13.5.2 Zapytania SQL
1. Wyświetlić nazwisko, etat oraz płacę podstawową pracowników zespołów
10 i 20 zgodnie z alfabetycznym porządkiem nazwisk.
select nazwisko, etat, placa_pod
from pracownicy1
where id_zesp = 10 or id_zesp = 20
order by nazwisko;
NAZWISKO ETAT PLACA_POD
--------------- ---------- ----------------------
koliberek sekretarka 1150
lech dyrektor 3160
misiecki asystent 1400
muszyński adiunkt 1600
palusz asystent 1200
podgajny profesor 2180
rus adiunkt 1750
7 rows selected
2. Wyświetlić nazwiska i etaty wszystkich asystentów zespołu 20.
select nazwisko, etat
from pracownicy1
where id_zesp = 20 and etat = 'asystent';
NAZWISKO ETAT
--------------- ----------
misiecki asystent
palusz asystent
3. Wydać zapytanie powodujące wyświetlenie następujących informacji:
Informacje o pracownikach
------------------------------------------------------------------------------------------------------------------
Pracownik LECH pracuje na etacie DYREKTOR od 01-JAN-71
Pracownik KOLIBEREK pracuje na etacie SEKRETARKA od 20-FEB-83
Pracownik PODGAJNY pracuje na etacie od 01-MAY-75
Pracownik RUS pracuje na etacie ADIUNKT od 15-SEP-79
Pracownik MUSZYŃSKI pracuje na etacie ADIUNKT od 01-MAY-85
Pracownik MISIECKI pracuje na etacie ASYSTENT od 01-MAR-85
Pracownik PALUSZ pracuje na etacie ASYSTENT od 15-SEP-89
Pracownik DELCKI pracuje na etacie PROFESOR od 01-SEP-77
Pracownik MALEJA pracuje na etacie ADIUNKT od 01-JUL-68
Pracownik WARSKI pracuje na etacie ASYSTENT od 15-JUL-87
Pracownik RAJSKI pracuje na etacie STAśYSTA od 01-JUL-90
Pracownik LUBICZ pracuje na etacie ADIUNKT od 01-SEP-83
Pracownik ORKA pracuje na etacie ASYSTENT od 01-APR-88
Pracownik KOLSKI pracuje na etacie STAśYSTA od 01-SEP-91
select 'Pracownik '|| nazwisko , 'pracuje na etacie '|| etat , 'od '|| pracuje_od
from pracownicy1;
'PRACOWNIK'||NAZWISKO 'PRACUJENAETACIE'||ETAT 'OD'||PRACUJE_OD
------------------------- ---------------------------- ----------------
Pracownik lech pracuje na etacie dyrektor od 71/01/01
Pracownik koliberek pracuje na etacie sekretarka od 83/02/20
Pracownik podgajny pracuje na etacie profesor od 75/05/01
Pracownik rus pracuje na etacie adiunkt od 79/09/15
Pracownik muszyński pracuje na etacie adiunkt od 85/05/01
Pracownik misiecki pracuje na etacie asystent od 85/03/01
Pracownik palusz pracuje na etacie asystent od 89/09/15
Pracownik delcki pracuje na etacie profesor od 77/09/01
Pracownik maleja pracuje na etacie adiunkt od 68/07/01
Pracownik warski pracuje na etacie asystent od 87/07/15
Pracownik rajski pracuje na etacie stażysta od 90/07/01
Pracownik lubicz pracuje na etacie adiunkt od 83/09/01
Pracownik orka pracuje na etacie asystent od 88/04/01
Pracownik kolski pracuje na etacie stażysta od 91/09/01
14 rows selected
8. Wyświetlić nazwiska pracowników, nazwy i adresy zespołów pracowników,
których miesięczna pensja przekracza 2000.
select nazwisko, etat adres , id_zesp
from pracownik, zespol
where placa_pod >2000
pracownik.id_zesp = zesp.id_zesp;
Zapytania w języku SQL
1. Wyświetlić wszystkie informacje o pracownikach.
select * from pracownicy;
2. Wyświetlić informacje o imieniu, nazwisku i pensji pracowników.
select imie, nazwisko, pensja from pracownicy;
3. Wyświetlić informacje o imieniu, nazwisku i pensji pracowników, których pensja jest
większa od 1500.
select imie, nazwisko, pensja from pracownicy where pensja > 1500;
4. Wyświetlić zamówienia o wartości z przedziału <1000,3000>, złożone po dniu 10-05-
1991.
select * from zamowienia where data_zamowienia > '91/05/10' and wartosc between 1000 and 3000;
5. Posortuj wynik zadania 4 po datach złożenia zamówienia i po wartościach zamówień.
select * from zamowienia where data_zamowienia > '91/05/10' and wartosc between 1000 and 3000 order by data_zamowienia, wartosc;
6. Wyświetl imię i nazwisko i nazwę etatu pracowników zatrudnionych na etacie
ANALYST.
Wybieramy dane z dwóch tabel, należy zastosować złączenie (odpowiedni warunek w
WHERE lub klauzulę JOIN).
select p.imie, p.nazwisko, e.etat from pracownicy p, etaty e where p.id_etatu = e.id_etatu and e.etat = 'ANALYST';
7. W bazie danych przechowywana jest informacja o zamówieniach złożonych przez
klientów. Wyświetlić nazwę klienta i wartość zamówienia złożonego przez niego, pod
warunkiem, Że wartość zamówienia jest z przedziału <1000,3000> i zamówienie
złożone zostało po dniu 10-05-1991. Posortować wynik po wartościach zamówień.
select k.nazwa, z.wartosc from klienci k , zamowienia z where z.id_klienta = k.id_klienta and z.data_zamowienia > '91.05.10' and z.wartosc between 1000 and 3000 order by z.wartosc ;
8. Wyświetlić średnią wartość zamówienia poszczególnych klientów, z zamówień
otrzymanych z poprzedniego zadania.
Pogrupuj wiersze po nazwie klienta (przed ORDER BY trzeba dopisać: GROUP BY
nazwa); wartość średnią liczy funkcja AVG(wartość) , należy jej użyć zamiast
wyświetlania wartości zamówienia
select k.nazwa, AVG(z.wartosc) as srednia from klienci k, zamowienia z where z.id_klienta = k.id_klienta and z.data_zamowienia > '91.05.10' and z.wartosc between 1000 and 3000 group by k.nazwa order by srednia;
9. Ilu pracowników zatrudnionych jest na poszczególnych etatach ? Pokazać nazwę etatu
i ilość pracowników.
Wybieramy dane z dwóch tabel, należy zastosować złączenie. Zadanie wykonujemy w
dwóch krokach:
1. Wyświetlić nazwę etatu i id_pracownika zatrudnionego na tym etacie
posortowane po nazwie etatu.
select e.etat, p.id_pracownika from etaty e, pracownicy p where e.id_etatu = p.id_etatu order by e.etat;
2. Utworzyć grupy z identycznymi nazwami etatów (GROUP BY etat) i policzyć
ilość id_pracownika w grupie (COUNT(id_pracownika)).
select e.etat, count(p.id_pracownika) from etaty e , pracownicy p where e.id_etatu = p.id_etatu group by e.etat order by e.etat ;
10. Każdy klient obsługiwany jest przez pewnego pracownika. Wyświetlić tabelę
pokazującą imię i nazwisko pracownika oraz ilu klientów obsługuje dany pracownik.
Pracownicy, którzy nie obsługują klientów nie powinni wystąpić w wyniku (tzn. nie
stosujemy złączeń zewnętrznych).
Zadanie wykonujemy podobnie jak poprzednie - używamy grupowania i zliczania
wierszy.
select p.imie, p.nazwisko, count(k.id_klienta) as ile from pracownicy p, klienci k where p.id_pracownika = k.id_pracownika group by p.imie, p.nazwisko;
11. Zmodyfikować poprzednie zadanie w taki sposób, Ŝeby wynik pokazywał ilość
klientów w poszczególnych miastach, np.:
Imię i nazwisko Miasto Ilość klientów
John Smith New York 5
John Smith Boston 4
Należy dodać grupowanie po nazwach miast.
select p.imie, p.nazwisko, k.miasto, count(k.id_klienta) as ile from pracownicy p, klienci k where p.id_pracownika = k.id_pracownika group by p.imie, p.nazwisko, k.miasto;
5