Laboratorium 3
Transkrypt
Laboratorium 3
Laboratorium Bazy danych SQL 3 1 F U N K C J E operujące na grupach wierszy: • avg([distinct|all]kol) oblicza średnią arytmetyczną wartości kolumny kol wszystkich wierszy grupy. • count([distinct|all]wyr) wyznacza liczbę wartościowań wyrażenia wyr, w wyniku których uzyskano wartość niepustą. Znak '*' w miejscu wyrażenia wyr powoduje, że wartościowane są wszystkie wiersze grupy (liczność grupy). • max([distinct|all]wyr) wyznacza maksymalną wartość wyr w ramach wierszy grupy. • min([distinct|all]wyr) wyznacza minimalną wartość wyr w ramach wierszy grupy. • stddev([distinct|all]kol) wyznacza odchylenie standardowe wartości kolumny kol. • sum([distinct|all]kol) wyznacza sumę wartości kolumny kol. • variance([distinct|all]kol) wyznacza wariancję wartości kolumny kol. Klauzula group by umożliwia podział wierszy relacji na grupy. Wiersze tej samej grupy mają identyczną wartość atrybutu grupowania, który wskazano w klauzuli. Po podziale, do każdej z grup można zastosować jedną z tzw. funkcji grupowych. Klauzula group by może być stosowana rekurencyjnie w celu wydzielenia podgrup w ramach wcześniej wydzielonych grup. Kolejność dzielenia relacji na grupy i podgrupy odpowiada kolejności kolumn grupowania. Stosowanie funkcji grupowych w klauzuli select wyklucza możliwość wyświetlania wartości n kolumn pojedynczych wierszy chyba, że nazwy n kolumn są wymienione w klauzuli group by. Przykład 1 Powoduje wydzielenie grupy wierszy z relacji pracownik o tej samej wartości id_zesp, a zatem pogrupowanie według identyfikatorów zespołu. Następnie, niezależnie dla każdej grupy, wykonywana jest funkcja grupowania count(*) (count(1)), powodująca zliczenie wierszy w ramach grupy. select id_zesp, count(*) from pracownik group by id_zesp; Przykład 2 Najpierw odrzucane są wiersze reprezentujące dyrektorów. Potem wiersze grupowane są według id_zesp. Następnie, każda z grup jest dzielona na podgrupy według etatu. Na zakończenie, dla każdej podgrupy jest wykonywana funkcja count(). Inaczej mówiąc, określamy liczebność różnych grup etatowych (bez dyrektorów), w ramach wcześniej wydzielonych grup zespołowych. select id_zesp, etat, count(*) Laboratorium Bazy danych SQL 3 2 from pracownik where etat != 'dyrektor' group by id_zesp, etat; Klauzula having pozwala na selekcję informacji, operuje na grupach wierszy otrzymanych w wyniku działania klauzuli group by. Przykład 3 select id_zesp, avg(placa_pod) from pracownik group by id_zesp having count(*) > 3; Zagnieżdżanie zapytań a) tryb nieskorelowany – podzapytanie jest wykonywane jako pierwsze, jednokrotnie, a jego wyniki są przekazywane do zapytania zewnętrznego. select kol_A_1, kol_A_2,... from relacja_A where kol,... operator ( select kol_B,... from relacja_B where warunek ); Gdy podzapytanie wyznacza jeden wiersz (zwykle ograniczony do pojedynczej kolumny w klauzuli select podzapytania), w warunku selekcji zapytania zewnętrznego stosujemy najczęściej jeden z operatorów porównania, np. =, >=, <. Gdy podzapytanie wyznacza więcej niż jeden wiersz, w warunku selekcji zapytania zewnętrznego stosujemy najczęściej operator in. Operatory: all – powoduje porównanie pojedynczej wartości z każdą wartością wyznaczoną przez podzapytanie. Warunek selekcji zapytania zewnętrznego jest spełniony, jeżeli wszystkie wartości listy spełniają ten warunek. Laboratorium Bazy danych SQL 3 3 any – powoduje porównanie pojedynczej wartości (umieszczonej po jego lewej stronie) z każdą wartością wyznaczoną przez podzapytanie. Warunek selekcji zapytania zewnętrznego jest spełniony, jeżeli lista wartości wyznaczonych przez podzapytanie zawiera choć jeden element spełniający ten warunek. UWAGA: liczba wartości wyznaczonych przez podzapytanie oraz ich typ muszą być zgodne z liczbą i typem kolumn użytych w warunku selekcji zapytania zewnętrznego. Przykład 4 select * from pracownik where placa_pod = ( select min(placa_pod) from pracownik ); Przykład 5 select nazwisko, etat from pracownik where etat = ( select etat from pracownik where nazwisko = 'ORKA' ); Przykład 6 select * from pracownik where (placa_pod,id_zesp) in ( select min(placa_pod), id_zesp from pracownik group by id_zesp ); Laboratorium Bazy danych SQL 3 4 b) tryb skorelowany – najpierw wykonywane jest zapytanie zewnętrzne, a dopiero potem podzapytanie z nim skorelowane. Wykonane zostaje dla każdego wiersza przeglądanego przez zapytanie zewnętrzne. W zapytaniu skorelowanym konieczne jest zastosowanie aliasów relacji, na których operuje zapytanie zewnętrzne i odwoływanie się do nich w podzapytaniu. Operatory: exists – sprawdza, czy podzapytanie zwraca wartość. not exists – sprawdza, czy podzapytanie nie wyznacza żadnej wartości. Przykład 7 W podzapytaniu jest wyznaczana przeciętna płaca pracowników zatrudnionych na tym samym etacie, co pracownik analizowany przez zapytanie zewnętrzne. select nazwisko, placa_pod, etat from pracownik p where placa_pod > ( select avg(placa_pod) from pracownik where etat = p.etat ); Przykład 8 Zapytanie wyznacza pracowników, którzy są zatrudnieni na etatach, na których nie jest zatrudniony nikt inny. Ilustracja sposobu użycia operatora not exists. select numer, nazwisko, etat from pracownik p where not exists ( select numer from pracownik where etat = p.etat and numer != p.numer ) order by numer; Laboratorium Bazy danych SQL 3 5 Zagnieżdżanie rekurencyjne Podzapytania nieskorelowane, bez względu na głębokość zagnieżdżenia, są zawsze wykonywane w kolejności od najbardziej zagnieżdżonego do najbardziej zewnętrznego. Odstępstwo od reguły dla podzapytania skorelowanego. Każde podzapytanie ograniczamy nawiasami i zagnieżdżamy po prawej stronie warunku zapytania zewnętrznego (zapytania umieszczonego o jeden poziom wyżej w strukturze zagłębienia). Ponadto przy zagnieżdżaniu wielopoziomowym: • liczba oraz typ kolumn występujących w klauzuli select podzapytania musi być zgodna z liczbą i typem kolumn użytych w warunku zapytania zewnętrznego (zapytania wyższego poziomu zagnieżdżenia); • w podzapytaniach nie używamy klauzuli order by; • klauzula order by może wystąpić wyłącznie jako ostatnia klauzula najbardziej zewnętrznego zapytania; • w podzapytaniu można używać operatorów zbiorowych; w warunkach zapytań zewnętrznych, poza operatorami any i all, można stosować dowolne operatory języka SQL*Plus. Przykład 9 Wyszukujemy pracowników, których zarobki są większe niż najwyższe zarobki w zespole sieci komputerowe. select nazwisko, etat, pracuje_od, placa_pod from pracownik where placa_pod > ( select max(placa_pod) from pracownik where id_zesp = ( select id_zesp from zespol where nazwa = 'sieci komputerowe' ) ); UWAGA: Podzapytania mogą być zagnieżdżane w klauzuli having w celu odrzucenia (przyjęcia) określonych grup krotek w zależności od wyniku podzapytania. Laboratorium Bazy danych SQL 3 6 Zadania do samodzielnego rozwiązania: Zad 1 Wyświetlić minimalne, średnie i maksymalne wynagrodzenie pracowników. Zad 2 Wyświetlić minimalne i maksymalne wynagrodzenie w poszczególnych grupach etatowych. Zad 3 Wyświetlić liczbę profesorów wśród pracowników. Zad 4 Wyświetlić średnią płacę i średni dochód roczny każdej grupy etatowej w trzech kolumnach: 'etat', 'Srednia placa' i 'Sredni dochod roczny', zgodnie z rosnącą wartością średniej płacy. Zad 5 Wyświetlić różnicę między najwyższą i najniższą płacą podstawową. Zad 6 Wyświetlić numery zespołów zatrudniających więcej niż 3 pracowników. Zad 7 Sprawdzić, czy wszystkie numery pracowników są unikalne. Zad 8 Wyświetlić najniższą płacę podstawową pracowników w grupie każdego przełożonego. Pominąć grupy, w których minimalne płace sa niższe od 1000. Wyniki uporządkować według rosnących zarobków. Zad 9 Wypisać nazwisko i płacę podstawową tych pracowników, którzy zarabiają więcej niż każdy pracownik z zespołu 20. Zad 10 Korzystając z podzapytania, wyświetlić zespoły, które nie zatrudniają pracowników. Zad 11 Wyświetlić nazwiska i płace podstawowe pracowników, których płaca podstawowa jest większa od płacy każdego pracownika zespołu 'systemy operacyjne'. Wyniki uszeregować zgodnie z malejącym porządkiem alfabetycznym nazwisk. Zad 12 Wyświetlić powtarzające się nazwiska pracowników, wykorzystać zapytanie skorelowane. Zad 13 Spośród wszystkich pracowników wyświetlić tych, których płaca podstawowa jest największa oraz tych, których płaca podstawowa jest druga co do wielkości. Laboratorium Bazy danych SQL 3 7 PERSPEKTWY Perspektywa jest swego rodzaju „oknem”, przez które odczytujemy lub modyfikujemy dane z tabeli lub zbioru tabel, na których została zdefiniowana. Charakteryzuje się następującymi cechami: • ogranicza zakres dostępnych danych do kolumn i wierszy określonych w definicji perspektywy; • jest definiowana na bazie w co najmniej jednej tabeli lub innej perspektywy; • jest pamiętana w systemie wyłącznie w postaci swojej definicji. Perspektywa nie ma własnych danych – każdorazowe odwołanie się do niej powoduje konieczność zastosowania jej definicji. Perspektywy stosuje się w celu: • ograniczenia dostępu do tabeli bazy danych; • uproszczenia zapytań w stosunku do zapytań kierowanych bezpośrednio do tabeli. Perspektywa prosta – udostępnia dane z pojedynczej tabeli, a w jej definicji nie stosuje się operacji na zbiorach, funkcji ani też grupowania wierszy. Przez perspektywę prostą można pobierać i modyfikować dane. Perspektywa złożona – udostępnia dane wielu tabel oraz operacje na zbiorach, łączenie tabel, funkcje i grupowanie wierszy. Jeżeli ciało polecenia select wykorzystuje: operatory zbiorowe, funkcje, klauzule group by, connect by, start with, operator distinct, to do perspektywy można kierować tylko polecenie select. Perspektywa złożona bazująca na wielu tabelach i wykorzystująca operacje połączenia umożliwia w ograniczonym zakresie wstawianie, modyfikowanie i usuwanie danych. Polecenie jest możliwe tylko wówczas, gdy dotyczy ono danych znajdujących się tylko w jednej tabeli. Wstawianie wierszy do tabeli bazowej jest możliwe tylko wtedy, gdy perspektywa umożliwia dostęp do wszystkich obowiązkowych kolumn tabeli bazowej. Klauzula with check option uniemożliwia wstawianie i modyfikowanie wierszy w sposób niezgodny z warunkami selekcji perspektywy. create [or replace] view nazwa_perspektywy [(atr1, atr2, …)] as select ciało_polecenia_select [with check option]; Laboratorium Bazy danych SQL 3 8 Przykład 10 create view asystenci as select numer, nazwisko from pracownik where etat = 'asystent'; Przykład 11 create view pods_zesp(nazwa, placa_min,placa_max,placa_przec) as select nazwa, min(placa_pod), max(placa_pod), avg(placa_pod) from pracownik, zespol where pracownik.id_zesp = zespol.id_zesp group by nazwa; Aby usunąć perspektywy stosujemy polecenie: drop view nazwa_perspektywy; Tworzenie tabeli jako kopii istniejących danych. CREATE TABLE nazwa_tabeli (def_kolumny[, ...]) AS SELECT …; Przykład 12 CREATE TABLE A (id_zesp int primary key, nazwa varchar(50)) AS SELECT id_zesp, nazwa FROM zespol WHERE id_zesp < 50; Laboratorium Bazy danych SQL 3 9 Zadania do samodzielnego rozwiązania: Zad.1 Utworzyć tabelę N zawierającą kolumny numer int primary key, nazwisko varchar(20) not null. Wpisać numery oraz nazwiska tych pracowników z tabeli pracownik, których etat zawiera literę 'a' na dowolnym miejscu oraz płaca podstawowa nie przekracza 3000. Zad.2 Dodać do tabeli N kolumnę placa_pod jako liczba rzeczywista 6 cyfrowa z 2 miejscami po przecinku. Przekopiować do kolumny placa_pod w tabeli N płacę podstawową tych pracowników z tabeli pracownik, którzy są w tabeli N. Zad.3 Zmodyfikować płacę podstawową tym pracownikom z tabeli pracownik, którzy są też w tabeli N, na wartość minimalnej płacy podstawowej tych pracowników z tabeli N, których pierwsza litera nazwiska zgodna jest z pierwszą literą nazwiska pracownika o numerze 1001. Zad.4 Do tabeli N dodać, o ile nie istnieją, tych pracowników z tabeli pracownik, którzy zatrudnieni zostali przed '1978-01-01' i są profesorami. Zad.5 Podnieść pensję do średniej płacy podstawowej pracowników z tabeli pracownik tym pracownikom w tabeli N, których płaca podstawowa jest równa minimalnej płacy podstawowej pracowników z tabeli pracownik. Zad.6 Uaktualnić pensję dodatkową pracownikom z tabeli pracownik, którzy zatrudnieni są w zespole o identyfikatorze 20. Nowa pensja ma być równa średniej pensji podstawowej spośród tych pracowników w tabeli N, którzy zarabiają mniej niż 'DELECKI'. Zad.7 Zwiększyć płacę podstawową pracownikom z tabeli pracownik do 120% średniej płacy podstawowej pracowników z tabeli N. Operacji dokonać tylko dla pracowników zatrudnionych po 1989 roku. Zad.8 Usunąć z tabeli N pracowników, których płaca podstawowa nie przekracza 1500 lub jest wyższa od 2500. Zad.9 Utworzyć perspektywę adiunkci udostępniającą informacje (numer, nazwisko, etat) o pracownikach zatrudnionych na etacie adiunkta. Zad.10 Usunąć utworzone dotychczas perspektywy. Zad.11 Zdefiniować perspektywę wyświetlającą wszystkich przełożonych i nazwy zespołów, w których pracują.