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ą.