Materiały do laboratoriów z przedmiotu Bazy danych 1 1 Wprowadzenie do funkcji Podział funkcji ze względu na liczbę wierszy: jednowierszowe (operujące na ciągach znaków, matematyczne, operujące na datach, konwertujące i inne), agregujące. Podział ze względu na zastosowanie: analityczne, do manipulacji obiektami. Podział ze względu na definicje: predefiniowane, użytkownika. Funkcje operujące na ciągach znaków: Concat(str1, str2) - zwraca ciąg znaków będący złączeniem ciągu str1 z ciągiem str2 (MySQL nie obsługuje operatora a jedynie funkcje Concat z dowolną listą parametrów). Initcap(str) - zwraca sformatowany ciąg wejściowy, tak, że pierwsza litera jest duża, zaś pozostałe małe (nie występuje w MySQL). Instr(str1, str2 [,pos [, n]]) - zwraca pozycję ciągu znaków str2, w str1, szukanie rozpoczyna się od pos,a kończy na n-tym wystąpieniu szukanego ciągu. Jeśli pos < 0 przeszukiwanie przebiega od końca. Jeśli ciąg str2 nie zostanie znaleziony to funkcja zwraca wartość 0 (W MySQL Instr(str1, str2) oraz Locate(str2, str1 [,pos])). Length(str) - zwraca długość str. Lower(str) - zwraca łańcuch str przekształcony na małe litery. Lpad(str, len [, pad_str]) - uzupełnia z lewej strony ciąg str ciągiem pad_str, aż do uzyskania przez ciąg wynikowy długości len. Domyślnie pad_str jest spacją. Ltrim(str [, set_str]) - poczynając z lewej strony odcina kolejne znaki ciągu str, aż do napotkania pierwszego znaku nie należącego do zbioru set_str (domyślnie spacja) (W MySQL usuwa wyłącznie białe znaki i posiada tylko jeden parametr). Replace(str1, str2 [, str3]) - zwraca ciąg str1 ze wszystkimi wystąpieniami ciągu str2 zastąpionymi przez ciąg str3, brak str3 oznacza usunięcie str2. Rpad(str, len [, pad_str]) - uzupełnia z prawej strony ciąg str ciągiem pad_str, aż do uzyskania przez ciąg wynikowy długości len. Domyślnie pad_str jest spacją. 1 na podstawie materiałów pani dr inż. Olgi Siedleckiej Lamch 1
Rtrim(str [, set_str]) - poczynając z prawej strony odcina kolejne znaki ciągu str, aż do napotkania pierwszego znaku nie należącego do zbioru set_str (domyślnie spacja) (W MySQL usuwa wyłącznie białe znaki i posiada tylko jeden parametr). Substr(str, pos [,len]) - zwraca podciąg ciągu str, o długości len, zaczynając od pos. Jeśli pos < 0 przeszukiwanie przebiega od końca. Domyślnie przebiega do końca (w MySQL Substring). Trim([[LEADING TRAILING BOTH] str1 FROM] str2) - Usuwa kolejne wystąpienia ciągu str1 w ciągu str2, zaczynając od początku - LEADING, końca - TRAILING, bądź z obu stron - BOTH. Domyślnie obcinane są spacje z obu stron. Upper(str) - przekształca wszystkie litery w str na duże. Funkcje matematyczne: Abs(n) - zwraca wartość bezwzględną z n. Ceil(n) - zwraca najmniejszą liczbę całkowitą większą lub równą n. Cos(n) - zwraca cosinus kąta n (wyrażonego w radianach). Floor(n) - zwraca największą liczbę całkowitą mniejszą lub równą n. Ln(n) - zwraca logarytm naturalny z n. Log(n, m) - zwraca logarytm z m przy podstawie n. Mod(m, n) - zwraca resztę z dzielenia m przez n. Power(m, n) - zwraca m podniesione do potęgi n. Round(m [, n]) - zwraca m zaokrąglone do n miejsc po przecinku. Dla n < 0, określa liczbę miejsc przed przecinkiem. Domyślnie n = 0. Sign(n) - zwraca -1 dla n < 0, 0 dla n = 0 oraz 1 dla n > 0. Sin(n) - zwraca sinus kąta n (wyrażonego w radianach). Sqrt(n) - zwraca pierwiastek kwadratowy z n. Tan(n) - zwraca tangens kąta n (wyrażonego w radianach). Trunc(m [,n]) - zwraca m po obcięciu do n miejsc po przecinku. Dla n < 0, określa liczbę miejsc przed przecinkiem. Domyślnie n = 0 (w MySQL Truncate). 2
2 Daty i czas Typy daty i czasu: DATE - data w formacie: YYYY-MM-DD (w Oracle przechowuje również czas) TIME - czas w formacie: HH:MM:SS.p (nie używany w Oracle) TIMESTAMP - data wraz z czasem - znacznik czasu w formacie: YYYY-MM-DD HH:MM:SS.p INTERVAL - przedział czasu INTERVAL YEAR TO MONTH: YYYY-MM INTERVAL DAY TO SECOND: DD HH:MM:SS.p Arytmetyka czasu Wyrażenie Operator Wyrażenie Typ wyniku DATE / TIMESTAMP + - NUMBER DATE DATE / TIMESTAMP + - INTERVAL DATE / TIMESTAMP INTERVAL + DATE / TIMESTAMP DATE / TIMESTAMP TIMESTAMP - DATE / TIMESTAMP INTERVAL DATE - DATE przedział czasu INTERVAL + - INTERVAL INTERVAL INTERVAL * / NUMBER INTERVAL NUMBER * INTERVAL INTERVAL TIMESTAMP - TIMESTAMP INTERVAL Funkcje operujące na datach Add_months(date, n) - zwraca podaną datę powiększoną (pomniejszoną) o n miesięcy Extract(element FROM date) - zwraca wybraną część daty. Parametrami mogą być m. in.: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND. Last_day(date) - zwraca datę odpowiadającą ostatniemu dniu miesiąca zawartego w dacie wejściowej. Months_between(date1, date2) - zwraca liczbę miesięcy pomiędzy datami date1 i date2. Next_day(date, day_str) - zwraca datę pierwszego dnia zgodnego z parametrem day_str, późniejszego niż podana data. Round(date [,fmt_str]) - zwraca datę zaokrągloną do jednostki wskazanej przez fmt_str. Domyślnie do najbliższego dnia. Trunc(date [,fmt_str]) - Zwraca datę obciętą do jednostki podanej w fmt_str. 3
Maski formatujące dla dat (Oracle) Maska Opis -,/.; tekst wstawia wymieniony znak lub ciąg znaków CC wiek D dzień tygodnia cyfrą (od 1 do 7) DAY nazwa dnia tygodnia w pełnym brzmieniu, uzupełniona do 9 znaków DD numer dnia w miesiącu DDD numer dnia w roku DY trzyliterowy skrót dnia HH lub HH12 godzina dnia (od 1 do 12) HH24 godzina dnia, zegar 24-godzinny MI minuta MM numer miesiąca MON trzyliterowy skrót miesiąca MONTH pełna nazwa miesiąca Q kwartał RM miesiąc w postaci liczby rzymskiej SS sekunda W numer tygodnia w miesiącu WW numer tygodnia w roku YEAR rok słownie YYYY pełny czterocyfrowy rok Y ostatnia cyfra roku YY ostatnie dwie cyfry roku YYY ostatnie trzy cyfry roku Funkcje konwersji typów: Cast(expr AS typename) - przeprowadza konwersję danych między dwoma typami wbudowanymi To_char(num [, fmt_str [,nls_str]]) - zamienia liczbę n na łańcuch (VARCHAR2) używając opcjonalnego ciągu formatującego fmt_str dla ustalonego języka narodowego nls_str. To_char(date [, fmt_str [,nls_str]]) - zamienia datę lub znacznik czasowy na łańcuch (VARCHAR2) używając opcjonalnego ciągu formatującego fmt_str dla ustalonego języka narodowego nls_str. To_date(str [, fmt_str [,nls_str]]) - przekształca ciąg znaków str w datę, zgodnie z formatem fmt_str. Jeżeli argument fmt jest opuszczony str musi być w domyślnym formacie daty. To_number(str[, fmt_str [,nls_str]]) - zamienia łańcuch znaków str na liczbę (NUMBER). Decode(wyr, s1, r1, s2, r2,... [, wyr_dom]) - porównuje wyrażenie wyr do kolejnych s1, s2,... Jeżeli wyr jest równe któremuś z tych wyrażeń, w wyniku zwracana jest odpowiadająca jemu wartość ri. Jeżeli żadna z wartości s1, s2,... nie jest równa wejściowemu wyrażeniu funkcja zwraca wartość domyślną. Jeśli jest ona pominięta, funkcja zwraca wartość NULL. Nvl(wyr1, wyr2) - jeżeli wyr1 ma wartość NULL, to funkcja zwraca wyr2. W przeciwnym przypadku funkcja zwraca wyr1 (W MySQL funkcja Ifnull). Uid - zwraca unikalny numer użytkownika. User - zwraca nazwę użytkownika. 4
3 Funkcje agregujące Funkcje agregujące pobierają jako dane wejściowe zbiór wartości, a zwracają jedną wartość. Avg([DISTINCT] wyr) - oblicza średnią ze zbioru (opcjonalnie różnych) wartości wyrażenia (pomijając wystąpienia NULL). Count(* [DISTINCT] wyr) - Wywołanie Count(*) zwraca liczbę wszystkich wierszy uzyskanych w wyniku zapytania. Podanie argumentu w postaci wyrażenia spowoduje zwrócenie liczby wierszy, w których wybrane wyrażenie nie przyjęło wartości NULL. Max([DISTINCT] wyr) - Zwraca największą wartość ze zbioru (opcjonalnie pozbawionego powtórzeń) pomijając NULL. Min([DISTINCT] wyr) - Zwraca najmniejszą wartość ze zbioru (opcjonalnie pozbawionego powtórzeń) pomijając NULL. Stdev([DISTINCT] wyr) - Wylicza odchylenie standardowe na zbiorze (opcjonalnie pozbawionym powtórzeń) pomijając NULL. Sum([DISTINCT] wyr) - Wylicza sumę wartości ze zbioru (opcjonalnie pozbawionego powtórzeń) pomijając NULL. Variance(* [DISTINCT] wyr) - Oblicza wariancję wartości ze zbioru (opcjonalnie pozbawionego powtórzeń) pomijając NULL. Klauzula GROUP BY Umożliwia podzielenie relacji na podzbiory - agregację. Pojedynczy podzbiór/grupę stanowią wiersze, dla których kryterium grupowania ma identyczną wartość. Na liście wyrażeń klauzuli SELECT mogą wówczas stanąć jedynie te wyrażenia, które są przedmiotem działania klauzuli GROUP BY, oraz argumenty funkcji agregujących. SELECT rok, Count(nazwisko) GROUP BY rok; SELECT rok,gr_dziekan, Count(nazwisko) GROUP BY rok, gr_dziekan; Klauzula HAVING Określa warunki, które muszą być spełnione przez podzbiór by został uwzględniony w relacji wynikowej; (warunki zawarte w klazuli WHERE tyczą się relacji przed agregacją, zaś w HAVING po agregacji). SELECT rok, Count(nazwisko) GROUP BY rok HAVING Count(nazwisko) > 100; SELECT rok,gr_dziekan, Count(nazwisko) GROUP BY rok, gr_dziekan HAVING Count(nazwisko) > 20; Rozszerzenia klauzuli GROUP BY ROLLUP - dla n kryteriów grupowania daje n - 1 dodatkowych zestawień; dodatkowe podsumowania uzyskuje poprzez zwijanie ostatnich elementów z listy. Np.: SELECT rok, gr_dziekan, imiona,count(*) GROUP BY ROLLUP(rok, gr_dziekan, imiona); 5
CUBE - dla n kryteriów grupowania daje 2n zestawień; Np.: SELECT rok, gr_dziekan, imiona,count(*) GROUP BY CUBE(rok, gr_dziekan, imiona); GROUPING SETS - pozwala na jednoznaczne określenie, które z dodatkowych zestawień chcemy uzyskać. Np.: SELECT rok, gr_dziekan, imiona,count(*) GROUP BY GROUPING SETS((rok, gr_dziekan, imiona),()); Grouping(wyr) - Funkcja zwracajaca wartość 1 dla wyrażeń zwijanych dla dodatkowych zestawień. Np.: SELECT Grouping(rok), rok, Grouping(gr_dziekan), gr_dziekan, Grouping(imiona), imiona,count(*) GROUP BY CUBE(rok, gr_dziekan, imiona); 6
4 Operatory zbiorowe Np.: Suma UNION lub UNION ALL Przecięcie INTERSECT Różnica MINUS (Oracle) w standardzie EXCEPT SELECT stanowisko FROM pracownicy WHERE id_dzialu=20 INTERSECT SELECT stanowisko FROM pracownicy WHERE id_dzialu=30; 5 Wyrażenie CASE CASE wyrazenie WHEN wartosc1 THEN wyrazenie1 WHEN wartosc2 THEN wyrazenie2... [ELSE wyr_dom] END CASE WHEN warunek1 THEN wyrazenie1 WHEN warunek2 THEN wyrazenie2... [ELSE wyr_dom] END 6 Złączenia Złączenia tabel w języku SQL uzyskuje się poprzez wstawienie więcej niż jednej relacji w klazuli FROM oraz polączenie ich odpowiednim operatorem. Notacja w standardzie ANSI SQL FROM tabela1 [AS alias] {CROSS JOIN { [NATURAL] [typ_laczenia] JOIN tabela2 [AS alias] { ON warunek1 [{AND OR} warunek2] [...] ] USING (atrybut1 [,...]) } } Zdefiniowano następujące typy złączeń: iloczyn kartezjański złączenia naturalne θ - złączenia złaczenia zewnętrzne samozłączenia Iloczyn kartezjański 7
SELECT * FROM pracownicy CROSS JOIN dzialy; Stary zapis: SELECT * FROM pracownicy, dzialy; Złączenie warunkowe SELECT * FROM pracownicy p [INNER] JOIN dzialy d ON (p.id_dzialu = d.id_dzialu); SELECT * FROM pracownicy p [INNER] JOIN dzialy d USING (id_dzialu); Stary zapis: SELECT * FROM pracownicy p, dzialy d WHERE p.id_dzialu = d.id_dzialu; Złączenie naturalne SELECT * FROM pracownicy NATURAL JOIN dzialy; Złączenie zewnętrzne Złączenia zewnętrzne dzielą się na: lewostronne prawostronne pełne SELECT * FROM pracownicy p {LEFT RIGHT FULL} [OUTER] JOIN dzialy d ON (p.id_dzialu = d.id_dzialu); Samozłączenie SELECT p.nazwisko, s.nazwisko FROM pracownicy p JOIN pracownicy s ON (p.kierownik = s.nr_akt); 8
7 Podzapytania Podzapytanie - to zapytanie zagnieżdżone w innym zapytaniu, może być zagnieżdżone w klauzulach: SELECT, FROM, WHERE oraz HAVING. Podzapytania są ograniczane nawiasami okrągłymi. Zapytania można zagnieżdżać wielokrotnie. podzapytanie proste - wykonywane w pierwszej kolejności, jako wynik pośredni trafiają do zapytania zewnętrznego. SELECT lista_wyrazen, (SELECT...) FROM lista_relacji (SELECT...) WHERE wyrazenie operator (SELECT...) GROUP BY kryteria HAVING wyrazenie operator (SELECT...); Podzapytania a operatory wierszowe: =, <>, <, <=, >, >= tablicowe: IN, ANY, ALL, EXISTS Podzapytania sorelowane podzapytanie skorelowane - wykonywane dla każdego wiersza z zapytania zewnętrznego. SELECT lista_wyrazen FROM lista_relacji WHERE wyrazenie operator (SELECT lista_wyrazen FROM lista_realcji WHERE warunek_skorelowania); 9
8 Pozostałe polecenia DML Polecenie UPDATE słuzy do aktualizacji zawartosci wierszy tabel. W klauzuli SET wymieniamy atrybuty, których wartosci beda zmieniane. Opcjonalna klauzula WHERE wyznacza kryterium, jakie musza spełnic wiersze tabeli aby podlegac zmianie. Brak ograniczajacego warunku oznacza, ze wszystkie wiersze beda zmienione. Składnia: UPDATE {tabela perspektywa} SET {{atrybut = wartosc DEFAULT NULL}, {atrybut = wartosc DEFAULT NULL},...} [WHERE warunek]; Przykłady: UPDATE pracownicy SET placa = placa * 1.1; UPDATE pracownicy SET placa = placa * 1.1 WHERE nr_akt IN (SELECT kierownik FROM pracownicy); Polecenie INSERT pozwala wstawiać do tabeli nowe wiersze. Opcjonalnie mozna okreslic liste uzupełnianych atrybutów, w przeciwnym razie nalezy wypełnic wszystkie. Klauzula VALUES okresla wartosci jakie beda przypisane atrybutom. Wiersz mozna wypełnic wartosciami zwróconymi przez podzapytanie. Składnia: INSERT INTO {tabela perspektywa} [(atrybut1 [,...] )] {DEFAULT VALUES VALUES (wartosc1 [,...]) SELECT... }; Przykłady: INSERT INTO dzialy VALUES (10, ZARZAD, CZESTOCHOWA ); INSERT INTO pracownicy VALUES (9121, KUKULSKI, DYREKTOR, 8901, To_date( 1991/04/02, yyyy/mm/dd ), NULL, 5000, 1500, NULL, 30); INSERT INTO pracownicy (nr_akt, nazwisko) VALUES (9192, KOWALSKI ); INSERT INTO prac_archiw SELECT * FROM pracownicy WHERE nr_akt = 9192; Polecenie DELETE usuwa wiersze ze wskazanej tabeli, zawiera opcjonalna klauzule WHERE ograniczajaca liczbe usunietych wierszy do tych, które spełniaja zadany warunek. Składnia: 10
DELETE FROM {tabela perspektywa} [WHERE warunek]; Przykłady: DELETE FROM stanowiska; DELETE FROM pracownicy WHERE nr_akt = 9192; 9 DDL 9.1 Usuwanie tabel DROP TABLE [schemat.]nazwa_tabeli [CASCADE CONSTRAINTS]; usuniecie definicji tabeli usuniecie danych z tabeli usuniecie wyzwalaczy i indeksów zwiazanych z tabela zwolnienie fizycznego segmentu i jego rozszerzen ustawienie atrybutu niepoprawnosci dla powiazanych perspektyw, synonimów, procedur itp. 9.2 Definiowanie tabeli CREATE TABLE nazwa_tabeli ( kolumna1 typ[(rozmiar)] [DEFAULT wyrazenie1] [wiezy_kolumny1], kolumna2 typ[(rozmiar)] [DEFAULT wyrazenie2] [wiezy_kolumny2],..., [wiezy_tabeli],... ); Przykład: CREATE TABLE mieszkancy ( PESEL NUMBER(11), nazwisko VARCHAR2(30), imiona VARCHAR2(30), data_zameldowania DATE DEFAULT CURRENT_DATE ); 11