Język SQL – ciąg dalszy DML (Data Manipulation Language) Wykład S. Kozielski
Wstawianie wierszy INSERT INTO <tablica> [(<lista kolumn>)] VALUES (<lista wartości>) Przykład: wstawianie wierszy do tablicy: uczniowie (nazwisko, wzrost, waga, klasa) insert into uczniowie values (‘Malina’,183,79.5,3) insert into uczniowie (nazwisko,klasa) values (‘Jaworek’,1)
Wstawianie wierszy - c.d. INSERT INTO <tablica> [(<lista kolumn>)] <instrukcja SELECT>
Modyfikowanie (aktualizacja) wierszy UPDATE <tablica> SET <kolumna> = <wyrażenie>, ... [WHERE <warunek>] Przykład: update uczniowie set wzrost = wzrost + 2 where nazwisko = ‘Malina’ update uczniowie set klasa = 3 where klasa = 2
Usuwanie wierszy DELETE FROM <tablica> [WHERE <warunek>] Przykład: delete from uczniowie where klasa = 3
Wyszukiwanie danych SELECT <> FROM <> WHERE <> GROUP BY <> HAVING <> ORDER BY <> UNION ...
Fraza SELECT – opis uproszczony SELECT [ALL|DISTINCT]{<wyrażenie> [AS <nazwa>], ... | *} <wyrażenie>::= <kolumna> | <alias>.<kolumna> | <kwalifikator>.<kolumna> | <wyrażenie określonego typu> | <funkcja agreująca> <kwalifikator>::= <tablica> | <perspektywa> | <synonim>
Przykłady zapytań dotyczących tablicy: Przykłady zapytań dotyczących tablicy: uczniowie (nazwisko, wzrost, waga, klasa) select * from uczniowie select nazwisko, klasa select nazwisko, waga – (wzrost - 100) select nazwisko, waga – (wzrost - 100) as ‘nadwaga’
select max(wzrost) from uczniowie select klasa select distinct klasa Przykłady zapytań - c.d. select max(wzrost) from uczniowie select klasa select distinct klasa
Fraza FROM – wariant bez złączeń FROM <element> [<alias>], ... <element>::= <tablica>|<perspektywa> | <synonim>|<konstruktor tablicy>
WHERE <warunek> Fraza WHERE WHERE <warunek>
Warunki filtrujące (zwykłe) <wyrażenie> <op> <stała> <wyrażenie> <op> <wyrażenie> <op>::= =, >, >=, <, <=, !=, <> <wyrażenie> [NOT] BETWEEN <dół> AND <góra> <wyrażenie> [NOT] IN (<lista wartości>)
Przykłady select * from uczniowie where klasa = 4 where waga – (wzrost - 100) > 10 where wzrost beetwen 178 and 183 where klasa in (1,2)
<wyrażenie> [NOT] LIKE <wzorzec tekstowy> znaki zastępcze we wzorcu tekstowym: _ : zastępuje 1 znak, % : zastępuje 0, 1, 2, 3, ... znaków
Przykłady select * from uczniowie where nazwisko like ‘Kowalsk_’ where upper(nazwisko) like ‘KOWALSK_’ where upper(nazwisko) like ‘KOWAL%’
Warunki łączące Tablice bazy danych: Zespoły (nrz, nazwa, nrpk) Pracownicy (nrp, nazwisko, nrz, . . . ) Wypłaty (nrp, nrt, kwota) Tematy (nrt, nazwa, nrpk)
Warunki łączące select nazwisko, kwota, nrt from pracownicy, wypłaty where pracownicy.nrp = wypłaty.nr select p.nazwisko, w.kwota, w.nrt, p.nrp from pracownicy p, wypłaty w where p.nrp = w.nrp
Złączenie tabel Pracownicy Wypłaty nrp nrt kwota 2 300 3 150 1 200 nrp nazwisko adres nrz 1 Lipowski Ruda 2 Grabski Zabrze 3 Jaworek Gliwice
Pracownicy Wypłaty nrp nazwisko adres nrz nrt kwota 2 Grabski Zabrze 1 300 3 Jaworek Gliwice 150 Lipowski Ruda 200
Pracownicy Wypłaty Tematy nrp nazwisko adres nrz nrt kwota nazwa kier. 2 Grabski Zabrze 1 300 Pr. przetwor. 3 Jaworek Gliwice 150 Pr. reaktora Lipowski Ruda Pr. zasilacza 200
select nazwisko, kwota, nrt from pracownicy p, wypłaty w where p.nrp = w.nrp and nrz = 4 and kwota > 2000
select distinct z.nazwa from zespoły z, pracownicy p, wypłaty w, tematy t where z.nrz = p.nrz and p.nrp = w.nrp and w.nrt = t.nrt and t.nazwa = ‘Projekt sterownika’
select p2.nazwisko from pracownicy p1, pracownicy p2 where p1.nazwisko = ‘Bukowy’ and p1.nrz = p2.nrz and p2.nazwisko <> ‘Bukowy’
select p2.nazwisko from pracownicy p1, wypłaty w, tematy t, pracownicy p2 where p1.nazwisko = ‘Grabski’ and p1.nrp = t.nrpk and t.nrt = w.nrt and w.nrp = p2.nrp
Złączenia zewnętrzne select nazwisko, kwota, nrt from pracownicy p, wypłaty w where p.nrp = w.nrp
Złączenie naturalne r (A, B, C) s (C, D) q (A, B, C, D) ———— ——— = ————— a1 b1 c1 c1 d1 a1 b1 c1 d1 a2 b2 c2 c5 d5 a4 b4 c1 d1 a3 b3 c3 a4 b4 c1
Złączenie zewnętrzne r (A, B, C) s (C, D) (+) q (A, B, C, D) ———— ———— = ————— a1 b1 c1 c1 d1 a1 b1 c1 d1 a2 b2 c2 c5 d5 a4 b4 c1 d1 a3 b3 c3 a2 b2 c2 a4 b4 c1 a3 b3 c3
Złączenia zewnętrzne select nazwisko, kwota, nrt from pracownicy p, wypłaty w where p.nrp = w.nrp (+)
Zapis złączeń w standardzie SQL-2 (SQL-92) SELECT <> FROM <rodzaj złączenia> <rodzaj złączenia>::= <tab A> [<typ złączenia>] JOIN <tab B> <tab A> [<typ złącz.>] JOIN <tab B> USING (<kolumna>, ...) <tab A> [<typ złączenia>] JOIN <tab B> ON <warunek> <typ złączenia>::= INNER|{LEFT|RIGHT|FULL}[OUTER]
select nazwisko, kwota, nrt from pracownicy join wypłaty lub from pracownicy join wypłaty using (nrp) from pracownicy p join wypłaty w on p.nrp = w.nrp
Złączenie zewnętrzne Zapis klasyczny select nazwisko, kwota, nrt from pracownicy p, wypłaty w where p.nrp = w.nrp (+) Zapis w SQL-2 from pracownicy p left outer join wypłaty w on p.nrp = w.nrp
Warunki filtrujące z pytaniami zagnieżdżonymi SELECT <> FROM <> WHERE <początek warunku> ( SELECT <> WHERE < . . . >)
<początek warunku>::= 1) <wyrażenie> <op> 2) <wyrażenie> <op> {ANY|ALL} 3) <wyrażenie> <op> [NOT] IN 4) [NOT] EXISTS
Baza danych: Zespoły (nrz, nazwa, nrpk) Pracownicy (nrp, nazwisko, nrz, premia) Wypłaty (nrp, nrt, kwota) Tematy (nrt, nazwa, nrpk)
ad 1) <wyrażenie> <op> select nazwisko from pracownicy where nrp = (select nrpk from zespoły where nazwa = ‘Zespół Wdrożeń’)
ad 1) <wyrażenie> <op> select nazwisko from pracownicy where nrz = 3 and premia > (select premia where nazwisko = ‘Jaworek’)
ad 2) <wyrażenie> <op> {ANY|ALL} select nazwa from tematy where nrt = any (select nrt from wypłaty)
ANY select nazwisko from pracownicy where nrp = any (select nrp from wypłaty where kwota > 2000)
ALL select nazwisko, wzrost from uczniowie where klasa = 1 and wzrost > all (select wzrost where klasa = 3)
select nazwisko from pracownicy p where 2000 < all (select kwota from wypłaty w where w.nrp = p.nrp)
ad 3) <wyrażenie> [NOT] IN select nazwa from tematy where nrt in (select nrt from wypłaty)
select nazwa from zespoły where nrz in (select nrz from pracownicy where nrp in (select nrp from wypłaty where nrt in (select nrt from tematy where nazwa = ‘Projekt sterownika’)))
ad 4) [NOT] EXISTS select nazwa from tematy t where exists (select * from wypłaty w where w.nrt = t.nrt)
select nazwisko from pracownicy p where not exists (select * from wypłaty w where w.nrp = p.nrp)
select nazwisko from pracownicy p where not exists (select * from tematy t from wypłaty w where w.nrt = t.nrt and w.nrp = p.nrp))
Funkcje agregujące SUM (<arg>) AVG (<arg>) MAX (<arg>) MIN (<arg>) COUNT (<arg>) <arg>::= [ALL|DISTINCT]<wyrażenie> oraz COUNT(*)
select count(*) from pracownicy select sum(kwota), avg(kwota), max(kwota) from wypłaty
select sum(kwota), avg(kwota), max(kwota) from wypłaty where nrt = 3 select sum(kwota), max(kwota), count(p.nrp) from pracownicy p, wypłaty w where p.nrp = w.nrp and nrz = 4
select max(waga - (wzost - 100)) from uczniowie select count(nrp), count(distinct nrp), count(distinct nrt) from wypłaty
select nazwisko, wzrost from uczniowie where wzrost = (select max(wzrost) from uczniowie)
select klasa, nazwisko, wzrost from uczniowie u1 where wzrost = (select max(wzrost) from uczniowie u2 where u2.klasa = u1.klasa)
select nrp, nrt, kwota from wypłaty w1 where kwota = (select max(kwota) from wypłaty w2 where w2.nrt = w1.nrt)
Grupowanie – fraza GROUP BY select nrz, count(*) from pracownicy group by nrz
select nrt, sum(kwota), max(kwota), count(*) from wypłaty group by nrt
select nrz, sum(kwota) from pracownicy p, wypłaty w where p.nrp = w.nrp group by nrz
select nazwisko, sum(kwota) from pracownicy p, wypłaty w where p.nrp = w.nrp group by nazwisko, p.nrp
SELECT <lista kolumn 1>,<lista funkcji agr.> FROM <> WHERE <> GROUP BY <lista kolumn 2> <lista kolumn 1> <lista kolumn 2>
Filtrowanie grup – fraza HAVING HAVING <warunek filtrujący> select nrz, count(*) from pracownicy group by nrz having count(*) > 20 or count(*) < 5
select nazwisko, p.nrp, sum(kwota) from pracownicy p, wypłaty w where p.nrp = w.nrp group by nazwisko, p.nrp having sum(kwota) > 10000
select nazwisko, p.nrp, sum(kwota) from pracownicy p, wypłaty w where p.nrp = w.nrp group by nazwisko, p.nrp having sum(kwota) > (select sum(kwota) from pracownicy pp, wypłaty ww where pp.nrp = ww.nrp and nazwisko = ‘Jaworek’)
Konstruktor tablicy w frazie FROM SELECT <> FROM <konstruktor tablicy> select max(suma) from (select sum(kwota) as suma from wypłaty group by nrp)
Konstruktor tablicy na liście SELECT select nrp, nazwisko, (select sum(kwota) from wypłaty w where w.nrp = p.nrp) as suma from pracownicy p
Porządkowanie wyników wyszukiwania – fraza ORDER BY ORDER BY {<wyrażenie> |<nr>} [ASC|DESC], ... select * from pracownicy order by nrz, nazwisko
select nazwisko, waga–(wzrost-100), klasa from uczniowie order by klasa, waga–(wzrost–100) desc lub order by 3,2 desc
Fraza UNION (i frazy pokrewne: INTERSECT, MINUS, ...) SELECT <lista kolumn 1> FROM <> . . . UNION [ALL] SELECT <lista kolumn 2>
select nrpk from zespoły union from tematy Fraza UNION - przykład select nrpk from zespoły union from tematy
select nrpk from zespoły union all from tematy Fraza UNION - przykład select nrpk from zespoły union all from tematy
Fraza INTERSECT - przykład select nrpk from zespoły intersect from tematy
select nrpk from zespoły minus from tematy Fraza MINUS - przykład select nrpk from zespoły minus from tematy