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 od 1986 r SQL jest oficjalnym standardem ( ANSI ), od 1987 ( ISO ) aktualny standard SQL: 2011 Cechy SQL: język deklaratywny język interpretowany dostęp do danych z poziomu tabel zbliżony konstrukcją do języka naturalnego wykorzystuje logikę trójwartościową bazuje na algebrze relacyjnej nie jest w pełni zgodny z modelem relacyjnym Możliwości SQL wyszukiwanie danych dopisywanie, usuwanie i modyfikacja danych tworzenie, usuwanie i modyfikowanie obiektów bazo_danowych zarządzanie transakcjami zarządzanie bazą danych Formy języka SQL interakcyjny ( autonomiczny ) statyczny kod SQL ( Static SQL ) 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 obiektów baz danych; polecenia CREATE, DROP, ALTER itp. DCL ( Data Control Language ) do zarządzania bazą danych polecenia COMMIT, ROLLBACK, GRANT, REVOKE itp. 1
Wady SQL standard nie jest przestrzegany przez różnych producentów narzędzi do baz danych nie określa zachowań bazy danych w wielu sytuacjach ( np.: indeksowanie, składowanie ) zbliżenie SQL'a do języka mówionego spowodowało większą złożoność składni czasem brak konsekwencji w składni wynikająca z pozostawienia starych form zbyt łatwe uzyskiwanie wyniku iloczynu kartezjańskiego 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 nie ma znaczenia Podstawowe typy danych SQL wg ANSI CHARACTER( n ), CHAR( n ) - ciąg znaków o stałej długości określone przez rozmiar n CHARACTER VARYING( n ), CHAR VARYING( n ) - ciąg znaków o zmiennej długości, nie przekraczającej podanego rozmiaru n 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 TIME czas w formacie: HH:MI:SS TIMESTAMP data wraz z czasem znacznik czasu w formacie : YYYY-MM-DD HH:MI:SS INTERVAL przedział czasu BLOB dane binarne CLOB dane znakowe XML dane w formacie XML Składnia zapytania SELECT [ DISTICT ] < lista_wynikowa > FROM < źródło_danych > [ WHERE < warunek_logiczny_dla_wierszy > ] [ GROUP BY < kryterium_grupowania > [ HAVING < warunek_logiczny_dla_grup > ] ] [ ORDER BY < kryterium_porządkowania > ] ; Klauzule SELECT oraz FROM są obowiązkowe; kolejność poszczególnych klauzul jest ważna 2
Klauzula SELECT określa schemat relacji wynikowej; słowo kluczowe DISTINCT ( bez duplikatów) stosujemy aby w wyniku otrzymać różne krotki ( wiersze ) praktykuje się użycie operatora * - lista wynikowa zawiera wszystkie atrybuty z relacji źródłowych lista wynikowa to elementy oddzielane przecinkiem element z listy może być atrybutem z relacji źródłowych, wyrażeniem typu liczbowego, tekstowego, datowego w szczególności funkcją istnieje możliwość stosowania aliasów ( przezwisk ) dla wyrażeń Klauzula FROM określa źródło danych; może to być jedna ( nazwana ) relacja, lub połączone relacje w szczególności ( nienazwana ) relacja jako wynik podzapytania Klauzula WHERE określa warunek logiczny jaki ma być spełniony przez krotki ( wiersze tabeli ) relacji wynikowej Warunek logiczny budujemy używając operatory: porównania ( =, <>, <, <=, >, LIKE, NOT LIKE ) zawierania w przedziale ( BETWEEN... AND ) zawierania w zbiorze ( IN ) operatorów logicznych (ALL, AND, ANY, EXISTS, NOT, OR ) operatory do obsługi wartości NULL ( IS NULL, IS NOT NULL) oraz atrybuty z relacji źródłowych, literały, a także funkcje Klauzula GROUP BY umożliwia podzielenie relacji wynikowej na podzbiory agregację pojedynczy podzbiór/grupę stanowią krotki, dla których kryterium grupowania ma identyczną wartość. na liście wynikowej klauzuli SELECT mogą wystąpić jedynie elementy związane z kryterium grupowania, funkcje agregujące (COUNT, SUM, AVG, MIN, MAX i inne) Klauzula HAVING określa warunki dla podzbiorów/grup, które powstały w wyniku agregacji jest możliwa tylko z klauzulą GROUP BY Klauzula ORDER BY umożliwia posortowanie danych wynikowych według zadanego kryterium kryterium może to być lista atrybutów z relacji źródłowych, wyrażenie, alias lub liczba wskazująca pozycje na liście wynikowej klauzuli SELECT możliwy jest porządek sortowania; rosnący, malejący, losowy opcja (klauzula) ORDER BY występuje w składni tylko raz SELECT nr_albumu, rok, gr_dziekan FROM Studenci WHERE rodzaj_studiow='inż_niest' AND rok IS NOT NULL ORDER BY 2, 3 ; SELECT kraj, Count(*), Sum(koszt) FROM Filmy GROUP BY kraj HAVING Count(*) > 2 ORDER BY kraj ; 3
Złączenia tabel w języku SQL Notacja w standardzie ANSI SQL FROM < tabela1> [ AS <alias> ] { CROSS JOIN [ NATURAL ] [ <rodzaj_połączenia> ] JOIN < tabela2 > [ AS < alias > ] { ON <warunek1> [ { AND OR } <warunek2> ] [... ] ] USING <atrybut1 > [,... ] ) } } Typy połączeń Iloczyn kartezjański daje w wyniku tabelę składającą się ze wszystkich możliwych kombinacji wierszy obu łączonych tabel SELECT m.imiona,m.rok FROM Studenci k CROSS JOIN Studenci m WHERE k.nr_albumu = ' ' AND to_char(m.data_urodzenia,'yyyy') IN ('1988', '1989','1990') AND m.rodzaj_studiow=' INŻ_NIEST' AND m.imiona NOT LIKE '%A' ; Złączenia naturalne daje w wyniku iloczyn kartezjański łączonych tabel ograniczony do tych wierszy, dla których atrybuty o tych samych nazwach i typach w obu tabelach mają równe wartości SELECT nazwisko, imie, rola, tytul FROM Filmy NATURAL JOIN Obsady WHERE rezyser LIKE 'Wajda%' ; Złączenie warunkowe ( tetha złączenie ) daje w wyniku iloczyn kartezjański łączonych tabel ograniczony do tych wierszy, dla których został spełniony warunek tetha SELECT nazwa, nazwisko FROM Pracownicy JOIN Dzialy USING ( id_dzialu); stary zapis SELECT * FROM Pracownicy p, Dzialy d WHERE p.id_dzialu=d.id_dzialu; Złączenie zewnętrzne rozszerza rezultat złączenia równościowego o te wiersze jednej lub obu tabel, dla których nie odnaleziono odpowiedników w drugiej tabeli. Wiersze stanowiące rozszerzenie są wypełnione wartością NULL. Złączenia zewnętrzne dzielą się na lewostronne, prawostronne, pełne SELECT nazwa,count(nr_akt) Liczba, sum(placa+nvl(dodatek_funkcyjny,0)) Budzed FROM Pracownicy FULL JOIN Dzialy USING(Id_dzialu) GROUP BY Nazwa ; 4
Samozłączenie złączenie relacji samej z sobą SELECT p.nazwisko AS Pracownik, s.nazwisko AS Kierownik FROM Pracownicy p JOIN Pracownicy s ON (p.kierownik = s.nr_akt ); Podzapytania mogą być zagnieżdżone w klauzulach SELECT, FROM, WHERE oraz HAVING SELECT nazwisko,placa FROM Pracownicy WHERE placa = ( SELECT min( placa ) FROM Pracownicy ); SELECT * FROM ( SELECT nazwisko, placa FROM Pracownicy ORDER BY 2 DESC ) WHERE rownum<=3 ; SELECT imiona,count(*) FROM Studenci WHERE rodzaj_studiow='inż_niest' GROUP BY imiona HAVING count(*) = ( SELECT max(count(*)) FROM Studenci WHERE rodzaj_studiow='inż_niest' GROUP BY imiona) ; SELECT nr_albumu, rok FROM Studenci s WHERE data_urodzenia = ( SELECT max(data_urodzenia) FROM Studenci WHERE rok = s.rok ) ; polecenie UPDATE służy do aktualizacji zawartości wierszy tabel lub perspektyw składnia: UPDATE { <nazwa_tabeli> <nazwa_perspektywy>} SET { {<nazwa_atrybutu1> = <wyrażenie> DEFAULT NULL}, {<nazwa_atrybutu2> = <wyrażenie> DEFAULT NULL},...} [WHERE <warunek_logiczny> ]; UPDATE Studenci SET rok = rok + 1 WHERE rodzaj_studiow =' INŻ_NIEST'; UPDATE Studenci SET rok = rok 1 WHERE nr_albumu IN ( '111','100'); 5
UPDATE Pracownicy SET placa = placa * 1.2 WHERE nr_akt IN ( SELECT kierownik FROM Pracownicy ); polecenie INSERT pozwala wstawiać do tabeli lub perspektywy nowe wiersze. składnia: INSERT INTO { <nazwa_tabeli> <nazwa_perspektywy>} [ (<nazwa_atrybutu1> [,... ] ) ] { DEFAULT VALUES VALUES ( <wartość1 [,...] ) SELECT... } ; INSERT INTO Dzialy VALUES (85,' Logistyka','Radom'); INSERT INTO Pracownicy ( nr_akt, nazwisko ) VALUES ( 700,'Nowak'); INSERT INTO Absolwenci ( nazwisko, imiona, rocznik ) SELECT nazwisko, imiona, to_char(sysdate,'yyyy') FROM Studenci WHERE rodzaj_studiow='inż_st' AND semestr='vii' ; Polecenie DELETE Usuwa wiersze z danej tabeli lub perspektywy Składnia: DELETE FROM { <nazwa_tabeli> <nazwa_perspektywy> } [ WHERE <warunek_logiczny> ]; Przykłady: DELETE Studenci WHERE rok = 5; DELETE FROM Robocza ; Normalizacja Anomalie Proces dekompozycji; odwracalny rozpoczynający się od podstawowej relacji zmierzającej do schematu optymalnego, pozbawionego anomalii. wstawiania usuwania modyfikacji 6
Proces normalizacji musi odbywać się bez strat danych; żaden atrybut nie może zostać zgubiony zależności; wszystkie zależności funkcyjne muszą być reprezentowane w pojedynczych schematach relacji proces normalizacji spowoduje: o o o spłaszczenie struktury danych poprzez eliminację atrybutów złożonych ustalenie pierwotnych i obcych kluczy relacji wyeliminowanie niepożądanych zależności pomiędzy kolumnami relacji poprzez wprowadzenie nowych relacji aktualnie rozróżnia się pięć postaci normalnych proces normalizacji jest (zazwyczaj) kończony po osiągnięciu 3NF, która w większości praktycznych zastosowań uznawana jest za wystarczającą przekształcanie relacji do zaawansowanych postaci normalnych dotyczy tabel, które posiadają więcej niż 3 atrybuty i każdy z nich pełni funkcję klucza Postacie normalne ( zdefiniowane przez Codda ) Pierwsza postać normalna 1NF relacja jest w pierwszej postaci normalnej, jeśli każda wartość atrybutu w każdej krotce tej relacji jest wartością atomową Dalsze postacie normalne 2NF, 3NF relacja jest w drugiej postaci normalnej, jeśli jest w 1NF i każdy atrybut nie należący do żadnego klucza potencjalnego jest zależny funkcyjnie od całego klucza głównego relacja jest w trzeciej postaci normalnej jeśli jest w 2NF i wszystkie atrybuty nie należące do żadnego klucza potencjalnego są wzajemnie niezależne Przysięga normalizacji ( parafraza ) 1. Bez powtórzeń 2. Atrybuty zależą od klucza 3. Od całego klucza 4. I niczego innego, tylko klucza 5. Tak mi dopomóż Codd. 7
Tabela ZAMÓWIENIA Nr_ Id_ zamówienia dostawcy Nazwa_ dostawcy Adres_ dostawcy Id_ części Nazwa_ Części Ilość_ zam_części Magazyn Adres_ magazynu 001 300 NISSAN Liege 53 Pompa 100 5 Warszawa 001 300 NISSAN Liege 57 Filtr 50 5 Warszawa 001 300 NISSAN Liege 59 Błotnik 500 6 Szczecin 002 400 HONDA Glasgow 54 Pompa 500 5 Warszawa 002 400 HONDA Glasgow 32 Koło 100 6 Szczecin 003 500 TOYOTA Tokio 88 Silnik 15 7 Poznań 004 600 HONDA London 59 Błotnik 400 6 Szczecin Założenia tabela zawiera informacje o zamówieniach części u dostawców i skierowaniu ich do odpowiednich magazynów jedno zamówienie może dotyczyć wielu części dostarczanych przez tego samego dostawcę różne zamówienia mogą dotyczyć tego samego dostawcy i tych samych części ta sama część może być dostarczana przez różnych dostawców te same części są składowane zawsze w tym samym magazynie w zamówieniach jest podawany identyfikator dostawcy i nazwa dostawcy, gdyż różni dostawcy mogą mieć tę samą nazwę ( np. Honda ) Wady ( ANOMALIE ) tabeli ZAMÓWIENIA występuje dublowanie się danych; wielokrotnie jest pamiętany adres dostawcy; podobnie magazynu w tej tabeli nie możemy zapisać adresu dostawcy, do którego nie złożono żadnego zamówienia usuwając informację o zamówieniu skierowanym do danego dostawcy, możemy utracić informacje o jego adresie analogiczna sytuacja występuje w odniesieniu do magazynu i jego adresu proponowane tabele po normalizacji: Zamowienie_do_dostawcy(Nr_zamowienia, Id_dostawcy) Czesci(Id_czesci, Nazwa_czesci) Czesci_w_magazynie(Id_czesci, Magazyn) Magazyny(Magazyn, Adres_magazynu) Dostawcy(Id_dostawcy, Nazwa_dostawcy, Adres_dostawcy) Dostawy_czesci(Nr_zamowienia, id_czesci, ilosc_zam_czesci) Wykorzystano Wykłady dr inż. Olga Siedlecka-Lamch - Systemy baz danych z roku 2012 8