Bazy danych SQL: funkcje dostępne w Oracle Funkcje działające na pojedynczych wartościach Działają na każdym wierszu wybranym przez zapytanie Zwracają jeden wynik dla każdego wiersza Są jedno- lub wieloargumentowe Można je zagnieżdżać Można ich używać wszędzie tam, gdzie stosuje się zmienne, kolumny, wyrażenia, w klauzulach SELECT, WHERE, ORDER BY Funkcje znakowe Funkcje liczbowe Funkcje działające na datach Funkcje konwersji Funkcje polimorficzne Funkcje znakowe Funkcja LOWER LOWER (wartość) - zmienia wielkie litery na odpowiadające im małe litery alfabetu. Inne znaki pozostawia bez zmian. SQL> select lower(dname) from dept; LOWER(DNAME) -------------- accounting research sales operations 2 3 Funkcja UPPER UPPER (wartość) - zmienia małę litery na odpowiadające im wielkie litery alfabetu. Inne znaki pozostawia bez zmian. SQL> select ename from emp where ename =upper('&ename'); Proszę podać wartość dla ename: smith stare 1: select ename from emp where ename =upper('&ename') nowe 1: select ename from emp where ename =upper('smith') ENAME ---------- SMITH Funkcja INITCAP INITCAP (wartość) - zamienia pierwszą literę każdego słowa na wielką, pozostałe litery na małe. Inne znaki pozostawia bez zmian. SQL> select initcap(dname), initcap(loc) from dept; INITCAP(DNAME) INITCAP(LOC) -------------- ------------- Accounting New York Research Dallas Sales Chicago Operations Boston Funkcja LPAD LPAD (wartość, n, [ ciąg ]) - uzupełnia kolumny lub literały z lewej strony do długości n za pomocą zadanego wyrażenia napisowego ciąg. Jeśli ostatni argument jest opuszczony, następuje uzupełnienie spacjami. SQL> select lpad(dname, 20,'*'), lpad(dname, 20), lpad(deptno, 20,'.') from dept; LPAD(DNAME,20,'*') LPAD(DNAME,20) LPAD(DEPTNO,20,'.') -------------------- -------------------- -------------------- **********ACCOUNTING ACCOUNTING...10 ************RESEARCH RESEARCH...20 ***************SALES SALES...30 **********OPERATIONS OPERATIONS...40 4 5 6 Funkcja RPAD RPAD (wartość, n, [ ciąg ]) - uzupełnia kolumny lub literały z prawej strony do długości n za pomocą zadanego wyrażenia napisowego ciąg. Jeśli ostatni argument jest opuszczony, następuje uzupełnienie spacjami. SQL> select rpad(dname, 20,'*'), rpad(dname, 20), rpad(deptno, 20,'.') from dept; RPAD(DNAME,20,'*') RPAD(DNAME,20) RPAD(DEPTNO,20,'.') -------------------- -------------------- -------------------- ACCOUNTING********** ACCOUNTING 10... RESEARCH************ RESEARCH 20... SALES*************** SALES 30... OPERATIONS********** OPERATIONS 40... Funkcja SUBSTR SUBSTR (wartość, m, [n]) - wybiara podciąg składający się z n znaków z kolumny, wyrażenia lub literału, począwszy od znaku o numerze m. Jeśli n nie jest podane, wynikiem jest podciąg od pozycji m do końca wartości, z której wycinamy. SQL> select substr('oracle',2,4), substr(dname, 2), substr(dname, 3, 5) from dept; SUBS SUBSTR(DNAME, SUBST ---- ------------- ----- RACL CCOUNTING COUNT RACL ESEARCH SEARC RACL ALES LES RACL PERATIONS ERATI Funkcja INSTR INSTR (wartość, ciag ) - wskazuje miejsce pierwszego wystąpienia wzorca ciąg ; INSTR (wartość, ciag,m,n) - wskazuje miejsce położenia n-tego wystąpienia wzorca ciąg, począwszy od pozycji m. SQL> select dname, instr(dname,'a'), instr(dname,'es'), instr(dname, 'C', 1,2) from dept; DNAME INSTR(DNAME,'A') INSTR(DNAME,'ES') INSTR(DNAME,'C',1,2) -------------- ---------------- ----------------- -------------------- ACCOUNTING 1 0 3 RESEARCH 5 2 0 SALES 2 4 0 OPERATIONS 5 0 0 7 8 9
Funkcje LTRIM i RTRIM LTRIM (wartość, znaki ); RTRIM(wartość, znaki ) - usuwa z lewej (RTRIM z prawej) strony wystąpienia dowolnych kombinacji znaków należących do argumentu znaki. Jeśli drugi argument nie jest podany, usuwa spacje. SQL> select dname, ltrim(dname, 'A'), ltrim(dname,'as'), ltrim(dname, 'ASOP') from dept; DNAME LTRIM(DNAME,'A LTRIM(DNAME,'A LTRIM(DNAME,'A -------------- -------------- -------------- -------------- ACCOUNTING CCOUNTING CCOUNTING CCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES LES LES OPERATIONS OPERATIONS OPERATIONS ERATIONS SQL> select dname, rtrim(dname, 'G'), rtrim(dname,'ghs') from dept; DNAME RTRIM(DNAME,'G RTRIM(DNAME,'G -------------- -------------- -------------- ACCOUNTING ACCOUNTIN ACCOUNTIN RESEARCH RESEARCH RESEARC SALES SALES SALE Funkcja LENGTH LENGTH (wartość) - zwraca długość ciągu zawartego w argumencie SQL> select length('sql'), length(deptno), length(dname) from dept; LENGTH('SQL') LENGTH(DEPTNO) LENGTH(DNAME) ------------- -------------- ------------- 3 2 10 3 2 8 3 2 5 3 2 10 Funkcja TRANSLATE TRANSLATE (źródło, z, na) - w żródłowym ciągu znaków każde wystąpienie dowolnego znaku występujacego w ciągu z, zostanie zastąpione odpowiadającym (według pozycji) znakiem z ciągu na. Pozostałe znaki nie są zmieniane. Jeśli nie ma odpowiadajacego znaku (argument na jest krótszy niż argument z), wystąpienie znaku źródłowego zostanie usunięte. 10 11 12 Funkcja REPLACE REPLACE (źródło, wzorzec, ciąg_zastępujący) - w źródłowym ciągu wszystkie wystąpienia danego ciągu wzorzec zostają zastąpione przez ciąg_zastępujący. Jeśli argument ciąg_zastępujący nie jest podany, wszystkie wystąpienia ciąg zostaną usunięte. UWAGA: Funkcja REPLACE stanowi uzupełnienie funkcji TRANSLATE. TRANSLATE realizuje zamianę znaków typu jeden na jeden. REPLACE pozwala na zamianę, wzgędnie usuwanie całych ciągów znaków. Wzorzec i ciąg_zastepujący mogą być różnej długości. Funkcje liczbowe Funkcja ROUND ROUND (wartość, n) - zaokrągla wartości do -tego miejsca po przecinku. Jeśli n jest ujemne, zaokrąglenie natepuje do n-tego miejsca przed prezcinkiem. Jeśli n nie jest podane, zaokrągla się do jedności. SQL> SELECT ROUND(45.932,1), ROUND(45.932), ROUND(45.932,-1), ROUND(SAL/32,2) FROM EMP WHERE DEPTNO=10; ROUND(45.932,1) ROUND(45.932) ROUND(45.932,-1) ROUND(SAL/32,2) --------------- ------------- ---------------- --------------- 45,9 46 50 76,56 45,9 46 50 156,25 45,9 46 50 40,63 Funkcja TRUNC TRUNC (wartość, n) - obcina podaną wartość do n-tego miejsca po przecinku. Jeśli n jest ujemne, n cyfr przed przecinkiem zostaje zamienione na 0. Jeśli n nie jest podane, obcięcie następuje z dokładnością do jedności. SQL> SELECT TRUNC(45.932,1), TRUNC(45.932), TRUNC(45.932,-1), TRUNC(SAL/32,2) FROM EMP WHERE DEPTNO=10; TRUNC(45.932,1) TRUNC(45.932) TRUNC(45.932,-1) TRUNC(SAL/32,2) --------------- ------------- ---------------- --------------- 45,9 45 40 76,56 45,9 45 40 156,25 45,9 45 40 40,62 13 14 15 Funkcja CEIL CEIL (wartość) - wynikiem jest najmniejsza liczba całkowita większa lub równa podanej wartości. SQL> SELECT CEIL(SAL),CEIL(99.9), CEIL(101.76),CEIL(-11.1) FROM EMP WHERE SAL BETWEEN 3000 AND 5000; CEIL(SAL) CEIL(99.9) CEIL(101.76) CEIL(-11.1) ---------- ---------- ------------ ----------- 3000 100 102-11 5000 100 102-11 3000 100 102-11 Funkcja FLOOR FLOOR (wartość) - największa liczba całkowita mniejsza lub równa podanej wartości. SQL> SELECT FLOOR(SAL),FLOOR(99.9), FLOOR(101.76),FLOOR(-11.1) FROM EMP WHERE SAL BETWEEN 3000 AND 5000; FLOOR(SAL) FLOOR(99.9) FLOOR(101.76) FLOOR(-11.1) ---------- ----------- ------------- ------------ 3000 99 101-12 5000 99 101-12 3000 99 101-12 Funkcja POWER POWER(wartość, n) - podnosi podaną wartość do n-tej potęgi. SQL> SELECT SAL, POWER(SAL, 2), POWER(SAL,3),POWER(50,5) FROM EMP WHERE DEPTNO=10; SAL POWER(SAL,2) POWER(SAL,3) POWER(50,5) ---------- ------------ ------------ ----------- 2450 6002500 1,4706E+10 312500000 5000 25000000 1,2500E+11 312500000 1300 1690000 2197000000 312500000 16 17 18
Funkcja SQRT Funkcja SIGN Funkcja ABS SQRT(wartość) - pierwiastek kwadratowy z wartości kolumny lub zadanej wartości. SQL> SELECT SAL,SQRT(SAL), SQRT(40), SQRT(COMM) FROM EMP WHERE COMM>0; SAL SQRT(SAL) SQRT(40) SQRT(COMM) ---------- ---------- ---------- ---------- 1600 40 6,32455532 17,3205081 1250 35,3553391 6,32455532 22,3606798 1250 35,3553391 6,32455532 37,4165739 SIGN(wartość) - funkcja zwraca -1, jeśli argument jest ujemny, 0. jeśli jest zerem oraz +1 jeśli jest dodatni. SQL> SELECT SAL-COMM, SIGN(SAL-COMM), COMM-SAL, SIGN(COMM-SAL) FROM EMP WHERE DEPTNO=30; SAL-COMM SIGN(SAL-COMM) COMM-SAL SIGN(COMM-SAL) ---------- -------------- ---------- -------------- 1300 1-1300 -1 750 1-750 -1-150 -1 150 1 1500 1-1500 -1 ABS(wartość) zwraca wartość bezwzględną argumentu. SQL> SELECT SAL, COMM, COMM-SAL, ABS(COMM-SAL), ABS(-35) FROM EMP WHERE DEPTNO=30; SAL COMM COMM-SAL ABS(COMM-SAL) ABS(-35) ---------- ---------- ---------- ------------- ---------- 1600 300-1300 1300 35 1250 500-750 750 35 1250 1400 150 150 35 2850 35 1500 0-1500 1500 35 950 35 MOD(wartość1, wartość2) - reszta z dzielenia wartości1 przez wartość2. 19 20 21 Typ DATE Pseudokolumna SYSDATE Wyrażenia arytmetyczne dla dat Typ danych DATE W formacie DATE można wyróżnic: identyfikator stulecia, rok; miesiąc; dzień; godzinę; minutę; sekundę Daty mogą występować w przedziale od 1-ego stycznia 4712 p.n.e. do 31-ego grudnia 4712 n.e. SYSDATE - pseudokolumna zawierajaca datę systemową - bieżącą datę i godzinę. Można ją używać jak każdą inną kolumnę, np. można ją umiecić na liście klauzuli SELECT i wybrać z dowolnej tabeli. Można ją traktową jako 0 argumentową funkcję, która zwraca wynik typu DATE. SQL> SYSDATE SP2-0042: nieznane polecenie "SYSDATE" - reszta linii pomijana. SQL> SELECT SYSDATE FROM DUAL; SYSDATE -------- 05/10/21 Tabela DUAL - istnieje w każdej bazie ORACLE i jest dostępna do odczytu dla wszystkich użytkowników. Składa się z jednej kolumny i jednego wiersza. Jest użytecza wówczas, gdy chcemy wybrać jakąś pojedynczą wartość, która nie zależy od zawartości naszych tabel. data + liczba - dodanie do daty pewnej liczby dni - wynikiem jest data data-liczba - odjęcie od daty pewnej liczby dni - wynikiem jest data data-data - odjecie od daty innej daty, wynikiem jest liczba dni między nimi UWAGA: liczba może być ułamkiem, wówczas do daty dodana zostanie odpowiednia liczba godzin, minut, sekund. SQL> SELECT HIREDATE, HIREDATE+7, HIREDATE-7, SYSDATE-HIREDATE FROM EMP WHERE HIREDATE LIKE'%06%'; HIREDATE HIREDATE HIREDATE SYSDATE-HIREDATE ---------------- 81/06/09 81/06/16 81/06/02 8900,56752 22 23 24 Funkcja MONTHS_BETWEEN Funkcja ADD_MONTHS Funkcja NEXT_DAY MONTHS_BETWEEN (data1, data2) - zwraca odstęp pomiędzy wyspecyfikowanymi datami wyrażony w miesiącach. Wynik dodatni, jeśli data1 późniejsza od data2, lub ujemny w przeciwnym przypadku. ADD_MONTHS (data, n) - zwraca datę plus n miesięcy kalendarzowych, n- całkowite, ale może być ujemne. Jeśli otrzymamy błędną datę (np. 30 lutego) wynikiem będzie ostatnia sensowna data w otrzymanym miesiącu. NEXT_DAY(data1, dzień_tygodnia) - zwraca pierwsząpo wskkazanej datę, której dzień tygodnia jest taki jak wskazuje drugi argument. W argumencie podajemy numer lub nazwę dnia tygodnia. SQL> SELECT MONTHS_BETWEEN(SYSDATE, HIREDATE), MONTHS_BETWEEN('82/01/01','88/11/05') FROM EMP WHERE MONTHS_BETWEEN(SYSDATE, HIREDATE)>288; MONTHS_BETWEEN(SYSDATE,HIREDATE) MONTHS_BETWEEN('82/01/01','88/11/05') -------------------------------- ------------------------------------- 298,147399-82,129032 296,050625-82,129032 295,986109-82,129032 294,63127-82,129032 SQL> SELECT HIREDATE, ADD_MONTHS(HIREDATE, 3), ADD_MONTHS(HIREDATE,-3) FROM EMP WHERE DEPTNO=20; HIREDATE ADD_MONT ADD_MONT 80/12/17 81/03/17 80/09/17 81/04/02 81/07/02 81/01/02 87/04/19 87/07/19 87/01/19 87/05/23 87/08/23 87/02/23 81/12/03 82/03/03 81/09/03 SQL> SELECT HIREDATE, NEXT_DAY(HIREDATE, 'PIĄTEK'), NEXT_DAY(HIREDATE, 6) FROM EMP WHERE DEPTNO=20; HIREDATE NEXT_DAY NEXT_DAY 80/12/17 80/12/19 80/12/20 81/04/02 81/04/03 81/04/04 87/04/19 87/04/24 87/04/25 87/05/23 87/05/29 87/05/30 25 26 27
Funkcja LAST_DAY LAST_DAY(data1) - wynikiem jest data ostatniego dnia w miesiącu, do którego należy data1. SQL> SELECT SYSDATE, LAST_DAY(SYSDATE), HIREDATE, LAST_DAY(HIREDATE), LAST_DAY(TO_DATE('03/10/2005', 'DD/MM/YYYY')) FROM EMP WHERE DEPTNO=20; SYSDATE LAST_DAY HIREDATE LAST_DAY LAST_DAY -------- -------- 05/10/21 05/10/31 80/12/17 80/12/31 05/10/31 05/10/21 05/10/31 81/04/02 81/04/30 05/10/31 05/10/21 05/10/31 87/04/19 87/04/30 05/10/31 05/10/21 05/10/31 87/05/23 87/05/31 05/10/31 05/10/21 05/10/31 81/12/03 81/12/31 05/10/31 Funkcja ROUND ROUND(data1) - wynikiem jest data1 ze wskaxnikiem godzinowym ustalonym na północ, jeśli data1 wskazuje na godzinę przed południem, lub na północ dnia następnego, gdy data1 wskazuje na godzinę przed południem ROUND(data1, MONTH ) - wynikiem jest data pierwszego dnia miesiąca zawierającego data1, gdy jest ona z pierwszej połowy miesiąca, lub pierwszego dnia następnego miesiąca w przeciwnym przypadku. ROUND(data1, YEAR ) - zaokrąglenie do pierwszego dnia roku. SQL> SELECT SYSDATE, ROUND(SYSDATE,'MONTH'), ROUND(SYSDATE,'YEAR') FROM DUAL; SYSDATE ROUND(SY ROUND(SY 05/10/21 05/11/01 06/01/01 Funkcja TRUNC TRUNC(data1, dokładność) - wynikiem jest data pierwszego dnia miesiaca zawierajacego data1, jeśli dokładność jest MONTH lub pierwszego dnia roku, jeśli dokładność jest YEAR. Bez drugiego argumentu funkcja powoduje usunięcie składnika godzinowego z daty. 28 29 30 Funkcje konwersji TO_CHAR (liczba data[,format ]) - zamiana liczby lub daty na ciąg znaków zgodny z formatem opisanym w parametrze format TO_NUMBER (tekst) - zamiana ciągu znaków zawierających liczbę na daną typu NUMBER TO_DATE( tekst, format ) - zamiana ciągu znaków reprezentujących datę w formacie opisanym w parametrze format na daną typu DATE Funkcja TO_CHAR konwersja dat SQL> SELECT TO_CHAR(SYSDATE,'DAY,DD MONTH YYYY') FROM DUAL; TO_CHAR(SYSDATE,'DAY,DDMONTHYYYY -------------------------------- PIĄTEK,21 PAŹDZIERNIK 2005 SQL> SELECT TO_CHAR(SYSDATE,'HH:MI:SS') FROM DUAL; TO_CHAR( -------- 02:06:30 Przykłady formatów dat: YYYY, YYY, YY, Y - 4, 3, 2,lub ostatnia cyfra roku MM - miesiąc MONTH - nazwa miesiąca DDD, DD, D - dzień roku, miesiąca lub tygodnia DAY - nazwa dnia tygodnia HH - godzina MI - minuta; SS - sekunda Funkcja TO_CHAR konwersja liczb SQL> SELECT TO_CHAR(SAL, '$9,999') FROM EMP; TO_CHAR ------- $800 $1,600 $1,250 $2,975 Formaty dla liczb: Wzorzec Znaczenie Przykład 9 Pozycja cyfry liczba 99999 1234 dziewiątek określa szerokość wyświetlania) 0 Wyświetlani zer 099999 001234 wiodących $ Ruchomy znak dolara $99999 $1234. Pozycja kropki dziesiętnej 99999.99 1234.00 31 32 33 Funkcja TO_NUMBER i TO_DATE SQL> SELECT EMPNO, ENAME,JOB,SAL FROM EMP WHERE SAL>TO_NUMBER('1500'); EMPNO ENAME JOB SAL ---------- ---------- --------- ---------- 7499 ALLEN SALESMAN 1600 7566 JONES MANAGER 2975 7698 BLAKE MANAGER 2850 7782 CLARK MANAGER 2450 SQL> SELECT EMPNO, ENAME, HIREDATE FROM EMP WHERE HIREDATE=TO_DATE ('GRUDZIEÑ 17, 1980','MONTH DD,YYYY'); EMPNO ENAME HIREDATE ---------- ---------- -------- 7369 SMITH 80/12/17 Funkcje polimorficzne Funkcja DECODE Funkcje polimorficzne - funkcje, które nie są związane ze szczególnym typem danych, działają podobnie dla wielu różnych danych. DECODE - umożliwia warunkową realizację zapytań, gdyż działa na zasadzie typu case czy if-then-else z innych języków. DECODE(wyrażenie, wyr1, wynik1, [wyr2, wynik2,...] wynik domyślny) Uwagi: wyrażenie może być dowolnego typu wartość wyr muszą być takiego samego typu jak wyrażenie Funkcja DECODE SQL>SELECT ENAME, JOB, DECODE(JOB, 'CLERK', 'PRACOWNIK', 'MANAGER', 'SZEF', ' ') TŁUMACZENIE FROM EMP; ENAME JOB TŁUMACZEN ---------- --------- --------- SMITH CLERK PRACOWNIK ALLEN SALESMAN WARD SALESMAN JONES MANAGER SZEF 34 35 36
Funkcja DECODE SQL> SELECT GRADE, DECODE(GRADE, 1, '15%', 2, '10%', 3, '8%', '5%') BONUS FROM SALGRADE; GRADE BON ---------- --- 1 15% 2 10% 3 8% 4 5% 5 5% Inne funkcje NVL (wyrażenie1, wyrażenie2) - zmienia wartość NULL w pierwszym argumencie na wartość2 GREATEST (wartość1, wartość2,...) - zwraca największą wartość z listy LEAST(wartość1, wartość2,...) - zwraca najmniejszą wartość sposród podanych argumentów 37 38