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