Rozdział 2: Język bazy danych - SQL (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-1
Wprowadzenie do języka SQL język dostępu do bazy danych język deklaratywny grupy poleceń języka: DQL (ang. Data Query Language) DML (ang. Data Manipulation Language) DDL (ang. Data Definition Language) DCL (ang. Data Control Language) polecenie SQL może być zapisane: w jednym bądź wielu wierszach dużymi lub małymi literami polecenie SQL kończymy średnikiem SELECT * FROM pracownicy; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-2
Wyrażenia arytmetyczne Projekcja wybór wartości określonych atrybutów relacji SELECT nazwisko, etat FROM pracownicy; Wyrażenia arytmetyczne operatory arytmetyczne +, -, *, / SELECT nazwisko, placa_pod*12, placa_dod+200 FROM pracownicy; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-3
Aliasy atrybutów relacji Operator konkatenacji - || alias - alternatywna nazwa atrybutu SELECT nazwisko, placa_pod*12 roczna_placa, placa_dod+200 "nowe dodatki" FROM pracownicy; Operator konkatenacji - || umożliwia łączenie wartości wyświetlanych atrybutów SELECT 'Pracownik ' || nazwisko FROM pracownicy; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-4
Eliminowanie duplikatów Obsługa wartości pustych funkcja NVL o następującej specyfikacji NVL (wyrażenie, wartość) SELECT nazwisko, placa_pod*12 + placa_dod FROM pracownicy; SELECT nazwisko, placa_pod*12 + NVL (placa_dod, 0) FROM pracownicy; Eliminowanie duplikatów słowo kluczowe DISTINCT SELECT etat FROM pracownicy; SELECT DISTINCT etat FROM pracownicy; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-5
Edycja poleceń input tekst rozszerza bufor o wiersz tekst change /stary/nowy zamienia łańcuch znaków stary na nowy w bieżącym wierszu bufora list wyświetla zawartość bufora list n wyświetla wiersz bufora o numerze n del kasuje bieżący wiersz bufora poleceń run wyświetla i wykonuje polecenie przechowywane w buforze Inne polecenia: append tekst rozszerza bieżący wiersz bufora o tekst; clear buffer kasuje zawartość bufora poleceń; spool nazwa pliku powoduje monitorowanie kolejnych poleceń i (lub) wyświetlanych wyników oraz ich zapis do pliku dyskowego, standardowym rozszerzeniem nazwy pliku jest .lis; spool off kończy monitorowanie poleceń i zamyka plik dyskowy; / wykonuje polecenia zawarte w buforze; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-6
Edycja poleceń cd. save nazwa_pliku zapisuje zawartość bufora w pliku tekstowym get nazwa_pliku wczytuje do bufora zawartość pliku edit umożliwia edycję zawartości bufora za pomocą edytora tekstowego (zmienna _EDITOR) start nazwa_pliku wykonuje polecenia zawarte w pliku @nazwa_pliku wykonuje polecenia zawarte w pliku describe nazwa_relacji wyświetla schemat relacji exit kończy sesję użytkownika spool nazwa_pliku zapisuje w pliku informacje pojawiające się na ekranie spool off kończy zapisywanie do pliku (c) 1999, Instytut Informatyki Politechniki Poznańskiej
Porządkowanie wyników zapytania klauzula ORDER BY kolejność sortowania - słowo kluczowe ASC lub DESC ORDER BY występuje zawsze jako ostatnia klauzula zapytania SELECT nazwisko, etat FROM pracownicy ORDER BY etat DESC, nazwisko ASC; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-8
Selekcja krotek relacji klauzula WHERE składnia polecenia SELECT atrybut1, atrybut2, ... FROM relacja WHERE atrybutm operator wartość Operatory operatory matematyczne =, !=, <>, >, >=, <, <= SELECT nazwisko, placa_pod, etat FROM pracownicy WHERE placa_pod > 400; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-9
Operatory cd. operatory SQL BETWEEN ... AND ... SELECT nazwisko, placa_pod, etat FROM pracownicy WHERE placa_pod BETWEEN 900 AND 1200; IN SELECT nazwisko, placa_pod, id_zesp FROM pracownicy WHERE etat IN ('PROFESOR', 'DYREKTOR'); (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-10
Operatory cd. LIKE SELECT nazwisko, placa_pod, id_zesp FROM pracownicy WHERE nazwisko LIKE 'M%'; IS NULL SELECT nazwisko, placa_pod FROM pracownicy WHERE placa_dod IS NULL; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-11
Operatory cd. negacje operatorów SQL NOT BETWEEN ... AND ... NOT IN NOT LIKE IS NOT NULL SELECT nazwisko, placa_pod, id_zesp FROM pracownicy WHERE etat NOT IN ('PROFESOR', 'DYREKTOR'); (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-12
Warunki złożone klauzuli WHERE operatory logiczne w klauzuli WHERE AND OR SELECT nazwisko, placa_pod, id_zesp FROM pracownicy WHERE etat = 'ASYSTENT' AND placa_pod > 400; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-13
Warunki złożone klauzuli WHERE cd. operatory logiczne mogą być stosowane jednocześnie w tej samej klauzuli WHERE AND posiada wyższy priorytet niż OR zmiana priorytetu jest możliwa za pomocą nawiasów SELECT nazwisko, etat FROM pracownicy WHERE placa_pod > 500 AND etat = 'ADIUNKT' OR etat = 'ASYSTENT'; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-14
Zadania 2-1. Wyświetl wszystkich pracowników o zarobkach z przedziału <300,800>. select nazwisko, id_zesp, placa_pod from pracownicy where placa_pod between 300 and 800; 2-2. Wyświetl całość informacji o pracownikach zespołów 10 i 20, zgodnie z alfabetycznym porządkiem nazwisk. select * from pracownicy where id_zesp in (10, 20) order by nazwisko; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-15
Zadania cd. 2-3. Wyświetl wszystkich pracowników o nazwiskach rozpoczynających się od liter KO i JE. select nazwisko from pracownicy where nazwisko like 'KO%' or nazwisko like 'JE%'; 2-4. Wyświetl nazwiska, etaty i płace podstawowe pracowników , którzy mają przełożonych. select nazwisko, etat, placa_pod where id_szefa is not null; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-16
Zadania cd. 2-5. Wyświetl nazwiska i etaty wszystkich asystentów zespołu 20 w porządku leksykograficznym nazwisk. select nazwisko, etat from pracownicy where etat='ASYSTENT' and id_zesp=20 order by nazwisko asc; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-17
Zadania cd. 2-6. Wyświetl nazwiska i roczne wynagrodzenie wszystkich pracowników zatrudnionych w roku 1992 i 1993, w kolejności malejącego wynagrodzenia. PRACOWNIK ROCZNE_ZAROBKI ----------------------------------- ---------------------------- HAPKE(ASYSTENT) 6840 JEZIERSKI (ASYSTENT) 6242.4 ......................................... ........... select nazwisko||' ('||etat||')' pracownik, 12*(placa_pod+nvl(placa_dod,0)) roczne_zarobki from pracownicy where zatrudniony like '%92' or zatrudniony like '%93' order by 2 desc; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-18
Funkcje grupowe operują na podzbiorach krotek relacji, nazywanych grupami wyznaczają wartość operując na atrybutach wielu krotek funkcje: avg ([distinct|all] wyrażenie) count ([distinct|all] wyrażenie) max ([distinct|all] wyrażenie) min ([distinct|all] wyrażenie) sum ([distinct|all] wyrażenie) SELECT AVG(placa_pod) FROM pracownicy; SELECT count(*) FROM pracownicy WHERE id_zesp=20; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-19
Podział krotek na grupy - klauzula GROUP BY wyznacz średnie płace w każdej z grup zespołowych SELECT id_zesp, avg(placa_pod) FROM pracownicy GROUP BY id_zesp; Podział grup na podgrupy wyznacz średnie płace w każdej z grup etatowych dla poszczególnych zespołów Uwaga: wszystkie atrybuty wymienione w klauzuli SELECT muszą się również znaleźć w klauzuli GROUP BY. Nie dotyczy to atrybutów będących argumentami wywołania funkcji grupowych. SELECT id_zesp, etat, avg(placa_pod) FROM pracownicy GROUP BY id_zesp, etat; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-20
Klauzula HAVING wybór grup spełniających określone warunki wyświetl grupy etatowe, których suma płac podstawowych przekracza 4000 PLN SELECT etat, sum(placa_pod) FROM pracownicy GROUP BY etat HAVING sum(placa_pod) > 4000; wyświetl maksymalne płace w ramach grup etatowych, z pominięciem grupy adiunktów SELECT etat, max(placa_pod) FROM pracownicy WHERE etat != 'ADIUNKT' GROUP BY etat; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-21
Zadania 2-7. Wyświetl liczbę pracowników zatrudnionych na etacie profesora. select count(*) profesorowie from pracownicy where etat='PROFESOR'; 2-8. Wyświetl przeciętną, miesięczną płacę oraz przeciętne roczne zarobki każdej grupy etatowej (uwzględnij płacę dodatkową). select etat, avg(placa_pod) srednia_placa_pod, avg(12*(placa_pod+nvl(placa_dod,0))) roczne_zarobki group by etat; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-22
Zadania cd. 2-9. Wyświetl numery zespołów zatrudniających powyżej 3 pracowników. select id_zesp, count(*) liczba_pracownikow from pracownicy group by id_zesp having count(*)>3; 2-10. Sprawdź, czy wszystkie numery pracowników są unikalne. select id_prac group by id_prac having count(*)>1; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-23
Zadania cd. 2-11. Dla każdego szefa wyświetl płacę najmniej zarabiającego podwładnego. Pomiń grupy, w których minimalna płaca jest niższa od 300 zł. Uporządkuj wyniki według malejących zarobków. select id_szefa, min(placa_pod) from pracownicy group by id_szefa having min(placa_pod)>300 order by min(placa_pod) desc; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-24
Połączenie równościowe PRACOWNICY id_prac nazwisko id_zesp 180 MAREK 10 200 ZAKRZEWICZ 30 210 BIAŁY 30 ZESPOLY id_zesp nazwa 10 ADMINISTRACJA 30 SYSTEMY EKSPERCKIE SELECT nazwisko, z.id_zesp, nazwa FROM pracownicy p, zespoly z WHERE p.id_zesp = z.id_zesp; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-25
Połączenie nierównościowe PRACOWNICY id_prac nazwisko placa_pod 180 MAREK 410.2 200 ZAKRZEWICZ 208 ETATY nazwa placa_min placa_max SEKRETARKA 270 270 450 STAŻYSTA 150 250 SELECT nazwisko, nazwa FROM pracownicy, etaty WHERE placa_pod BETWEEN placa_min AND placa_max; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-26
Połączenie zewnętrzne SELECT z.id_zesp, z.nazwa, p.nazwisko FROM pracownicy p, zespoly z WHERE p.id_zesp = z.id_zesp; Zespół 50 - BADANIA OPERACYJNE nie zostanie wyświetlony Zadanie: wyświetlić wszystkie zespoły, nawet te, które nie zatrudniają pracowników (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-27
Połączenie zewnętrzne cd. id_zesp nazwa nazwisko id_zesp 10 ADMINISTRACJA MAREK 10 20 SYSTEMY ROZPROSZONE JEZIERSKI 20 50 BADANIA OPERACYJNE KONOPKA 20 ??? SELECT z.id_zesp, z.nazwa, p.nazwisko FROM pracownicy p, zespoly z WHERE p.id_zesp (+) = z.id_zesp; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-28
Połączenie zewnętrzne cd. id_zesp nazwa nazwisko id_zesp 10 ADMINISTRACJA MAREK 10 20 SYSTEMY ROZPORSZONE JEZIERSKI 20 KONOPKA 20 ??? KIWLENKO SELECT z.id_zesp, z.nazwa, p.nazwisko FROM pracownicy p, zespoly z WHERE p.id_zesp = z.id_zesp (+); (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-29
Połączenie zwrotne relacji id_prac nazwisko id_szefa Pracownicy 130 BRZEZIŃSKI 100 140 MORZY 130 190 MATYSIAK 140 P S id_prac nazwisko id_szefa id_prac nazwisko id_szefa 130 BRZEZIŃSKI 100 130 BRZEZIŃSKI 100 140 MORZY 130 140 MORZY 130 190 MATYSIAK 140 190 MATYSIAK 140 SELECT p.nazwisko, s.nazwisko FROM pracownicy p, pracownicy s WHERE p.id_szefa = s.id_prac; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-30
Zadania 2-12. Wyświetl wszystkich pracowników z ul. Piotrowo 3a; wyniki uporządkuj według nazwisk pracowników. select nazwisko, adres from pracownicy p, zespoly z where (z.adres = 'PIOTROWO 3A') and (p.id_zesp = z.id_zesp) order by nazwisko; 2-13. Wyświetl nazwiska, miejsca pracy oraz nazwy zespołów tych pracowników, których miesięczna pensja przekracza 400. select nazwisko, adres, nazwa from pracownicy p, zespoly z where(placa_pod > 400) and (p.id_zesp = z.id_zesp); (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-31
Zadania cd. 2-14. Wyświetl nazwiska, etaty, wynagrodzenia, kategorie płacowe i nazwy zespołów pracowników nie będących asystentami. Wyniki uszereguj zgodnie z malejącym wynagrodzeniem. select nazwisko, etat, placa_pod, e.nazwa kategoria, z.nazwa zespol from pracownicy p, etaty e, zespoly z where (etat <> 'ASYSTENT') and (p.id_zesp = z.id_zesp) and (placa_pod between placa_min and placa_max) order by placa_pod desc; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-32
Zadania cd. 2-15. Wyświetl zespoły nie zatrudniające pracowników. select z.nazwa zespol from pracownicy p, zespoly z where (p.id_zesp(+) = z.id_zesp) and (p.id_prac is null); 2-16. Wyświetl nazwiska i numery pracowników wraz z numerami i nazwiskami ich szefów. select p.id_prac, p.nazwisko podwladny, s.id_prac, s.nazwisko szef from pracownicy p, pracownicy s where p.id_szefa = s.id_prac; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-33
Zadania cd. 2-17. W zleceniu z powyższego zadania dokonaj modyfikacji umożliwiających wyświetlenie pracownika WĘGLARZ, który nie ma szefa. select p.id_prac, p.nazwisko podwladny, s.id_prac, s.nazwisko szef from pracownicy p, pracownicy s where p.id_szefa = s.id_prac(+); (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-34
Operatory zbiorowe UNION suma zbiorów eliminuje duplikaty UNION ALL nie eliminuje duplikatów INTERSECT część wspólna zbiorów MINUS różnica zbiorów SELECT etat FROM pracownicy WHERE id_zesp = 10 UNION WHERE id_zesp = 30; ORDER BY 1; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-35
Reguły stosowania operatorów zbiorowych w łączonych operatorami zbiorowymi klauzulach SELECT musi wystąpić ta sama liczba atrybutów typy odpowiednich atrybutów różnych klauzul SELECT muszą być zgodne w wyniku zapytania pojawiają się nazwy atrybutów wyłącznie z pierwszej klauzuli SELECT klauzula ORDER BY może być użyta tylko jako ostatnia klauzula zapytania w klauzuli ORDER BY nie stosujemy nazw atrybutów lecz ich numery porządkowe polecenia SELECT są wykonywane w kolejności ich wystąpienia (od góry do dołu) nawiasy umożliwiają zmianę domyślnej kolejności wykonywania łączonych operatorami zbiorowymi poleceń SELECT (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-36
Zadania 2-18. Znajdź etat, na którym zatrudniono pracownika w drugiej połowie 93r. oraz w drugiej połowie 94 r. select etat from pracownicy where zatrudniony between '01-JUL-93' and '31-DEC-93' intersect between '01-JUL-94' and '31-DEC-94'; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-37
Zadania cd. 2-19. Korzystając z operatorów zbiorowych, wyświetl zespoły niezatrudniające pracowników. select z.id_zesp, z.nazwa from pracownicy p, zespoly z where p.id_zesp(+)=z.id_zesp minus where p.id_zesp=z.id_zesp; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-38
Podzapytania podzapytanie jest poleceniem SELECT zagnieżdżonym w innym poleceniu SELECT ogólny format zagnieżdżania zapytań: SELECT atrybut1, atrybut2, ... FROM relacja WHERE atrybut operator (SELECT atrybut WHERE warunek); operator =, !=, <>, >, >=, <, <= IN ANY, ALL (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-39
Reguły zagnieżdżania podzapytań podzapytanie ograniczamy nawiasami i zagnieżdżamy po prawej stronie warunku zapytania zewnętrznego; w podzapytaniu nie używamy klauzuli ORDER BY; klauzula ORDER BY może wystąpić wyłącznie jako ostatnia klauzula najbardziej zewnętrznego zapytania; liczba oraz typy atrybutów występujących w klauzuli SELECT podzapytania musi być zgodna z liczbą i typem atrybutów użytych w warunku zapytania zewnętrznego, tj. zapytania wyższego poziomu zagnieżdżenia; w podzapytaniu można używać operatorów zbiorowych; podzapytania są zawsze wykonywane w kolejności od najgłębiej zagnieżdżonego do najbardziej zewnętrznego. (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-40
Podzapytania wyznaczające jedną krotkę wyznacz pracownika zarabiającego najmniej SELECT nazwisko, etat, placa_pod FROM pracownicy WHERE placa_pod = (SELECT MIN(placa_pod) FROM pracownicy); wyznacz pracownika zarabiającego najmniej w swoim zespole SELECT nazwisko, etat, placa_pod FROM pracownicy WHERE (placa_pod, id_zesp) IN (SELECT MIN(placa_pod), id_zesp GROUP BY id_zesp); (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-41
Podzapytania wyznaczające wiele krotek cd. operator ANY SELECT nazwisko, placa_pod, etat, id_zesp FROM pracownicy WHERE placa_pod > ANY (SELECT DISTINCT placa_pod FROM pracownicy WHERE id_zesp = 30); operator ALL SELECT nazwisko, placa_pod, etat, id_zesp FROM pracownicy WHERE placa_pod > ALL (SELECT DISTINCT placa_pod FROM pracownicy WHERE id_zesp = 30); (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-42
Podzapytania w klauzuli HAVING wyświetl te zespoły, w których średnia płaca podstawowa jest większa niż średnia płaca w zespole trzydziestym SELECT id_zesp, AVG (placa_pod) FROM pracownicy HAVING AVG (placa_pod) > (SELECT AVG (placa_pod) FROM pracownicy WHERE id_zesp = 30) GROUP BY id_zesp; (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-43
Wielopoziomowe zagnieżdżanie zapytań wyświetlić nazwiska i płace pracowników, zarabiających więcej niż wynosi maksymalna płaca w zespole o nazwie ALGORYTMY SELECT nazwisko, placa_pod FROM pracownicy WHERE placa_pod > (SELECT MAX (placa_pod) WHERE id_zesp = (SELECT id_zesp FROM zespoly WHERE nazwa ='ALGORYTMY')); (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-44
Zadania 2-20. Wyświetl najkrócej pracujących pracowników każdego zespołu. Uszereguj wyniki zgodnie z kolejnością zatrudnienia. select id_zesp, nazwisko, zatrudniony from pracownicy where (id_zesp, zatrudniony) in (select id_zesp, max(zatrudniony) from pracownicy group by id_zesp) order by zatrudniony; 2-21. Wyświetl zespoły, które nie zatrudniają pracowników. select id_zesp from zespoly z where id_zesp not in (select distinct id_zesp from pracownicy); (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-45
Zadania cd. 2-22. Wyświetl identyfikator i nazwę zespołu wypłacającego swoim pracownikom najwięcej pieniędzy miesięcznie. select id_zesp, nazwa from zespoly where id_zesp= (select id_zesp from pracownicy group by id_zesp having sum(placa_pod)= (select max(sum(placa_pod)) from pracownicy group by id_zesp) ); (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-46
Podzapytania skorelowane cechy wykonywane dla każdej krotki przeglądanej przez zapytanie zewnętrzne operują na wartościach atrybutów przekazanych przez zapytanie zewnętrzne przykład: wyszukaj pracowników zarabiających więcej niż wynosi średnia pensja w ich zespole (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-47
Podzapytania skorelowane cd. Pracownicy nazwisko placa_pod id_zesp nazwisko placa_pod id_zesp LECH 300 1 LECH 300 1 CZECH 400 1 CZECH 400 1 RUS 400 2 RUS 400 2 PIAST 500 2 PIAST 500 2 SELECT nazwisko, placa_pod, id_zesp FROM pracownicy p WHERE placa_pod > (SELECT AVG(placa_pod) FROM pracownicy WHERE id_zesp = p.id_zesp); (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-48
Podzapytania skorelowane cd. operator EXISTS umożliwia sprawdzenie czy podzapytanie wyznacza jakąkolwiek wartość operator NOT EXISTS przykład: wyszukaj pracowników, którym służbowo podlegają inni pracownicy select id_prac, nazwisko, etat, id_zesp from pracownicy p where exists (select id_prac from pracownicy where id_szefa = p.id_prac); (c) 1999, Instytut Informatyki Politechniki Poznańskiej 2-49