1
SYSTEMY BAZ
DANYCH
Część II
Opracowanie : Dr Bożena
Śmiałkowska
Cechy języków zapytań do baz
danych
Deklaratywny charakter,
Zanurzenie w języku programowania,
Wysoki poziom abstrakcji
SQL
Języki zapytań do relacyjnych baz
danych
Języki oparte na
algebrze relacji (ISBL w
Ingresie)
Języki oparte na
predykatach
Języki oparte
na rachunku
dziedzin (QBL)
Języki oparte na
rachunku
krotek (QUEL)
SQL
=
[
język oparty na algebrze relacji
] + [
język oparty na
rachunku krotek
]
Literatura do zagadnienia :
SQL
Celko J.: Zaawansowane techniki programowania.
Mikrom, W-wa, 1999
Connan S.: SQL-The standard Handbook. McGraw-Hill
Book Company, London, 1993
Harrington J.L.: SQL dla każdego. EDU-Mikom, W-wa,
1998
SQL. Język relacyjnych baz danych. Wellesley Software.
WNT, W-wa, 1999
Stephans R.: SQL w 3 tygodnie. LT&P, W-wa, 1999
http://galaxy.uci.agh.edu.pl/chwastek/lectures/db/dbtitl
e.html
http://baszta.iie.ae.wroc.pl/index.html
http://www.cs.put.poznan.pl/kjankiewicz/oracle/sql/inde
x.html
http://www.cs.put.poznan.pl/rwrembel/courses/sbd.htm
l
SQL to:
Strukturalny język zapytań (Ang. Structured
Query Language),
niepełny język obsługi baz danych,
język obsługi baz danych zaimplementowany w
systemach zarządzania relacyjnymi bazami
danych (RDBMS – relacyjny DBMS), przeznaczony
do definiowania struktur danych, wyszukiwania
danych oraz operacji na danych,
Posiada on akceptację ANSI oraz standard ISO.
W praktyce jest to standardowy język zapytań.
Cechy języka SQL
Jest językiem wysokiego poziomu (4GL) opartym na
języku angielskim,
Jest językiem deklaratywnym (nieproceduralnym)
zorientowanym na wynik (użytkownik deklaruj co chce
uzyskać, a nie jak to chce zrealizować),
SQL nie ma instrukcji sterujących wykonanie programu,
Jest często zanurzony w innym języku programowania
(np.: C, Fortran, PL, itp.),
Nie zawiera w sobie rekurencji,
Umożliwia definiowanie struktur danych, wyszukiwanie
danych oraz operacje na danych (np.: kasowanie
danych, modyfikowanie danych itp., o ile użytkownik
ma do tego prawo).
Zalety SQL
Wady i ograniczenia SQL
Historia SQL
Koniec lat 70 – tych – firma ORACLE (Relational
Software Inc.) – pierwsza implementacja praktyczna
(komercyjna),
1981 – IBM – SQL/DS. (RDL – Relational Data Language),
1983 – ISO definicja SQL,
1986 – ANSI – pierwszy standard SQL (SQL-86),
1987 – ISO – pierwszy standard SQL : ISO 9075:1987 (E),
1989 – ISO – następny standard SQL : ISO 9076: 1989
(E), (SQL-98),
1992 – ISO – kolejna, wzbogacona wersja : ISO 9075 :
1992 (E), (SQL 2),
1999 – SQL 3
Grupa ODMG (Object DataBase Management Group) w
oparciu o SQL opracowała język do obiektowych baz
danych OQL.
Historia SQL…cd…
Koncepcja leżąca u podstaw języka SQL powstała w wyniku
prac prowadzonych w laboratorium badawczym IBM w San Jose
w Kalifornii w latach siedemdziesiątych. Tam też została
zbudowana implementacja prototypowa relacyjnych pojęć o
nazwie System/R. Ten wczesny relacyjny SZBD używał języka
znanego wówczas jako SEQUEL. Dlatego właśnie wiele osób
wciąż wymawia nazwę SQL jak SEQUEL (to jest sikłel).
W latach 1973-1979 badacze z IBM opublikowali w
akademickich czasopismach dużo materiałów na temat
budowy System/R. W tym czasie zarówno w USA, jak i w
Europie na konferencjach i seminariach prowadzono ożywione
dyskusje na temat poprawności relacyjnego SZBD. IBM okazał
się
niewątpliwie
nadzwyczaj
powolny
w
dostrzeżeniu
komercyjnego znaczenia systemów relacyjnych. Pierwsze
pomyślne, komercyjne wykorzystanie idei związanych z
relacyjnym modelem danych przypadło korporacji ORACLE,
założonej w 1977 r.
Historia SQL…cd…
System ORACLE był i jest relacyjnym SZBD opartym na
SQL. Wielu innych producentów również
wyprodukowało systemy używające SQL. Z tego
powodu w 1982 r. organizacja ANSI (American National
Standards Committee) przekazała swojemu komitetowi
baz danych (X3H2) sprawę utworzenia standardu
języka relacyjnych baz danych (RDL). Komitet ten
opublikował definicję składni standardu SQL w 1986 r.,
opartą głównie na dwóch dialektach SQL IBM i ORACLE
(ANSI, 1986). W 1987 r. organizacja ISO (International
Standards Organization) opublikowała bardzo podobny
standard (ISO, 1987). Ten standard jest również znany
pod nazwą SQLI. Oryginalny dokument ANSI określa
dwa poziomy dla SQLl: poziom pierwszy i poziom drugi.
Poziom drugi jest pełnym językiem SQL. Poziom
pierwszy, którego pierwotnym założeniem było
pełnienie funkcji przecięcia dla istniejących
implementacji, jest podzbiorem poziomu drugiego.
Historia SQL…cd…
W następstwie powyższych publikacji pojawiło się wiele
krytycznych uwag na temat standardu ANSI/ISO,
zwłaszcza ze strony specjalistów w dziedzinie baz
danych, takich jak E. F. Codd (1988a, 1988b) i C. Dale
(1987). Wiele osób uważało, że wadą standardu jest
fakt, że jest on częścią wspólną istniejących aplikacji.
Inni uważali, że język ma poważniejsze wady, zwłaszcza
w zakresie relacyjnych konstrukcji.
W 1989 r. w odpowiedzi na krytykę ANSI opublikowała
dodatek do standardu, zawierający głównie ulepszenia
cech integralności (ANSI, 1989a). Duża część tego
dodatku została włączona do roboczej wersji
proponowanej drugiej wersji standardu, również
wydanego przez ANSI w 1989 r. (ANSI, 1989b). ISO,
blisko współpracując z ANSI, wydała w tym samym roku
dokument zatytułowany "Database Language SQL with
Integrity Enhancement" (ISO, 1989).
Historia SQL…cd…
W 1992 r. ANSI i ISO wydały pełną specyfikację rozszerzonej
wersji SQL, znanej jako SQL2. Dla tego standardu określono dwa
podzbiory: poziom minimalny i poziom pośredni. Poziom
minimalny SQL2 jest w zasadzie taki sam jak SQL1 z
udoskonalonymi cechami integralności. Uzgodniono już kolejne
istotne rozszerzenia standardu SQL2 i oczekuje się pojawienia
wersji
standardu
o
nazwie
SQL3
pod
koniec
lat
dziewięćdziesiątych.
Nie ma zatem jednego standardu, a przynajmniej trzy. Oznacza
to, że jakakolwiek implementacja SQL może realizować
wszystkie lub część z tych trzech wersji standardu. Jest to
jeden z powodów, dla których większość implementacji
komercyjnych uważa się w najlepszym razie za dialekty
standardu SQL. Innymi słowy, pod wieloma względami znajdują
one wspólny grunt wokół definicji podstaw lub poziomu jeden
standardu SQLl. Pod innymi względami różnią się one nie
dostosowując się ani do SQLI, ani do późniejszych standardów
(typy
danych
są
tu
dobrym
przykładem).
Niektóre
implementacje oferują dodatkowe konstrukcje nie uwzględnione
w standardzie.
Ogólna charakterystyka SQL…
SQL (strukturalny język zapytań - Structured Query
Language
)
Wysoki poziom bezpieczeństwa, integralności i
kompletności
danych,
Praca w konfiguracjach klient-serwer,
Optymalizacja zapytań kierowanych do bazy przez
użytkowników lub ich systemy,
Efektywne przetwarzanie transakcji,
Zdolność manipulowania niestandardowymi
strukturami
danych,
SQL jest zwykle podzielony na trzy główne części:
definicje
danych, operowanie danymi i kontrola danych,
Sposób wykorzystania
SQL
Interaktywny SQL
– bezpośredni dostęp do danych za
pomocą interpretera SQL,
Statyczny SQL
– stały (predefiniowany) kod w SQL –
może to być zanurzony SQL (tzw. embedded SQL) – kod
znajdujący się wewnątrz innego języka programowania
lub modułowy SQL, tzn. samodzielne moduły w języku
SQL mogą być łączone z modułami innych języków,
Dynamiczny SQL
– kod SQL generowany dynamicznie
przez programy użytkowe – często generowany jest za
pomocą interfejsów graficznych lub z poziomu WWW,
Definicyjny SQL
– kod w SQL generowany przy pomocy
narzędzi CASE (Computer Aided Software Enginnering).
SQL – postać poleceń
(zapytań)
Przykładowe pełne
określenie zapytania
Przykładowe zapytanie
sparametryzowane
Przykładowe zapytanie
sparametryzowane
Zapytania dynamiczne -
przykład
Zapytania dynamiczne -
przykład
Komponenty SQL
Podstawowe struktury danych w
SQL
Podstawowe struktury danych cd..
Alfabet SQL
Obejmuje:
Zestaw znaków SQL charakterystyczny dla
implementacji
litery duże i małe, cyfry, znaki specjalne , ; ( ) . %
_ > < = „ + * / - ? : ! spacja,
Literały (stałe), zapisywane w cudzysłowiu np.:
‘Warszawa’
Identyfikatory (nazwy), np.: nazwy tabel, kolumn
(atrybutów), widoków, schematów, itp.,
Nazwy poleceń i funkcji - każda instrukcja w SQl
zaczyna się słowem kluczowym, może zawierać
modyfikatory i kończy się średnikiem,
Znak * oznacza wszystkie kolumny (atrybuty)
tabeli,
Zasady konstrukcji wyrażeń
Podstawowe typy danych w
SQL
Wyróżnia się następujace typy danych:
Typy napisowe (String)
Character(N)
- Napis znakowy o stałej długości.
Jeżeli na wejściu znajdzie się napis o mniejszej
długości niż N, to na końcu napisu są dodawane
spacje,
Character Varying (N)
- Napis znakowy o
minimalnej długości 1 i maksymalnej długości
określonej przez system. Jeżeli na wejściu pojawi
się napis o mniejszej długości niż N, to jest
przechowywana tylko właściwa długość napisu.
Bit
- Napisy bitowe głównie używane dla danych
graficznych i dźwięku. d. Bit Varying. Napisy
bitowe zmiennej długości,
Podstawowe typy danych w
SQL
Typy liczbowe:
Numeric
- Synonim dla Decimal,
Decimal(M, N)
- Liczba dziesiętna o długości M z N
miejscami po przecinku dziesiętnym,
Integer
- Liczba całkowita z zakresu wartości
określonych przez system,
Smallint
- Liczba całkowita z mniejszego zakresu
wartości określonych przez system,
Float
- Liczba przechowywana w reprezentacji
zmiennopozycyjnej,
Real
- Jest synonimem Float,
Double Precision
.
Podstawowe typy danych w
SQL
Typy daty i godziny (Datetime) :
Date
- Daty określone przez system,
Time
- Godziny określone przez system,
Timestamp
- Daty i godziny z uwzględnieniem ułamków
sekund
Interval
- Przedziały między datami.
Konkretne implementacje
różnią się realizacją typów
danych.
Obiektowy model SQL3
Rozszerzenie typów o obiekty w
SQL3
Zakładanie tabel bazy danych
CREATE TABLE
<nazwa tabeli>
(<nazwa kolumny><typ danych>(<długość>),
<nazwa kolumny><typ danych>(<długość>),
...
[
PRIMARY KEY
(nazwa atrubutu [ , nazwa
atrubutu ]…)],
FOREIGN KEY
(nazwa atrubutu [, nazwa
atrybutu ] …)
REFERENCES
<nazwa tabeli> (<nazwa
atrybutu>)]);
Zakładanie tabel bazy danych -
Opcje NOT NULL i UNIQUE
Każda kolumna w tabeli może być zdefiniowana
jako
NOT NULL.
Oznacza to, że użytkownik nie może
wprowadzić wartości null do tej kolumny.
Domyślną specyfikacją dla kolumny jest
NULL
.
To
znaczy wartości null są dozwolone w
kolumnie.
Każda kolumna może być również zdefiniowana
jako
UNIQUE
(jednoznaczna). Ta klauzula zabrania
użytkownikowi wprowadzania powtarzających
się
wartości do kolumny.
Kombinację NOT NULL i UNIQUE możemy użyć
do
zdefiniowania cech klucza głównego.
Zakładanie tabel bazy danych -
przykłady
Do definicji kolumny możemy dodać klauzulę określającą
wartość, którą system automatycznie wpisuje do
kolumny,
jeżeli
użytkownik
wprowadzi
niepełną
informację. Na przykład do kolumny poziom w tabeli
Moduły
możemy
dodać
specyfikację
DEFAULT
<wartość> wskazującą, że domyślnym poziomem
powinien być 1:
CREATE TABLE Moduły
(NazwaModułu Character( 30) NOT NULL
UNIQUE,
Poziom Smallint DEFAULT 1,
KodKursu Character(3),
NrPrac Integer) ;
Zakładanie tabel bazy danych -
przykłady
CREATE TABLE
sale
(id_sali
short not null,
kod_kursu
text(10) not null,
nazwa_kursu
text(30),
wymiar_godz
byte,
czas_od
text(12),
id_kierunku
text(4),
Primary key
(id_sali),
Foreign key
(id_kierunku)
references
KIERUNKI
(
nr_kierunek
));
Zakładanie tabel bazy danych-
przykłady
Instrukcja DROP TABLE –
usuwanie definicji tabeli
Usuwa definicję tabel.
Aby usunąć tabelę z bazy danych,
używamy następującego polecenia:
DROP TABLE
<nazwa tabeli>
Na przykład
DROP TABLE Moduły
Modyfikacja struktury tabel bazy
danych
Przy założeniu idealnej niezależności danych administrator danych
powinien móc modyfikować strukturę bazy danych bez wywierania
wpływu na użytkowników lub programy użytkowe, które mają dostęp
do bazy danych. W praktyce produkty oparte na SQL realizują tylko
ograniczoną postać niezależności danych. Administrator może dodać
dodatkową kolumnę do tabeli, zmodyfikować maksymalną długość
istniejącej kolumny lub usunąć kolumnę z tabeli. Każdą z tych operacji
określamy używając polecenia
ALTER TABLE.
Na przykład:
ALTER TABLE Wykładowcy
ADD COLUMN NrPokoju Smallint
ALTER TABLE Wykładowcy
ALTER COLUMN NazwiskoPrac Varchar(20)
ALTER TABLE Wykładowcy
DROP COLUMN NazwiskoPrac
dodanie
kolumny
zmiana
wymiaru
usuniecie
wymiaru
Operacje w SQL na danych bazy
danych
Wstawianie danych do bazy danych (
INSERT INTO
),
Aktualizacja bazy danych (
UPDATE
),
Kasowanie danych z bazy danych (
DELETE
),
Operacje teoriomnogościowe na bazie danych: suma, różnica,
iloczyn mnogościowy i kartezjański (
UNION,
INTERSECT,
EXCEPT
),
Selekcja danych (
SELECT
),
Projekcja (rzutowanie) danych (realizowane przez
SELECT
),
Łączenie tabel bazy danych: naturalne, warunkowe, zewnętrzne
(
JOIN, NATURAL JOIN, LEFT OTHER JOIN, RIGHT OTHER JOIN
FULL
OTHER JOIN
oraz realizowane przez
SELECT
),
Dzielenie tabel (
DIVISION
).
Wstawianie danych do bazy danych
Polecenie INSERT dodaje dodatkowy wiersz do podanej
tabeli. Na przykład instrukcja:
INSERT INTO Moduly
VALUES ('Wstęp do zarządzania',I,'BSD',123)
dodaje dodatkowy wiersz do tabeli Moduly. Porządek, w
jakim powinny być podane wartości w poleceniu INSERT,
musi się zgadzać z porządkiem, w jakim pierwotnie
określono kolumny dla tabeli w poleceniu CREATE
TABLE. Jeżeli chcemy wypisać wartości w jakimś innym
porządku niż pierwotnie określony lub jeśli chcemy
ominąć jakieś kolumny przed wstawianiem, to musimy
dodać listę nazw kolumn do polecenia INSERT. Na
przykład:
INSERT INTO Moduty (Poziom, KodKursu,
NrPrac, NazwaModulu) VALUES
(2,'CSD',237,'Tworzenie systemów
informacyjnych')
Wstawianie danych do bazy danych
Wstawianie danych do bazy danych
Specjalna wersja polecenia INSERT umożliwia dodanie
wielu wierszy do tabeli. Jest zwykle używana, aby
umieścić wyniki jakiegoś zapytania w podanej tabeli.
Przypuśćmy na przykład, że chcemy utworzyć tabelę
wykładowców
pracujących
na
wydziale
studi6w
informatycznych. Możemy to zrobić, jak następuje:
CREATE TABLE WykladowcyInformatyki
(NrPrac Number(5),
NazwiskoPrac Varchar(15),
Status Varchar(10),
Pensja Decimal(7, 2))
INSERT INTO WykladowcyInformatyki(NrPrac,
NazwiskoPrac, Status, Pensja)
SELECT NrPrac, NazwiskoPrac, Status, Pensja
FROM Wykladowcy
WHERE NazwaWydzialu = 'Studia informatyczne'
Usuwanie danych z bazy danych
Polecenia DELETE używamy do usuwania wierszy z tabeli.
Wiersze do usunięcia podajemy w klauzuli WHERE,
podobnie jak w poleceniu SELECT.
DELETE FROM Wykładowcy
WHERE NazwaWydziału = 'Studia
informatyczne'
np.:
Aktualizowanie danych w bazie
danych
Polecenia
UPDATE
używamy do zmodyfikowania zawartości
jednego lub więcej wierszy tabeli. Wiersze do modyfikacji
są określane w opcjonalnej klauzuli WHERE, a zmianę lub
zmiany do wykonania podajemy w klauzuli
SET
.
UPDATE Wykładowcy SET Pensja =
Pensja*1.1
WHERE Status = 'PL'
Na przykład następujące polecenie zwiększy o 10% pensję
wszystkich wykładowców o statusie PL:
Operacje w SQL na danych bazy
danych
Selekcja
projekcja
Łączenie (join) dwóch tabel
Operacje „mnogościowe” w
SQL na danych bazy danych
S
44
Kos
z
34
Znak
a
11
Dos
w
32
Bios
a
11
Dos
w
32
Bios
w
32
Bios
z
43
Znak
a
11
Dos
w
32
Bios
w
32
Bios
z
43
Znak
A
11
Dos
w
32
Bios
S
44
Kos
z
34
Znak
a
11
Dos
w
32
Bios
Suma tabel
Różnica tabel
Iloczyn tabel
Selekcja
Struktura typowego zapytania
selekcyjnego
Proste wyszukiwanie jest wykonywane dzięki kombinacji klauzul
SELECT, FROM i WHERE:
SELECT <nazwa atrybutul.>, <nazwa atrybutu2>,...
FROM <nazwa tabeli>
[WHERE <warunek>]
Klauzula
SELECT
wskazuje na kolumny, z których wartości mają
być wydobyte. Klauzula
FROM
określa tabele, z których mają
pochodzić dane. Klauzula
WHERE
określa warunek lub warunki,
które mają być spełnione przez sprowadzane dane. W
następującym poleceniu gwiazdka "
*
" pełni funkcję symbolu
uniwersalnego. Oznacza to, że zostaną wypisane wszystkie
atrybuty z tabeli, której nazwa znajduje się po słowie FROM.
Klauzula WHERE jest opcjonalna
Opcja
DISTINCT
w wyniku daje różne (niepowtarzalne) wyniki
SELECT DISTINCT stanowisko
FROM pracownicy
;
Warunki w zapytaniach
selekcyjnych
Like w Access
Znak
Opis
0
Cyfra (Od 0 do 9, pozycja wymagana, znaki plus [+] i minus [–] nie są dozwolone).
9
Cyfra lub spacja (pozycja nie jest wymagana, znaki plus i minus nie są dozwolone).
#
Cyfra lub spacja (pozycja nie jest wymagana, w trybie edycji spacje wyświetlane są jako puste miejsca, lecz
podczas zapisywania danych spacje są usuwane; znaki plus i minus są dozwolone).
L
Litera (od A do Z, pozycja wymagana).
?
Litera (od A do Z, pozycja wymagana).
A
Litera lub cyfra (pozycja wymagana).
a
Litera lub cyfra (pozycja wymagana).
&
Dowolny znak lub spacja (pozycja wymagana).
C
Dowolny znak lub spacja (pozycja wymagana).
. , : ; - /
Dziesiętny symbol zastępczy oraz separator tysięcy, dat i godzin. (Znak, który zostanie użyty w charakterze
separatora zależy od ustawień w oknie dialogowym Właściwości: Ustawienia regionalne w Panelu
sterowania systemu Windows).
<
Powoduje, że wszystkie litery zostaną zmienione na małe.
>
Powoduje, że wszystkie litery zostaną zmienione na wielkie.
!
Powoduje, że wszystkie dane są wyświetlane od strony prawej do lewej zamiast od lewej do prawej. Znaki
wpisane do maski wprowadzania zawsze będą ją wypełniać od strony lewej do strony prawej. Wykrzyknik
może pojawić się w dowolnym miejscu maski wprowadzania
\
Powoduje, że znak, który po nim występuje, zostanie wyświetlony jako znak literałowy (na przykład, \A będzie
wyświetlone po prostu jako A).
Struktura typowego zapytania
selekcyjnego - przykłady
SELECT * FROM Moduły
WHERE NazwaModułu = 'Dedukcyjne bazy danych’
Selekcja - przykłady
SELECT
w.nr_w,
p.nazwisko,
p.stanowisko,
p.dzial,
m .miasto,
m.ulica
FROM
pracownicy p, miejsca
m,wypozyczenia w
WHERE
p.nr_m=m.nr_m
AND
p.nr_p=
w.prac_wyp
AND
m.miasto = ‘WARSZAWA’
W celu
połączenia
w jeden dwóch
łańcuchów
znaków
należy
wykorzystać
znak
konkatenacji
‘||’
Kolumny
wyliczone
mogą
być nazwane
przez
zastosowanie
klauzuli AS
SELECT
k.imie || ‘ ‘ || k.nazwisko AS
Klient,
‘ul. ‘ || k.ulica || ‘ ‘ || k.numer
AS
Ulica,
k.kod || ‘ ‘ || k.miasto
AS
Miasto
FROM
klienci k
Obliczenia w zapytaniach
selekcyjnych
1
2
3
4
Ilosc)
54
Selekcja – przykłady cd..
SELECT k.imie, k.nazwisko, k.miasto ,
CASE k.miasto
WHEN ‘Warszawa’ THEN ‘Klient oddziału
macierzystego’
ELSE ‘Klient z przedstawicielstwa’
END
FROM
klienci k
Wyrażenie CASE pozwala na wybranie pewnej
wartości w zależności od wartości w innej
kolumnie. W przykładzie sprawdzamy czy klient
pochodzi z Warszawy, jeśli tak to wpisywana jest
wartość „Klient oddziału macierzystego”, w
przeciwnym razie jest to Klient z
przedstawicielstwa”.
Rzut (projekcja)
Rzut (projekcja)
Rzut (projekcja)
Selekcja jako rzut (projekcja)
Jeżeli określimy nazwy kolumn w zapytaniu selekcyjnym, to
instrukcja SELECT języka SQL staje się kombinacją operatorów
selekcji (RESTRICT) i rzutu (PROJECT) algebry relacyjnej.
SELECT Poziom
FROM Moduły
Poziom
1
1
3
3
2
1
1
Wynik
selekcji
Jeśli w zapytaniu selekcyjnym pominięto warunki selekcji
(warunek po słowie kluczowym WHERE), to mamy do czynienia z
rzutem (projekcją).
Struktura typowego zapytania
selekcyjnego - przykłady
Powtarzające się wartości są dozwolone w SQL ale są
niedozwolone w relacyjnym modelu danych. Aby
uzyskać prawdziwie relacyjny wynik na powyższe
zapytanie, musimy do klauzuli SELECT dodać słowo
kluczowe
DISTINCT
(różne). Usuwa to powtarzające się
wartości w tabeli.
SELECT DISTINCT Poziom
FROM Moduły
Poziom
1
3
2
Wynik
selekcji z
poprzedniego
zapytania
Wybór krotek z uporządkowaniem
wyniku wyszukiwania
SELECT
Nazwisko
,
Imię
,
Zarobki
FROM
pracownicy
WHERE
Zarobki>1000)
ORDER BY
Nazwisko
;
Wybierz pola
Nazwisko
,
Imię
,
Zarobki
z rekordów tabeli
o nazwie
pracownicy
dla których pole
Zarobki
ma wartość
większą niż 1000
i posortuj je wg pola
Nazwisko
Aby uzyskać listę w porządku malejącym, do klauzuli
ORDER BY
musimy dodać słowo kluczowe
DESC
po nazwie atrybutu
.
Grupowanie krotek do obliczeń
klauzula GROUP BY
Klauzula
(instrukcja)
GROUP
BY
dzieli
dane
wyselekcjonowane z bazy danych na grupy, biorąc za
podstawę wartości w określonej kolumnie lub zbiorze
kolumn,
i
umożliwia
wykonanie
obliczeń
podsumowujących (agregujących) na wartościach w każdej
grupie,
Ta instrukcja dzieli dane na grupy, biorąc za podstawę
wartości w określonej kolumnie lub zbiorze kolumn, i
umożliwia
wykonanie
obliczenia
podsumowującego
wartości w każdej grupie. W powyższym wypadku dla
każdej grupy wykonujemy zliczenie liczby wierszy w grupie
i obliczenie średniej pensji w grupie.
do grupy funkcji agregujących należą następujące funkcje:
Count( )
– oblicza ilość wystąpień,
Max( )
- wyznacza wartość największą w grupie,
Min( )
- wyznacza wartość najmniejszą w grupie wartości,
Avg()
- wyznacza wartość średnią w grupie
Sum()
- suma wartości w grupie
Funkcje agregujące -
przykłady
Funkcje agregujące -
przykłady
Grupowanie krotek do
obliczeń klauzula GROUP
BY - przykład
SELECT NazwaWydziału, avg(Pensja), count(*)
FROM Wykładowcy
GROUP BY NazwaWydziału
Studia informatyczne
22000.00 3
Studia biznesu
20000.00 2
NrPrac
NazwiskoPrac
Status
NazwaWydziału
Pensja
234
DaviasT
L
Studia
informatyczne
16000.00
345
Evans R
PL
Studia
informatyczne
26500.00
123
Smith J
L
Studia biznesu
16500.00
237
Jones S
SL
Studia
informatyczne
23500.00
145
Thomas P
SL
Studia biznesu
23500.00
Tabela
Wykładowcy
wynik
Grupowanie krotek do
obliczeń klauzula HAVING
- przykład
Klauzula GROUP BY może również mieć swoją własną klauzulę
ograniczającą "WHERE ' -
HAVING.
Następująca instrukcja
wyszukuje z naszej bazy danych tylko te wydziały, które mają
więcej niż dwóch wykładowców:
S
tudia informatyczne
NrPrac
NazwiskoPrac
Status
NazwaWydziału
Pensja
234
DaviasT
L
Studia
informatyczne
16000.oo
345
Evans R
PL
Studia
informatyczne
26500.00
123
Smith J
L
Studia biznesu
16500.00
237
Jones S
SL
Studia
informatyczne
23500.00
145
Thomas P
SL
Studia biznesu
23500.00
Tabela
Wykładowcy
wynik
SELECT NazwaWydziału
FROM Wykładowcy
GROUP BY
NazwaWydziału
HAVING count(*) > 2
Funkcje agregujące -
przykłady
Kolejność klauzul w
zapytaniu selekcyjnym
Select … From … Where …
Group
by
Having
Order by
Przykłady zapytań
selekcyjnych
1
2
3
Przykłady zapytań
selekcyjnych
1
2
3
Przykłady zapytań
selekcyjnych
Zapytania zagnieżdżone -
przykład
Zapytania zagnieżdżone -
przykład
Wykonywanie podzapytania może być powtarzane. W takim
wypadku otrzymujemy ciąg wartości do porównywania z
wynikami najbardziej zewnętrznego zapytania. Rozważmy na
przykład
następujące
zadanie:
Wypisz
listę
nazwisk
pracowników,
nazw
wydziałów
i
pensji
wszystkich
wykładowców, którzy zarabiają więcej niż wynosi średnia
pensja pracownika ich wydziału.
NrPrac
NazwiskoPrac
Status
NazwaWydziału
Pensja
234
DaviasT
L
Studia
informatyczne
16000.oo
237
Jones S
SL
Studia
informatyczne
23500.00
345
Evans R
PL
Studia
informatyczne
26500.00
123
Smith J
L
Studia biznesu
16500.00
145
Thomas P
SL
Studia biznesu
23500.00
Tabela
Wykładowcy
SELECT NazwiskoPrac,
NazwaWydziału, Pensja
FROM Wykładowcy L
WHERE Pensja>
(SELECT AVG(Pensja)
FROM Wykładowcy
WHERE
L.NazwaWydziału
=
NazwaWydziału)
Zapytania zagnieżdżone -
przykład
Słowo "strukturalny" w strukturalnym języku zapytań (SQL)
pierwotnie odnosiło się do możliwości zagnieżdżania zapytań w
instrukcjach SELECT.
Na przykład, aby znaleźć osobę, która zarabia więcej niż Jones
NrPrac
NazwiskoPrac
Status
NazwaWydziału
Pensja
234
DaviasT
L
Studia
informatyczne
16000.oo
237
Jones S
SL
Studia
informatyczne
23500.00
345
Evans R
PL
Studia
informatyczne
26500.00
123
Smith J
L
Studia biznesu
16500.00
145
Thomas P
SL
Studia biznesu
23500.00
Tabela
Wykładowcy
SELECT Nrprac,
NazwiskoPrac
FROM Wykładowcy
WHERE Pensja >
(
SELECT
Pensja
FROM
Wykładowcy
WHERE
NazwiskoPrac
=
'Jones S’
'
)
SQL wykonuje
na początku najbardziej
wewnętrzne zapytanie
, którego wynik
jest
porównywany
z
wynikiem
zwracanym przez najbardziej zewnętrzne
zapytanie.
Złączenia tabel - przykład
SQL wykonuje
złączenia relacyjne
przez wskazanie
wspólnych
atrybutów w klauzuli WHERE instrukcji SELECT. Na przykład
poniższa
instrukcja SELECT wydobywa dane z tabel Wykładowcy i
Moduły, które
są istotne dla osób pracujących na wydziale ‘studia
informatyczne’.
Konkretny warunek (lub warunki) użyty do określenia
złączenia jest
nazywany warunkiem złączenia. W powyższym przykładzie
warunkiem
złączenia jest L.NrPrac = M.NrPrac.
NrPrac
NazwiskoPrac
Status
NazwaWydziału
Pensja
234
DaviasT
L
Studia
informatyczne
16000.oo
237
Jones S
SL
Studia
informatyczne
23500.00
345
Evans R
PL
Studia
informatyczne
26500.00
123
Smith J
L
Studia biznesu
16500.00
145
Thomas P
SL
Studia biznesu
23500.00
Tabela
Wykładowcy
SELECT NazwiskoPrac,
Pensja, NazwaModulu
FROM
Wykladowcy L,
Modufiy M
WHERE L.NrPrac =
M.NrPrac
Inne złączenia tabel
Złączenie (złączenie naturalne)
tabel
Złączenie (złączenie naturalne)
tabel
Złączenie (złączenie naturalne)
tabel
Złączenie (złączenie naturalne)
tabel
Złączenie (złączenie naturalne)
tabel
NATURAL JOIN
lub
JOIN
wykonuje złączenie dwóch tabel,
korzystając ze związku klucz główny - klucz obcy
(wtórny), o których informacja jest przechowywana w
definicji tabel, przy założeniu, ze kolumny złączenia mają
tę samą nazwę w obu tabelach.
Operator złączenia naturalnego może być użyty w klauzuli
FROM. Jeżeli nazwa klucza głównego-klucza obcego są
rożne, to zapytanie może mieć następującą postać:
SELECT NazwaModułu, NazwiskoPrac
FROM Wykładowcy
NATURAL JOIN
Moduły
Jeżeli nazwa jest różna, musielibyśmy przepisać
zapytanie w następujący sposób:
SELECT NazwaModulu, NazwiskoPrac
FROM Wykładowcy L
JOIN
Moduły M
ON L.NrPrac = M.KodPrac
Złączenie (złączenie naturalne)
tabel
Własności złączenia
naturalnego
Własności złączenia
naturalnego
Złączenie Θ-join
Złączenie Θ-join
Złączenie warunkowe -
przykład
Złączenie zewnętrzne tabel
Złączenie zewnętrzne
lewostronne
Złączenie zewnętrzne
lewostronne
Złączenie zewnętrzne
prawostronne
Złączenie zewnętrzne
prawostronne
Złączenie zewnętrzne pełne
FULL OUTER JOIN
93
Przykłady złączeń
Tabele:
Kobiety Faceci
imie
Wiek
Anna
23
Maria
34
Sabina
43
Teresa
55
Wanda
33
Edyta
56
Zofia
23
Mirosława
33
Imie
Wiek
Jan
33
Henryk
55
Józef
21
Marian
18
Tomasz
44
Zbigniew
76
SELECT Faceci.Imie AS Pan, Faceci.Wiek AS
WiekPana,
Kobiety.Imie AS Pani, Kobiety.Wiek AS
WiekPani
FROM Faceci
NATURAL JOIN
Kobiety;
WYNIK=Zbiór pusty, bo złączenie naturalne
wymaga równości wszystkich kolumn
94
Przykłady złączeń cd..
SELECT Faceci.Imie AS Pan, Faceci.Wiek AS WiekPana,
Kobiety.Imie AS Pani, Kobiety.Wiek AS WiekPani
FROM Faceci
JOIN
Kobiety ON Faceci.Wiek = Kobiety.Wiek
ORDER BY WiekPana, Pan, WiekPani;
Pan
WiekPana
Pani
WiekPani
Jan
33
Wanda
33
Jan
33
Mirosława
33
Henryk
55
Teresa
55
SELECT Faceci.Imie AS Pan, Faceci.Wiek AS WiekPana,
Kobiety.Imie AS Pani, Kobiety.Wiek AS WiekPani
FROM Faceci
NATURAL JOIN
Kobiety;
Wynik=zbiór pusty
95
Przykłady złączeń cd..
SELECT Faceci.Imie AS Pan, Faceci.Wiek AS WiekPana,
Kobiety.Imie AS Pani, Kobiety.Wiek AS WiekPani
FROM Faceci
JOIN
Kobiety ON Faceci.Wiek <= Kobiety.Wiek
ORDER BY WiekPana, Pan, WiekPani;
Pan
WiekPana
Pani
WiekPani
Marian
18
Anna
23
Marian
18
Zofia
23
Marian
18
Mirosława
33
Marian
18
Maria
34
…………..
…………..
…………..
…………..
Henryk
55
Teresa
55
Henryk
55
Edyta
56
96
Złączenie RIGHT JOIN
SELECT … FROM
T1
RIGHT JOIN
T2
ON
<warunek złączenia>
WHERE <warunek wyboru>;
WYNIK=Prawie jak „zwykłe” złączenie, z tym, że
wiersze z
prawej
tabeli nie mające odpowiedników
w lewej tabeli są uzupełniane wartościami NULL
Kolejność tabel jest istotna!
97
Przykłady złączeń cd..
SELECT * FROM Faceci
RIGHT JOIN
Kobiety
ON Faceci.Wiek= Kobiety.Wiek;
Pan
WiekPana
Pani
WiekPani
Null
Null
Anna
23
Null
Null
Maria
34
Null
Null
Sabina
43
Henryk
55
Teresa
55
Jan
33
Wanda
33
Null
Null
Edyta
56
Null
Null
Zofia
23
Jan
33
Mirosława
33
98
Przykłady złączeń cd..
SELECT * FROM Kobiety
LEFT JOIN
Faceci
ON Faceci.Wiek= Kobiety.Wiek;
Pani
WiekPani
Pan
WiekPana
Anna
23
Null
Null
Maria
34
Null
Null
Sabina
43
Null
Null
Teresa
55
Henryk
55
Wanda
33
Jan
33
Edyta
56
Null
Null
Zofia
23
Null
Null
Mirosława
33
Jan
33
99
Przykłady złączeń cd..
SELECT * FROM Kobiety
RIGHT JOIN
Faceci
ON Faceci.Wiek = Kobiety.Wiek
;
Pani
WiekPani
Pan
WiekPana
Wanda
33
Jan
33
Teresa
55
Henryk
55
Null
Null
Józef
21
Null
Null
Marian
18
Null
Null
Tomasz
44
Null
Null
Zbigniew
76
Mirosława
33
Jan
33
100
Przykłady złączeń cd..
Konstrukcje
JOIN
i
LEFT JOIN
są często traktowane
jako synonimy, ale to nieprawda:
Jeżeli w tabeli znajdującej się
po prawej
stronie ON w
konstrukcji LEFT JOIN nie ma żadnych wierszy, dla
prawej tabeli użyty zostanie wiersz z samymi
wartościami NULL;
SELECT Kobiety.* FROM Kobiety
JOIN
Faceci
ON Kobiety.Wiek = Faceci.Wiek
WHERE Faceci.Wiek IS NULL;
Wynik jest zbiorem pustym
101
Przykłady złączeń cd..
SELECT Kobiety.* FROM Kobiety
LEFT JOIN
Faceci
ON Kobiety.Wiek = Faceci.Wiek
WHERE Faceci.Wiek IS NULL;
Znajdź wiersze
tabeli Kobiety
nie mające
odpowiedników
w tabeli Faceci
imie
Wiek
Anna
23
Maria
34
Sabina
43
Edyta
56
Zofia
23
Złączenie zewnętrzne pełne
FULL OUTER JOIN
Złączenie zewnętrzne tabel
W SQL2 występuje również standardowa składnia złączeń
zewnętrznych. Na przykład lewostronne, prawostronne i
obustronne złączenia zewnętrzne zostałyby określone w
SQL2 w następujący sposób:
SELECT *
FROM Wykladowcy L
LEFT OUTER JOIN
Moduly M
ON L.NrPrac = M.KodPrac
SELECT *
FROM Wykladowcy L
RIGHT OUTER
JOIN
Moduly M
ON L.NrPrac = M.KodPrac
SELECT NazwaModulu, NazwiskoPrac
FROM Wykladowcy L
FULL OUTER
JOIN
Moduly M
ON L.NrPrac = M.KodPrac
Iloczyn kartezjański krotek
Iloczyn kartezjański krotek
Suma tabel - przykład
Operator
sumy
języka SQL odpowiada operatorowi sumy
algebry
relacyjnej.
Daje on możliwość połączenia wyników dwóch zgodnych
zapytań.
Na przykład poniższe zapytanie produkuje wynik łączący
informacje na
temat modułów ‘studia informatyczne’ z modułami na
‘wydziale
elektrycznym’.
NrPrac
NazwiskoPrac
Status
NazwaWydziału
Pensja
234
DaviasT
L
Studia
informatyczne
16000.oo
237
Jones S
SL
Studia
informatyczne
23500.00
345
Evans R
PL
Studia
informatyczne
26500.00
123
Smith J
L
Studia biznesu
16500.00
145
Thomas
P
SL
Studia biznesu
23500.00
Tabela
Wykładowcy
SELECT
NazwaModulu,
Poziom
FROM
Moduly
WHERE KodKursu = 'CSD'
UNION
SELECT
NazwaModulu,
Poziom
FROM
Moduly
WHERE
KodKursu = 'EED'
Suma tabel - przykład
Suma tabel - przykład
Suma tabel - przykład
np.:
Różnica tabel - przykład
Np.:
Różnica tabel - przykład
Różnica tabel z
wykorzystaniem EXCEPT -
przykład
lub
Np.:
Różnica tabel z
wykorzystaniem złączeń -
przykład
Np.:
Iloczyn tabel - przykład
Operator
iloczynu
języka SQL odpowiada operatorowi
iloczynu algebry
relacyjnej.
Daje on możliwość porównywania wyników dwóch zgodnych
zapytań.
Na przykład poniższe zapytanie produkuje wynik wspólnych
informacje na temat modułów ‘studia informatyczne’ z
modułami na
‘wydziale elektrycznym’.
NrPrac
NazwiskoPrac
Status
NazwaWydziału
Pensja
234
DaviasT
L
Studia
informatyczne
16000.oo
237
Jones S
SL
Studia
informatyczne
23500.00
345
Evans R
PL
Studia
informatyczne
26500.00
123
Smith J
L
Studia biznesu
16500.00
145
Thomas
P
SL
Studia biznesu
23500.00
Tabela
Wykładowcy
SELECT
NazwaModulu,
Poziom
FROM
Moduly
WHERE KodKursu = 'CSD'
INTERSECT
SELECT
NazwaModulu,
Poziom
FROM
Moduly
WHERE
KodKursu = 'EED'
Iloczyn tabel - przykład
Podzielenie tabel (division)
Podzielenie tabel (division)
Operacje z wykorzystaniem
kursora
Operacje z wykorzystaniem
kursora
Operacje pozycyjne
UPDATE, DELETE z
wykorzystaniem kursora
Perspektywy – widoki
(views)
Perspektywy – widoki
(views)
Modyfikacja perspektyw
Modyfikacja perspektyw
cd..
Modyfikacja perspektyw
cd..
Modyfikacja perspektyw
cd..
Modyfikacja perspektyw
cd..
Modyfikacja perspektyw
cd..
129
Zabezpieczenia baz
danych
130
Zabezpieczenia baz
danych cd..
131
Spójność bazy danych
132
Rodzaje spójności bazy
danych
133
Integralność referencyjna -
przykład
Integralność referencyjną definiujemy już w SQL89
przez specyfikację klucza obcego. Poniższe
definicje określają, że
NrPrac
w tabeli
Moduły
ma
zostać ustawione na
null
, jeżeli powiązany rekord
wykładowcy
jest usuwany.
Więzy
integralności
referencyjnej
określają
również, że jeśli dokonamy jakiejkolwiek zmiany w
numerze pracownika w rekordzie
wykładowcy
, to
zmiana ta powinna zostać odzwierciedlona w
powiązanych rekordach
modułów
.
134
Integralność referencyjna
cd..przykładu
CREATE TABLE
Wykładowcy
(Nrprac Number(5),
Nazwiskoprac Varchar(15),
Status Varchar(10),
NazwaWydziału(Varchar(20),
Pensja Decimal(7, 2),
PRIMARY KEY (Nrprac))
135
Integralność referencyjna
cd..przykładu
CREATE TABLE
Moduły
(NazwaModulu Char(15),
Poziom Smallint,
KodKursu Char(3),
NrPrac Number(5),
PRIMARY KEY (NazwaModutu)
FOREIGN KEY (Nrprac) references
Wykladowcy)
ON DELETE SET NULL
ON UPDATE CASCADE
)
136
Integralność referencyjna
cd..
W SQL2 opcjami propagacji są
NO ACTION
,
CASCADE, SET DEFAULT i SET NULL
.
Opcje
CASCADE
i
SET NULL
odpowiadają
odpowiednio operacji kaskadowej propagacji
(CASCADES) i ustawienia NULL (NULLIFIES).
Opcja
NO ACTION
częściowo odpowiada, ale
nie do końca, operacji RESTRICTED.
Opcja
SET DEFAULT
wymusza na systemie
używanie zadeklarowanej wartości domyślnej
137
Integralność dziedziny
Integralność dziedziny możemy częściowo
określać podając odpowiedni typ danych
dla kolumny.
Możemy tez użyć klauzuli
CHECK
, aby
wymusić poprawne modyfikacje.
Możemy na przykład wymusić, aby
wartość wstawiana do kolumny poziom
była w określonym zbiorze lub aby numery
pracowników mieściły się w podanym
zakresie:
138
Integralność dziedziny -
przykłady
CREATE TABLE Moduły
(NazwaModułu Char(IS),
Poziom Smallint,
KodKursu Char(3),
Nrprac Number(5),
PRIMARY KEY (NazwaModułu)
FOREIGN KEY (Nrprac IDENTIFIES
Wykładowcy)
ON DELETE RESTRICT
ON UPDATE CASCADE
CHECK (Poziom IN 1, 2, 3))
CREATE TABLE Wykładowcy
NrPrac Number(5),
NazwiskoPrac Varchar(15),
Status Varchar( 10),
NazwaWydziatu(Varchar(20),
Pensja Decimal(7, 2),
PRIMARY KEY (NrPrac)
CHECK (NrPrac BETWEEN 100 AND
10999
))
139
Integralność danych cd..
Mówimy, że baza danych ma
właściwość
integralności,
kiedy istnieje odpowiedniość
między faktami przechowywanymi w bazie danych
a światem rzeczywistym modelowanym przez tą
bazę.
Tą właśnie integralność zapewniają
reguły
integralności,
które można podzielić na dwa
rodzaje:
integralność encji
oraz
integralność
referencyjną
.
Integralność encji
dotyczy kluczy głównych. Mówi
ona, że każda tabela musi mieć klucz główny i że
kolumna lub kolumny wybrane jako klucz główny
powinny być jednoznaczne i nie zawierać wartości
null. Wynika stąd, że w tabeli są zabronione
powtórzenia wierszy.
140
Integralność danych cd..
Integralność referencyjna
dotyczy
kluczy obcych
.
Mówi ona, że wartość klucza obcego może się
znajdować tylko w jednym z dwóch stanów.
Wartość klucza obcego odwołuje się do wartości
klucza głównego w tabeli w bazie danych.
Czasami wartość klucza obcego może być null, co
oznacza że nie ma związku między
reprezentowanymi obiektami w bazie danych albo
że ten związek jest nieznany.
Utrzymywanie integralności referencyjnej oprócz
określenia czy klucz obcy jest null, czy nie
obejmuje również określenie
więzów propagacji
.
Mówią one co powinno się stać z powiązaną
tabelą, gdy modyfikujemy wiersz lub wiersze w
tabeli docelowej.
141
Integralność danych cd..
Są trzy możliwości, które określają co się będzie
działo z docelowymi i powiązanymi krotkami dla
każdego związku między tabelami w naszej
bazie:
Ograniczone usuwanie
(Restricted). Podejście
ostrożne – nie dopuszcza do usuwania
rekordu nadrzędnego, jeśli istnieją rekordy
podrzędne.
Kaskadowe usuwanie
(Cascades). Podejście
ufne – przy usuwaniu rekordu nadrzędnego
usuwa także rekordy podrzędne.
Izolowane usuwanie
(Isolated). Podejście
wyważone – usuwa jedynie rekord nadrzędny.
142
Asercje
Więzy mogą być nazywane i określane niezależnie od
jakiejkolwiek tabeli lub dziedziny. W takim wypadku
więzy są
nazywane asercjami.
Możemy
na
przykład
zadeklarować
asercję,
określającą
następujące sprawdzanie niezależnie od tabeli
Wykładowcy:
CREATE ASSERTION NrPracCheck
CHECK (NrPrac BETWEEN 100 AND 10999)
143
Asercje
Za każdym razem, gdy instrukcja SQL dokonuje wstawienia,
modyfikacji
bądź usunięcia wiersza tabeli, istnieje możliwość, że więzy
mogą zostać
naruszone.
SQL89 wymaga, aby system sprawdzał naruszanie więzów
pod koniec
wykonywania każdej instrukcji.
SQL2 umożliwia sprawdzanie więzów pod koniec transakcji.
Jeżeli
więzy są sprawdzane po każdej instrukcji, to mówimy , ze
sprawdzanie
odbywa się w trybie natychmiastowym. Jeżeli sprawdzenie
następuje
pod koniec transakcji, to mówimy, że sprawdzanie odbywa
się w trybie
opóźnionym.
Dlatego dla każdej definicji więzów możemy dołączyć
specyfikację tego,
czy więzy są sprawdzane z opóźnieniem (DEFERRABLE), czy
sprawdzane natychmiast (NOT DEFERRABLE).
Początkowy tryb więzów może być określony jako INITIALLY
DEFERRED lub INITIALLY IMMEDIATE. Tryb sprawdzania
więzów może
być następnie w czasie sesji zmieniony za pomocą instrukcji
SET
CONSTRAINTS, która określa, czy dla listy nazwanych
więzów
wykonywać sprawdzanie opóźnione czy natychmiastowe.
144
Zatwierdzanie zmian w bazie
danych
Instrukcje
INSERT, DELETE, UPDATE
nie
dokonują same trwałych zmian w bazie
danych. Aby zmiany wprowadzone przez nie
utrwalić, należy wykonać instrukcję
COMMIT
.
Można również zrezygnować z wprowadzania
zmian do bazy danych, wycofując je za
pomocą instrukcji
ROLLBACK.
W PostgreSQL domyślnie jest włączona opcja
auto-zatwierdzania więc nie trzeba przy
pojedynczych instrukcjach wykonywać
COMMIT
.