Laboratorium 2

Transkrypt

Laboratorium 2
Laboratorium Bazy danych SQL 2
Klauzula order by – występuje jako ostatnia klauzula w poleceniu select, powoduje posortowanie
wierszy będących wynikiem zapytania według wartości atrybutu w niej wskazanego. Domyślnie
sortowanie jest według narastającego porządku (asc), desc sortuje malejąco.
select...
from...
where...
ORDER BY nazwy(a)_kolumn(y) lub numer(y)_kolumn(y) [ASC/DESC];
Przykład 1
select distinct nazwisko, etat from pracownik order by nazwisko;
select distinct nazwisko, etat from pracownik order by 1, 2 desc;
Łączenie poziome relacji:
Z reguły łączy się tabele na podstawie wartości wspólnego atrybutu, na przykład wartości pary
klucz podstawowy – klucz obcy. W takim przypadku musimy użyć jednoznacznego identyfikatora
kolumny. Ponieważ nazwy kolumn zawierających klucz podstawowy i obcy najczęściej są takie
same, musimy poprzedzać nazwy kolumn nazwami tabel. Możemy poprawić czytelność zapytania,
stosując aliasy dla nazw tabel.
Tabele łączymy zgodnie z następującymi wskazówkami:
1. Staramy się łączyć tabele za pomocą kolumn przechowujących parę kluczy podstawowyklucz obcy.
2. Do złączenia używamy całych kluczy podstawowych tabel. Jeżeli dla jakiejś tabeli
zdefiniowano złożony (składający się z kilku atrybutów) klucz podstawowy, łącząc taką
tabelę, odwołujemy się do całego klucza.
3. Łączymy obiekty za pomocą kolumn tego samego typu.
4. Poprzedzamy nazwy kolumn aliasem nazwy obiektu źródłowego, nawet jeżeli nazwy te są
unikatowe — w ten sposób poprawimy czytelność zapytania.
5. Ograniczamy liczbę łączonych obiektów do niezbędnego minimum.
•
iloczyn kartezjański: łączone iloczynem kartezjańskim relacje wymienia się kolejno w
klauzuli from oddzielając je przecinkami.
Przykład 2
select *
from zespol, etat;
1
Laboratorium Bazy danych SQL 2
•
połączenie (JOIN): wiersze jednej relacji łączone są z wierszami innej relacji tylko wtedy,
gdy wartości korespondujących atrybutów tych wierszy spełniają określony warunek.
◦ … INNER JOIN... ON | USING … – złączenie wewnętrzne
◦ … NATURAL JOIN … – złączenie naturalne
Przykład 3
select nazwisko, nazwa
from pracownik, etat
where etat = nazwa;
Przykład 4
select nazwisko, nazwa
from pracownik p, zespol z
where p.id_zesp = z.id_zesp;
Przykład 5
select nazwisko, nazwa
from pracownik INNER JOIN etat ON (etat = nazwa);
Przykład 6
select nazwisko, nazwa
from pracownik p INNER JOIN zespol z ON p.id_zesp = z.id_zesp;
Przykład 7
select nazwisko, nazwa
from pracownik INNER JOIN zespol USING (id_zesp);
•
połączenie zewnętrzne: LEFT | RIGHT OUTER JOIN – złączenie zewnętrzne;
wiersze nie spełniające warunku połączenia mogą być wyświetlone w wyniku zapytania, np.
operator połączenia zewnętrznego stosujemy, gdy po jednej stronie w tabeli brakuje krotek
umożliwiających wyświetlenie wszystkich krotek drugiej relacji (po połączeniu). Powoduje
on utworzenie dodatkowych pustych krotek w niepełnej relacji. Liczba pustych krotek jest
równa liczbie krotek, które nie spełniają warunków klasycznego połączenia.
Przykład 8 W tabeli zespol istnieją wiersze, do których nie odwołujemy się w tabeli pracownik.
insert into zespol values(100, 'aaa','bbb');
insert into zespol values(101, 'ccc','ddd');
select nazwisko, nazwa
from pracownik p RIGHT OUTER JOIN zespol z USING (id_zesp);
2
Laboratorium Bazy danych SQL 2
UWAGA: Dla połączenia n relacji jest konieczne zdefiniowanie n-1 warunków połączenia.
Łączenie pionowe relacji:
W celu pionowego połączenia relacji stosujemy operator zbiorowy sumy (union, uinion all).
Operator ten działa na wynikach co najmniej dwóch operacji select. W łączonych operatorem
zbiorowym klauzulach select musi wystąpić ta sama liczba kolumn o typach zgodnych. W wyniku
zapytania pojawią się nazwy atrybutów wyłącznie z pierwszej klauzuli select. Polecenia select
wykonywane są w kolejności ich wystąpienia (od góry do dołu). W celu zmiany tej kolejności
stosujemy nawiasy. Jeśli wystąpi potrzeba użycia klauzuli order by, to musi ona wystąpić jako
ostatnia klauzula zapytania. Ponadto, w klauzuli order by nie stosujemy nazw kolumn, lecz ich
numery porządkowe.
select k_1, ..., k_n
from r_1
where warunki
operator
select k_1, ..., k_n
from r_2
where warunki
order by 1,...,n;
Przykład 9.
select etat from pracownik where id_zesp = 10
union all
select etat from pracownik where id_zesp = 30
order by 1 desc;
3
Laboratorium Bazy danych SQL 2
Zadania do samodzielnego rozwiązania:
Zad.1 Wyświetlić wszystkie informacje o pracownikach i posortować w pierwszej kolejności
rosnąco według identyfikatora zespołu potem malejąco według płacy podstawowej.
Zad.2 Wyświetlić nazwiska i roczne wynagrodzenie pracowników, nie uwzględniać płacy
dodatkowej (nadać kolumnie nazwę WYNAGRODZENIE). Wiersze uporządkować w malejącej
kolejności wynagrodzenia, pracowników wynagradzanych tak samo uporządkować w rosnącej
kolejności nazwisk.
Zad.3 Wyświetlić wszystkie informacje o tych etatach, których średnia z płacy minimalnej oraz
maksymalnej jest z przedziału 1000 do 1500. Wiersze uporządkować malejąco według nazwy etatu.
Zad.4 Wyświetlić nazwiska, nazwę etatu oraz nazwę zespołu z połączonych tabel: pracownik,
zespol i etat.
Zad.5 Wyświetlić nazwiska pracowników, nazwy i adresy zespołów pracowników, których
miesięczna pensja przekracza 2000.
Zad.6 Wyświetlić pracowników z ul. ..., w rosnącym porządku alfabetycznym ich nazwisk.
Zad.7 Wyświetlić zespoły, które nie zatrudniają pracowników.
Zad.8 Wyświetlić numery i nazwiska pracowników i ich przełożonych. Wyświetlić również
pracowników, którzy nie mają przełożonych. Wyniki uporządkować zgodnie z rosnącym
porządkiem alfabetycznym nazwisk przełożonych.
Zad.9 Wyświetlić pracowników zatrudnionych przed ich przełożonymi.
Zad.10 Wyświetlić pracowników, którzy zarabiają więcej niż Warski.
Zad.11 Wyświetlić nazwiska i płace podstawowe pracowników. Ponadto, jeśli płaca podstawowa
jest mniejsza od 1400, wyświetlić tekst:'poniżej 1400', jeśli płaca podstawowa jest równa 1400,
wyświetlić tekst:'1400' natomiast jeśli płaca podstawowa jest większa od 1400, wyświetlić
tekst:'powyżej 1400'. Uporządkować wiersze rosnąco według płacy podstawowej.
4
Laboratorium Bazy danych SQL 2
FUNKCJE WBUDOWANE (http://dev.mysql.com/doc/)
Zad.12 W trakcie porównywania łańcuchów MySQL nie uwzględnia wielkości liter. Przykładowo
poniższe polecenie zwróci jeden rekord, mimo że nazwisko pracownika jest napisane bez dbałości o
zachowanie wielkości liter:
SELECT nazwisko, etat FROM pracownik WHERE nazwisko LIKE ’WarSKi’;
Inny sposób wyświetlania danych:
SELECT nazwisko, etat FROM pracownik WHERE nazwisko LIKE ’WarSKi’ \G
Należy zmodyfikować powyższe zapytanie SQL tak, aby wielkość liter była honorowana. Ponadto
należy odnaleźć w dokumentacji informacje jak można zdefiniować kolumnę łańcuchową (CHAR,
VARCHAR TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT), aby na trwałe wymusić
uwzględnianie wielkości liter. Utworzyć następnie przykładową tabelę oraz sprawdzić „nieczułość”
na wielkość liter.
Zad.13 Wyświetlić połączone dane o pracowniku. Użyć funkcji CONCAT.
Zad.14 Wyświetlić dane o pracowniku, których nazwiska zaczynają się na literę D. Wyświetlany
tekst ma zostać uzupełniony do 20 znaków (policz to) sekwencją znaków #*. Należy użyć funkcji
RPAD. Czym różni się w działaniu funkcja LPAD?
Zad.15 Wyświetlić nazwiska pracowników. W drugiej kolumnie wyświetlić tylko 3 znaki z
nazwiska poczynając od 1 znaku. Użyć funkcji SUBSTR.
Zad.16 Wyświetlić dane o pracownikach, których nazwiska są dłuższe niż 6 znaków oraz w osobnej
kolumnie długość nazwiska. Wynik posortować wg. długości nazwiska w porządku od największej
do najmniejszej.
Zad.17 Wyświetlić nazwiska pracowników, a w drugiej kolumnie nazwiska, ale każdą literę 'a'
zastąpić przez 'X'. Użyć funkcji REPLACE.
Zad.18 Wyświetlić nazwiska pracowników, a w drugiej kolumnie nazwiska mają być pisane wspak.
Użyć funkcji REVERSE.
5
Laboratorium Bazy danych SQL 2
Zad.19 Wyświetlić dane o pracownikach, których nazwiska zaczynają się na literę M. W nazwisku
wszystkie litery mają być małe, a w etacie duże. Użyć funkcji LOWER oraz UPPER.
Zad.20 Wyświetlić dane o zespołach oraz liczbie pracowników zatrudnionych w każdym z nich.
Przy czym ograniczyć się do zespołów zatrudniających nie więcej niż 3.
Zad.21 Wyświetlić nazwiska pracowników. W drugiej kolumnie wypisać, w którym miejscu po raz
pierwszy pojawiła się litera ’a’. Użyć funkcji INSTR.
Zad.22 Użyć SQL-a do obliczenia pola i obwodu koła o promieniu 10. Użyć funkcji POW.
Zad.23 Użyć SQL-a do wygenerowanie liczby losowej. Użyć funkcji RAND. Jak „zmusić” funkcję
RAND, aby za każdym wywołaniem generowała tą samą liczbę losową (przydatne przy testowaniu
oprogramowania).
Zad.24 Zaokrąglić płacę podstawową pracowników do liczb całkowitych. Użyć funkcji ROUND.
Zad.25 Wyświetlić bieżącą datę oraz czas. W pierwszych dwóch kolumnach format wyświetlania
ma być domyślny, w trzech ostatnich ustalony przez nas. Użyć funkcji DATE_FORMAT.
Zad.26 Do bieżącej daty i godziny dodać 2 dni, 5 godzin oraz 8 minut. Użyć funkcji DATE_ADD.
Zad.27 Wyliczyć, używając odpowiednich funkcji MySQL, „parametry” bieżącego dnia. Jako
wynik powinniśmy otrzymać:
+---------------+ ---------------------------------------------------------------------------------+
| 2016-10-21 | Dzis mamy 295 dzien roku, 42 tydzien roku oraz 6 dzien tygodnia. |
+---------------+ ---------------------------------------------------------------------------------+
6

Podobne dokumenty