1
BAZY DANYCH
Część II
Opracowanie : Dr hab. 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/dbtitle.html
http://baszta.iie.ae.wroc.pl/index.html
http://www.cs.put.poznan.pl/kjankiewicz/oracle/sql/index.html
http://www.cs.put.poznan.pl/rwrembel/courses/sbd.html
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
32
Komponenty SQL
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 INTO jest wykorzystywane do dopisywania
(wstawiania) pojedynczych wierszy do tabeli bazy danych wcześniej
wykreowanej np.. Z użyciem CREATE TABLE
INSERT INTO
Tabela
[(kolumna1, kolumna2, …, kolumnak)]
VALUES
(listaWartosci)
;
INSERT INTO
Tabela
;
lub
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')
43
Wstawianie danych do bazy danych
INSERT INTO
Ksiazki
VALUES (
’83-87102-55-5’, ‘Harrington’, ‘SQL
dla każdego’, ‘EDU-Mikron’, 1998,
‘Warszawa’
);
INSERT INTO
Ksiazki (ISBN, Autor, Tytul)
VALUES (
’83-87102-55-5’, ‘Harrington’, ‘SQL dla każdego’
);
Usuwanie danych z bazy danych
Polecenia DELETE używamy do usuwania wierszy z tabeli. Wiersze
do usunięcia podajemy w klauzuli WHERE.
DELETE FROM
Wykładowcy
WHERE
NazwaWydziału = 'Studia informatyczne'
;
np.:
DELETE FROM
tabela
WHERE
warunek
;
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
Tabela
SET
kolumna1 = NowaWartość,
kolumna2 = NowaWartość,
kolumnak = NowaWartość
WHERE
Warunek
;
Aktualizowanie danych w bazie danych
UPDATE
Wykładowcy
SET
Pensja = Pensja*1.1
WHERE
Status = 'PL'
Np.: 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
Znak
34
z
Kos
44
S
Bios
32
w
Dos
11
a
Bios
32
w
Dos
11
a
Znak
43
z
Bios
32
w
Bios
32
w
Dos
11
a
Znak
43
z
Bios
32
w
Bios
32
w
Dos
11
a
Znak
34
z
Kos
44
S
Dos
11
a
Bios
32
w
Suma tabel
Różnica tabel
Iloczyn tabel
Struktura typowego zapytania
selekcyjnego
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.
Proste wyszukiwanie jest wykonywane dzięki kombinacji klauzul
SELECT, FROM i WHERE:
Struktura typowego zapytania
selekcyjnego
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
W zapytaniach selekcyjnych używa się:
Operatory relacyjne
Operatory logiczne
Operatory specjalne
OPERATORY RELACYJNE
=
,
<
,
>
,
<=
,
>=
,
!=
(lub symbol <>)
służą do porównania liczb, dat, napisów
Napisy muszą być zapisane w apostrofie. Data i godzina muszą być
zapisane zgodnie z formatem stosowanym w DBMS.
Warunki w zapytaniach selekcyjnych
OPERATORY LOGICZNE
AND
,
OR
,
NOT
wraz nawiasami służą do konstrukcji złożonych warunków
logicznych (algebraicznie – odpowiadających iloczynowi, sumie
i dopełnieniu). Wyznaczenie wartości logiczne przebiega od
lewej do prawej (o ile nie ma nawiasów).
Warunki w zapytaniach selekcyjnych
OPERATORY SPECJALNE
BETWEEN
LIKE
IN
IS NULL
Służą do definiowania warunków złożonych selekcji.
Operator LIKE pozwala na porównanie łańcuchów znaków z użyciem
symbolu specjalnego % oznaczającego dowolny ciąg znaków oraz _
do porównywania pojedynczego symbolu. Operatory specjalne mogą
być negowane z użyciem operatora NOT.
Like w Access
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).
\
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 wszystkie litery zostaną zmienione na wielkie.
>
Powoduje, że wszystkie litery zostaną zmienione na małe.
<
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).
. , : ; - /
Dowolny znak lub spacja (pozycja wymagana).
C
Dowolny znak lub spacja (pozycja wymagana).
&
Litera lub cyfra (pozycja wymagana).
a
Litera lub cyfra (pozycja wymagana).
A
Litera (od A do Z, pozycja wymagana).
?
Litera (od A do Z, pozycja wymagana).
L
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).
#
Cyfra lub spacja (pozycja nie jest wymagana, znaki plus i minus nie są dozwolone).
9
Cyfra (Od 0 do 9, pozycja wymagana, znaki plus [+] i minus [–] nie są dozwolone).
0
Opis
Znak
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)
58
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”.
59
Wstawianie danych do bazy danych z
użyciem SELECT
INSERT INTO TabelaA
[(kolumnaA1, kolumnaA2, …, kolumnaAk)]
SELECT
kolumnaB1, kolumnaB2, …, kolumnaBk
FROM
TabelaB
WHERE
WarunekWyboruWierszy
;
INSERT INTO
Ksiazki
SELECT
ISBN, Autor, Tytul, Wydawnictwo, Rok, Miejsce
FROM
ZamowioneKsiazki
WHERE
status=‘dostarczone’
;
60
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'
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 .
66
Funkcje agregujące w SELECT
Funkcja agregujaca
Funkcja
Funkcja
agregujaca
agregujaca
Opis
Opis
Opis
AVG
AVG
Średnia wartości numerycznych
Średnia wartości numerycznych
COUNT
COUNT
Liczba wartości w wyrażeniu
Liczba wartości w wyrażeniu
COUNT (*)
COUNT (*)
Liczba wybranych wierszy
Liczba wybranych wierszy
MAX
MAX
Najwyższa wartość w wyrażeniu
Najwyższa wartość w wyrażeniu
MIN
MIN
Najniższa wartość w wyrażeniu
Najniższa wartość w wyrażeniu
SUM
SUM
Suma wartości w wyrażeniu
Suma wartości w wyrażeniu
STDEV
STDEV
Odchylenie statystyczne wartości
Odchylenie statystyczne wartości
STDEVP
STDEVP
Odchylenie statystyczne populacji
Odchylenie statystyczne populacji
VAR
VAR
Wariancja wartości
Wariancja wartości
VARP
VARP
Wariancja populacji
Wariancja populacji
67
Funkcje agregujące
SELECT AVG(unitprice)
FROM products
SELECT AVG(unitprice)
FROM products
SELECT SUM(quantity)
FROM orderdetails
SELECT SUM(quantity)
FROM orderdetails
Przykład 1
Przykład 1
Przykład 2
Przykład 2
SELECT AVG(DISTINCT unitprice)
FROM products
SELECT AVG(DISTINCT unitprice)
FROM products
Przykład 1
Przykład 1
68
Funkcje agregujące COUNT( )
SELECT COUNT (*)
FROM employees
SELECT COUNT (*)
FROM employees
SELECT COUNT(reportsto)
FROM employees
SELECT COUNT(reportsto)
FROM employees
Przykład 1
Przykład 1
Przykład 2
Przykład 2
69
Klauzula GROUP BY
SELECT product, order
,quantity
FROM orderhist
SELECT product, order
,quantity
FROM orderhist
SELECT product
,SUM(quantity) AS total_quantity
FROM orderhist
GROUP BY product
SELECT product
,SUM(quantity) AS total_quantity
FROM orderhist
GROUP BY product
product
product
product
total_quantity
total_quantity
total_quantity
1
1
15
15
2
2
35
35
3
3
45
45
product
product
product
order
order
order
quantity
quantity
quantity
1
1
1
1
5
5
1
1
1
1
10
10
2
2
1
1
10
10
2
2
2
2
25
25
3
3
1
1
15
15
3
3
2
2
30
30
product
product
product
total_quantity
total_quantity
total_quantity
2
2
35
35
Tylko wiersze
spełniające warunek
w WHERE wirtualnie
są grupowane
SELECT product
,SUM(quantity) AS total_quantity
FROM orderhist
WHERE product = 2
GROUP BY product
SELECT product
,SUM(quantity) AS total_quantity
FROM orderhist
WHERE product = 2
GROUP BY product
70
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
23500.00
Studia informatyczne
SL
Jones S
237
23500.00
Studia biznesu
SL
Thomas P
145
16500.00
Studia biznesu
L
Smith J
123
26500.00
Studia informatyczne
PL
Evans R
345
16000.00
Studia informatyczne
L
DaviasT
234
Pensja
NazwaWydziału
Status
NazwiskoPrac
NrPrac
Tabela
Wykładowcy
wynik
71
Klauzula GROUP BY z klauzulą
HAVING
SELECT product, order
,quantity
FROM orderhist
SELECT product, order
,quantity
FROM orderhist
SELECT product, SUM(quantity)
AS total_quantity
FROM orderhist
GROUP BY product
HAVING SUM(quantity)>=30
SELECT product, SUM(quantity)
AS total_quantity
FROM orderhist
GROUP BY product
HAVING SUM(quantity)>=30
product
product
product
total_quantity
total_quantity
total_quantity
2
2
35
35
3
3
45
45
product
product
product
order
order
order
quantity
quantity
quantity
1
1
1
1
5
5
1
1
1
1
10
10
2
2
1
1
10
10
2
2
2
2
25
25
3
3
1
1
15
15
3
3
2
2
30
30
72
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:
Studia informatyczne
23500.00
Studia
informatyczne
SL
Jones S
237
23500.00
Studia biznesu
SL
Thomas P
145
16500.00
Studia biznesu
L
Smith J
123
26500.00
Studia
informatyczne
PL
Evans R
345
16000.oo
Studia
informatyczne
L
DaviasT
234
Pensja
NazwaWydziału
Status
NazwiskoPrac
NrPrac
Tabela
Wykładowcy
wynik
SELECT NazwaWydziału
FROM Wykładowcy
GROUP BY
NazwaWydziału
HAVING count(*) > 2
Funkcje agregujące - przykłady
Wartości towarów w poszczególnych grupach towarowych:
SELECT
T.GrupaTow, SUM(T.CenaZak*TM.Stan) as Wartosc
FROM
Towat T, TowMag TM
WHERE
T.NrTow = TM.NrTow
GROUP BY
T.GrupaTow
HAVING
GrupaTow <> ‘AGD”;
45 000.00
RTV
24 000.00
KOM
Wartosc
GrupaTow
74
Klauzula GROUP BY
SELECT product,SUM(quantity) AS
total_quantity
FROM orderdetails
GROUP BY product
SELECT product,SUM(quantity) AS
total_quantity
FROM orderdetails
GROUP BY product
SELECT product, SUM (quantity) AS
total_quantity
FROM orderdetails
GROUP BY product
HAVING SUM(quantity) > 1200
SELECT product, SUM (quantity) AS
total_quantity
FROM orderdetails
GROUP BY product
HAVING SUM(quantity) > 1200
Przykład 2
Przykład 2
Przykład 1
Przykład 1
Kolejność klauzul w zapytaniu
selekcyjnym
Select … From … Where …
Group by
Having
Order by
Przykłady zapytań selekcyjnych
1
2
3
Przykłady zapytań selekcyjnych
4
5
6
Przykłady zapytań selekcyjnych
79
Klauzule COMPUTE oraz
COMPUTE BY
COMPUTE BY
COMPUTE
SELECT product, order, quantity
FROM orderhist
ORDER BY product, order
COMPUTE SUM(quantity) BY product
COMPUTE SUM(quantity)
SELECT product, order, quantity
FROM orderhist
ORDER BY product, order
COMPUTE SUM(quantity) BY product
COMPUTE SUM(quantity)
SELECT product, order
,quantity
FROM orderhist
ORDER BY product, order
COMPUTE SUM(quantity)
SELECT product, order
,quantity
FROM orderhist
ORDER BY product, order
COMPUTE SUM(quantity)
product
product
product
order
order
order
quantity
quantity
quantity
1
1
1
1
5
5
1
1
2
2
10
10
2
2
1
1
10
10
2
2
2
2
25
25
3
3
1
1
15
15
3
3
2
2
30
30
sum
sum
95
95
product
product
product
order
order
order
quantity
quantity
quantity
1
1
1
1
5
5
1
1
2
2
10
10
sum
sum
15
15
2
2
1
1
10
10
2
2
2
2
25
25
sum
sum
35
35
3
3
1
1
15
15
3
3
2
2
30
30
sum
sum
45
45
sum
sum
95
95
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.
23500.00
Studia biznesu
SL
Thomas P
145
16500.00
Studia biznesu
L
Smith J
123
26500.00
Studia informatyczne
PL
Evans R
345
23500.00
Studia informatyczne
SL
Jones S
237
16000.oo
Studia informatyczne
L
DaviasT
234
Pensja
NazwaWydziału
Status
NazwiskoPrac
NrPrac
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
23500.00
Studia biznesu
SL
Thomas P
145
16500.00
Studia biznesu
L
Smith J
123
26500.00
Studia informatyczne
PL
Evans R
345
23500.00
Studia informatyczne
SL
Jones S
237
16000.oo
Studia informatyczne
L
DaviasT
234
Pensja
NazwaWydziału
Status
NazwiskoPrac
NrPrac
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.
23500.00
Studia biznesu
SL
Thomas P
145
16500.00
Studia biznesu
L
Smith J
123
26500.00
Studia
informatyczne
PL
Evans R
345
23500.00
Studia
informatyczne
SL
Jones S
237
16000.oo
Studia
informatyczne
L
DaviasT
234
Pensja
NazwaWydziału
Status
NazwiskoPrac
NrPrac
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
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
Złączenie warunkowe - przykład
Złączenie zewnętrzne tabel
Złączenie zewnętrzne lewostronne
Wynikiem złączenia lewostronnego tabeli R z tabelą S są
wszystkie krotki operatora R złączone bądź z
dopasowanymi krotkami tabeli S, bądź z wartościami
NULL, gdy brak dla krotek z R dopasowanych do nich
krotek S.
R złączone lewostronnie z S
Złączenie zewnętrzne lewostronne
Złączenie zewnętrzne prawostronne
R złączone prawostronnie z S
Wynikiem złączenia prawostronnego tabeli R z tabelą S
są wszystkie krotki prawego operatora S złączone bądź z
dopasowanymi krotkami relacji R, bądź z wartościami
NULL, gdy brak dla krotek w R dopasowanych do nich
krotek.
Złączenie zewnętrzne prawostronne
Złączenie zewnętrzne pełne
FULL OUTER JOIN
Wynikiem złączenia zewnętrznego
pełnego jest suma mnogościowa
złączenia zewnętrznego lewostronnego i
złączenia zewnętrznego prawostronnego.
97
Złączenie zewnętrzne pełne
FULL OUTER JOIN
98
Przykłady złączeń
Tabele:
Kobiety Faceci
33
Mirosława
23
Zofia
56
Edyta
33
Wanda
55
Teresa
43
Sabina
34
Maria
23
Anna
Wiek
imie
Wiek
Imie
76
Zbigniew
44
Tomasz
18
Marian
21
Józef
55
Henryk
33
Jan
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
99
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;
55
Teresa
55
Henryk
33
Wanda
33
Jan
33
Mirosława
33
Jan
WiekPani
Pani
WiekPana
Pan
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
100
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;
56
Edyta
55
Henryk
55
Teresa
55
Henryk
…………..
…………..
…………..
…………..
34
Maria
18
Marian
33
Mirosława
18
Marian
23
Zofia
18
Marian
23
Anna
18
Marian
WiekPani
Pani
WiekPana
Pan
101
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!
102
Przykłady złączeń cd..
SELECT * FROM Faceci
RIGHT JOIN
Kobiety
ON Faceci.Wiek= Kobiety.Wiek;
34
Maria
Null
Null
33
Mirosława
33
Jan
23
Zofia
Null
Null
56
Edyta
Null
Null
33
Wanda
33
Jan
55
Teresa
55
Henryk
43
Sabina
Null
Null
23
Anna
Null
Null
WiekPani
Pani
WiekPana
Pan
103
Przykłady złączeń cd..
SELECT * FROM Kobiety
LEFT JOIN
Faceci
ON Faceci.Wiek= Kobiety.Wiek;
Null
Null
23
Anna
Null
Null
34
Maria
Null
Null
43
Sabina
55
Henryk
55
Teresa
33
Jan
33
Wanda
Null
Null
56
Edyta
Null
Null
23
Zofia
33
Jan
33
Mirosława
WiekPana
Pan
WiekPani
Pani
104
Przykłady złączeń cd..
SELECT * FROM Kobiety
RIGHT JOIN
Faceci
ON Faceci.Wiek = Kobiety.Wiek
;
33
Jan
33
Mirosława
76
Zbigniew
Null
Null
44
Tomasz
Null
Null
18
Marian
Null
Null
21
Józef
Null
Null
55
Henryk
55
Teresa
33
Jan
33
Wanda
WiekPana
Pan
WiekPani
Pani
105
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
106
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
23
Zofia
56
Edyta
43
Sabina
34
Maria
23
Anna
Wiek
imie
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
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’.
23500.00
Studia biznesu
SL
Thomas P
145
16500.00
Studia biznesu
L
Smith J
123
26500.00
Studia informatyczne
PL
Evans R
345
23500.00
Studia informatyczne
SL
Jones S
237
16000.oo
Studia informatyczne
L
DaviasT
234
Pensja
NazwaWydziału
Status
NazwiskoPrac
NrPrac
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’.
23500.00
Studia biznesu
SL
Thomas P
145
16500.00
Studia biznesu
L
Smith J
123
26500.00
Studia informatyczne
PL
Evans R
345
23500.00
Studia informatyczne
SL
Jones S
237
16000.oo
Studia informatyczne
L
DaviasT
234
Pensja
NazwaWydziału
Status
NazwiskoPrac
NrPrac
Tabela
Wykładowcy
SELECT
NazwaModulu, Poziom
FROM
Moduly
WHERE KodKursu = 'CSD'
INTERSECT
SELECT
NazwaModulu, Poziom
FROM
Moduly
WHERE
KodKursu = 'EED'
Iloczyn mnogościowy tabel - przykład
118
Iloczyn kartezjański krotek
119
Iloczyn kartezjański krotek
Podzielenie tabel (division)
Podzielenie tabel (division)
122
Perspektywy – widoki (views)
CREATE VIEW RTV (NrTow, Nazwa, CenaSprz)
As SELECT T.NrTow, T.Nazwa, T.CenaSprz
FROM Towar T WHERE T.GrupaTow=‘RTV’;
Definicja widoku wykorzystywana jest w momencie odwołania się do
widoku. Odwołanie to realizuje się na podobnych zasadach jak dla tabel
(relacji) bazy danych, np.
SELECT RTV.NrTow, RTV.Nazwa, RTV.CenaSprz
FROM RTV
WHERE RTV.CenaSprz < 2000;
Widoki są wirtualnymi tablicami bazy danych.
Nie mają one bezpośredniej reprezentacji w bazie danych. W bazie danych
zapamiętywana jest definicja perspektywy.
Definicja widoku jest wykorzystywana w momencie odwołania się do widoku
tak jak do innej tabeli bazy danych.
Definicja
perspektywy
Odwołanie do
perspektywy
123
Przykład perspektywy
Perspektywa DobryDostawca ustala DNR, nazwisko, status i sumę
dostarczanych części dla tych dostawców, którzy dostarczają ich ponad 600:
CREATE VIEW DobryDostawca( DNR, nazwisko, status, suma )
AS
SELECT V.DNR, D.NAZW, D.STATUS, V.SUMA
FROM DOSTAWCA AS D, OcenaDostawcy AS V
WHERE V.DNR = D.DNR AND V.SUMA > 600;
Rezultat:
Wirtualna tabela o postaci:
DNR
D1
D2
D4
nazwisko
Abacki
Bober
Dąbek
status
20
10
20
suma
1300
700
900
124
Przykład perspektywy
CREATE VIEW OcenaDostawcy(DNR, suma )
AS
SELECT DNR, SUM( ILOŚĆ ) FROM DC
GROUP BY DNR;
Perspektywa OcenaDostawcy podaje numer dostawcy i
sumę dostarczanych przez niego części.
125
Usunięcie perspektywy
CREATE VIEW DobryDostawca( DNR, nazwisko, status, suma )
AS
SELECT V.DNR, D.NAZW, D.STATUS, V.SUMA
FROM DOSTAWCA AS D, OcenaDostawcy AS V
WHERE V.DNR = D.DNR AND V.SUMA > 600;
DROP VIEW DobryDostawca;
126
Modyfikacja perspektyw cd..
CREATE VIEW RTV (NrTow, Nazwa, CenaSprz)
As SELECT T.NrTow, T.Nazwa, T.CenaSprz
FROM Towar T WHERE T.GrupaTow=‘RTV’;
Definicja perspektywy zawiera klucz główny tabeli Towar –
można perspektywę aktualizować
Update RTV
Set CenaSprz = CenaSprz +10
Definicja przykładowej perspektywy
127
Czy możliwa jest aktualizacja widoku?
Dział
IdDz
Nazwa
Pracownik
Nazwisko
Zarobek
Dział
/MojeDziały
Nazwa
ŚredniZarobek
Dane rzeczywiste
Dane wirtualne
Create view MojeDziały (nazwa, ŚredniZarobek)
as
Select Nazwa, AVG(Zarobek)
From Pracownik
Group By Dział;
zatrudnia
*
128
Czy możliwa jest aktualizacja widoku?
Dział
Nazwa
Pracownik
Nazwisko
Zarobek
/MojeDziały
Nazwa
ŚredniZarobek
Dane rzeczywiste
Dane wirtualne
Podwyższ średni zarobek w dziale „Krasnale ogrodowe” o 500 zł:
update MojeDziały set ŚredniZarobek = ŚredniZarobek + 500
where Nazwa = ‘Krasnale ogrodowe’;
?
Zlecenie jest błędne, gdyż:
Nie ma danej o nazwie ŚredniZarobek.
Nawet gdybyśmy chcieli je poprawnie wykonać na danych rzeczywistych, mamy
do wyboru nieskończenie wiele sposobów. Prawdopodobnie tylko jeden z nich
satysfakcjonowałby naszego szefa, który wydał takie polecenie.
zatrudnia
*
129
Modyfikacja perspektyw cd..
Widok
MIASTA
definiuje pary (DAdres, MAdres), gdzie:
DAdres – adres dostawcy,
MAdres – adres magazynu, do którego dostawca dostarcza towary
CREATE VIEW MIASTA(DAdres, MAdres)
As SELECT DISTINCT D.Adres, M.Adres
FROM DOSTAWCA D, MAGAZYN M, DOSTWA W
WHERE D.NrDCY AND M.NrMag = W.NrMag;
130
Modyfikacja perspektyw cd..
Widok
MIASTA
definiuje pary (DAdres, MAdres), gdzie:
DAdres – adres dostawcy,
MAdres – adres magazynu, do którego dostawca dostarcza towary
CREATE VIEW MIASTA(DAdres, MAdres)
As SELECT DISTINCT D.Adres, M.Adres
FROM DOSTAWCA D, MAGAZYN M, DOSTWA W
WHERE D.NrDCY AND M.NrMag = W.NrMag;
Widok jest niemodyfikowalny, gdyż w
jego definicji zawarto słowo DISTINCT a
w tabeli bazy danych może być wiele
rekordów o tej samej wartości D.Adres
!
131
Modyfikacja perspektyw cd..
CREATE VIEW
Miasta1
(DAdres, MAdres)
AS
SELECT D.Adres, M.Adres
FROM Dostawca D, Magazyn M, Dostawa W
WHERE D.NrDcy=W.NrDcy AND M.NrMag = W.NrMag
NrDcy Nazwa Adres
1
Nowak Szczecin
2
Adamski Gorzów
3
Kowal Koło
4 Lipski Płock
Magazyn
Dostawca
NrMag
Adres
1
Szczecin
2
Koło
3 Szczecin
Dostawa
NrDost
NrDcy NrTow
NrMag
….
1
1 2 2 ….
2
4 3 2 …
3
2 2 1 …
4
2 3 1 …
5
1 1 3 …
Miasta1
DAdres
MAdres
Szczecin Koło
Płock Szczecin
Gorzów Szczecin
Gorzów Szczecin
Szczecin Szczecin
132
Modyfikacja perspektyw cd..
UPDATE Miasta1 SET DAdres=‘Kraków’ WHERE DAdres=‘Szczecin’;
NrDcy Nazwa Adres
1
Nowak
Szczecin
2
Adamski Gorzów
3
Kowal Koło
4 Lipski Płock
Magazyn
Dostawca
NrMag
Adres
1
Szczecin
2
Koło
3 Szczecin
Dostawa
NrDost
NrDcy NrTow
NrMag
….
1
1 2 2 ….
2
4 3 2 …
3
2 2 1 …
4
2 3 1 …
5
1 1 3 …
Miasta1
DAdres
MAdres
Szczecin Koło
Płock Szczecin
Gorzów Szczecin
Gorzów Szczecin
Szczecin Szczecin
Widok Miasta1 jest modyfikowalny, gdyż zawiera klucz w jego definicji
Modyfikacja zostanie wykonana na tabeli
Dostawca
NrDcy Nazwa Adres
1
Nowak
Kraków
2
Adamski Gorzów
3
Kowal Koło
4 Lipski Płock
Dostawca
133
Aktualizacja perspektyw
Najpoważniejszy i nierozwiązany problemem to aktualizacja
perspektyw.
Baza danych
Dane zapamiętane
Perspektywa
Dane wirtualne
Aktualizacja
Na ogół odwzorowanie danych wirtualnych w dane zapamiętane nie jest
jednoznaczne. Odwzorowanie aktualizacji danych wirtualnych w aktualizacje
danych zapamiętanych można zrobić na wiele sposobów. Czasami takie
odwzorowanie odwrotne w ogóle nie istnieje.
134
Modyfikacja perspektyw
podsumowanie
Jeśli widok (perspektywa) jest tak zdefiniowany,
że można przetransformować operacje jego
modyfikowania na modyfikację tabel
bazodanowych, to można go modyfikować
Sytuacja taka występuje np. wówczas, gdy w
definicji pespektywy zawarto klucz główny tabel
bazy danych, nad którymi jest definiowana
perspektywa i definicja perspektywy nie zawiera
funkcji agregujących ani klauzuli DISTINCT