CONNECT BY
ORDER BY
UPDATE
i
DELETE
ze skorelowanymi podzapytaniamiNULL
w składowych zapytania z UNION
Funkcja | Opis |
---|---|
MIN | Minimum |
MAX | Maksimum |
AVG | Średnia arytmetyczna |
SUM | Suma |
COUNT | Liczba wierszy/wartości |
VARIANCE | Wariancja |
STDDEV | Odchylenie standardowe |
LOWER(e)
e
z wszystkimi literami zmienionymi na małe.
UPPER(e)
e
z wszystkimi literami zmienionymi na wielkie.
INITCAP(e)
e
, przy czym litery początkowe wszystkich
wyrazów zmienia na wielkie, a pozostałe litery na małe.
CONCAT(e1, e2)
e1
z e2
(równoważne
operatorowi ||
).
SUBSTR(e,m[,n])
n
znaków napisu e
od pozycji
m
.m
jest ujemne, odliczanie rozpoczyna sie od końca
e
.n
pominięto, przekazywana są wszystkie znaki do
końca e
(lub początku gdy n
jest ujemne).
LENGTH(e)
e
.
INSTR(e,m)
m
w
e
.
LPAD(e,n,s)
e
do
n
znaków napisem s
z lewej strony.
RPAD(e,n,s)
e
do
n
znaków napisem s
z prawej strony.
e LIKE wzorzec
TRUE
wtedy i tylko wtedy, gdy e
pasuje do wzorca
. W wzorcu
:%
oznacza dowolny napis;_
oznacza dowolny znak.
LOWER('SQL Course') = 'sql course' UPPER('SQL Course') = 'SQL COURSE' INITCAP('SQL Course') = 'Sql Course' CONCAT('Good', 'String') = 'GoodString' SUBSTR('String',1,3) = 'Str' LENGTH('String') = '6' INSTR('String', 'r') = '3' LPAD(sal,10,'*') = '******5000'
Do kolumn i tabel można dodać komentarze:
COMMENT ON TABLE emp IS 'wszyscy pracownicy firmy'; COMMENT ON COLUMN emp.empno IS 'identyfikator pracownika';
CONNECT BY
SELECT FROM WHERE START WITH CONNECT BY
PRIOR
może występować także w klauzuli SELECT
(przykład poniżej).
WHERE
działa na już zbudowanej hierarchii (a więc później
niż to sugeruje zapis). Można w nim użyc pseudokolumny LEVEL
.
CONNECT BY
(to zapytanie pominie SMITHa i jego podwładnych):
SELECT level, ename, PRIOR ename FROM emp START WITH ename = 'KING' CONNECT BY mgr = PRIOR empno AND ename <> 'SMITH';Natomiast nastepujące zapytanie pominie SMITHa, ale zostawi jego podwładnych:
SELECT level, ename, PRIOR ename FROM emp WHERE ename <> 'SMITH' START WITH ename = 'KING' CONNECT BY mgr = PRIOR empno;
TO_DATE(napis, format) TO_CHAR(wyrażenie_datowe, format)
format
) jest opcjonalny.
Jego wartość domyślna to 'DD-MON-YY'
.SYSDATE
.format
jest napisem, który może zawierać nastepujące
elementy:
fm
przełącza między występowaniem lub nie dopełniania wyników
zerami/odstępami.Formaty daty | Znaczenie |
---|---|
SCC lub CC |
Wiek. Jeśli użyto S , to daty ujemne są
poprzedzone przez BC . |
YYYY lub SYYYY |
Rok. Jeśli użyto S , to daty ujemne są
poprzedzone przez BC . |
YYY lub YY lub Y |
Ostatnie 3, 2, 1 cyfra (y) roku. |
Y,YYY |
Rok z przecinkiem we wskazanym miejscu. |
IYYY , IYY , IY , I |
4-, 3-, 2-, 1-cyfrowy rok zgodnie ze standardem ISO. |
SYEAR lub YEAR |
Rok słownie. Jeśli użyto S , to daty ujemne są
poprzedzone przez BC . |
BC lub AD |
Oznacznik BC/AD |
B.C. lub A.D. |
Oznacznik BC/AD z kropkami. |
Q |
Kwartał roku. |
MM |
Miesiąc dwucyfrowo. |
MONTH |
Nazwa miesiąca uzupełniona odstępami do dziewięciu znaków. |
MON |
Trzyliterowy skrót nazwy miesiąca. |
RM |
Miesiąc cyframi rzymskimi. |
WW lub W |
Tydzień roku lub miesiąca. |
DDD , DD lub D |
Dzień roku, miesiąca lub tygodnia. |
DAY |
Nazwa dnia tygodnia uzupełniona odstępami do dziewięciu znaków. |
DY |
Trzyliterowy skrót nazwy dnia tygodnia. |
J |
Dzień wg kalendarz juliańskiego; liczba dni do 31-12-4713 p.n.e. |
RR |
Dwucyfrowy numer roku, ale z okienkowaniem wieków, tzn. jeśli
|
Formaty czasu | Znaczenie |
AM lub PM |
Oznacznik AM/PM . |
A.M. lub P.M. |
Oznacznik AM/PM . |
HH , HH12 lub HH24 |
Godzina dnia: wg lokalnych ustawień, 1-12, lub 0-23. |
MI |
Minuta (0-59). |
SS |
Sekunda (0-59). |
SSSSS |
Liczba sekund północy (0-86399). |
Inne formaty | Znaczenie |
/ . , |
Znaki przestankowe są kopiowane do wyniku. |
" dnia " |
Napis w cudzysłowie jest kopiowany do wyniku. |
Przyrostki | Znaczenie |
TH |
Liczebnik cyfrowo (np. DDTH dla 4TH ). |
SP |
Słownie (np. DDSP dla FOUR ). |
SPTH lub THSP |
Liczebnik słownie (np. DDSPTH dla FOURTH ). |
Format | wynik |
---|---|
HH24:MI:SS | 15:45:32 |
DD "of" MONTH | 12 of OCTOBER |
ddspth | fourteenth |
fmDD Month YYYY |
17 November 1981
1 May 1981
9 June 1981
2 April 1981
28 September 1981
20 February 1981 |
data + liczba
daty
podaną liczbę
dni. Wynikiem
jest DATE
.
data - liczba
daty
podaną liczbę
dni. Wynikiem
jest DATE
.
data - data
daty
do drugiej
daty
.
data + liczba/24
daty
podaną liczbę
godzin. Wynikiem
jest DATE
.
MONTHS_BETWEEN(d1, d2)
d1
i d2
.
Wynik może być dodatni albo ujemny. Wynik nie musi być liczbą
całkowitą. Ułamek odpowiada kawałkowi miesiąca.
ADD_MONTHS(data, n)
n
kalendarzowych miesięcy do daty
.
Liczba n
musi być całkowita, ale może być ujemna.
NEXT_DAY(data, 'znak')
dacie
, który jest dniem tygodnia
wskazanym przez 'znak'
. 'znak'
może być liczbą
lub pierwszą literą nazwy dnia tygodnia.
LAST_DAY(data)
datę
.
ROUND(data[,'fmt'])
daty
do jednostki określonej przez
model formatu 'fmt'
. Jeśli nie podano
'fmt'
zaokrąglenie nastepuje do najbliższej pełnej daty.
TRUNC(data[, 'fmt'])
daty
do jednostki określonej przez
model formatu 'fmt'
. Jeśli nie podano
'fmt'
obcięcie nastepuje do najbliższej pełnej.
MONTHS_BETWEEN('01-SEP-95','11-JAN-94') = 19.6774194 ADD_MONTHS ('11-JAN-94',6) = '11-JUL-94' NEXT_DAY ('01-SEP-95','FRIDAY') = '08-SEP-95' LAST_DAY('01-SEP-95') = '30-SEP-95' ROUND('25-JUL-95','MONTH') = '01-AUG-95' ROUND('25-JUL-95','YEAR') = '01-JAN-96' TRUNC('25-JUL-95','MONTH') = '01-JUL-95' TRUNC('25-JUL-95','YEAR') = '01-JAN-95'
NVL(x, y)
x
nie jest NULL
, to przekazuje
x
.x
jest NULL
, to przekazuje y
.
DECODE(e, s1, r1
[, s2, r2,...,]
[, defautl])
e = s1
, to przekazuje r1
.e = s2
, to przekazuje r2
.e = s3
, to przekazuje r3
.default
(jeśli nie podano default
, to przekazuje NULL
).SELECT job, sal, DECODE(job, 'ANALYST', SAL*1.1, 'CLERK', SAL*1.15, 'MANAGER', SAL*1.20, SAL) REVISED_SALARY FROM emp; JOB SAL REVISED_SALARY --------- --------- -------------- PRESIDENT 5000 5000 MANAGER 2850 3420 MANAGER 2450 2940 ... 14 rows selected.
CREATE USER użytkownik IDENTIFIED BY hasło;
Zmiana hasla:
ALTER USER użytkownik IDENTIFIED BY nowe_hasło;
GRANT przywilej [, przywilej...] TO użytkownik [, użytkownik...];
Takimi przywilejami są:
CREATE SESSION
CREATE TABLE
CREATE SEQUENCE
CREATE VIEW
CREATE PROCEDURE
CREATE (ANY) PROCEDURE | TRIGGER | TYPE
ALTER (ANY) PROCEDURE | TRIGGER | TYPE
DROP (ANY) PROCEDURE | TRIGGER | TYPE
EXECUTE (ANY) PROCEDURE | TYPE
ANY
, przywilej dotyczy tylko twojego schematu.
Musisz mieć przywilej EXECUTE
, aby móc wywołać podprogram w
PL/SQL, jeśli nie jesteś jego właścicielem. Przywileje obiektowe do
obiektów, z których ten podprogram korzysta muszą być nadane wprost (a nie
przez rolę). Podprogram PL/SQL wykonuje się z prawami właściciela (set uid).
Słowo kluczowe PROCEDURE
dotyczy procedur, funkcji
oraz pakietów składowanych.
CREATE ROLE rola;
Przykład:
CREATE ROLE szef; GRANT create table to szef; -- nadanie roli prawa GRANT szef to józio, kazio; -- nadanie użytkownikowi roli
Są pewne role predefiniowane:
PUBLIC
DBA
CREATE USER
DROP USER
DROP ANY TABLE
BACKUP ANY TABLE
Przywilej | Tabela | Perspektywa | Sekwencja | Procedura |
---|---|---|---|---|
ALTER | X | X | ||
DELETE | X | X | ||
EXECUTE | X | |||
INDEX | X | |||
INSERT | X | X | ||
REFERENCES | X | |||
SELECT | X | X | X | |
UPDATE | X | X |
GRANT przywilej_obiektowy [(kolumny)] ON obiekt TO {użytkownik|rola|PUBLIC} [WITH GRANT OPTION];
REVOKE {przywilej [, przywilej...]|ALL} ON obiekt FROM {uzytkownik[, użytkownik...]|rola|PUBLIC} [CASCADE CONSTRAINTS]; -- jest konieczne w celu usunięcia wszystkich -- więzów spójności referencyjnej utworzonych -- na mocy przywileju REFERENCES
TO_CHAR(napis, format) TO_NUMBER(wyrazenie_datowe, format)
format
) jest opcjonalny.Element | Opis | Przykład | Wynik |
---|---|---|---|
9 |
Cyfra (liczba dziewiątek określa szerokość pola) | 999999 |
1234 |
0 |
Wyświetl wiodące zera | 099999 |
001234 |
$ |
Ruchomy znak dolara | $999999 |
$1234 |
L |
Ruchomy znak lokalnej waluty | L999999 |
zł1234 |
. |
Kropka dzisiętna na wskazanej pozycji | 9999.99 |
1234.00 |
, |
Przecinek na wskazanej pozycji | 999,999 |
1,234 |
MI |
Znak minus z prawej strony (przy wartościah ujemnych) | 9999MI |
1234- |
PR |
Liczby ujemne w nawiasach | 9999PR |
<1234> |
EEEE |
Notacja inżynierska (w formacie muszą być cztery E ) |
9.9EEEE |
1.2E+03 |
V |
Pomnóż przez 10 n razy (n to liczba dziewiątek po V ) |
9999V99 |
123400 |
ROUND(e, [n])
e
do n
miejsc po
przecinku.n
, jest to zaokrąglenie do zera miejsc po
przecinku.n
jest ujemne, zaokrągla się cyfry na lewo od
przecinka dziesiętnego.
TRUNC(e, [n])
e
do n
miejsc po
przecinku.n
, jest to obcięcie do zera miejsc po
przecinku.n
jest ujemne, obcina się cyfry na lewo od
przecinka dziesiętnego.
MOD(m, n)
n
przez m
.
ROUND(45.926, 2) = 45.93 TRUNC(45.926, 2) = 45.92 MOD(1600, 300) = 100 ROUND(45.923, 2) = 45.92 ROUND(45.923, 0) = 46 ROUND(45.923, -1) = 50
ORDER BY
RENAME nazwa_stara TO nazwa_nowa;
TRUNCATE nazwa_tabeli;
DELETE FROM nazwa_tabeli;
SAVEPOINT nazwa;
nazwa
.
ROLLBACK;
ROLLBACK to nazwa;
SAVEPOINT nazwa
.
COMMIT;
W Oracle każde polecenie DDL powoduje automatyczne COMMIT
przed i po swoim wykonaniu, niezależnie od tego czy się powiedzie.
UPDATE
i
DELETE
ze skorelowanymi podzapytaniamiSET
jak i
WHERE
.SELECT
(przykład).SPOOL nazwa_pliku
nazwa_pliku
i
na konsolę.
SPOOL OFF
Można to wykorzystać do automatycznego tworzenia skryptów. Np. wynik tego zapytania kasuje wszystkie tabele:
SELECT 'drop table ' || table_name || ' cascade constraints;' FROM user_tables;
Skrypt kasujący wszystkie tabele: dropall.sql.
Zawiera wiele cech SQL2 a nawet SQL3.
UNION ALL
, INTERSECT ALL
,
EXCEPT ALL
działają tak jak powinny na multizbiorach.(FULL/LEFT/RIGHT OUTER)/INNER JOIN ON
.TABLE(...)
.
SELECT ... FROM A, TABLE (SELECT * FROM B WHERE b1 = A.a1) BA ...
CREATE TABLE ... UNDER ...
SELECT * FROM A;
A
i z jej
podtabel, ale tylko te kolumny, które są w A
.SELECT * FROM ONLY(A);
A
, ale nie wiersze, które są w
podtabelach A
.
SELECT * FROM OUTER(A);
A
i z jej
podtabel. Drukuje wszystkie kolumny podtabel. Jeśli dany wiersz nie
zawiera odpowiedniej wartości, używa się NULL
.
FROM
mogą występować aplikacje funkcji wierszowych:
SELECT t.c1, z.c5 FROM t, TABLE( tf3(t.c2) ) AS z WHERE t.c3 = z.c4;
t
jest przed tf3
we FROM
, więc
t.c2
jest znane.
Na podstawie wartości wiersza z t
,
funkcja tf3
wylicza wiersz, który jest
złączany z wierszem z t
.
Jest to pewna forma złączenia zależnego.
W przypadku grupowania na innym poziomie niz najwyższy
"niegrupowane-tym-razem" kolumny sa wypelniane NULL
ami.
Grupowanie może być po wielu GROUPING SETS
.
GROUPING SETS ((a,b), (b,c), (d))
ROLLUP(a,b,c)
GROUPING SETS
: (a,b,c), (a,b), (a) i ()
CUBE(a,b)
GROUPING SETS
:(a,b), (a), (b) i ().
ROLLUP
grupuje po coraz mniejszym zbiorze,
za każdym razem odrzucając ostatnie kryterium.
CUBE
grupuje po każdym pozdbiorze swego argumentu.
NULL
w
składowych zapytania z UNION
Jeśli napiszemy:
SELECT deptno, ename FROM emp UNION SELECT NULL, dname FROM dept;
będzie błąd (niezgodność typów danych). Aby to zadziałało trzeba użyć konwersji typów i napisać:
SELECT deptno, ename FROM emp UNION SELECT TO_NUMBER(NULL), dname FROM dept;
Składnia:
CREATE [ FORCE | NOFORCE ] VIEW nazwa AS SELECT ... [ WITH CHECK OPTION [ CONSTRAINT nazwa_wiezu ] ] [ WITH READ ONLY ];
NOFORCE
FORCE
WITH CHECK OPTION
WHERE
pespektywy. Jeśli
falsyfikują operacja DML jest odrzucana.
To są więzy spójności jak każde inne i można mu nadać im nazwę poprzez
CONSTRAINT
.
WITH READ ONLY