Plan wykładu Spis treści 1 Wprowadzenie do języka SQL 1 2 Podstawowe elementy języka 3 3 DML - zapytania, część I 6 4 Źródła 12 1 Wprowadzenie do języka SQL Język SQL Trochę historii: SQL - Structured Query Language stworzony na początku lat 70 ubiegłego wieku w IBM przez Donalda Messerly ego, Donalda Chamberlina oraz Raymonda Boyce a pod nazwą SEQUEL pierwszy SZBD - System R utworzony przez IBM w 1973 r. wykorzystujący SEQUEL pierwszy komercyjny SZBD stworzony przez Relational Software (obecnie Oracle) w 1979 r. dla amerykańskiej marynarki wojennej, CIA i kilku agencji rządowych; użycie SQL a od 1986 SQL jest oficjalnym standardem (ANSI), od 1987 (ISO). stale standardaryzowany Cechy SQL Cechy języka SQL: język deklaratywny język interpretowany podjęzyk danych dostęp do danych z poziomu relacji zbliżony konstrukcją do języka naturalnego wykorzystuje logikę trójwartościową wykorzystuje algebrę relacyjną nie jest do końca zgodny z modelem relacyjnym 1
Możliwości SQL Możliwości języka SQL: wyszukiwanie danych wstawianie, usuwanie i modyfikacja danych tworzenie baz danych tworzenie, modyfikowanie i usuwanie obiektów relacyjnych zarządzanie transakcjami zarządzanie bazą danych Formy SQL SQL interakcyjny (autonomiczny) Statyczny kod SQL (Static SQL) Osadzony SQL (Embedded SQL) Język modułów Dynamiczny kod SQL (Dynamic SQL) Składowe SQL DML (Data Manipulation Language) do manipulacji danymi zawierający polecenia SELECT, UPDATE, INSERT, DELETE itp; DDL (Data Definition Language) do definiowania struktur dla danych (CREATE, DROP, ALTER itp.); DCL (Data Control Language) - do zarządzania bazą danych (GRANT, REVOKE itp.); TCL (Transaction Control Language) - do zarządzania bazą danych (COMMIT, ROLLBACK itp.). Zalety SQL wszechstronność i wielość zastosowań standardaryzacja łatwość uczenia się - intuicyjność popularność wielu mistrzów możliwość certyfikacji 2
Wady SQL standard nie jest przestrzegany przez różnych dostawców zbyt łatwe uzyskanie wyniku iloczynu kartezjańskiego czasem brak konsekwencji w składni wynikająca z pozostawienia starych form zbliżenie SQL a do języka mówionego spowodowało większą złożoność składni standard nie określa zachowań bazy danych w wielu sytuacjach (np.: indeksowanie, składowanie) 2 Podstawowe elementy języka Polecenie SQL Składniki polecenia (instrukcji) SQL klauzule, niektóre opcjonalne wyrażenia predykaty określające warunki średnik kończący polecenie wielkość liter w składni jest ignorowana (w wartościach pól jest rozróżniana) Polecenie SQL Podstawowe typy danych SQL ANSI CHARACTER(n), CHAR(n) - ciąg znaków o stałej długości określonej przez rozmiar CHARACTER VARYING(n), CHAR VARYING(n) - ciąg znaków o zmiennej długości, nie przekraczającej podanego rozmiaru NUMERIC(p,s), DECIMAL(p,s) - liczby o ustalonej precyzji p i skali s INTEGER, INT, SMALLINT - liczby całkowite FLOAT(b), DOUBLE PRECISION, REAL - liczby zmiennoprzecinkowe DATE - data w formacie: YYYY-MM-DD 3
TIME - czas w formacie: HH:MM:SS.p TIMESTAMP - data wraz z czasem - znacznik czasu w formacie: YYYY-MM-DD HH:MM:SS.p INTERVAL - przedział czasu BLOB - dane binarne CLOB - dane znakowe XML - dane w języku XML Aliasy typów danych SQL ANSI Oracle DB2 MySQL PostgrSQL MS SQL CHARACTER(n) CHAR(n) CHARACTER(n) CHAR(n) CHAR(n) CHAR(n) CHAR(n) CHARACTER VARCHAR2(n) VARCHAR(n) VARCHAR(n) VARCHAR(n) VARCHAR(n) VARYING(n) CHAR VARYING(n) NUMERIC(p,s) NUMBER(p,s) DECIMAL(p,s) DECIMAL(p,s) NUMERIC(p,s) DECIMAL(p,s) DECIMAL(p,s) INTEGER NUMBER(38) INTEGER INT, INTEGER INT, INTEGER INTEGER INT, SMALLINT SMALLINT FLOAT(b) NUMBER(p,s) FLOAT(b) FLOAT(b) NUMERIC(p,s) FLOAT(b) DOUBLE PRECISION REAL DATE DATE DATE DATE DATE DATETIME TIME DATE TIME TIME TIME DATETIME TIMESTAMP TIMESTAMP TIMESTAMP TIMESTAMP TIMESTAMP DATETIME INTERVAL INTERVAL - +- INTERVAL - BLOB BLOB BLOB BLOB BYTEA VARBINARY(n) CLOB CLOB CLOB TEXT TEXT TEXT XML XMLTYPE XML +- XML +- Literały literały tekstowe znajdują się w apostrofach: tekst daty, przedziały i znaczniki czasowe zapisywane jak literały tekstowe w apostrofach; wymagają zastosowania formatu YYYY-MM-DD HH:MM:SS.p, np. 1998-12-19 17:23:34.45 literały liczbowe: 12, 45e-2 (można stosować notację naukową) Przedziały czasu wyróżniamy dwa typy przedziałów czasowych: miesiące do lat oraz sekundy do dni przykłady: INTERVAL 3-5 YEAR TO MONTH - przedział 3 lat i 5 miesięcy INTERVAL 5 YEAR - przedział 5 lat INTERVAL 5 10:12 DAY TO MINUTE - przedział 5 dni 10 godzin i 12 minut przedziały maja szczególne zastosowanie w tzw. arytmetyce czasu Arytmetyka czasu Typ Operator Typ Typ wyniku DATE/TIMESTAMP + - NUMERIC DATE DATE/TIMESTAMP + - INTERVAL DATE/TIMESTAMP INTERVAL + DATE/TIMESTAMP DATE/TIMESTAMP TIMESTAMP + - DATE/TIMESTAMP INTERVAL DATE - DATE INTERVAL (w Oracle NUMBER - liczba dni) INTERVAL + - INTERVAL INTERVAL INTERVAL * / NUMERIC INTERVAL NUMERIC * INTERVAL INTERVAL 4
Operatory operatory arytmetyczne (+, -,*,/) operator przypisania = operatory porównania ( =, <>, <, <=, >, >=, LIKE, NOT LIKE) operator zawarcia w przedziale BETWEEN operator zawarcia w zbiorze IN operatory konkatenacji w standardzie: (zachowany w Oracle, DB2 i PostgreSQL, zaś w MySQL funkcja Concat, w MS SQL operator +) operatory logiczne (ALL, AND, ANY, EXISTS, NOT, OR ) operatory zbiorowe (UNION, INTERSECT, EXCEPT (MINUS w Oracle)) operatory unarne (+, -) Hierarchia operatorów ( ) +, - (opeartory unarne) *, / +, - =, >, <, >=, <=, <> NOT AND ALL, ANY, BETWEEN, IN, LIKE, OR, SOME = (przypisanie) Wyrażenia atrybuty (nazwisko, placa, data_zatrudnienia, itp.) pseudokolumny (np. CURRVAL, NEXTVAL, LEVEL, ROWID, ROWNUM) stałe liczbowe (20, 16, 24.289, itp.) stałe łańcuchowe ( Kowalski, Dyrektor, itp.) działania arytmetyczne (placa+dod_funkcyjny, placa*12, 5/6, itp.) konkatenacja łańcuchów (imie nazwisko, itp.) funkcje relacje 5
3 DML - zapytania, część I Konwencje typograficzne DUŻE LITERY - słowa kluczowe SQL małe litery - elementy definiowane przez użytkownika znaki [] - oznaczenie elementów opcjonalnych znaki {} - oznaczenie grupy elementów opcjonalnych, z których jeden jest obowiązkowy znak - znak oddzielający elementy opcjonalne Składnia zapytania SELECT [DISTINCT] lista_wyrazen FROM lista_relacji [WHERE warunki] [GROUP BY kryteria [HAVING warunki]] [ORDER BY kryteria [DESC]]; klauzule SELECT oraz FROM są obowiązkowe kolejność poszczególnych klauzul nie może być zmieniona Klauzula SELECT Klauzula SELECT określa jakie kolumny znajdą się w relacji wynikowej (określa atrybuty rzutu); słowo kluczowe DISTINCT usuwa z wyniku zapytania powtórzenia; operator * oznacza wszystkie atrybuty relacji wejściowych. Na przykład: SELECT * FROM nazwa_tabeli; SELECT imiona, nazwisko FROM studenci; SELECT DISTINCT imiona FROM studenci; SELECT Pracownik: Upper(nazwisko) AS kto, zarabia rocznie: placa*12. AS "płaca roczna" FROM pracownicy; Klauzula SELECT Istnieje możliwość stosowania aliasów (przezwisk) dla wyrażeń: SELECT imiona nazwisko SELECT imiona nazwisko FROM studenci; SELECT imiona nazwisko FROM studenci; Dane FROM studenci; AS Dane AS "Dane osobowe" 6
Klauzula FROM Klauzula FROM określa relacje wejściowe, z których będą pobierane dane; nazwom tabel można nadać aliasy. SELECT imiona, nazwisko, nazwa_wydzialu FROM studenci s JOIN wydzialy w ON(s.wydzial_id = w.wydzial_id); Klauzula ORDER BY Klauzula ORDER BY umożliwia posortowanie danych wynikowych według zadanego kryterium, którym może być atrybut relacji wejściowych, alias, albo numer na liście wyrażeń klauzuli SELECT. Odwrotny porządek sortowanie uzyskujemy poprzez dodanie słowa kluczowego DESC. SELECT imiona, nazwisko, data_urodzenia AS urodziny FROM studenci ORDER BY nazwisko, 1 DESC, urodziny; Klauzula WHERE Klauzula WHERE określa warunki jakie muszą być spełnione przez wiersze relacji wynikowej (realizacja restrykcji). SELECT imiona, nazwisko FROM studenci WHERE rok = 2 AND gr_dziekan IN(1,2); SELECT imiona, nazwisko FROM studenci WHERE rok = 2 AND (gr_dziekan = 1 OR gr_dziekan = 2); SELECT imiona, nazwisko FROM studenci WHERE rok = 2 AND gr_dziekan BETWEEN 1 AND 2); Restrykacja ze wzorcem %. Istnieje możliwość zastąpienia dowolnego znaku symbolem _ i ciągu znaków symbolem SELECT imiona, nazwisko FROM studenci WHERE imiona LIKE MARIAN% ; SELECT imiona, nazwisko FROM studenci WHERE nazwisko LIKE KOWALSK_ ; 7
Rzut i restrykcja 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). 8
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ą. 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 9
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). Daty i czas Pobranie aktualnej daty i czasu: Current_date (w Oracle i MySQL dodatkowo Sysdate) Current_timestamp (w Oracle dodatkowo Systimestamp) Funkcje operujące na datach Oracle: 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. 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ł 10
Maska RM SS W WW YEAR YYYY Y YY YYY Opis miesiąc w postaci liczby rzymskiej sekunda numer tygodnia w miesiącu numer tygodnia w roku rok słownie pełny czterocyfrowy rok ostatnia cyfra roku ostatnie dwie cyfry roku ostatnie trzy cyfry roku Funkcje konwersji typów Oracle: 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). Maski formatujące liczb - Oracle Maska Opis $ prefiks - znak dolara,. ustalenie separatora dziesiętnego 0 uzupełnia liczbę zerem wiodącym 9 określa liczbę cyfr w liczbie EEEE sufiks - notacja inżynierska RN zapis cyframi rzymskimi L symbol lokalnej waluty U symbol drugiej waluty Pozostałe funkcje wierszowe Oracle: 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. 11
Uid - zwraca unikalny numer użytkownika User - zwraca nazwę użytkownika 4 Źródła Źródła W wykładzie wykorzystano materiały: J. Price, Oracle Database 12c i SQL. Programowanie, Helion 2015 M. Lentner, Oracle 9i Kompletny podręcznik użytkownika, PJWSTK - W-wa, 2003 J. Gennick, SQL leksykon kieszonkowy, Helion 2010 http://sqlnut.atw.hu/ 12