1
1
Opracowanie: Lech Banachowski
Opracowanie: Lech Banachowski
, Krzysztof Matejewski
, Krzysztof Matejewski
Wykład VIII
Wykład VIII
SQL – język relacyjnych baz danych
SQL – język relacyjnych baz danych
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
2
2
Wprowadzenie
Wprowadzenie
Jako międzynarodowy standard dla relacyjnych baz danych został opracowany
specjalny język o nazwie
SQL
(ang.
Structured Query Language
-
Strukturalny Język Zapytań), umożliwiający dostęp do danych i ich
przetwarzanie w bazie danych – na poziomie obiektów modelu relacyjnego
tj. tabel i perspektyw.
Ponadto został także opracowany sposób użycia instrukcji tego języka w
programach konwencjonalnych języków programowania jak C, C++, Java,
Visual Basic. O użyciu instrukcji języka SQL w językach Visual Basic i Java
będzie mowa na następnych wykładach.
Znamienne też jest powszechne stosowanie narzędzi generowania aplikacji
klienckich takich jak MS Access czy Oracle Forms bez potrzeby sięgania do
tradycyjnego sposobu programowania.
Omówimy kolejno najważniejsze instrukcje języka SQL. Pokazywane przykłady
będą dotyczyć bazy danych Uczelnia o schemacie zbliżonym do
używanego już na poprzednich wykładach.
Ten pojedynczy wykład należy traktować jako zapoznanie z podstawowymi
konstrukcjami języka. Znacznie szersze omówienie języka SQL zostanie
przedstawione w wykładzie „Sysytemy Baz Danych” na II roku studiów
inżynierskich.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
3
3
Schemat przykładowej bazy danych
Schemat przykładowej bazy danych
Schemat przedstawia strukturę przykładowej uczelni (wszelka zbieżność nazw i
nazwisk to czysty przypadek!). W bazie odnotowani są
Studenci
, przypisani do
Grup
studenckich, otrzymujący
Oceny
z wielu przedmiotów i zapisujący się (z
czasem) na
Specjalizacje
. Za każdy
Przedmiot
oraz za
Specjalizację
odpowiada
Katedra
, do której też są przypisani
Wykładowcy
prowadzący
Wykłady
.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
4
4
Instrukcja SELECT
Instrukcja SELECT
Instrukcja
SELECT
wydobywa dane z bazy danych. Składa się z części
nazywanych
klauzulami
. Tworząc instrukcję SELECT trzeba określić:
z jakich tabel w bazie danych mają być sprowadzone (dostarczone) dane -
tak zwaną klauzulę
FROM
,
jakie warunki mają spełniać dane - tak zwaną klauzulę
WHERE
,
w jakiej postaci mają się pojawiać przed użytkownikiem (aplikacją
użytkownika) - tak zwaną klauzulę
SELECT
.
Uwagi do notacji składniowej:
• Zapis: nazwa_kolumny,... daje możliwość użycia jednej lub więcej nazw
kolumn rodzielonych przecinkami.
• Meta-nawiasy [...] oznaczają opcjonalne fragmenty. To oznacza, że
powyższa definicja składniowa, w sposób zwarty, definiuje dwie postacie
instrukcji SELECT:
SELECT
nazwa_kolumny,...
FROM nazwa_tabeli
[WHERE warunek];
SELECT nazwa_kolumny,...
FROM nazwa_tabeli;
SELECT nazwa_kolumny,...
FROM nazwa_tabeli
WHERE warunek;
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
5
5
Instrukcja SELECT
Instrukcja SELECT
Przykłady prostych instrukcji
SELECT
nie zawierających klauzuli
WHERE
.
Pierwszy przykład:
Wypisz imiona i nazwiska studentów
.
I rozwiąznie w postaci zapytania SQL:
SELECT
Imie, Nazwisko
FROM
Studenci;
Używając programu MS Access do wykonywania instrukcji SQL postępujemy w
następujący sposób:
W oknie bazy danych wybieramy zakładkę "Kwerendy" ("Queries") a następnie
pozycję z listy "Utwórz kwerendę w widoku projekt" ("Create Query in Design
View").
Zamykamy okienko "Pokazywanie tabeli" ("Show Table") nie wybierając z listy
żadnej tabeli.
Z menu "Plik" ("File") wybieramy opcję "Widok SQL" ("SQL View").
W wyświetlonym okienku wpisujemy tekst instrukcji SELECT po czym ją zapisujemy
jako kwerendę (lub nie) i wykonujemy.
Poniżej zapis instrukcji w oknie MS Access w trybie SQL oraz wynik zapytania.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
6
6
Instrukcja SELECT
Instrukcja SELECT
Kolejne zapytanie – jeszcze prostsze:
Wypisz wszystkie dane z tabeli Studenci
I jego rozwiązanie:
SELECT
*
FROM
Studenci;
Jak widać, symbol* zastępuje „wszystko”, czyli wypisywanie nazw
poszczególnych kolumn tabeli. Należy również zwrócić uwagę na średnik
kończący każdą instrukcję SQL – formalny wymóg składni tego języka.
Poniżej składnia zapytania w oknie MS Access, oraz wynik wykonania instrukcji.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
7
7
Wyrażenie tekstowe w instrukcji SELECT
Wyrażenie tekstowe w instrukcji SELECT
Wypisywany wynik można sformatować używając w tym celu wyrażeń.
Załóżmy, że interesuje nas informacja tekstowa o studentach. Stosujemy
operator konkatenacji (składania) napisów '
&
'. Z kolei operator
AS
daje nam
możliwość określenia etykiety dla wynikowej kolumny (a także pozwala
zmienić wyświetlaną nazwę kolumny istniejącej).
SELECT
"Student: " & Imie & " " & Nazwisko & " jest przydzielony do grupy
studenckiej: " & Grupa_Id
AS
[Przydział studentów do grup]
FROM
Studenci;
Użyte zostały nawiasy kwadratowe, ponieważ w nazwie kolumny wynikowej
występują spacje. W rezultacie otrzymujemy:
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
8
8
Instrukcja SELECT z klauzulą WHERE
Instrukcja SELECT z klauzulą WHERE
Dotąd przy użyciu instrukcji
SELECT
pobieraliśmy z tabeli wszystkie dane zawarte we
wszystkich wierszach (rekordach) określonych w instrukcji kolumn (pól). Klauzula
WHERE
pozwala zdefiniować warunki, które mają spełniać wybierane wiersze.
Przykład:
Wypisz imiona i nazwiska wszystkich wykładowców posiadających stopień
doktora.
I rozwiązanie, pokazujące składnię:
SELECT
Imie, Nazwisko
FROM
Wykladowcy
WHERE
Stopien = ”dr”;
Doktorów w naszej bazie wyznacza warunek Stopien = „dr” i w takiej postaci zostaje
on użyty w klauzuli WHERE.
Należy zwrócić uwagę na konieczność podania wartości tekstowych (napisowych) w
cudzysłowach.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
9
9
Operator DISTINCT
Operator DISTINCT
Kolejny element składni SQL - kolejne zadanie.
Wypisz bez powtórzeń numery grup studentów z tabeli Studenci.
W rozwiązaniu korzystamy z operatora
DISTINCT
eliminującego powtarzające się
wiersze wynikowe.
SELECT
DISTINCT
Grupa_Id
FROM
Studenci;
W wyniku otrzymujemy siedem wierszy – w tym jeden pusty, reprezentujący wartość
NULL, czyli rekordy opisujące studentów nie przypisanych do żadnej grupy.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
10
10
Klauzula ORDER BY
Klauzula ORDER BY
Kolejną klauzulą instrukcji
SELECT
jest
ORDER BY
. Pozwala ona
wyspecyfikować kolejność w jakiej mają być sprowadzane z bazy danych
wynikowe wiersze. Klauzula
ORDER
BY
jest klauzulą instrukcji
SELECT
występującą na jej końcu (!). Klauzula ta ma postać:
ORDER BY
kolumna [specyfikator], …
gdzie specyfikator oznacza porządek sortowania wynikowych wierszy albo
ASC
(rosnący) - domyślny, albo
DESC
(malejący).
I kolejny przykład:
Wypisz dane studentów w kolejności numerów grup studenckich, a w obrębie
grupy w odwrotnej kolejności alfabetycznej nazwisk.
SELECT
Imie, Nazwisko, Grupa_Id
FROM
Studenci
ORDER
BY
Grupa_Id
ASC
, Nazwisko
DESC;
Gdy w klauzuli nie podamy ani
ASC
ani
DESC
domyślnie przyjmowany jest
specyfikator
ASC
. Brak klauzuli w instrukcji (jest ona opcjonalna) powoduje
dostarczenie wierszy nieuporządkowanych.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
11
11
Operatory IS NULL, BETWEEN
Operatory IS NULL, BETWEEN
Operator
IS [NOT] NULL
Operatorem testującym obecność
NULL
jest
IS NULL
a drugim testującym brak
NULL
-
IS NOT NULL
.
Przykład:
Wypisz nazwiska i imiona studentów, którzy nie mają określonego adresu e-mail.
SELECT
Imie, Nazwisko
FROM
Studenci
WHERE
IS
NULL;
Operator
[NOT] BETWEEN
Operator
BETWEEN
sprawdza czy dana wartość należy do określonego przedziału
wartości - końce przedziału są wliczane do przedziału (przedział jest
domknięty).
Operator
NOT
BETWEEN
sprawdza - czy dana wartość leży poza określonym
przedziałem wartości.
Przykład:
Wypisz nazwiska i imiona studentów, którzy zapisali się na studia w 2004 roku.
SELECT
Nazwisko, Imie
FROM
Studenci
WHERE
Data_Rekrutacji
BETWEEN
#2004-01-01#
AND
#2004-12-31#
;
Alternatywą użycia operatora
BETWEEN
jest zapis w postaci koniunkcji dwóch
nierówności:
Data_rekrutacji => #2004-01-01# <=
AND
Data_rekrutacji <= #2004-12-
31#
Chyba nie ma wątpliwości, która postać jest bardziej czytelna.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
12
12
Operatory LIKE, IN
Operatory LIKE, IN
Operator
[NOT] LIKE
Operator
LIKE
sprawdza, czy w danym napisie (!) występuje określony wzorzec - np.
czy na początku (podobnie w środku, na końcu) napisu występuje dana litera.
Operator
NOT
LIKE
ma działanie odwrotne. Przypominamy z wykładu 6, że znakami
uniwersalnymi we wzorcu są: "
*
" - cokolwiek, "
?
" - jeden znak.
Przykład:
Wypisz studentów, których nazwiska zaczynają się na literę „K”
SELECT
Imie, Nazwisko
FROM
Studenci
WHERE
Nazwisko
LIKE
„K*”
;
Operator
[NOT] IN
Operator
IN
sprawdza czy wartość podana jako lewy argument występuje na liście
wartości będącej prawym argumentem. Operator
NOT IN
ma działanie
odwrotne.
Przykład:
Wypisz studentów z grup D10, D11, D21
SELECT
Imie, Nazwisko
FROM
Studenci
WHERE
Grupa_Id
IN
(”D10”, ”D11”, ”D21”)
;
Powyższy zapis jest rownoważny alternatywie:
Grupa_Id = ”D10”
OR
Grupa_Id = ”D11”
OR
Grupa_Id = ”D21”)
;
Separatorem danych na liście jest zgodnie ze standardem SQL przecinek, ale jeżeli
lista definiowana jest w MS Access na siatce kwerend, wówczas należy użyć
średnika (!).
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
13
13
Operatory NOT, AND, OR
Operatory NOT, AND, OR
Proste warunki logiczne możemy łączyć spójnikami logicznymi:
OR
alternatywy "lub",
AND
koniunkcji "i" oraz
NOT
negacji "nie prawda, że" .
Przykład:
Wypisz studentów, którzy mają adres e-mail oraz ich nazwiska kończą się na
literę „i”
SELECT
Imie, Nazwisko
FROM
Studenci
WHERE
Nazwisko
LIKE
„*i”
AND
IS
NOT
NULL;
Jest to koniunkcja dwóch prostych warunków logicznych.
Należy pamiętać o chierarchii operatoró (Not, And, Or) i zmieniających ją (w
razie potrzeby) nawiasach.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
14
14
Instrukcja INSERT
Instrukcja INSERT
Instrukcja
INSERT
służy do wstawiania wierszy do tabeli. Ma dwie klauzule
INSERT
INTO
oraz
VALUES
:
Kolumny, które nie występują na liście
VALUES
uzyskują przy wstawieniu
wiersza wartość
NULL
chyba, że są typu Autonumer (AutoNumber), albo
zostały dla nich określone wartości domyślne.
Przykład:
Dodaj nowego studenta do tabeli studenci
INSERT
INTO
Studenci (Imie, Nazwisko, Nr_Indeksu, Data_rekrutacji)
VALUES
(”Kamil”, ”Jastrzębski”, ”X3867”, #2005-02-01#)
;
Na liście wartości brak jest danych dla kilku pól: pole Student_Id uzyska
automatyzcnie wartość nadaną przez mechanizm AutoNumber, pozostałe
pola (niewymagane!) uzyskają NULL.
Dopuszczalna jest także skrócona postać instrukcji
INSERT
. W przypadku gdy
dopisywane są wartości do wszystkich pól w tabeli, wówczas można
pominąć nazwy pól:
INSERT
INTO
Przedmioty
VALUES
("PR2", "Programowanie 2", 10)
;
Powyższy przykład to instrukcja dopisania nowego wiersza do tabeli Przedmioty.
INSERT INTO tabela
(kolumna, …)
VALUES (wartość, …);
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
15
15
Instrukcja DELETE
Instrukcja DELETE
Instrukcja
DELETE
służy do usuwania wierszy z tabeli. Instrukcja ma dwie
klauzule: wymaganą
DELETE
FROM
i opcjonalną
WHERE.
Z danej tabeli zostają usunięte wszystkie wiersze spełniające podany warunek.
Jeżeli brak klauzuli
WHERE
zostaną usunięte wszystkie (!) wiersze tabeli.
Przykład:
Z tabeli studenci usuń wszystkie wiersze (dane studentów), dla których
Data_rekrutacji <= 2002-06-01 a Data_obrony jest nieokreślona.
DELETE
FROM
Studenci
WHERE
Data_rekrutacji <= #2002-06-01#
AND
Data_obrony
IS
NULL;
Można tu wskazać pewien szczegół charakterystyczny dla realizacji tej
instrukcji w MS Access. Otóż instrukcja
DELETE
tworzona w konstruktorze
(siatce) kwerend wymaga podania przynajmniej jednej, dowolnej nazwy
kolumny z tabeli na której będzie operowała. Jak widać w składni SQL to
nie jest wymagane, w dodatku Access akceptuje ten zapis.
Instrukcja
DELETE
działa na pojedyńczej tabeli – nie na związku tabel (!);
wyjątkiem jest związek jedno – jednoznaczny.
DELETE FROM
tabela
[WHERE warunek];
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
16
16
Instrukcja UPDATE
Instrukcja UPDATE
Instrukcja
UPDATE
służy do aktualizacji wierszy w tabeli. Instrukcja ma trzy
klauzule: dwie wymagane
UPDATE
i
SET
oraz jedną opcjonalną
WHERE
.
W danej tabeli zostają zmodyfikowane wszystkie wiersze spełniające podany
warunek. Modyfikacja polega na zastosowaniu instrukcji przypisania
kolumna = wyrażenie do każdej kolumny, której nazwa znajduje się po
lewej stronie równości w klauzuli SET. Brak warunku zdefiniowanego w
klauzuli WHERE spowoduje aktualizację do nowej wartości określonego pola
we wszystkich wierszach.
Przykład:
W tabeli Studenci zmień numer grupy z D11 na D31
UPDATE
Studenci
SET
Grupa_Id = ”D21”
WHERE
Grupa_Id = ”D11”;
UPDATE tabela
SET kolumna =
wyrażenie
[WHERE warunek];
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
17
17
Operator UNION
Operator UNION
Istnieje możliwość połączenia wyników kilku instrukcji
SELECT
, o ile dają wyniki
o zgodnych typach danych. Służy do tego operator
UNION
.
Ta postać zapytania nie ma swojego odpowiednika w siatce kwerendy. Aby je
zrealizować należy użyć okna tekstowego do wpisania instrukcji SQL. Można
to zrobić na dwa sposoby: albo postępując tak samo jak uprzednio, albo po
dojściu do siatki kwerendy wybierając z menu "Kwerenda -> Wyłącznie SQL
-> Kwerenda składająca" ("Query -> SQL Specific -> UNION").
Użycie operatora
UNION
eliminuje powtarzające się rekordy (tak jak operator
DISTINCT
). Aby wypisać wszystkie rekordy (łącznie z powtarzającymi się),
należy użyć operatora
UNION
ALL
.
Przykład:
Wypisać Imiona i nazwiska studentów poprzedzone słowem „student” oraz
wykładowców, poprzedzone słowem „wykładowca”
SELECT
”Student ” & Imie & ” ” & Nazwisko
AS
Osoba
FROM
Studenci
UNION
SELECT
„”Wykładowca ” & Imie & ” ” & Nazwisko
AS
Osoba
FROM
Wykladowcy
;
Wynik pokazany jest na nastepnym slajdzie.
Instrukcja_SELECT UNION
instrukcja_SELECT
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
18
18
Operator UNION
Operator UNION
Działanie operatora
UNION
można porównać do operacji sumowania zbiorów (tutaj
– zbiory wierszy). Operator może być użyty w jednej instrukcji wielokrotnie.
Dwa pozostałe operatory działające na zbiorach rekordów, przewidziane przez
Standard języka SQL (
INTERSECT
– iloczyn logiczny i
EXCEPT
– różnica) nie
zostały w MS Access zaimplementowane (a szkoda!).
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
19
19
Pozostałe instrukcje nie mające odpowiednika
Pozostałe instrukcje nie mające odpowiednika
w siatce kwerend
w siatce kwerend
Wśród opcji zebranych w "Kwerenda –> Wyłącznie SQL" ("SQL Specific") są
jeszcze dwie:
definicja danych (Data Definition)
- instrukcje definiowania danych:
tworzenie tabeli (
CREATE TABLE
), zmiana schematu tabeli (
ALTER
TABLE
) oraz usuwanie tabeli (
DROP TABLE
) - omówimy je na wykładzie
przedmiotu "Systemy baz danych
kwerenda przekazująca (Pass-Through)
- zapytanie SQL, które ma być
wykonane w odległej bazie danych – składnia rozumiana przez odległą bazę
danych (wymaga określenia DSN do zewnętrznego źródła danych).
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
20
20
Złożone instrukcje SELECT
Złożone instrukcje SELECT
SELECT
ze złączeniem tabel
Przejdziemy teraz do omówienia bardziej skomplikowanych instrukcji
SELECT
obejmujących złączenia tabel, grupowanie wierszy i podzapytania.
Oto typowe zadanie na złączenie.
Wyświetl katedry wraz z prowadzonymi przez nie przedmiotami.
Zastosujemy metodę, którą można stosować i w innych przypadkach.
Mianowicie zaprojektujemy najpierw kwerendę wybierającą używając siatki
kwerend w widoku Projekt – tak jak to robiliśmy na wykładzie II. Następnie
przechodząc do widoku SQL otrzymamy szukaną instrukcję SQL.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
21
21
SELECT ze złączeniem tabel
SELECT ze złączeniem tabel
Mamy tu do czynienia ze złączeniem wewnętrznym
INNER JOIN
tabel Katedry
i Przedmioty - z warunkiem złączenia postaci klucz_główny = klucz_obcy.
Oto konstrukcja (składnia) złączenia dwóch tabel występująca w klauzuli
FROM
:
Nazwy kolumn są poprzedzane nazwami tabel. W przypadku nazwy Katedra_Id
zapewnia to jednoznaczność, ponieważ ta sama nazwa jest użyta jako
nazwa kolumny w dwóch tabelach.
Złączenie wewnętrzne można określić nie posługując się operatorem
INNER
JOIN
. Mianowicie warunek złączenia dwóch tabel możemy zapisać w
klauzuli
WHERE
zamiast we
FROM
.
Tak wygląda złączenie tabel Katedry i Przedmioty:
SELECT
Katedry.Katedra_Id, Katedry.Katedra, Przedmioty.Przedmiot
FROM
Katedry, Przedmioty
WHERE
Katedry.Katedra_Id = Przedmioty.Katedra_Id;
Tabela1 INNER JOIN Tabela2 ON Tabela1.kolumna1 =
Tabela2.kolumna2
FROM Tabela1, Tabela2
WHERE Tabela1.kolumna1 =
Tabela2.kolumna2
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
22
22
SELECT ze złączeniem tabel
SELECT ze złączeniem tabel
Istnieje jeszcze jeden przypadek - gdy od instrukcji wybierającej wiersze ze złączenia
dwóch tabel oczekujemy dostarczenia wszystkich wierszy z jednej tabeli, nawet
wówczas, gdy nie wszystkie jej wiersze mają w drugiej tabeli wiersze powiązane
ze sobą.
Przykład:
Wyświetl dane grup studenckich z przypisanymi do nich studentami; wyświetl
również te grupy, do których nie przypisano żadnego studenta.
Użyjemy, jak poprzednio, siatki kwerendy do zdefiniowania tego zapytania. Złączenie
między grupami i studentami jest zewnętrzne (OUTER JOIN) tzn. przy złączaniu
uwzględniamy też grupy, do których nie został przypisany żaden student. Tym
wierszom odpowiadają puste pola Imię i Nazwisko tabeli będącej wynikiem
zapytania.
Widok SQL przedstawia składnie tej instrukcji:
SELECT
Grupy.Grupa_Id, Grupy.Rok_studiow, Studenci.Nazwisko, Studenci.Imie
FROM
Studenci
LEFT
JOIN
Grupy
ON
Studenci.Grupa_Id = Grupy.Grupa_Id;
Pojawia się w niej słowo kluczowe
LEFT
JOIN
sygnalizujące złączenie zewnętrzne.
Oto konstrukcja złączenia zewnętrznego dwóch tabel występująca w kaluzuli
FROM
:
Nazwy kolumn są poprzedzane nazwami tabel. W przypadku nazwy Grupa_Id
zapewnia to jednoznaczność, ponieważ ta sama nazwa jest użyta jako nazwa
kolumny w obu tabelach.
Widok rozwiązania uzyskanego w MS Access pokazany jest na następnym slajdzie.
Tabela1 RIGHT JOIN Tabela2 ON Tabela1.kolumna1 =
Tabela2.kolumna2
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
23
23
SELECT ze złączeniem tabel
SELECT ze złączeniem tabel
Sposób powiązania tabel definiowany jest na etapie tworzenia diagramu
związków encji. Może być na stałe zdefiniowany jako
OUTER
JOIN
. Na ogół
jednak rozwiązaniem stosowanym jest przyjęcie powiązań dla tabel typu
INNER
JOIN
i tylko w przypadku wydobywaia danych poporzez instrukcję
SELECT (kwerendę), doraźnie definiuje się powiązanie typu
OUTER
JOIN
.
Powiązanie typu OUTER JOIN występuje w dwu postaciach:
Zwraca wszystkie wiersze z tabeli nadrzędnej (strona 1) i te z podrzędnej,
dla których wartości powiązanych pól są równe –
LEFT JOIN
Zwraca wszystkie wiersze z tabeli podrzędnej (strona wiele) i te z
nadrzędnej, dla których wartości powiązanych pól są równe –
RIGHT JOIN
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
24
24
Operatory DISTINCT, DISTINCTROW
Operatory DISTINCT, DISTINCTROW
Operator
DISTINCTROW
nie występuje w Standardzie SQL - omówimy go za chwilę.
Operator
DISTINCT
występował w jednym z naszych pierwszych zapytań -
oznacza on eliminację powtarzających się wierszy.
Aby zobaczyć różnicę działania, porównamy ze sobą wynik zapytania (tego samego
złączenia wewnętrznego) w trzech wersjach: bez zastosowania operatorów
DISTINCTROW
i
DISTINCT
, z
DISTINCTROW
, z
DISTINCT
. W każdym z tych
trzech przypadków otrzymujemy inny wynik!
1. Instrukcja:
SELECT
Studenci.Imie, Studenci.Nazwisko
FROM
Studenci
INNER
JOIN
Oceny
ON
Studenci.Student_ID
=
Oceny.Student_Id
;
Zwraca wynik z powtórzeniami:
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
25
25
Operatory DISTINCT, DISTINCTROW
Operatory DISTINCT, DISTINCTROW
2. Instrukcja:
SELECT
DISTINCTROW
Studenci.Imie
,
Studenci.Nazwisko
FROM
Studenci
INNER
JOIN
Oceny
ON
Studenci.Student_ID
=
Oceny.Student_Id
;
zwraca wynik, w którym mamy do czynienia z jednym powtórzeniem. Operator
DISTINCTROW
dla każdego wiersza tabeli Studenci tworzy osobny wiersz wyniku.
W tabeli Studenci występują dwie różne osoby nazywające się „Adam Janowski" - o
różnych identyfikatorach. Każdy z nich otrzymał co najmniej jeden stopień. Zatem w
wyniku dostajemy dwa różne wiersze dla dwóch różnych studentów.
3. Instrukcja:
SELECT
DISTINCT
Studenci.Imie
,
Studenci.Nazwisko
FROM
Studenci
INNER
JOIN
Oceny
ON
Studenci.Student_ID =
Oceny.Student_Id
;
zwaraca wynik bez powtórzeń.Teraz eliminujemy wszystkie powtarzające się wiersze
wynikowe i dlatego dostajemy tylko jeden wiersz z Adamem Janowskim. Gdybyśmy
w wierszu wynikowym dołączyli kolumnę Student_Id, wówczas operatory DISTINCT i
DISTINCTROW dałyby ten sam rezultat – bez powtórzeń.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
26
26
Samozłączenie tabeli
Samozłączenie tabeli
Jest jeszcze jeden specjalny rodzaj złączenia mianowicie samozłączenie tabeli
czyli złączenie tabeli z nią samą przy pomocy związku klucz obcy-klucz główny
(jest to związek rekurencyjny omawiany na wykładzie III). Rozważmy związek
pokrewieństwa między osobami, reprezentowany przy pomocy tabeli, w której
dla każdej osoby podajemy informację o jej ojcu i matce. Mamy więc do czynienia
z dwoma kluczami obcymi Ojciec i Matka odwołującymi się do klucza głównego w
tej samej tabeli. Na diagramie tabel w MS Access trzeba wprowadzić kopie tej
samej tabeli, aby określić jej samozłączenia - inaczej niż w MS Visio.
Interesuje nas tabelka, w której dla każdej osoby będą podane imiona jej ojca i matki
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
27
27
Samozłączenie tabeli
Samozłączenie tabeli
Aby zdefiniować takie zapytanie, wprowadzamy trzy kopie tej samej tabeli:
D – oznacza wiersz osoby, dla której określamy jej rodziców,
D1 – oznacza wiersz ojca,
D2 – oznacza wiersz matki.
Aliasy D, D1, D2 wprowadzamy w klauzuli
FROM
a nazwy Ojciec i Matka w klauzuli
SELECT.
SELECT
D.Imię AS Imię, D1.Imię
AS
Ojciec
,
D2.Imię AS Matka
FROM
Drzewo_krewnych AS D2
RIGHT
JOIN
(Drzewo_krewnych AS D1
RIGHT
JOIN
Drzewo_krewnych AS D
ON
D1.Identyfikator = D.Ojciec)
ON
D2.Identyfikator = D.Matka;
Zapytanie to moglibyśmy zdefiniować również w siatce kwerendy – wprowadzając
trzy kopie tej samej tabeli i dwa związki – ze złączeniem zewnętrznym, aby
uwzględnić osoby, które nie mają określonego ojca lub matki.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
28
28
Funkcje sumaryczne
Funkcje sumaryczne
Specjalną rolę w zapytaniach pełnią funkcje sumaryczne takie jak
COUNT(),
MAX(), MIN(), SUM(), AVG(), StDev(), Var(), First(), Last()
obliczające odpowiednio: liczbę wartości, maksymalną wartość, minimalną
wartość, sumę wartości, wartość średnią odchulenie standardowe,
wariancję, pierwszą i ostatnią wartość – z wartości wyrażenia będącego
argumentem funkcji, realizowaną na wartościach wszystkich wierszy. Na
ogół jako argumentu używamy nazwy kolumny. Na przykład instrukcja:
SELECT
Count
(Ocena),
Min
(Ocena),
Max
(Ocena),
Sum
(Ocena),
Avg
(Ocena)
FROM
Oceny
WHERE
Przedmiot_Id = ”RBD”
AND
Data = #2004-01-30#;
wypisze w jednym wierszu: ile jest wpisanych ocen w tabeli Oceny, jaka jest
minimalna ocena, jaka jest maksymalna ocena, jaka jest suma ocen
(zakładając optymistycznie, że ma to jakiś sens) i jaka jest średnia wartość
ocen zapisanych w tabeli Oceny a wystawionych na egzaminie z
przedmiotu RBD w dniu 2004-01-30.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
29
29
Klauzula GROUP BY
Klauzula GROUP BY
Kolejna omawiana przez nas klauzula instrukcji
SELECT
to
GROUP
BY
.
Umożliwia ona podział wierszy na grupy a następnie wykonanie funkcji
podsumowujących na wierszach zebranych w grupy. Aby zrealizować zadanie:
Dla każdego studenta znajdź średnią ocen
skorzystajmy jak poprzednio z siatki kwerend, rozszerzając ją o nowy wiersz z
podsumowaniami - z menu "Widok -> Sumy" ("View -> Totals").
Dla kolumn Istudent_Id, Nazwisko i Imie wybieramy "Grupuj" ("Group By") a dla
kolumny Ocena wybieramy funkcję podsumowującą „Średnia" („Avg") i
poprzedzamy ją identyfikatorem Średnia_ocen. W wyniku otrzymujemy dla
każdego studenta śrenią uzyskanych przez niego ocen:
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
30
30
Klauzula GROUP BY
Klauzula GROUP BY
Składnia tego zapytania (instukcji SQL) wygląda nastepująco:
SELECT
Studenci.Student_ID, Studenci.Nazwisko, Studenci.Imie,
Avg
(Oceny.Ocena)
AS
Srednia_Ocen
FROM
Studenci
INNER
JOIN
Oceny
ON
Studenci.Student_ID =
Oceny.Student_Id
GROUP
BY
Studenci.Student_ID, Studenci.Nazwisko, Studenci.Imie;
Zaraz po klauzuli
FROM
pojawiła się nowa klauzula
GROUP
BY
nakazująca
pogrupowanie wierszy uzyskanych w wyniku złączenia
INNER
JOIN
i
filtrowania
WHERE
(gdyby klauzula WHERE w zapytaniu się pojawiła).
Specyfikacja wartości w klauzuli
SELECT
dotyczy podziału na grupy
określonego w klauzuli
GROUP
BY
. W klauzuli
SELECT
mogą występować
kolumny z klauzuli
GROUP
BY
, jak również funkcje podsumowujące dla
kolumn, które nie występują w klauzuli
GROUP
BY
.
GROUP BY
kolumna,
…
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
31
31
Klauzula GROUP BY
Klauzula GROUP BY
Kolejne zadanie:
Dla każdego studenta policz, ile otrzymał ocen. Zastosujemy teraz lewostronne
złączenie zewnętrzne. Przy złączaniu tabeli Studenci i Oceny będziemy teraz
uwzględniać również tych studentów, którzy dotychczas nie otrzymali żadnej
oceny. Zaczynamy od siatki zapytania, aby w efekcie otrzymać tekst polecenia
SQL:
SELECT
Studenci.Student_ID, Studenci.Nazwisko, Studenci.Imie,
COUNT
(Oceny.Ocena)
AS
Liczba_ocen
FROM
Studenci
LEFT
JOIN
Oceny
ON
Studenci.Student_ID = Oceny.Student_Id
GROUP
BY
Studenci.Student_ID, Studenci.Nazwisko, Studenci.Imie;
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
32
32
Klauzula HAVING
Klauzula HAVING
Odpowiednikiem klauzuli WHERE ograniczającej zbiór rozpatrywanych wierszy
– dla klauzuli GROUP BY jest klauzula HAVING.
Warunek klauzuli
HAVING
dotyczy grup oraz wyników zwracanych przez
operujące na nich funkcje podsumowujące, a nie samych wierszy z tabel.
Mogą w nim występować kolumny grupujące z listy
GROUP
BY
lub funkcje
sumaryczne w zastosowaniu do pozostałych kolumn – nie występujących
na liście
GROUP
BY
. Na przykład w ostatnim przykładzie możemy
ograniczyć wypisywane wiersze do grup, które dotyczą studentów, którzy
otrzymali co najmniej dwie oceny.
A tak wyglada to zapytanie z uzyciem klauzuli HAVING:
SELECT
Studenci.Student_ID, Studenci.Nazwisko, Studenci.Imie,
COUNT
(Oceny.Ocena
)
AS
Liczba_ocen
FROM
Studenci
LEFT
JOIN
Oceny
ON
Studenci.Student_ID =
Oceny.Student_Id
GROUP
BY
Studenci.Student_ID, Studenci.Nazwisko, Studenci.Imie
HAVING
COUNT
(Oceny.Ocena) >=2;
GROUP BY
kolumna, ....
HAVING warunek
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
33
33
Zasady wykonywania zapytania grupującego
Zasady wykonywania zapytania grupującego
1.
Jeśli występuje operator algebraiczny
UNION
, to powtórz poniższe kroki 2-7 dla
każdego jego składnika.
2.
Oblicz tabele w klauzuli
FROM
wykonując operacje
INNER
JOIN
,
LEFT
JOIN
i
RIGHT
JOIN
. Rozważ kolejno wszystkie kombinacje ich wierszy.
3.
Do każdej kombinacji wierszy zastosuj warunek
WHERE
. Pozostaw tylko
kombinacje wierszy dające wartość True - usuwając wiersze dające False lub
Null.
4.
Podziel pozostające kombinacje wierszy na grupy.
5.
Dla każdej grupy wierszy oblicz wartości wyrażeń na liście
SELECT
.
6.
Do każdej grupy zastosuj warunek w klauzuli
HAVING
. Pozostaw tylko grupy,
dla których wartość warunku jest True.
7.
Jeśli po
SELECT
występuje
DISTINCT
, usuń duplikaty wśród wynikowych
wierszy.
8.
Jeśli trzeba, zastosuj operator algebraiczny
UNION
.
9.
Jeśli występuje klauzula
ORDER
BY
, wykonaj sortowanie wynikowych wierszy
zgodnie ze specyfikacją.
Przedstawiona semantyka zapytania ma charakter koncepcyjny. W rzeczywistości
system bazodanowy wykonuje zapytanie w bardziej efektywny sposób, unikając
na przykład liczenia wszystkich możliwych kombinacji wierszy tabel obliczonych
w klauzuli
FROM
. Na wykładach przedmiotu „Systemy baz danych” zostaną
przedstawione algorytmy wykonywania zapytań przez system bazodanowy.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
34
34
Zapytanie (kwerenda) sparametryzowane
Zapytanie (kwerenda) sparametryzowane
Czasami jest wygodnie mieć kwerendę uzależnioną od parametru np. od nazwiska
osoby, nazwy firmy itp. Poniżej przedstawiona jest metoda tworzenia takiej
kwerendy w widoku projekt, okno wprowadzania danych (Inputbox) uruchamiane
przez MS Access w trakcie jej wykonywania, oraz wynik. Zadaniem kwerendy jest
odnalezienie wszystkich przedmiotów zaliczonych (Ocena > 2) przez studenta o
podanym w parametrze numerze indeksu.
Odpowiadające jej polecenie w skadni SQL:
SELECT
Przedmioty.Przedmiot, Oceny.Ocena
FROM
Przedmioty
INNER
JOIN
(Studenci
INNER
JOIN
Oceny
ON
Studenci.Student_ID = Oceny.Student_Id)
ON
Przedmioty.Przedmiot_Id =
Oceny.Przedmiot_Id
WHERE
(((Studenci.Nr_Indeksu)=[Podaj numer indeksu])
AND
((Oceny.Ocena)>2));
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
35
35
Podzapytania
Podzapytania
Dotychczas nie poruszyliśmmy istotnej cechy, która jest typowa dla języków
programowania – mianowicie zagnieżdżania instrukcji – zgodnego ze
strukturalnym podejściem do rozwiązywania problemów. Według tej metody
rozwiązywania problemów dzielimy istniejący problem na podproblemy,
rozwiązujemy podproblemy, a następnie używając ich rozwiązań konstruujemy
rozwiązanie całego problemu. Język SQL nazywa się "strukturalnym językiem
zapytań" więc ma też możliwość podejścia strukturalnego. Rozważmy problem,
w którym łatwo zidentyfikować podproblem.
Odnajdź studenta o minimalnym numerze indeksu.
Podproblemem jest tutaj znalezienie indeksu o minimalnym numerze. Zapytanie
SELECT
MIN
(Nr_Indeksu)
FROM
Studenci
znajduje najniższą wartość (wg
kodu ASCI lub UNICODE – bo to jest wartość tekstowa), zapisaną w kolumnie
Nr_indeksu tabeli Studenci. Oto rozwiązanie całego problemu:
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
36
36
Podzapytania
Podzapytania
Wreszcie odczytujemy widok SQL:
SELECT
Studenci.Nazwisko, Studenci.Imie, Studenci.Nr_Indeksu
FROM
Studenci
WHERE
(Studenci.Nr_Indeksu) = (
SELECT
Min
(Studenci.Nr_Indeksu )
FROM
Studenci );
Warunek:
Studenci.Nr_Indeksu=(
SELECT
Min(Studenci.Nr_Indeksu )
FROM
Studenci);
występujący w klauzuli
WHERE
głównego zapytania określa, że interesuje nas
numer (a może numery?) indeksu, którego wartość jest równa wartości
numeru minimalnego.
Proszę zauważyć, że w podzapytaniu nie skorzystaliśmy z nazw kolumn
wprowadzonych w głównym zapytaniu. Takie podzapytanie nazywamy
zwykłym - zbiór wynikowych wierszy nie zmienia się i nie zależy od
wierszy w głównym zapytaniu. Podzapytanie nazywamy skorelowanym
jeśli zbiór wyników podzapytania zależy od wartości występujących w
wierszach w głównym zapytaniu.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
37
37
Podzapytania skorelowane
Podzapytania skorelowane
Rozważmy teraz problem:
Dla każdego przedmiotu znajdź jego wykładowcę, który najdłużej pracuje w
szkole.
Interesuje więc nas następujący wynik pokazany w powyższej tabelce.
Rozwiązujemy postawiony problem zakładając na chwilę, że umiemy rozwiązać
podproblem - znalezienia minimalnej daty zatrudnienia wykładowcy
wykładającego
przedmiot
o
danej
wartości
Przedmioty.Przedmiot_Id
.
Zaznaczona na czerwono wartość pojawia się w wierszu głównego zapytania i
następnie jest przekazywana i używana przez podzapytanie. Służy więc do
korelacji głównego zapytania z podzapytaniem.
SELECT
Przedmioty.Przedmiot_Id
, Przedmioty.Przedmiot, Wykladowcy.Nazwisko,
Wykladowcy.Imie
FROM
Wykladowcy
INNER
JOIN
(Przedmioty
INNER
JOIN
Wyklad
ON
Przedmioty.Przedmiot_Id
= Wyklad.Przedmiot_Id)
ON
Wykladowcy.Wykladowca_Id = Wyklad.Wykladowca_Id
WHERE
Wykladowcy.data_zatrudnienia = <
MIN Wykladowcy.Data_zatrudnienia
wśród danych wykładowców wykładających
Przedmioty.Przedmiot_Id
>
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
38
38
Podzapytania skorelowane
Podzapytania skorelowane
Rozwiązujemy teraz wyróżniony przez nas podproblem:
SELECT
Min
(Wykladowcy.data_zatrudnienia)
FROM
Wykladowcy
INNER
JOIN
Wyklad
ON
Wykladowcy.Wykladowca_Id =
Wyklad.Wykladowca_Id
WHERE
Wyklad.Przedmiot_Id =
Przedmioty.Przedmiot_Id
;
Składając razem oba rozwiązania otrzymujemy rozwiązanie wyjściowego
problemu:
SELECT
Przedmioty.Przedmiot_Id
, Przedmioty.Przedmiot,
Wykladowcy.Nazwisko,
Wykladowcy.Imie
FROM
Wykladowcy
INNER
JOIN
(Przedmioty
INNER
JOIN
Wyklad
ON
Przedmioty.Przedmiot_Id
= Wyklad.Przedmiot_Id)
ON
Wykladowcy.Wykladowca_Id = Wyklad.Wykladowca_Id
WHERE
(((Wykladowcy.data_zatrudnienia) =
(
SELECT
Min(Wykladowcy.data_zatrudnienia) FROM Wykladowcy
INNER
JOIN
Wyklad
ON
Wykladowcy.Wykladowca_Id =
Wyklad.Wykladowca_Id
WHERE
Wyklad.Przedmiot_Id =
Przedmioty.Przedmiot_Id
)
ORDER BY
Przedmioty.Przedmiot_Id
;
Reasumując, otrzymane podzapytanie jest skorelowane, ponieważ wielkość
określona w głównym zapytaniu - Przedmioty.Przedmiot_Id, jest używana w
podzapytaniu i wpływa na jego wynik.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
39
39
Podzapytania
Podzapytania
Podzapytania mogą występować tylko po prawej stronie operatorów relacyjnych i
muszą zwracać pojedynczą wartość z wyjątkiem operatorów:
IN
oraz
NOT
IN
- które akceptują listy wartości,
EXISTS
oraz
NOT
EXISTS
- które akceptują dowolne zapytania.
Oto przykład zastosowania operatora
IN
do wyznaczenia specjalizacji, na które
zapisał się co najmniej jeden student:
SELECT
Specjalizacja_Id
FROM
Specjalizacje
WHERE
Specjalizacja_Id
IN
(
SELECT
Specjalizacja_Id
FROM
Studenci);
Wydaje się, że analogicznie przy pomocy operatora
NOT IN
można znaleźć te
specjalizacje, na które dotychczas żaden student się nie zapisał:
SELECT
Specjalizacja_Id
FROM
Specjalizacje
WHERE
Specjalizacja_Id
NOT
IN
(
SELECT
Specjalizacja_Id
FROM
Studenci);
Spotyka nas jednak tutaj niespodzianka - wynik jest pusty, chociaż w naszej bazie
danych mamy takie specjalizacje, na które nie zapisano dotychczas żadnego
studenta.
Bierze to się stąd, że o żadnej wartości nie da się stwierdzić, że jest różna od
NULL
! A wśród studentów znajdują się tacy, którzy jeszcze specjalizacji nie
wybrali
–
w
tym
przypadku
został
wpisany
NULL
w
polu
Studenci.Specjalizacja_Id.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
40
40
Operatory EXISTS i NOT EXISTS
Operatory EXISTS i NOT EXISTS
Operatory
EXISTS
i
NOT EXISTS
- sprawdzają czy podzapytanie daje pusty
zbiór wyników czy nie, np.
EXISTS
(
SELECT
"
x
"
FROM
Studenci
WHERE
Grupa_Id = "D11")
Oznacza: "istnieje co najmniej jeden student zapisany do grupy D11". Dla
wyniku nie jest istotne co napiszemy na liście
SELECT
w ramach predykatu
EXISTS
– najprostsza obliczeniowo jest wartość stała taka jak "x” albo 1.
Pierwszy przykład dotyczy
EXISTS
:
Znaleźć specjalizacje, na które zapisał się co najmniej jeden student.
SELECT
Specjalizacje.Specjalizacja_Id
FROM
Specjalizacje
WHERE
EXISTS
(
SELECT
”X”
FROM
Studenci
WHERE
Studenci.Specjalizacja_Id=Specjalizacje.Specjalizacja_Id);
Teraz rozwiążemy problem, którego poprzednio nie udało się rozwiązać za
pomocą operatora NOT IN:
Znaleźć specjalizacje, na które nie zapisał się co najmniej jeden student.
Oto rozwiązanie korzystające z operatora NOT EXISTS:
SELECT
Specjalizacja
FROM
Specjalizacje
WHERE
NOT
EXISTS
(
SELECT
„”X”
FROM
Studenci
WHERE
Studenci.Specjalizacja_Id = Specjaizacje.Specjalizacja_Id);
Tym razem wynik jest poprawny, zapytanie zwraca niezerowy zestaw wierszy.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
41
41
Problem braku operatora INTERSECT
Problem braku operatora INTERSECT
Na zakończenie tego wykładu rozważmy problem.
Znajdź studentów, którzy jednocześnie są wykładowcami.
Łatwe rozwiązanie problemu dawałby operator przecięcia (części wspólnej)
wyników dwóch zapytań skierowanych odpowiednio do tabel Studenci i
Wykładowcy. Jednak takiego operatora MS Access 2000 nie wprowadza –
chociaż występuje on w Standardzie języka SQL - pod nazwą
INTERSECT
.
Zamiast niego użyjemy podzapytania i operatora EXISTS.
SELECT
Studenci.Imie, Studenci.Nazwisko
FROM
Studenci
WHERE
EXISTS
(
SELECT
"x"
FROM
Wykładowcy
WHERE
Wykładowcy.Imie = Studenci.Imie
AND
Wykładowcy.Nazwisko = Studenci.Nazwisko);
W naszej przykładowej bazie danych otrzymamy w wyniku jeden rekord –
odnotowany jest jeden student, który jednocześnie pełni rolę wykładowcy.
Oczywiście wątpliwość może budzić test na tożsamość osoby za pomocą
imienia i nazwiska – ale w naszej bazie danych nie postaraliśmy się o
przechowywanie bardziej wiarygodnej identyfikacji osoby jak np. numer
PESEL.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
42
42
Problem braku operatora EXCEPT
Problem braku operatora EXCEPT
Podobnie w MS Access nie ma operatora
EXCEPT
, przy pomocy którego można
byłoby odejmować wyniki dwóch zapytań. Zamiast niego można użyć
podzapytania i operatora
NOT EXISTS
.
Znajdź wykładowcami, którzy studentami nie są.
SELECT
Wykładowcy.Imie, Wykładowcy.Nazwisko
FROM
Wykładowcy
WHERE NOT
EXISTS
(
SELECT
"x"
FROM
Wykładowcy
WHERE
Wykładowcy.Imie = Studenci.Imie
AND
Wykładowcy.Nazwisko = Studenci.Nazwisko);
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
43
43
Słownik
Słownik
SQL
- (ang. Structured Query Language - Strukturalny Język Zapytań) język
stanowiący interfejs do relacyjnej bazy danych. Jest międzynarodowym
standardem, do którego stosują się wszyscy producenci relacyjnych i
obiektowo-relacyjnych systemów baz danych.
SELECT
- instrukcja języka SQL służąca do wydobywania danych z bazy danych.
Określa:
z jakich tabel w bazie danych mają być sprowadzone dane - klauzula
FROM,
jakie warunki mają spełniać dane - klauzula WHERE
W jakiej postaci mają się pojawić przed użytkownikiem (aplikacją
użytkownika) - klauzula SELECT.
operatory w SQL
- IS [NOT] NULL, [NOT] BETWEEN, [NOT] LIKE, [NOT] IN,
[NOT] EXISTS, UNION, DISTINCT, DISTINCTROW.
INSERT
- instrukcja języka SQL służąca do wprowadzania danych do bazy
danych.
DELETE
- instrukcja języka SQL służąca do usuwania danych z bazy danych.
UPDATE
- instrukcja języka SQL służąca do aktualizacji danych w bazie danych.
UNION
- operator sumowania wyników zapytań.
złączenia w SQL
- mogą być dokonane przy pomocy specjalnych operatorów
na tabelach: INNER JOIN, LEFT JOIN, RIGHT JOIN.
Opracowanie: Lech Banachowski, Krzysztof Matejewski
Opracowanie: Lech Banachowski, Krzysztof Matejewski
44
44
Słownik
Słownik
GROUP BY
- klauzula instrukcji SELECT służąca do grupowania danych.
zapytanie sparametryzowane
- zapytanie wewnątrz którego występują
parametry, których wartości na ogół podaje użytkownik przed realizacją
zapytania.
podzapytanie
- wystąpienie jednego zapytania wewnątrz drugiego.
Podzapytanie jest albo proste, albo skorelowane z głównym zapytaniem.