Bazy danych Zapytania SELECT Dr inż. Paweł Kasprowski pawel@kasprowski.pl
Przykład HAVING Podaj liczebność zespołów dla których najstarszy pracownik urodził się po 1940 select idz, count(*) from prac p group by idz having min(dataur)> 1940
Filtr na grupę Podaj nazwy zespołów w których jest więcej niż jeden pracownik o nazwisku KOWALSKI select z.idz,nazwa from zesp z join prac p on z.idz=p.idz where nazwisko='kowalski' group by z.idz,nazwa having count(*)>1
Filtr na grupę Podaj nazwiska pracowników, którzy mają średnią wypłat z projektu nr 10 większą niż 1000 select nazwisko from wyplaty w join prac p on w.idp=p.idp where idpr=10 group by p.idp,nazwisko having avg(kwota)>1000
Użycie wyrażeń ń Podaj nazwiska pracowników, dla których różnica pomiędzy najwyższą a najniższą wypłatą jest większa niż 1000 select nazwisko from wyplaty w join prac p on w.idp=p.idp group by p.idp,nazwisko having max(kwota)-min(kwota)>1000
Użycie wyrażeń ń Podaj nazwiska pracowników, dla których różnica pomiędzy najwyższą a najniższą wypłatą w projekcie nr 10 jest większa niż 1000 select nazwisko from wyplaty w join prac p on w.idp=p.idp where idpr=10 group by p.idp,nazwisko having max(kwota)-min(kwota)>1000min(kwota)>1000
Użycie wyrażeń ń Podaj nazwiska pracowników, dla których różnica pomiędzy najwyższą a najniższą wypłatą w projekcie DYSK jest większa niż 1000 select nazwisko from wyplaty w join prac p on w.idp=p.idp join projekty pr on pr.idpr=w.idpr where nazwa='dysk'' group by p.idp,nazwisko having max(kwota)-min(kwota)>1000
Zagnieżdżenia i Podaj nazwiska pracowników, którzy zarobili w sumie więcej niż 4000 select nazwisko from wyplaty w join prac p on w.idp=p.idp group by p.idp,nazwisko having sum(kwota) >4000
Zagnieżdżenia i Podaj nazwiska pracowników, którzy zarobili w sumie więcej niż pracownik MISIURA select nazwisko from wyplaty w join prac p on w.idp=p.idp group by p.idp,nazwisko having sum(kwota) >(suma zarobków MISIURY)
Zagnieżdżenia i Podaj nazwiska pracowników, którzy zarobili w sumie więcej niż pracownik MISIURA select nazwisko from wyplaty w join prac p on w.idp=p.idp group by p.idp,nazwisko having sum(kwota) >( select sum(kwota) from wyplaty w join prac p on w.idp=p.idp where nazwisko='misiura'' )
Przykłady zapytań ń (24) Podaj pracowników, którzy mają wypłatę w każdym projekcie select nazwisko from pracownicy p where not exists( select * from projekty pr where not exists( select * from wyplaty where idp = p.idp and idpr = pr.idpr)) Podwójne zagnieżdżenie!
Przykłady zapytań ń (24a) Podaj pracowników, którzy mają wypłatę w każdym projekcie liczba projektów w których mają wypłaty jest równa całkowietej liczbie projektów select nazwisko from pracownicy p join wyplaty w on p.idp=w.idp group by idp,nazwisko having count(distinct idpr)=(liczba wszyskich projektów)
Przykłady zapytań ń (24a) Podaj pracowników, którzy mają wypłatę w każdym projekcie liczba projektów w których mają wypłaty jest równa całkowietej liczbie projektów select nazwisko from pracownicy p join wyplaty w on p.idp=w.idp group by idp,nazwisko having count(distinct idpr)=(select count(*) from projekty)
Widoki (perspektywy) Wirtualne tabele oparte na zapytaniach SQL CREATE VIEW <nazwa>[<nazwy kolumn>] AS <select> Wszelkie zmiany w tabelach bazowych są od razu widoczne w widoku Widoczny jak zwykła tabela Nasz przykład: create view ildzieci as select idp, count(*) as ldz from dzieci group by idp select avg(ldz) from ildzieci
Zalety widoków Uproszczenie częstych zapytań Przyspieszenie i zapytań ń (dla widoków materializowanych) Uproszczenie ograniczenia dostępu do danych Ukrycie prawdziwej struktury bazy Lepsza kontrola aktualizacji ali acji
Aktualizacja widoków Widok do aktualizacji nie może zawierać: agregacji group by / having distinct union (Oracle aktualizuje UNION ALL) Powinien być oparty na jednej j tabeli - standard rozszerzany w niektórych serwerach (np. Oracle, SQL Server) Nieaktualizowalne widoki mogą być aktualizowane za pomocą triggerów
Więzy referencyjne Daklaracje kluczy głównych i obcych Deklaracja klucza głównego zapewnia unikalność w ramach klucza (SZBD tym się zajmuje) Deklaracja klucza obcego wiąże dany atrybut (kolumnę) z innym atrybutem w innej ą y y ( ę) y y j tabeli
Więzy referencyjne Klucze: PRIMARY KEY i FOREIGN KEY Składnia: CREATE TABLE prac( ) idp int PRIMARY KEY,..., idz int FOREIGN KEY REFERENCES zespoly(idz) [ ON DELETE RESTRICT CASCADE SET NULL ] [, ON UPDATE RESTRICT CASCADE SET NULL ]
ON DELETE RESTRICT (domyślne) nie pozwala na usunięcie, jeśli są dzieci CASCADE wraz z rodzicem usuwa wszystkie dzieci SET NULL wpisuje dzieciom NULL w pole FK
Więzy referencyjne Zapewniają spójność danych nie będzie pracownika z nieistniejącego zespołu Opisują strukturę danych i pomagają w jej analizie widać połączenia między tabelami Ułatwiają serwerowi (właściwie optymalizatorowi) wykonanie zapytań wiadomo jak będą wyglądać zapytania
Uprawnienia i Brak jednolitego standardu MySQL użytkownicy definiowani wraz z adresem (adam@domena.pl) SQL Server użytkownicy serwerowi + użytkownicy bazodanowi, schematy, role Oracle schematy, użytkownicy, role Tworzenie uzytkowników CREATE USER <username> IDENTIFIED BY <pass> Nie działa w ten sposób w SQL Server 2000, Centura itd.
Nadawanie uprawnień ń GRANT nadaje uprawnienie GRANT <upr> [ON <obiekt>] TO <user> np. grant select on prac to janek REVOKE zabiera uprawnienie REVOKE <upr> [ON <obiekt>] FROM <user> np. revoke update on prac from janek Uprawnienia do obiektów (tabel, widoków): SELECT, INSERT, UPDATE, DELETE do poleceń, np. CREATE VIEW, DBA, ALTER DATABASE dodanie WITH GRANT OPTION umożliwia delegację uprawnień
Role Rola to grupa użytkowników Użytkownik może ż należeć ż ć do wielu ról Uprawnienia dla ról określa się tak samo jak dla użytkowników Nie w każdym serwerze są dostępne (np. nie w MySQL) Dodatkowe uprawnienie: DENY DENY <upr> [ON <obiekt>] TO <user> Zabrania temu użytkownikowi/roli dostępu niezależnie od innych uprawnień
Dziękuję za uwagę Do zobaczenia... materiały dostępne pod adresem: www.kasprowski.pl pl