Plan wykładu Spis treści 1 DML - zapytania, część II 1 1.1 Grupowanie................................... 1 1.2 Operatory zbiorowe............................... 5 2 DML - modyfikacja 7 3 DCL - sterowanie danymi 9 4 Źródła 9 1 DML - zapytania, część II 1.1 Grupowanie Klauzula GROUP BY klauzula GROUP BY umożliwia podzielenie relacji na podzbiory - agregację. Pojedynczy podzbiór/grupę stanowią wiersze, dla których kryterium grupowania ma identyczną wartość. Na liście wyrażeń klauzuli SELECT mogą wówczas stanąć jedynie te wyrażenia, które są przedmiotem działania klauzuli GROUP BY, oraz argumenty funkcji agregujących. SELECT rok, Count(nazwisko) FROM studenci GROUP BY rok; SELECT rok,gr_dziekan, Count(nazwisko) FROM studenci GROUP BY rok, gr_dziekan; Grupowanie 1
Grupowanie z wieloma kryteriami Funkcje agregujące Funkcje agregujące pobierają jako dane wejściowe zbiór wartości, a zwracają jedną wartość. Avg([DISTINCT] wyr) - oblicza średnią ze zbioru (opcjonalnie różnych) wartości wyrażenia (pomijając wystąpienia NULL). Count(* [DISTINCT] wyr) - Wywołanie Count(*) zwraca liczbę wszystkich wierszy uzyskanych w wyniku zapytania. Podanie argumentu w postaci wyrażenia spowoduje zwrócenie liczby wierszy, w których wybrane wyrażenie nie przyjęło wartości NULL. Max([DISTINCT] wyr) - Zwraca największą wartość ze zbioru (opcjonalnie pozbawionego powtórzeń) pomijając NULL. Min([DISTINCT] wyr) - Zwraca najmniejszą wartość ze zbioru (opcjonalnie pozbawionego powtórzeń) pomijając NULL. Stdev([DISTINCT] wyr) - Wylicza odchylenie standardowe na zbiorze (opcjonalnie pozbawionym powtórzeń) pomijając NULL. Sum([DISTINCT] wyr) - Wylicza sumę wartości ze zbioru (opcjonalnie pozbawionego powtórzeń) pomijając NULL. Variance(* [DISTINCT] wyr) - Oblicza wariancję wartości ze zbioru (opcjonalnie pozbawionego powtórzeń) pomijając NULL. Klauzula HAVING klauzula HAVING określa warunki, które muszą być spełnione przez podzbiór by został uwzględniony w relacji wynikowej; (warunki zawarte w klazuli WHERE tyczą się relacji przed agregacją, zaś w HAVING po agregacji). 2
SELECT rok, Count(nazwisko) FROM studenci GROUP BY rok HAVING Count(nazwisko) > 100; SELECT rok,gr_dziekan, Count(nazwisko) FROM studenci GROUP BY rok, gr_dziekan HAVING Count(nazwisko) > 20; WHERE kontra HAVING Rozszerzenia klauzuli GROUP BY Oracle: ROLLUP - dla n kryteriów grupowania daje n 1 dodatkowych zestawień; dodatkowe podsumowania uzyskuje poprzez zwijanie ostatnich elementów z listy. Np.: SELECT rok, gr_dziekan, imiona,count(*) FROM studenci GROUP BY ROLLUP(rok, gr_dziekan, imiona); 3
CUBE - dla n kryteriów grupowania daje 2 n zestawień; Np.: SELECT rok, gr_dziekan, imiona,count(*) FROM studenci GROUP BY CUBE(rok, gr_dziekan, imiona); GROUPING SETS - pozwala na jednoznaczne określenie, które z dodatkowych zestawień chcemy uzyskać. Np.: SELECT rok, gr_dziekan, imiona,count(*) FROM studenci GROUP BY GROUPING SETS((rok, gr_dziekan, imiona),()); Grouping(wyr) - Funkcja zwracajaca wartość 1 dla wyrażeń zwijanych dla dodatkowych zestawień.np.: SELECT Grouping(rok), rok, Grouping(gr_dziekan), gr_dziekan, Grouping(imiona), imiona,count(*) FROM studenci GROUP BY CUBE(rok, gr_dziekan, imiona); 4
1.2 Operatory zbiorowe Operatory zbiorowe UNION, INTERSECT, EXCEPT/MINUS używane są do przeprowadzania operacji sumy, przecięcia lub różnicy na dwóch lub więcej kompatybilnych relacjach będących wynikami zapytań. SELECT stanowisko FROM pracownicy WHERE id_dzialu=20 INTERSECT SELECT stanowisko FROM pracownicy WHERE id_dzialu=30; Złączenia Złączenia tabel w języku SQL uzyskuje się poprzez wstawienie więcej niż jednej relacji w klazuli FROM oraz polączenie ich odpowiednim operatorem. Notacja w standardzie ANSI SQL FROM tabela1 [AS alias] {CROSS JOIN { [NATURAL] [typ_laczenia] JOIN tabela2 [AS alias] { ON warunek1 [{AND OR} warunek2] [...] ] USING (atrybut1 [,...]) } } Zdefiniowano następujące typy złączeń: iloczyn kartezjański złączenia naturalne θ-złączenia złaczenia zewnętrzne samozłączenia Iloczyn kartezjański Iloczyn kartezjański daje w wyniku relację składajacą się ze wszystkich możliwych kombinacji krotek obu łączonych relacji. SELECT * FROM pracownicy CROSS JOIN dzialy; 5
Złączenie naturalne Złączenie naturalne daje w wyniku iloczyn kartezjański łączonych relacji ograniczony do tych krotek, dla których atrybuty o tych samych nazwach i typach w obu relacjach miały równe wartości. SELECT * FROM pracownicy NATURAL JOIN dzialy; Złączenie warunkowe θ-złączenie daje w wyniku iloczyn kartezjański łączonych relacji ograniczony do tych krotek, dla których został spełniony warunek θ. SELECT * FROM pracownicy p [INNER] JOIN dzialy d ON (p.id_dzialu = d.id_dzialu); SELECT * FROM pracownicy p [INNER] JOIN dzialy d USING (id_dzialu); Złączenie zewnętrzne Złączenie zewnętrzne rozszerza rezultat złączenia wewnętrznego o te wiersze jednej lub obu tabel, dla których nie odnaleziono odpowiedników w drugiej tabeli. Wiersze stanowiące rozszerzenie są wypełnione wartością NULL. Złączenia zewnętrzne dzielą się na: lewostronne prawostronne pełne SELECT * FROM pracownicy p {LEFT RIGHT FULL} [OUTER] JOIN dzialy d ON (p.id_dzialu = d.id_dzialu); Samozłączenie Samozłączenie złączenie tabeli samej ze sobą. SELECT p.nazwisko, s.nazwisko FROM pracownicy p JOIN pracownicy s ON (p.kierownik = s.nr_akt); 6
Podzapytania Podzapytanie to zapytanie zagnieżdżone w innym zapytaniu, może być zagnieżdżone w klauzulach: SELECT, FROM, WHERE oraz HAVING. Podzapytania są ograniczane nawiasami okrągłymi. Zapytania można zagnieżdżać wielokrotnie. Istnieją dwa typy podzapytań: podzapytanie proste - wykonywane w pierwszej kolejności, jako wynik pośredni trafiają do zapytania zewnętrznego. SELECT nazwisko FROM pracownicy WHERE placa = (SELECT Min(placa) FROM pracownicy); podzapytanie skorelowane - wykonywane dla każdego wiersza z zapytania zewnętrznego. SELECT nazwisko, rok FROM studenci s WHERE data_urodzenia = (SELECT Max(data_urodzenia) FROM studenci WHERE rok = s.rok); 2 DML - modyfikacja Polecenie UPDATE Polecenie UPDATE służy do aktualizacji zawartości wierszy tabel. W klauzuli SET wymieniamy atrybuty, których wartości będą zmieniane. Opcjonalna klauzula WHERE wyznacza kryterium, jakie muszą spełnić wiersze tabeli aby podlegać zmianie. Brak ograniczającego warunku oznacza, że wszystkie wiersze będą zmienione. Składnia: UPDATE {tabela perspektywa} SET {{atrybut = wartosc DEFAULT NULL}, {atrybut = wartosc DEFAULT NULL},...} [WHERE warunek]; Przykłady: UPDATE pracownicy SET placa = placa * 1.1; UPDATE pracownicy SET placa = placa * 1.1 WHERE nr_akt IN (SELECT kierownik FROM pracownicy); 7
Polecenie INSERT Polecenie INSERT pozwala wstawiać do tabeli nowe wiersze. Opcjonalnie można określić listę uzupełnianych atrybutów, w przeciwnym razie należy wypełnić wszystkie. Klauzula VALUES określa wartości jakie będą przypisane atrybutom. Wiersz można wypełnić wartościami zwróconymi przez podzapytanie. Składnia: INSERT INTO {tabela perspektywa} [(atrybut1 [,...] )] {DEFAULT VALUES VALUES (wartosc1 [,...]) SELECT... }; Przykłady: INSERT INTO dzialy VALUES (10, ZARZAD, CZESTOCHOWA ); INSERT INTO pracownicy VALUES (9121, KUKULSKI, DYREKTOR, 8901, To_date( 1991/04/02, yyyy/mm/dd ), NULL, 5000, 1500, NULL, 30); INSERT INTO pracownicy (nr_akt, nazwisko) VALUES (9192, KOWALSKI ); INSERT INTO prac_archiw SELECT * FROM pracownicy WHERE nr_akt = 9192; Polecenie DELETE Polecenie DELETE usuwa wiersze ze wskazanej tabeli, zawiera opcjonalną klauzule WHERE ograniczającą liczbę usuniętych wierszy do tych, które spełniają zadany warunek. Składnia: DELETE FROM {tabela perspektywa} [WHERE warunek]; Przykłady: DELETE FROM stanowiska; DELETE FROM pracownicy WHERE nr_akt = 9192; 8
3 DCL - sterowanie danymi Polecenie COMMIT i ROLLBACK Polecenie COMMIT - polecenie zatwierdzające wprowadzone dane. Dane, które nie zostały zatwierdzone, są widoczne wyłącznie w ramach sesji (w wypadku awarii zmiany zostaną wycofane). Polecenie ROLLBACK umożliwia wycofanie niezatwierdzonych zmian w bazie danych. 4 Źródła Źródła W wykładzie wykorzystano materiały: M. Lentner, Oracle 9i Kompletny podręcznik użytkownika, PJWSTK - W-wa, 2003 J. Gennick, SQL leksykon kieszonkowy, Helion 2004 http://sqlnut.atw.hu/ 9