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