Współczesne systemy baz danych dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu Zakład Systemów Informatycznych i Mechatronicznych (SIMT) 2018
Język SQL Język SQL (ang. Structured Query Language) deklaratywny strukturalny język zapytań stosowany do wstawiania, wyszukiwania oraz modyfikacji danych w RBD, zarządzania jej strukturą oraz uprawnieniami użytkowników. Deklaratywność: użytkownik formułuje co chce uzyskać, pozostawiając decyzję o sposobie realizacji zapytania systemowi zarządzania baza danych. Z tego wynika że: użytkownik nie ma wpływu na sposób wykonania zapytania, podobne zapytania mogą się wykonywać na różne sposoby, sposób wykonania różnych zapytań może być identyczny
Podgrupy języka SQL DML (Data Manipulation Language) polecenia manipulowania danymi (instrukcje wstawiania, pobierania, aktualizacji oraz usuwania danych - CRUD). DDL (Data Definition Language) polecenia zarządzania strukturą danych (definiowanie tabel, zmiana struktury oraz usuwanie). DCL (Data Control Language) polecenia zarządzania uprawnieniami użytkowników (GRANT, REVOKE, DENY).
Typy danych języka SQL TYP OPIS PRZYKŁAD char(n) tekst o stałej długości n znaków A varchar(n) tekst o zmiennej długości Ala ma kota (maksymalnie n znaków) nchar, nvarchar tekst unicode ŁÓDŹ int, integer Liczba całkowita (32 bit) 10 numeric(c,p) Liczba dziesiętna (c liczba cyfr 10.123456 razem z kropką i znakiem, p liczba cyfr po przecinku ) decimal(c,p) Liczba dziesiętna z ograniczoną 10.25 precyzją (p < 6) float Liczba zmiennoprzecinkowa 3.1457. datetime Godzina i data 2011-02-28 23:35:01 date Data 2011-02-28 Binary, blob Ciąg znaków binarny (obiekty multimedia, grafika itp.) 0xFA13 (Kod binarny)
Polecenie SELECT SELECT [DISTINCT] * <kolumna> [, <kolumna> ] [, <funkcja agregująca> ] [, <wyrażenie>.. ] FROM <tabela> [, <tabela> ] <złączone tabele> [ WHERE <warunek wyboru wierszy> ] [ GROUP BY <kolumna> [, <kolumna> ] ] [ HAVING <warunek wyboru grup> ] [ UNION EXCEPT INTERSECT ] [ ORDER BY <kolumna> [ASC DESC] [, <kolumna> ] ]
Polecenie SELECT Po SELECT należy wskazać kolumny tabeli (lub tabel) z których mają być pobrane dane. Znak * oznacza pobranie wszystkich kolumn. Klauzula FROM określa tabele, z których maja być pobrane dane. Sposób łączenia wielu tabel będzie omówiony później. Klauzula WHERE określa warunek jaki muszą spełniać wiersze wybierane z tabel(i). Klauzula GROUP BY służy do grupowania danych pobranych z tabel wg wymienionych kolumn. Grupowanie może odbywać się po kilku kolumnach. Wszystkie pozostałe kolumny wynikowe nie biorące udział w grupowaniu wymagają zastosowania tzw. funkcji agregujących (o tym dalej). Filtrowanie już pogrupowanych wierszy odbywa się za pomocą klauzuli HAVING. Klauzula UNION łączy wyniki dwóch zapytań SELECT (pod warunkiem iż ilość zwracanych kolumn jest identyczna). Sortowanie ostateczne pobranych danych dokonuje się za pomocą klauzuli ORDER BY. Domyślną kolejnością sortowania jest rosnąca (ASC), sortowanie malejące należy wskazywać jawnie (DESC).
Operatory relacji Operator Opis = Równe <> lub!= Nierówne < Mniejszy > Większy <= Mniejszy lub równy >= Większy lub równy LIKE Podobny do (wyrażenie regularne) BETWEEN W przedziale od do (włącznie) IN Należy do zbioru wartości IS NULL Równy wartości NULL ANY (syn. SOME) Dla dowolnej wartości ze zbioru ALL Dla każdej wartości ze zbioru
Operatory logiczne Operator Opis AND Iloczyn logiczny ( I ) OR Suma logiczna ( LUB ) NOT Negacja ( NIE )
Operatory arytmetyczne Operator Opis + Dodawanie - Odejmowanie * Mnożenie / Dzielenie
Funkcje skalarne Funkcje działające na pojedynczych wartościach. Zwracają w miejsce zapytania wartość wyrażenia obliczonego na podstawie wartości pojedynczej komórki w tabeli
Funkcje skalarne Funkcja Opis Godzina i Data GETDATE() Zwraca bieżącą datę serwerową YEAR / MONTH / DAY( datetime ) Zwraca rok / miesiąc / dzień daty przekazanej jako parametr DATEPART( part, datetime ) Zwraca część part parametru datetime part = { YEAR, DAY, MONTH, HOUR, MINUTE, SECOND } DATEDIFF( part, startdate, enddate ) Zwraca część part interwału pomiędzy datami startdate enddate DATEADD( part, increment, datetime) Zwraca datę otrzymaną w wyniku dodania do daty datetime liczby jednostek increment interwału określonego przez part Łańcuchy znaków LEN( string ) Zwraca długość łańcucha znaków string SUBSTRING( string, from, count ) Zwraca wycinek łańcucha string od pozycji from (licząc od 1) długością count znaków LOWER( string ) / UPPER( string ) Konwersja na małe / wielkie litery CHARINDEX( what, where, [from] ) Zwraca pozycję (licząc od 1) znaku what w łańcuchu where rozpoczynając szukanie od pozycji from (opcja); zwraca 0 jeśli nic nie zostało znaleziono REPLACE( string, from, to ) Zwraca łańcuch string w którym wszystkie wystąpienia from zamieniono ciągiem znaków to REVERSE( string ) Zwraca odwrócony łańcuch
Funkcje skalarne Matematyczne ABS( value ) Zwraca wartość bezwzględną liczby EXP( value ) Zwraca wartość wyrażenia e^value LOG( value ) Zwraca logarytm naturalny value PI() Zwraca wartość Pi POWER( a, b ) Zwraca wartość a podniesioną do potęgi b a % b Zwraca resztę z dzielenia a przez b SQRT( x ) Zwraca pierwiastek kwadratowy x SIGN( x ) Zwraca znak wartości x (-1, 0, 1) ROUND( float, positions ) Zwraca wartość float zaokrągloną do positions znaków po przecinku FLOOR( float ) Zwraca najbliższą wartość całkowitą mniejszą od float SIN / COS / TAN / ASIN / ACOS / ATAN Funkcje trygonometryczne Inne przydatne funkcje IsNULL( value, replace ) Sprawdza czy wartość value == NULL i jeśli tak, zwraca wartość zastępczą replace CAST( value AS type ) Rzutowanie (konwersja) wartości value na wartość typu danych type (nie wszystkiej konwersje są dozwolone!)
Funkcje agregujące Funkcje agregujące (syn. funkcje grupujące) funkcje działające na grupie wierszy i zwracające jeden wynik (np. suma wartości wszystkich komórek w jednej kolumnie) Funkcja agregująca COUNT(*) COUNT( column ) MAX( column ) MIN( column ) SUM( column ) AVG (column ) STDEV( column ) VAR( column ) Opis Zwraca liczbę wszystkich wierzy Zwraca liczbę wierszy tabeli wartość pola w kolumnie column których jest różna od NULL Zwraca maksymalną / minimalną wartość w kolumnie column Zwraca sumę wartości w kolumnie column Zwraca wartość średnią Zwraca odchylenie standardowe Zwraca wariację
Klauzula GROUP BY Klauzula GROUP BY pozwala podzielić wynik zapytania SELECT na mniejsze grupy wierszy poprzez grupowanie identycznych wartości Grupowanie może być zagnieżdżonym (odbywać się wg kilku kolumn) Przez wykonaniem operacji grupowania dane można odfiltrować za pomocą klauzuli WHERE Jeśli w skład zapytania SELECT wchodzi kolumna nie objęta warunkiem grupowania (nie występująca w GROUP BY), należy wskazać metodę za pomocą której zbiór jej wartości (niekoniecznie identycznych) ma być zastąpiony jedną wartością będącą wynikiem pogrupowania. W tym celu stosuje się funkcje agregujące (p. 4.2.2). Filtrowanie wierszy już pogrupowanych odbywa się za pomocą klauzuli HAVING (w niektórych przypadkach można to wykonać umieszczając odpowiedni filtr w sekcji WHERE, lecz np. filtrowanie wg wartości obliczonych w locie przez funkcje agregujące jest możliwe tylko poprzez HAVING)
Złączenie tabel
Złączenie tabel W operacji złączenia tabel zawsze biorą udział dwie tabele A i B ( lewa i prawa odpowiednio; ta sama tabela może występować w złączeniu po obu stronach). Złączenie odbywa się poprzez porównanie wartości z kolumn wskazanych w sekcji ON. Z reguły kolumny te są kluczem własnym jednej z tabel oraz kluczem obcym drugiej tabeli.
Złączenie tabel Przykład: złączenie tabel Grupa i Student może się odbyć względem kolumn Grupa.ID oraz Student.GrupaID (w tym przypadku jest to jedyny możliwy sposób złączenia).
Rodzaje złączenia tabel: LEFT OUTER JOIN JOIN OUTER JOIN INNER JOIN RIGHT OUTER JOIN FULL OUTER JOIN
Złączenie wewnętrzne (inner join) Tabelę wynikową stanowią wiersze z obu tabel, wartości łączonych kolumn których są identycz Kolejność łączonych tabel A i B przy wykorzystaniu INNER JOIN nie jest istotna (tj. nie jest ważne którą z tabel wymieniono w SELECT a którą w sekcji JOIN).
Złączenie zewnętrzne (outer join) Złączenie zewnętrzne różni się od wewnętrznego sposobem traktowania pustej wartości NULL. W złączeniu wewnętrznym wiersze zawierające NULL przynajmniej w jednej z łączonych kolumn są pomijane. Złączenie zewnętrzne pozwala uwzględnić je w wyniku zwracanym przez kwerendę, tj.: OUTER JOIN = INNER JOIN + NULL W złączeniu zewnętrznym kolejność wystąpienia złączanych tabel jest istotna! Rozróżniają 3 rodzaje złączenia zewnętrznego: LEFT OUTER JOIN RIGHT OUTER JOIN (RIGHT JOIN) FULL OUTER JOIN (FULL JOIN)
Złączenie zewnętrzne lewostronne (LEFT OUTER JOIN) Złączenie lewostronne [A] Left Outer Join [B] umieszcza w tabeli wynikowej wszystkie wiersze z lewej tabeli (A) oraz odpowiadające im wartości z prawej (B). Przykład: Lista wszystkich studentów (włącznie z tymi nie przypisanymi do żadnej z grup)
Złączenie zewnętrzne prawostronne (RIGHT OUTER JOIN) Złączenie prawostronne [A] Right Outer Join [B] umieszcza w tabeli wynikowej wszystkie wiersze z prawej tabeli (B) oraz odpowiadające im wartości z lewej (A). Przykład: Lista wszystkich grup oraz przypisanych do nich studentów (włącznie z grupami nieposiadającymi ani jednego studenta)
Złączenie zewnętrzne obustronne (pełne) (FULL OUTER JOIN) W złączeniu obustronnym pełnym biorą udział wszystkie wierszy obu złączonych tabel kolejność wystąpienia tabel w SELECT JOIN nie ma znaczenia. Przykład: lista wszystkich grup oraz studentów (w tym grupy nie mające studentów oraz studenci nie należące do żadnej z grup)
Złączenie wielu tabel w jednym zapytaniu Klauzula JOIN może występować w zapytaniu SELECT wielokrotnie
Złączenie nierównościowe Złączenie nierównościowe opiera się na innym niż = operatorze relacyjnym. Przykład: zapytanie wybiera wszystkie pary grup A i B z tabeli Grupy, przy tym ta sama grupa nie może wystąpić w obu kolumnach jednocześnie ("turniej")
Podzapytania Zapytania w języku SQL mogą być zagnieżdżane. Wynik zwrócony przez zapytanie może być daną wejściową dla innego zapytania np. jako warunek SELECT lub JOIN. W zależności od ilości wartości zwracanych przez podzapytanie, rozróżniają: Podzapytania proste wykonywane jednokrotnie przed wykonaniem zapytania głównego Podzapytania skorelowane wykonywane dla każdego wiersza zapytania głównego
Podzapytania proste Przykład: zapytanie zwraca numer grupy o maksymalnej liczbie studentów Jeśli podzapytanie zwraca więcej niż jedną wartość, należy posłużyć się instrukcją IN. Przykład: zapytanie zwraca listę grup liczba studentów których przekracza 15: SELECT Numer FROM Grupa WHERE ID IN ( SELECT GrupaID FROM Student GROUP BY GrupaID HAVING COUNT(*) > 15 ) Podzapytania proste mogą być wielokrotnie zagnieżdżane, wykonanie zawsze rozpoczyna się od najbardziej zagnieżdżonego zapytania i podąża w kierunku zapytania nadrzędnego
Podzapytania skorelowane Podzapytania skorelowane są wykonywane dla każdego wiersza zapytania nadrzędnego wykorzystując zwróconą przez niego informację. Przykład: zapytanie zwraca listę grup liczba studentów których przekracza 15: SELECT Numer FROM Grupa WHERE (SELECT COUNT(*) FROM Student WHERE GrupaID=Grupa.ID) > 15 Zapytania skorelowane często są wykonywane na tej samej tabeli. W takim przypadku należy posłużyć się aliasem nazwy. Przy napisaniu zapytań skorelowanych należy brać pod uwagę potencjalną czasochłonność ich wykonania.
Polecenie INSERT INSERT INTO [tabela] ( lista kolumn ) VALUES ( lista wartości ) Uwaga: Liczba wymienionych kolumn = liczba wartości w sekcji VALUES Typy danych kolumn = typy danych wstawianych wartości Kolejność kolumn nie ma znaczenia Kolumny nie wymienione na liście uzyskają wartości NULL lub wartości domyślne o ile zostały one zdefiniowane Zapis wartości poszczególnych typów: Łańcuchy tekstowe, daty oraz wartości binarne w apostrofach Liczby bez apostrofów
Polecenie UPDATE UPDATE [tabela] SET kolumna1 = wartość1 [, kolumna2 = wartość2 ] WHERE [warunek] Aktualizacja dotyczy dowolnej liczby wierszy (w tym zerowej) dla których spełniony zostaje warunek WHERE Pominięcie WHERE aktualizuje wszystkie wiersze w tabeli Aktualizacja dotyczy tylko danych w wymienionych kolumnach Aktualizować można również dane w kolumnach objętych warunkiem WHERE, ponieważ SZBD najpierw dokonuje operacji selekcji wierszy wg warunku WHERE
Polecenie DELETE DELETE FROM [tabela] WHERE [warunek] Operacja usunięcia dotyczy całego wiersza Usuwane są wszystkie wiersze, dla których spełniony jest warunek WHERE Pominięcie WHERE powoduje usunięcie danych z całej tabeli DELETE FROM Obecnosc Operację usunięcia wszystkich danych z tabeli zaleca się przeprowadzać za pomocą alternatywnego polecenia TRUNCATE TABLE [tabela], które się wykonuje znacznie szybciej