You are on page 1of 16

----------------------------------------------------------------------------------------------------------------------------- ----------I. Wybieranie danych z wielu tabel.

Zadania obejmuj wyszukiwanie danych z wielu tabel. Do budowy takich zapyta suy predykat JOIN, ktry
jest implementacj operatorw zcze algebry relacji.
Znale adresy oddziaw wypoyczalni samochodw, w ktrych pracuj poszczeglni pracownicy. Aby
uzyska te informacje, potrzebna jest lista pracownikw oraz dane o miejscu zatrudnienia pracownikw. W
bazie danych WYPAUT, dla kadego numeru miejsca (pracy pracownika) istnieje jeden wiersz w tabeli
MIEJSCA. DBMS odczytuje numer miejsca pracownika z tabeli PRACOWNICY, a potem przeszukuje tabele
MIEJSCA w celu znalezienia odpowiadajcego temu numerowi wiersza, ktry opisuje dokadnie miejsce pracy,
tzn. adres, telefon i inne informacje. W jzyku baz danych SQL mona to wyrazi poniszym zapytaniem:
Wykona najpierw bez klauzuli WHERE
SELECT PRACOWNICY.NAZWISKO,
PRACOWNICY.STANOWISKO,
PRACOWNICY.DZIAL,
MIEJSCA.MIASTO,
MIEJSCA.ULICA
FROM PRACOWNICY,
MIEJSCA
WHERE PRACOWNICY.NR_MIEJSCA = MIEJSCA.NR_MIEJSCA
ORDER BY PRACOWNICY.NAZWISKO;
Takie zapytanie SQL nazywamy zczeniem (ang. join).
W zapytaniu tym:
w klauzuli SELECT specyfikujemy kolumny, ktre chcemy uzyska, jako wynik zapytania,
w klauzuli FROM okrelamy nazwy zczanych tabel,
w klauzuli WHERE okrelamy warunki zczenia.
Skadnia zczenia predykat JOIN. S dwa rodzaje skadni zapytania zczeniowego.
Pierwszy przedstawiony zosta powyej. Przy specyfikowaniu zczenia dwch tabel, do poprawnego
wywietlenia wyniku klauzula WHERE musi zawiera jeden warunek. Gdy zczamy trzy tabele klauzula
WHERE musi zawiera przynajmniej dwa warunki musza dotyczy zczenia tabel, a pozostae dotycz wyboru
wierszy. Oto przykad:
SELECT WYPOZYCZENIA.NR_WYPOZYCZENIA,
PRACOWNICY.NAZWISKO,
PRACOWNICY.STANOWISKO,
PRACOWNICY.DZIAL,
MIEJSCA.MIASTO,
MIEJSCA.ULICA
FROM PRACOWNICY,
MIEJSCA,
WYPOZYCZENIA
WHERE PRACOWNICY.NR_MIEJSCA = MIEJSCA.NR_MIEJSCA
AND PRACOWNICY.NR_PRACOWNIKA = WYPOZYCZENIA.NR_PRACOW_WYP
AND MIEJSCA.MIASTO = WARSZAWA
ORDER BY PRACOWNICY.NAZWISKO;

Inny typ specyfikacji zczenia polega na zastosowaniu konstrukcji JOIN...ON:


SELECT PRACOWNICY.NAZWISKO,
PRACOWNICY.STANOWISKO,
PRACOWNICY.DZIAL,
MIEJSCA.MIASTO,
MIEJSCA.ULICA
FROM PRACOWNICY JOIN
MIEJSCA ON
PRACOWNICY.NR_MIEJSCA = MIEJSCA.NR_MIEJSCA
WHERE PRACOWNICY.STANOWISKO = SPRZEDAWCA
ORDER BY PRACOWNICY.NAZWISKO;
Jak wida powyej, gdy uywamy sowa kluczowego JOIN w klauzuli FROM, warunki zczenia musza by
wyspecyfikowane po klauzuli ON. W klauzuli WHERE mona natomiast okreli dodatkowe warunki, na
przykad wyboru wierszy.
Stosowanie aliasw w zapytaniu. Aliasy definiuje si w celu skrcenia nazwy tabeli. Przykadowo alias P moe
wskazywa na tabele PRACOWNICY, a M moe wskazywa tabele MIEJSCA:
SELECT P.NAZWISKO, P.STANOWISKO, P.DZIAL, M.MIASTO, M.ULICA
FROM PRACOWNICY P,
MIEJSCA M
WHERE
P.NR_MIEJSCA = M.NR_MIEJSCA
AND P.STANOWISKO = SPRZEDAWCA
ORDER BY P.NAZWISKO;
Wynik wykonania tego zapytania jest taki sam jak poprzedniego zapytania. Od tej chwili w przykadach
bdziemy stosowa aliasy dla nazw tabel.

Podsumowanie:
1. Dane mog by wydobywane z jednej lub wielu tabel.
2. W zapytaniu wybierajcym dane z przynajmniej dwch tabel mona uy predykatu JOIN.
3. Jeeli w zapytaniu, ktre wybiera dane z przynajmniej dwch tabel, nie zostanie wyspecyfikowany warunek
po sowie kluczowym WHERE lub ON, to zwrcony wynik bdzie iloczynem kartezjaskim.
4. W zapytaniach mona uywa aliasw zamiast nazw tabel.

Funkcje skalarne i arytmetyczne.


Wybieranie wyliczonych wartoci. W zapytaniu SQL moemy uy nastpujcych funkcji skalarnych i
arytmetycznych w celu obliczenia wartoci:
+ dodawanie
- odejmowanie
* mnoenie
/ dzielenie
Tych operatorw uywamy te do budowy bardziej zoonych wyrae. W celu zaznaczenia kolejnoci
wykonywania dziaa mona uywa nawiasw.
SELECT P.IMIE, P.NAZWISKO, P.PENSJA, P.DODATEK,
P.PENSJA + P.DODATEK AS DO_WYPLATY
FROM PRACOWNICY P
WHERE P.PENSJA > 1100
ORDER BY P.NAZWISKO;
Wynik zapytania zawiera kolumn obliczona, ktra jest suma kolumn PENSJA i DODTEK. Jeli warto ktrej
z kolumn potrzebnych do oblicze jest pusta (ma warto NULL), to warto pola zwizanego z obliczeniami na
tej wartoci jest rwnie pusta (NULL).

Aby nazwa kolumny wyliczonej moga zawiera spacje, to nazwa ta musi by wzit w cudzysw:
SELECT P.IMIE, P.NAZWISKO, P.PENSJA, P.DODATEK,
P.PENSJA + P.DODATEK AS DO WYPLATY
FROM PRACOWNICY P
WHERE P.PENSJA > 1100
ORDER BY P.NAZWISKO;
Nazwa kolumny wyliczonej nie moe wystpi w klauzuli WHERE.
W niektrych systemach DBMS i zrealizowanych w nich odmianach jzyka SQL nazwy kolumny wyliczonej
nie mona uywa w klauzuli ORDER BY. Jest tak w InterBase. Wtedy naley uywa numeru na licie
wyliczonej w klauzuli SELECT:
SELECT P.IMIE, P.NAZWISKO, P.PENSJA, P.DODATEK,
P.PENSJA + P.DODATEK AS DO_WYPLATY
FROM PRACOWNICY P
WHERE P.PENSJA > 1100
ORDER BY 5;
Porwnanie daty. Kolumny typu daty lub czasu mog by porwnywane z innymi wartociami reprezentujcymi
dat lub czas. Wartoci przedstawiajce dat lub czas musza by otoczone pojedynczym cudzysowem. W
poniszym przykadzie zostan wywietlone dane pracownikw zatrudnionych w lub po dacie 1998-01-01:
SELECT P.IMIE, P.NAZWISKO, P.DZIAL,
P.STANOWISKO, P.DATA_ZATR
FROM PRACOWNICY P
WHERE P.DATA_ZATR >= 1998-01-01
ORDER BY P.NAZWISKO;
W DBMS IntrerBase funkcje SUBSTR trzeba uaktywni. W tym celu deklarujemy funkcje, ktra bdzie
pobrana z zewntrznej biblioteki DLL doczanej dynamicznie:
DECLARE EXTERNAL FUNCTION SUBSTR
CSTRING(80), SMALLINT, SMALLINT
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT IB_UDF_substr MODULE_NAME ib_udf.dll;
Po wykonaniu powyszego polecenia mona przej do opcji IBConsole, aby zobaczy te funkcje, klikajc w
panelu po lewej stronie na ikonie External Function.
Funkcja skalarna SUBSTR wybierania podacucha (dostpna w wybranych systemach DBMS).
Do wybierania podacucha suy funkcja SUBSTR. Aby z kolumny NAZWISKO wybra cigi znakw od
pozycji wskazywanej przez drugi argument do pozycji wskazywanej przez trzeci argument budujemy ponisze
zapytanie. Naley z naciskiem zaznaczy, e funkcja ta ma inne znaczenie skadni i inaczej dziaa w innych
systemach DBMS.
SELECT SUBSTR(K.NAZWISKO, 3, 4), K.NAZWISKO
FROM KLIENCI K;

czenie acuchw. Cigi znakw mona czy w caociowe acuchy wynikowe za pomoc operatora ||.
Co w innych odmianach SQL dla innych systemw DBMS mona zastosowa do czenia acuchw specjalne
funkcje, np. w MySQL funkcje CONCAT, a w Microsoft SQLServer uywamy znaku +.
Zatem okrelone zapytanie ma posta:

W DBMS
SELECT
W DBMS
SELECT
W DBMS
SELECT

InterBase
IMIE || || NAZWISKO AS KLIENT FROM KLIENCI;
MySQL
CONCAT(nazwisko, ' ', imie) AS dane_osobowe FROM klienci;
Microsoft SQLServer
IMIE + + NAZWISKO AS KLIENT FROM KLIENCI;

Podsumowanie:
1. Funkcje arytmetyczne mog by uywane w klauzuli SELECT oraz WHERE.
2. Kolumny wyliczone mog by nazwane przez zastosowanie klauzuli AS.
3. Do zmiany reprezentacji danych su funkcje skalarne.
4. W innych odmianach SQL dla innych systemw DBMS wystpuje bardzo duo wbudowanych funkcji
skalarnych.

Funkcje kolumnowe i grupujce.


Funkcje kolumnowe. Do funkcji kolumnowych zalicza sie funkcje: SUM, AVG, MIN, MAX oraz COUNT. Funkcje
te uywane s w klauzulach SELECT lub HAVING.
SUM suy do obliczania sumy wartoci w okrelonych kolumnach,
AVG oblicza warto rednia w kolumnie,
MIN znajduje warto minimaln,
MAX znajduje warto maksymaln,
COUNT suy do zliczania wystpie pewnej wartoci w wierszach.
Poniszy przykad wywietla cakowit sum wszystkich pensji pracownikw, redni pensje, minimaln pensje
oraz ilo pracownikw:
SELECT SUM(P.PENSJA) AS PENSJA,
AVG(P.PENSJA) AS SREDNIA,
MIN(P.PENSJA) AS PENSJA_MIN,
MAX(P.PENSJA) AS PENSJA_MAX,
COUNT(*) AS ILOSC
FROM PRACOWNICY P;
Powyej funkcja COUNT zostaa uyta do zliczania wszystkich wierszy w tabeli (COUNT(*)). Moe by ona
rwnie uyta do zliczania wierszy nie zawierajcych powtarzajcych si wartoci w kolumnie w kolumnach.
Przykadowo, moemy zliczy liczb dziaw i stanowisk w firmie:
SELECT COUNT(DISTINCT P.DZIAL) AS ILOSC_DZIALOW,
COUNT(DISTINCT P.STANOWISKO) AS ILOSC_STANOWISK
FROM PRACOWNICY P;
Funkcje kolumnowe mona zastosowa rwnie na podzbiorze wierszy.
SELECT SUM(P.PENSJA) AS PENSJA,
AVG(P.PENSJA) AS SREDNIA,
MIN(P.PENSJA) AS PENSJA_MIN,
MAX(P.PENSJA) AS PENSJA_MAX,
COUNT(*) AS ILOSC

FROM PRACOWNICY P
WHERE P.DZIAL = OBSLUGA KLIENTA;

Klauzula GROUP BY. Grupuje wiersze o tej samej wartoci wyszczeglnionych kolumn. Funkcje agregujce
SQL (AVG, MAX, MIN, SUM, oraz COUNT) w klauzuli SELECT operuj na kadej grupie osobno.
Nastpujce zapytanie pogrupuje wiersze wedug stanowiska:
SELECT P.STANOWISKO, SUM(P.PENSJA) AS PENSJA,
AVG(P.PENSJA) AS SREDNIA,
MIN(P.PENSJA) AS PENSJA_MIN,
MAX(P.PENSJA) AS PENSJA_MAX,
COUNT(*) AS ILOSC
FROM PRACOWNICY P
GROUP BY P.STANOWISKO
ORDER BY P.STANOWISKO;

Klauzula HAVING. Klauzula HAVING jest uywana w GROPUP BY w celu ograniczenia wywietlania grup.
Warunek szukania musi zawiera funkcje agregujc. Po zgrupowaniu wierszy przez klauzule GROUP BY,
klauzula HAVING wywietla tylko te wiersze spord zgrupowanych, ktre speniaj warunki wyszczeglnione
w klauzuli HAVING. Klauzula HAVING moe by uyta tylko wwczas, gdy w zapytaniu znajduje si klauzula
GROUP BY.
Aby wywietli wszystkich pracownikw, ktrzy wypoyczyli samochody na czn sum powyej 400z
budujemy ponisze zapytanie:
SELECT P.NAZWISKO, SUM(W.CENA_JEDN)
FROM PRACOWNICY P,
WYPOZYCZENIA W
WHERE P.NR_PRACOWNIKA = W.NR_PRACOW_WYP
GROUP BY P.NAZWISKO
HAVING SUM(W.CENA_JEDN) > 400
ORDER BY P.NAZWISKO;

Podsumowanie:
1. Funkcje kolumnowe mog by uyte tylko w klauzulach SELECT HAVING.
2. Klauzula SELECT moe zawiera tylko funkcje kolumnowe oraz kolumny wskazane w klauzuli ORDER BY.
3. Klauzula HAVING moe zawiera dowolne funkcje kolumnowe operujce na dowolnych kolumnach tabeli.
Kolumny te nie musza by wyspecyfikowane w klauzuli SELECT.
Klauzula UNION. Klauzula UNION pozwala na czenie dwch lub wicej wynikw wykonania zapytania
SELECT. Zapoznamy si ze skadnia polecenia UNION, oraz zasadami dla list w klauzuli SELECT oraz
rnicami miedzy klauzul UNION i UNION ALL.
czenie wielu wynikw zapytania.
Klauzula UNION czy dwa lub wicej zapytania SELECT w jedn tabel wynikowa. Klauzula SELECT musi
zwraca t sam liczb kolumn. Kolumny pokrywajce si musza mie te sama szeroko i typ danych. Nazwy
tych kolumn mog by rne. Klauzula UNION czy dwa zestawy wynikw w jeden i jednoczenie usuwa
duplikaty. Powtarzajce si wiersze umieszczane s w wyniku kocowym zapytania tylko raz, to znaczy
eliminowane s duplikaty w wyniku kocowym.
Ponisze zapytanie zwraca dane o imieniu i nazwisku wszystkich klientw i pracownikw, ktrych nazwiska
kocz si na ski. Tylko jedna osoba o imieniu i nazwisku Jan Kowalski wystpuje jednoczenie w tabeli
klientw i pracownikw:
SELECT IMIE, NAZWISKO
FROM KLIENCI
WHERE NAZWISKO LIKE %SKI
UNION
SELECT IMIE, NAZWISKO
FROM PRACOWNICY
WHERE NAZWISKO LIKE %SKI;

Za kadym razem zapytania czce wyniki z klauzula UNION wywietlaj wyniki posortowane rosnco. Jeeli
chcemy zawrze klauzule ORDER BY sortujc wyniki malejco ze wzgldu na NAZWISKO, to musi ona by
umieszczona na kocu zapytania.
Uwaga: W dialekcie jzyka SQL systemu DBMS InterBase, w klauzuli ORDER BY zamiast specyfikowania
nazwy kolumny NAZWISKO musimy wyspecyfikowa numer pozycji tej kolumny na licie kolumn
wybieranych w SELECT (w poniszym przykadzie jest to 2). InterBase nie pozwala specyfikowa w klauzuli
ORDER BY nazw kolumn:
SELECT IMIE, NAZWISKO
FROM KLIENCI
WHERE NAZWISKO LIKE %SKI
UNION
SELECT IMIE, NAZWISKO
FROM PRACOWNICY
WHERE NAZWISKO LIKE %SKI
ORDER BY 2 DESC;

Klauzula UNION ALL.


Rnica pomidzy klauzul UNION a UNION ALL polega na tym, e wynik czenia zapyta klauzula UNION
ALL zawiera powtarzajce si wiersze. Natomiast klauzula UNION ALL dziaa szybciej ni UNION. Zatem,
gdy czymy klika wynikw zapytania, i gdy jestemy pewni, e czone wyniki nie zawieraj duplikatw,
moemy uywa klauzuli UNION ALL.
SELECT IMIE, NAZWISKO
FROM KLIENCI
WHERE NAZWISKO LIKE %SKI
UNION ALL
SELECT IMIE, NAZWISKO
FROM PRACOWNICY
WHERE NAZWISKO LIKE %SKI
ORDER BY 2 DESC;
W wyniku tego zapytania JAN KOWALSKI wystpuje dwa razy poniewa UNION ALL nie usuwa duplikatw

Podsumowanie:
1. Wyniki zapytania SELECT z t sam liczb kolumn bdcych tego samego typu danych mog by czone
poprzez uycie klauzuli UNION.
2. Klauzula UNION sortuje dane wynikowe i usuwa duplikaty.
3. Klauzula UNION ALL dziaa szybciej ni UNION.
4. Klauzuli UNION ALL uywamy, gdy jestemy pewni, e czone wyniki nie zawieraj duplikatw.

Dalsze przykady dotycz podzapyta. Pokaemy, jak konstruowa podzapytania, jak je uywa w klauzuli
HAVING oraz jak budowa podzapytania ze sowami kluczowymi IN, ALL, ANY lub SOME.
Przypumy, e musimy znale pracownikw, ktrzy otrzymuj wynagrodzenie na kwot wiksz ni wynosi
rednia. Musimy najpierw sprawdzi, jaka jest rednia pensja (dla kadego) pracownika:
SELECT AVG(P.PENSJA)
FROM PRACOWNICY P;
Teraz szukamy pracownikw, ktrzy zarabiaj powyej redniej:
SELECT P.IMIE, P.NAZWISKO, P.DZIAL, P.STANOWISKO
FROM PRACOWNICY P
WHERE P.PENSJA > 1530;
Co prawda zrealizowalimy tre zadania, W DWCH KROKACH. Natomiast naszym celem jest realizacja
zadania JEDNYM POLECENIEM. Mona to zrobi przy uyciu podzapytania:
SELECT P.IMIE, P.NAZWISKO, P.DZIAL, P.STANOWISKO
FROM PRACOWNICY P
WHERE P.PENSJA > (SELECT AVG(P.PENSJA)
FROM PRACOWNICY P);
Podzapytania z uyciem sw kluczowych IN oraz NOT IN.
Sowo kluczowe IN pozwala na zidentyfikowanie wszystkich elementw w zbiorze A, ktre wystpuj w
zbiorze B. Dualnie, sowo kluczowe NOT IN pozwala na zidentyfikowanie wszystkich elementw w zbiorze
A, ktre nie wystpuj w zbiorze B.
Zapytanie wywietlajce list samochodw, ktrych do tej pory nie wypoyczy aden klient. Zapytanie wybiera
te samochody, ktre nie znajduj si w tabeli wypoyczenia, czyli te, ktre nie byy do tej pory przedmiotem
wypoyczenia:
SELECT S.NR_SAMOCHODU, S.MARKA, S.TYP
FROM SAMOCHODY S
WHERE S.NR_SAMOCHODU
NOT IN
(SELECT W.NR_SAMOCHODU
FROM WYPOZYCZENIA W);
Podzapytania z uyciem sowa kluczowego ALL.
Ponisze podzapytanie przykadowe bdzie wykonywane w trzech krokach. Najpierw wykonywane jest
podzapytanie, znajdujce redni pensje w kadym dziale (dziaami). W drugim kroku, kada pensja pracownika
porwnywana jest z list rednich pensji. W kocu, wywietleni zostan pracownicy, ktrych pensja jest wysza
od wszystkich rednich pensji obliczonych w podzapytaniu:
SELECT P.IMIE, P.NAZWISKO, P.DZIAL, P.STANOWISKO, P.PENSJA
FROM PRACOWNICY P
WHERE
P.PENSJA > ALL (SELECT AVG(P.PENSJA)
FROM PRACOWNICY P
GROUP BY P.DZIAL);

Podzapytania z uyciem sowa kluczowego ANY lub SOME.


Ponisze zapytanie wykonywane jest w trzech krokach. Jako pierwsze jest wykonywane podzapytanie, ktre
znajduje rednia pensj w kadym dziale (dziaami). W drugim kroku, kada pensja pracownika porwnywana
jest z lista rednich pensji. Ostatecznie, wywietleni zostan wszyscy pracownicy, ktrych pensja jest wysza od
najmniejszej redniej pensji obliczonej w podzapytaniu:
SELECT P.IMIE, P.NAZWISKO, P.DZIAL, P.STANOWISKO, P.PENSJA
FROM PRACOWNICY P
WHERE
P.PENSJA > ANY (SELECT AVG(P.PENSJA)
FROM PRACOWNICY P
GROUP BY P.DZIAL);
Sowo kluczowe SOME jest rwnowane sowu ANY.
Podzapytania w klauzuli HAVING.
Chcemy znale dziay, w ktrych rednia pensja pracownikw jest wysza od redniej pensji w firmie. Do
rednich pensji nie bd brani pod uwag kierownicy dziaw. Gdybymy musieli wykona to zadanie rcznie,
to musielibymy wykona trzy kroki. W pierwszym musielibymy znale redni pensje w firmie, nie biorc
pod uwag kierownikw:
SELECT AVG(P.PENSJA)
FROM PRACOWNICY P
WHERE P.STANOWISKO <> KIEROWNIK;
W drugim obliczylibymy rednie pensje pracownikw w poszczeglnych dziaach, nie biorc przy tym pod
uwag kierownikw:
SELECT P.DZIAL, AVG(P.PENSJA) AS SREDNIA_PENSJA
FROM PRACOWNICY P
WHERE P.STANOWISKO <> KIEROWNIK
GROUP BY P.DZIAL
ORDER BY 2;
Gdy uywamy innego systemu DBMS ni InterBase, to ostatni wiersz bedzie wyglada nastepujaco:
ORDER BY SREDNIA_PENSJA;
W trzecim kroku musielibymy porwna wartoci rednich pensji poszczeglnych dziaw ze redni pensj w
firmie.
Ostatecznie, wykonujemy to zadanie za pomoc pojedynczego zapytania z podzapytaniem w klauzuli HAVING.
SELECT P.DZIAL, AVG(P.PENSJA) AS SREDNIA_PENSJA
FROM PRACOWNICY P
WHERE P.STANOWISKO <> KIEROWNIK
GROUP BY P.DZIAL
HAVING AVG(P.PENSJA) > (SELECT AVG(P.PENSJA)
FROM PRACOWNICY P
WHERE P.STANOWISKO <> KIEROWNIK)
ORDER BY 2;

Podsumowanie:
1. Podzapytania musza by otoczone nawiasami.
2. Podzapytania nie mog zawiera klauzuli UNION, UNION ALL, lub ORDER BY.

Utrzymywanie danych.
Obecnie pokaemy skadnie polece do tworzenia tabel i widokw oraz pokaemy jak wprowadza do tabeli
dane, jak te dane modyfikowa, a take jak usuwa z tabel wiersze i jak usuwa cae tabele.
Tworzenie tabel. Utworzymy wiczeniow tabele wypeniona danymi. Tabele tworzy nastpujce polecenie.
CREATE TABLE KLIENCI_TEST (
NR_KLIENTA CHAR(8) NOT NULL,
IMIE VARCHAR(20) NOT NULL,
NAZWISKO VARCHAR(20) NOT NULL,
NR_KARTY_KREDYT CHAR(20) ,
ULICA VARCHAR(24) NOT NULL,
NUMER CHAR(8) NOT NULL,
MIASTO VARCHAR(24) NOT NULL,
KOD CHAR(6) NOT NULL,
NR_TELEFONU CHAR(16) ,
PRIMARY KEY (NR_KLIENTA) );
Definiujc tabel okrelamy jej nazw KLIENCI_TEST. Nastpnie okrelamy kolumny dla tej tabeli. Kada
kolumna musi posiada unikatowa nazw w obrbie tabeli oraz typ danych przechowywanych w kolumnie.
Dodatkowo przy definiowaniu kolumn mona okreli, czy dozwolone jest pozostawienie wartoci pustych w tej
kolumnie. Jeli nie, to dodajemy do definicji kolumny klauzule NOT NULL. W tabeli KLIENCI_TEST kolumna
NR_KARTY_KREDYT moe by puste, co oznacza e nie kady klient posiada kart kredytow, a gdy nawet
tak kart posiada, to nie musi ni realizowa patnoci. Sowo kluczowe PRIMARY KEY okrela klucz gwny
dla tabeli.

Tabele mona przebudowa dodajc nowa kolumn albo usuwajc jak kolumn istniejc ju w tabeli. Mona
zmieni typ danych kolumny lub zmieni inne cechy tabeli oraz kolumn w niej zawartych. Do zmiany struktury
tabeli suy polecenie ALTER TABLE jzyka SQL.
Nastpujce polecenie ALTER TABLE dodaje dwie kolumny FIRMA oraz NIP do tabeli KLIECI_TEST.
ALTER TABLE KLIENCI_TEST
ADD FIRMA VARCHAR(40),
ADD NIP CHAR(12);
W InterBase kolejne wiersze ze sowem ADD w powyszym naley oddzieli przecinkiem.
Polece ALTER TABLE uywamy w celu poprawiania bdw definiowania tabel i schematu bazy danych.
Tworzenie widokw.
Dane zawarte w widoku nie musza by kompletnymi danymi jakiej tabeli, a nawet nie musza pochodzi z
jednej tabeli. Widok, czyli perspektywa jest pewnym oknem na dane i moe ono pokazywa dane z kilku
tabel. Widoki s tworzone gwnie w celu ograniczenia dostpu do danych w tabelach bazy danych.
Do tworzenia widokw suy polecenie CREATE VIEW.
A oto przykad tworzenia widoku zawierajcego dane klientw, ktrzy posiadaj firm.
CREATE VIEW KLIENCI_FIRMY AS
SELECT K.IMIE, K.NAZWISKO, K.FIRMA, K.NIP, K.MIASTO
FROM KLIENCI K
WHERE K.FIRMA IS NOT NULL;

Z widoku mona wybiera dane, tak jak z tabeli.


SELECT *
FROM KLIENCI_FIRMY;

Tworzenie widoku, ktry ogranicza dane pracownikw do wszystkich danych oprcz informacji na temat
dodatku i pensji:
CREATE VIEW PRACOWNICY_DANE_BEZ_PLAC AS
SELECT P.NR_PRACOWNIKA, P.IMIE, P. NAZWISKO,
P.DATA_ZATR, P.DZIAL, P.STANOWISKO,
P.NR_MIEJSCA, P.NR_TELEFONU
FROM PRACOWNICY P;

Dodawanie i usuwanie wierszy.


Aby doda jeden lub wicej wierszy do istniejcej tabeli, naley posuy si poleceniem INSERT. Aby doda
wiersz do tabeli KLIENCI_TEST musimy napisa i wykona nastpujce polecenie SQL.
INSERT INTO KLIENCI_TEST
VALUES (00000031, MARIUSZ, DOLATA, NULL, KOCHANOWSKIEGO, 3,
WROCLAW, 37-300, 167-763-234, KWIATY, 2224-444-224);

Mona doda jeszcze kilka wierszy:


INSERT INTO KLIENCI_TEST
VALUES (00000032, TOMASZ, DOMAGALA, HX 145345678, ROZANA, 4/9,
WARSZAWA, 01-900, 46-744-431, NULL, NULL);
INSERT INTO KLIENCI_TEST
VALUES (00000033, PAWEL, MALCZYKOWSKI, HF 14565661, SLONECZNA,
9, WARSZAWA, 01-900, 16-742-114, NULL, NULL);
INSERT INTO KLIENCI_TEST
VALUES (00000034, PIOTR, MUSZYNSKI, DD 72325221, SZYBOWCOWA,
22A, WARSZAWA, 01-200, 144-188-415, FRYZJERSTWO, 2343-112-345);
Kade z tych polece wypenia wartociami wszystkie kolumny tabeli.
Aby wstawi dane tylko do wybranych kolumn tabeli, naley je wyspecyfikowa, a nastpnie pod wartoci.
INSERT INTO KLIENCI_TEST (NR_KLIENTA, IMIE, NAZWISKO, ULICA, NUMER, MIASTO,
KOD)
VALUES (00000036, MAGDALENA, BRZOZA,ALEJE LIPOWE, 4/3,
SWIDNICA, 58-100);
Aby usun wiersze z tabeli, uywamy polecenia DELETE FROM:
DELETE FROM KLIENCI_TEST WHERE FIRMA IS NOT NULL;

Polecenie DELETE FROM bez klauzuli WHERE usuwa wszystkie wiersze z tabeli.
DELETE FROM KLIENCI_TEST;

Zmiana danych w tabeli.


Polecenie UPDATE zmienia wartoci we wskazanych kolumnach tabeli dla jednego lub wicej wierszy.
Najpierw sprawdzamy, jaki obecnie sprzedawcy maja dodatek:
SELECT *
FROM PRACOWNICY
WHERE STANOWISKO = SPRZEDAWCA;

Nastpujce polecenie UPDATE zmienia kwot dodatku pracownika zatrudnionego na stanowisku sprzedawcy o
50 z:
UPDATE PRACOWNICY
SET DODATEK = DODATEK + 50
WHERE STANOWISKO = SPRZEDAWCA;
Sprawdzamy, czy wartoci dodatku dla sprzedawcw zostay zmienione:
SELECT *
FROM PRACOWNICY
WHERE STANOWISKO = SPRZEDAWCA;

Jeeli zmieniamy wartoci wicej ni jednej kolumny, kolumny musza by oddzielone przecinkami.
A oto polecenie zwikszajce dodatek dla kierownikw o 30 z oraz zwikszajce pensje o 10%.
UPDATE PRACOWNICY
SET DODATEK = DODATEK + 30,
PENSJA = PENSJA + (PENSJA * 10)/100
WHERE STANOWISKO = KIEROWNIK;

Usuwanie tabel.
Aby usun tabele, stosujemy polecenie DROP TABLE. Jeli transakcja na tabeli trwa, to trzeba ja wczeniej
zatwierdzi (COMMIT) lub wycofa (ROLLBACK).
DROP TABLE KLIENCI_TEST;
Polecenie usuwajce tabele usuwa jednoczenie wszystkie dane zawarte w tabeli oraz wszystkie widoki
czerpice dane z usuwanej tabeli.

Podsumowanie:
1. Usuniecie tabeli powoduje usuniecie danych i widokw zwizanych z usuwan tabel.
2. Mona okreli wiersze, ktre maja by usunite lub zmienione poprzez zamieszczenie odpowiedniego
warunku w klauzuli WHERE.
3. Opuszczenie klauzuli WHERE w poleceniach UPDATE lub DELETE powoduje, e wszystkie wiersze
zostan zmienione lub usunite.

Ograniczenia i integralno referencyjna.


Ograniczenia, integralno danych i integralno referencyjna skadaj si na bezpieczestwo i jako
gromadzonych w bazie danych.

Ograniczenia.
Mona zdefiniowa ograniczenie sprawdzajce poprawno wprowadzanych danych do tabeli poprzez
okrelenie warunku sprawdzajcego CHECK.
Zmienimy struktur tabeli PRACOWNICY przez dodanie ograniczenia zapobiegajcego wprowadzeniu kwoty
dodatku wikszej od kwoty pensji.
ALTER TABLE PRACOWNICY
ADD CHECK (PENSJA > DODATEK);
Jeli teraz wpiszemy polecenie dodajce wiersz do tabeli PRACOWNICY, ktry bdzie zawiera w kolumnie
DODATEK warto wiksz ni w kolumnie PENSJA, baza wygeneruje komunikat o bdzie, mwicy o
naruszeniu ograniczenia sprawdzajcego CHECK. Wane jest, e zmiany definicji tabeli powinny by wykonane
w zasadzie na etapie definiowania schematu, przed wprowadzeniem jakichkolwiek danych do tabeli, a by moe
do bazy.

Integralno danych klucz gwny.


Jak wiemy, kada tabela bazy danych musi zawiera klucz gwny. Klucz gwny to kolumna lub grupa kolumn,
ktra w sposb jednoznaczny identyfikuje wiersz w tabeli. Przykadowo, dla tabeli zawierajcej dane o
pracownikach kluczem gwnym moe by kolumna o nazwie NR_PRACOWNIKA, ktra jednoznacznie
okrela danego pracownika. Kluczem gwnym moe by NR_TELEFONU w tabeli przechowujcej dane
abonentw operatora telefonicznego. Przykadem klucza gwnego z wielu kolumn moe by klucz z kolumn
NUMER oraz ROK w tabeli przechowujcej dane o wystawionych fakturach, gdzie kolumna NUMER okrela
numer faktury, a kolumna ROK okrela rok wystawienia. Wartoci z tych kolumn wzite razem s rne w
kadym wierszu.
Dla tabeli PRACOWNICY kluczem gwnym moe by kolumna NR_PRACOWNIKA. Ustalenie klucza
gwnego
(PRIMARY KEY) odbywa si podczas tworzenia tabeli.
CREATE TABLE PRACOWNICY_TEST(
NR_PRACOWNIKA CHAR(4) NOT NULL,
IMIE VARCHAR(20) NOT NULL,
NAZWISKO VARCHAR(20) NOT NULL,
DATA_ZATR DATE NOT NULL,
DZIAL VARCHAR(20) NOT NULL,
STANOWISKO VARCHAR(20) NOT NULL,
PENSJA DECIMAL(8,2) ,
DODATEK DECIMAL(8,2) ,
NR_MIEJSCA CHAR(6) NOT NULL,
NR_TELEFONU CHAR(16) ,
PRIMARY KEY (NR_PRACOWNIKA));
Jak wiemy, klucz zapobiega wstawieniu dwch identycznych wierszy (musza si rni przynajmniej wartoci
klucza). Prba wstawienia identycznego wiersza spowoduje powstanie bdu sygnalizowanego odpowiednim
komunikatem.
Integralno referencyjna klucz obcy.
Kasujemy baz danych poleceniem DROP DATABASE WYPAUT;. Zamykamy query analyzer.
Wylogowujemy sie z serwera lokalnego Local Server. Zamykamy IBConsole. Na wszelki wypadek moemy
sprawdzi, czy zosta usunity plik bazy danych WYPAUT w folderze bin oprogramowania Interbase w
Program Files.
Tworzymy baze danych powtrnie, ale bez danych. Najpierw tworzymy pojemnik WYPAUT za pomoc
opcji Create Database. (to moe potrwa kilka chwil), potem schemat za pomoc skryptw pozbawionych
polece INSERT INTO.
Tworzymy te tabele PRACOWNICY_TEST:
CREATE TABLE PRACOWNICY_TEST(
NR_PRACOWNIKA CHAR(4) NOT NULL,
IMIE VARCHAR(20) NOT NULL,
NAZWISKO VARCHAR(20) NOT NULL,
DATA_ZATR DATE NOT NULL,
DZIAL VARCHAR(20) NOT NULL,
STANOWISKO VARCHAR(20) NOT NULL,
PENSJA DECIMAL(8,2) ,
DODATEK DECIMAL(8,2) ,
NR_MIEJSCA CHAR(6) NOT NULL,
NR_TELEFONU CHAR(16) ,
PRIMARY KEY (NR_PRACOWNIKA));
Jak wiemy, klucz obcy to jedna lub wicej kolumn odwoujcych si do kolumny lub kolumn klucza gwnego
innej tabeli. Klucze obce s wykorzystywane do integralnoci referencyjnej w bazie danych. Tworzc klucz obcy
definiujemy zwizek miedzy tabela klucza obcego i tabela klucza gwnego. Zwizek taki powstaje podczas
zczania kolumn takich samych typw danych z kadej tabeli. Zczanie tabel przez odpowiednie kolumny
chroni dane z tabeli klucza obcego przed osieroceniem, jakie mogoby nastpi w wyniku usunicia

odpowiadajcych im danych z tabeli klucza gwnego. Definiowanie kluczy obcych jest, zatem sposobem
czenia danych przechowywanych w rnych tabelach bazy danych.
Przykadowo, jeli w tabeli PRACOWNICY kluczem obcym jest kolumna NR_MIEJSCA, to kolumna czerpie
wartoci z tabeli MIEJSCA. Gdy odczytamy NR_MIEJSCA z tabeli PRACOWNICY, to moemy odwoa si
do tabeli MIEJSCA i odczyta z niej peny adres miejsca pracy pracownika. Tabela PRACOWNICY z kluczem
obcym jest zczona z tabel MIEJSCA z kluczem gwnym, poprzez referencje do krotek z identycznymi
wartociami klucza gwnego jak te wartoci, ktre ma klucz obcy. Zwizek klucza obcego chroni wiersze z
tabeli PRACOWNICY przed osieroceniem na wypadek usunicia jakiegokolwiek wiersza z tabeli MIEJSCA.
Aby zapewni tak ochron, musimy zdefiniowa klucze obce we wszystkich tabelach, ktre odwouj si do
innych tabel.
Taki zwizek wystpuje w naszych przykadowych tabelach PRACOWNICY oraz MIEJSCA.
ALTER TABLE WYPOZYCZENIA
ADD FOREIGN KEY (NR_PRACOW_WYP)
REFERENCES PRACOWNICY_TEST (NR_PRACOWNIKA) ON DELETE CASCADE;
To polecenie ustanawia klucz obcy w tabeli WYPOZYCZENIA na kolumnie NR_PRACOWNIKA_WYP.
Przegldajc dalej to polecenie mona si dowiedzie, e kolumna ta odwouje si do kolumny
NR_PRACOWNIKA. Sowo kluczowe ON DELETE CASCADE mwi, e usuwanie wiersza z tabeli
PRACOWNICY_TEST pociga za sob usuniecie wiersza do niego si odwoujcego (cilej, wiersza
partnerskiego wzgldem referencji) w tabeli WYPOZYCZENIA.
A oto jak sprawdzi, e krotki zostan wykasowane kaskadowo.
Najpierw wprowadzamy krotk na stron 1:
INSERT INTO PRACOWNICY_TEST
VALUES (0020, WOJTEK, WOJTKOWSKI, 1998-04-01, OBSLUGA KLIENTA,
SPRZEDAWCA, 1200, 100, 000004, 457-531-143);
Nastpnie wprowadzamy krotk na stron M:
INSERT INTO WYPOZYCZENIA
VALUES (00000055, 00000010, 000004, 0020, NULL, 000002, NULL,
200002-09, NULL, 200, 100);
Nastpnie usuwamy krotk po stronie 1:
DELETE FROM PRACOWNICY_TEST
WHERE NAZWISKO = WOJTKOWSKI;
Krotki zostay (kaskadowo) usunite! Zarwno ta po stronie 1 w tabeli PRACOWNICY_TEST, jak i ta po
stronie M w tabeli WYPOZYCZENIA. Przede wszystkim krotka z tabeli PRACOWNICY_TEST (ze strony
1), a kaskadowo rwnie krotki z ni powizane referencyjnie po stronie M z tabeli WYPOZYCZENIA.
Inaczej przebiega kasowanie krotek, gdy usuwamy krotk po stronie M w tabeli WYPOZYCZENIA.
A oto jak sprawdzi, e w tym przypadku zostan wykasowane krotki jedynie z tabeli WYPOZYCZENIA po
stronie M:
Najpierw wprowadzamy krotk na stron 1:
INSERT INTO PRACOWNICY_TEST
VALUES (0020, WOJTEK, WOJTKOWSKI, 1998-04-01, OBSLUGA KLIENTA,
SPRZEDAWCA, 1200, 100, 000004, 457-531-143);
Nastpnie wprowadzamy krotk na stron M:
INSERT INTO WYPOZYCZENIA
VALUES (00000055, 00000010, 000004, 0020, NULL, 000002, NULL,
200002-09, NULL, 200, 100);

Nastpnie usuwamy krotk po stronie M:


DELETE FROM WYPOZYCZENIA
WHERE NR_PRACOW_WYP = 0020;
Zostay usunite jedynie krotki z tabeli WYPOZYCZENIA po stronie M!

Obecnie zbadamy nieco inn definicj integralnoci referencyjnej. Jest ona oparta na definicji klucza obcego za
pomoc polecenia ALTER TABLE WYPOZYCZENIA ... ON DELETE NO ACTION; Znowu trzeba
skasowa baz danych, utworzy ja powtrnie, ale bez danych. Utworzy tabele PRACOWNICY_TEST i
wykona podobne akcje, co przedtem.
CREATE TABLE PRACOWNICY_TEST(
NR_PRACOWNIKA CHAR(4) NOT NULL,
IMIE VARCHAR(20) NOT NULL,
NAZWISKO VARCHAR(20) NOT NULL,
DATA_ZATR DATE NOT NULL,
DZIAL VARCHAR(20) NOT NULL,
STANOWISKO VARCHAR(20) NOT NULL,
PENSJA DECIMAL(8,2) ,
DODATEK DECIMAL(8,2) ,
NR_MIEJSCA CHAR(6) NOT NULL,
NR_TELEFONU CHAR(16) ,
PRIMARY KEY (NR_PRACOWNIKA));
Oraz ze skryptu utworzy tabel WYPOZYCZENIA z pominiciem polece INSERT.
Po utworzeniu tabel definiujemy w tabeli WYPOZYCZENIA klucz obcy w nastpujcy sposb:
UWAGA: NO ACTION jest w systemie InterBase odpowiednikiem sowa RESTRICT uywanego w
definicjach wizw referencyjnych klucza obcego w innych systemach DBMS.
ALTER TABLE WYPOZYCZENIA
ADD FOREIGN KEY (NR_PRACOW_WYP)
REFERENCES PRACOWNICY_TEST (NR_PRACOWNIKA) ON DELETE NO ACTION;
Najpierw wprowadzamy krotk na stron 1:
INSERT INTO PRACOWNICY_TEST
VALUES (0020, WOJTEK, WOJTKOWSKI, 1998-04-01, OBSLUGA KLIENTA,
SPRZEDAWCA, 1200, 100, 000004, 457-531-143);
Nastpnie wprowadzamy krotk na stron M:
INSERT INTO WYPOZYCZENIA
VALUES (00000055, 00000010, 000004, 0020, NULL, 000002, NULL,
2000-02-09, NULL, 200, 100);
Nastpnie prbujemy usun krotk po stronie 1:
DELETE FROM PRACOWNICY_TEST
WHERE NAZWISKO = WOJTKOWSKI;
Krotki wcale nie zostan usunite! Ani po stronie 1, ani po stronie M.
Prbujemy, zatem usun krotk po stronie M:
DELETE FROM WYPOZYCZENIA
WHERE NR_PRACOW_WYP = 0020;
Zostay usuniete jedynie krotki z tabeli WYPOZYCZENIA po stronie M! W tabeli po stronie 1 w tabeli
PRACOWNICY_TEST krotka powizana referencyjnie pozostaa.

A oto opisy wszystkich moliwych akcji, jakie zostan zainicjowane w chwili usuwania wiersza w tabeli
zalenej.
Akcja
RESTRICT
(lub dla InterBase)
NO ACTION
CASCADE

SET NULL

Opis
Ograniczone usuwanie, ktre mwi, e dopty istniej w tabeli WYPOZYCZENIA
wiersze odwoujce si do usuwanego adresu w jakim wierszu tabeli
PRACOWNICY_TEST, wiersza z tabeli PRACOWNICY_TEST nie mona usun.
Naley najpierw usun wszystkie referencyjnie powizane krotki z tabeli zalenej
WYPOZYCZENIA.
Kaskadowe usuwanie mwi, e gdy usuwamy wiersze z tabeli PRACOWNICY_TEST,
to s jednoczenie usuwane wszystkie wiersze z danymi o wypoyczeniach z tabeli
zalenej WYPOZYCZENIA o wypoyczeniach dokonanych przez usuwanego
pracownika.
Wstaw warto NULL. Mwi, e moemy usun dane o pracowniku w tabeli
PRACOWNICY_TEST. Wtedy w tabeli zalenej WYPOZYCZENIA pozostan krotki
osierocone z wypoyczeniami realizowanymi przez pracownikw, ktrzy te
wypoyczenia realizowali, a ktrzy to pracownicy zostali skasowani. Naturalnie
usuniecie krotek z tabeli zalenej WYPOZYCZENIA bdzie zawsze moliwe.

Podsumowanie:
1. Moliwe jest zdefiniowanie ograniczenia sprawdzajcego poprawno wpisywanych do tabeli danych poprzez
okrelenie warunku sprawdzajcego CHECK.
2. Integralno danych w tabeli zachowuje si dziki kluczom gwnym.
3. Klucze obce su do utrzymania integralnoci referencyjnej.

You might also like