Podstawy języka SQL cz. 2 1. Operatory zbiorowe a. UNION suma zbiorów z eliminacją powtórzeń, b. EXCEPT różnica zbiorów z eliminacją powtórzeń, c. INTERSECT część wspólna zbiorów z eliminacją powtórzeń. zapytanie1 UNION EXCEPT INTERSECT zapytanie2 UNION EXCEPT INTERSECT zapytanie3...; 2. Funkcje agregujące i grupujące a. MIN minimum, b. MAX maksimum, c. COUNT liczba wystąpień, d. SUM suma, e. AVG średnia, f. COUNT i. COUNT(*) liczba rekordów, ii. COUNT(wyrażenie) liczba niepustych wartości wyrażenia, g. GROUP BY - definiuje wyrażenie grupujące, h. ORDER BY ASC DSC i. HAVING warunek_logiczny umożliwia wybór grup, spełniających warunek logiczny. Zapytania będą realizowane w oparciu o następującą relację: i. Znajdź minimalną wartość płacy podstawowej osób pracujących na etacie reżysera: SELECT MIN(Pensja_pod) FROM Pracownicy WHERE Etat LIKE 'reżyser';
ii. Znajdź minimalną wartość płacy podstawowej osób pracujących na etacie kaskadera: SELECT MIN(Pensja_pod), MAX(Pensja_pod) FROM Pracownicy WHERE Etat LIKE 'reżyser'; iii. Znajdź średnią wartość płacy podstawowej wśród pracowników każdego zespołu, posortuj wynik wg średniej rosnąco: SELECT Etat, AVG(Pensja_pod) FROM Pracownicy GROUP BY Etat ORDER BY AVG(Pensja_pod); SELECT Etat, AVG(Pensja_pod) FROM Pracownicy GROUP BY Etat ORDER BY 2; iv. Dla każdego etatu znajdź średnią płacę pracowników z danego miasta wynik posortuj wg etatu: SELECT Etat, Adres, AVG(Pensja_pod) FROM Pracownicy GROUP BY Etat, Adres ORDER BY 1; v. Podaj nazwę i średnie płace podstawowe na etatach na których zatrudnionych jest nie mniej niż 2 pracowników: SELECT Etat, AVG(Pensja_pod) FROM Pracownicy GROUP BY Etat HAVING COUNT(*) >=2;
3. Połączenia relacji Na przykładzie poniższej bazy: a. iloczyn kartezjański - wybiera wszystkie możliwe kombinacje zbioru krotek, i. iloczyn kartezjański zbiorów wydawnictwa i książki: SELECT * FROM Wydawnictwa CROSS JOIN Autorzy; SELECT * FROM Wydawnictwa, Autorzy; ii. wyświetl wszystkie kombinacje nazwisk autorów kończących się na s i nazw wydawnictw zaczynających się na S: SELECT Nazwisko, Nazwa FROM Autorzy CROSS JOIN Wydawnictwa WHERE Nazwa LIKE 'S%' AND Nazwisko LIKE '%s'; b. połączenia równościowe, c. połączenia naturalne - to połączenie równościowe relacji, w którym warunki równości dotyczą wszystkich par atrybutów o takich samych nazwach. Podstawową różnicą, pomiędzy zapytaniami równościowymi, a naturalnymi, jest lista atrybutów relacji powstającej w wyniku połączenia. W wyniku połączenia naturalnego atrybut (albo atrybuty) połączeniowe występują tylko raz, podczas gdy w wyniku połączenia równościowego występują oba atrybuty połączeniowe z obu łączonych relacji. i. Wyświetl tytuły książek i nazwę wydawnictw, które je wydały: SELECT Tytuł, Nazwa FROM Wydawnictwa NATURAL JOIN Książki; SELECT Tytuł, Nazwa FROM Wydawnictwa JOIN Książki ON Wydawnictwa.WydID=Książki.WydId; SELECT Tytuł, Nazwa FROM Wydawnictwa JOIN Książki USING(WydId);
ii. Wyświetl numer ISBN, tytuł oraz ilość autorów każdej z książki SELECT k.isbn, k.tytuł, COUNT(*) FROM Książki k NATURAL JOIN Książki_Autorzy KA GROUP BY k.isbn, k.tytuł; d. połączenia nierównościowe - połączeniami, w których warunek połączeniowy nie używa operatora równości, ale dowolny inny operator. Podobnie jak w przypadku połączenia równościowego, w wyniku połączenia nierównościowego powstaje relacja, która zawiera wszystkie atrybuty z obu relacji. e. połączenia zewnętrzne pokazuje wszystkie krotki z jednej, albo z obydwu łączonych relacji znalazły się w wyniku połączenia, nawet takie, które nie spełniają warunków połączenia (nie znalazły pary). Aby móc zachować wszystkie krotki z jednej relacji, do drugiej relacji wprowadzana jest wirtualna krotka, która wypełniona jest wartościami pustymi. Wszystkie krotki z relacji, które nie mogą znaleźć swojej pary, łączone są z "wirtualną" krotką w drugiej relacji. i. Wyświetl ID wydawnictw oraz tytuły i ceny książek które te wydawnictwa wydały: SELECT Tytuł, Wydawnictwa.WydID, Cena FROM Książki RIGHT OUTER JOIN Wydawnictwa ON Książki.WydID = Wydawnictwa.WydID; ii. Wyświetl tytuły i ceny książek oraz ID wydawnictw które te książki wydały: SELECT Tytuł, Wydawnictwa.WydID, Cena FROM Książki NATURAL LEFT JOIN Wydawnictwa;
iii. Wyświetl wszystkie informacje o wydawnictwach w połączeniu ze wszystkimi informacjami o książkach: SELECT * FROM Książki FULL OUTER JOIN Wydawnictwa ON Książki.WydID=Wydawniwnictwa.WydID; f. połączenia zwrotne - łączymy tabelę samą z sobą. Połączeniem zwrotnym może być dowolny typ połączenia (wewnętrzne, zewnętrzne, równościowe i nierównościowe) bez połączenia naturalnego. i. Wyświetlić tytuły książek dla których cena jest mniejsza od ceny The cat : SELECT Tytuł, Cena FROM Książki WHERE Cena<29.00; lub SELECT k.tytuł, k.cena FROM Książki k JOIN Książki kk ON k.cena<kk.cena WHERE kk.tytuł='the cat'; g. połączenia wielu tabel i. Wyświetl informację o tytułach książek i identyfikatorach ich autorów: SELECT Tytuł, AuID FROM Książki LEFT OUTER JOIN Książki_Autorzy ON Książki.ISBN=Książki_Autorzy.ISBN;
ii. Wyświetl informację o tytułach książek oraz imionach i nazwiskach ich autorów: SELECT Tytuł, Imię, Nazwisko FROM Książki LEFT OUTER JOIN Książki_Autorzy ON Książki.ISBN=Książki_Autorzy.ISBN JOIN Autorzy USING(AuID); iii. Wyświetl informację o tytułach książek oraz imionach i nazwiskach ich autorów i nazw wydawnictw, które te książki wydały: SELECT Tytuł, Imię, Nazwisko, Nazwa FROM Książki LEFT OUTER JOIN Książki_Autorzy ON Książki.ISBN=Książki_Autorzy.ISBN JOIN Autorzy USING(AuID) JOIN Wydawnictwa USING(WydID);
4. Podzapytania Ujęte w nawiasy zapytanie, umieszczone wewnątrz innego zapytania (tzw. zapytania zewnętrznego), najczęściej w warunkach klauzul WHERE i HAVING, również w SELECT i FROM (rozwiązania specyficzne). Ogólny schemat stosowania podzapytań: SELECT wyrażenie_a1,... FROM nazwa_relacji_a1 WHERE wyrażenie_a3 operator (SELECT wyrażenie_b1 FROM nazwa_relacji_b1 WHERE...) ORDER BY wyrażenie_a4; a. Wierszowe zwraca zawsze co najwyżej jeden rekord, zawierający jedną lub wiele wartości. i. Dopuszczalne zastosowanie operatorów logicznych: =,!=, <>, >, >=, <, <=. ii. Znajdź tytuł i cenę najtańszej książki (podzapytanie zwraca rekord z jedną wartością): SELECT Tytuł, Cena FROM Książki WHERE Cena =(SELECT MIN(Cena) FROM Książki); b. Tablicowe - zwraca zbiór rekordów zawierających jedną lub wiele wartości. i. Dopuszczalne zastosowanie operatorów: IN, ANY, ALL. ii. Podaj tytuły najdroższych książek wydanych przez poszczególne wydawnictwa: SELECT Tytuł, Cena FROM Książki WHERE Cena IN (SELECT MAX(Cena) FROM Książki GROUP BY WydID); iii. Sprawdź, czy w bazie znajdują się książki droższe od jakiejkolwiek książki wydawnictwa Small House : SELECT Tytuł, Cena FROM Książki WHERE Cena > ANY (SELECT Cena FROM Książki WydID WHERE WydID=3);
iv. Sprawdź, czy w bazie znajdują się książki droższe od książek wydawnictwa Small House : SELECT Tytuł, Cena FROM Książki WHERE Cena > ALL (SELECT Cena FROM Książki WydID WHERE WydID = (SELECT WydID FROM Wydawnictwa WHERE Nazwa Like 'Small House') ); c. Zastosowanie klauzuli HAVING i. Podaj identyfikator i średnią cenę książek, tego wydawnictwa, które nie przekracza średniej ceny wszystkich książek: SELECT WydID, AVG(Cena) FROM Książki GROUP BY(WydID) HAVING AVG(Cena) > (SELECT AVG(Cena) FROM Książki); d. Skorelowane - podzapytanie wykonywane wielokrotnie raz dla każdego rekordu przeglądanego przez zapytanie zewnętrzne. W podzapytaniu odwołanie do wyrażenia z zapytania zewnętrznego. i. Ogólny schemat: SELECT wyrażenie_a1,... FROM nazwa_relacji_a1 WHERE wyrażenie_a2 operator (SELECT wyrażenie_b1 FROM nazwa_relacji_b1 WHERE wyrażenie_b2 = wyrażenie_a3) ORDER BY wyrażenie_a4; ii. Przebieg wykonania: 1. Pobranie rekordu R1 przez zapytanie zewnętrzne. 2. Wykonania podzapytania na podstawie wartości rekordu R1, podzapytanie dostarcza wartości dla warunku W1 zapytania zewnętrznego. 3. Jeśli W1 jest spełniony, R1 trafia do zbioru wynikowego. 4. Jeśli pozostały jeszcze nie pobrane rekordy, przejdź do punktu 1. iii. Podaj tytuły i ceny wszystkich książek, których cena jest większa lub równa średniej cenie książek danego wydawnictwa: SELECT k.tytuł, k.cena FROM Książki k WHERE k.cena >= (SELECT AVG(Cena) FROM Książki WHERE k.wydid=wydid);