Składowe SQL
Transkrypt
Składowe SQL
Wykład III 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 Wykład III 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 Wykład III 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 przykłady: 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 Wykład III 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 przykład: 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 przykład: 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 przykłady: 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 przykład: 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 Wykład III Samozłączenie – złączenie relacji samej z sobą przykład: 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 przykłady: 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> ]; przykłady: UPDATE Studenci SET rok = rok + 1 WHERE rodzaj_studiow =' INŻ_NIEST'; UPDATE Studenci SET rok = rok – 1 WHERE nr_albumu IN ( '111','100'); 5 Wykład III 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 . . . } ; przykłady: 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 Proces dekompozycji; odwracalny rozpoczynający się od podstawowej relacji zmierzającej do schematu optymalnego, pozbawionego anomalii. Anomalie wstawiania usuwania modyfikacji 6 Wykład III 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 „spłaszczenie” struktury danych poprzez eliminację atrybutów złożonych o ustalenie pierwotnych i obcych kluczy relacji o 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. 2. 3. 4. 5. Bez powtórzeń Atrybuty zależą od klucza Od całego klucza I niczego innego, tylko klucza Tak mi dopomóż Codd. 7 Wykład III przykład: Tabela ZAMÓWIENIA Nr_ zamówienia Id_ dostawcy Nazwa_ dostawcy Adres_ dostawcy Id_ części Nazwa_ Części Ilość_ Magazyn zam_części Adres_ magazynu 001 001 001 002 002 003 004 300 300 300 400 400 500 600 NISSAN NISSAN NISSAN HONDA HONDA TOYOTA HONDA Liege Liege Liege Glasgow Glasgow Tokio London 53 57 59 54 32 88 59 Pompa Filtr Błotnik Pompa Koło Silnik Błotnik 100 50 500 500 100 15 400 Warszawa Warszawa Szczecin Warszawa Szczecin Poznań Szczecin 5 5 6 5 6 7 6 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