RBD W08

background image

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

background image

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.

background image

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

.

background image

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;

background image

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.

background image

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.

background image

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:

background image

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.

background image

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.

background image

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.

background image

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

e-mail

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.

background image

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 (!).

background image

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

e-mail

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.

background image

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ść, …);

background image

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];

background image

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];

background image

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

background image

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!).

background image

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).

background image

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.

background image

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

background image

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

background image

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

background image

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:

background image

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ń.

background image

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

background image

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.

background image

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.

background image

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:

background image

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,

background image

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;

background image

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

background image

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.

background image

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));

background image

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:

background image

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.

background image

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

>

background image

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.

background image

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.

background image

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.

background image

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.

background image

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);

background image

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.

background image

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.


Document Outline


Wyszukiwarka

Podobne podstrony:
RBD W08
RBD W02
RBD W04
W08 Patofizjologia zaburzeń gospodarki węglowodanowej
RBD W02
RBD W03
w08
w08, Materiały Budowlane
VBA2, pjwstk PJLinka.pl, RBD
Darmowa Wyszukiwarka - styl RBD, Chomikowa Pomoc, Wyszukiwarki chomikowe
Los peces en el Rio, Teksty i tłumaczenia piosenek RBD
Erwinkil, PJWSTK, 0sem, RBD
0708z sieciTM w08
bal w08
787 W08 CAN

więcej podobnych podstron