SQL w praktyce

Transkrypt

SQL w praktyce
SQL w praktyce
Niniejsza praca objęta jest prawami autorskimi. Nielegalne jest kopiowanie
żadnej częsci tej pracy w żadnej postaci. Niezgodne z prawem tym
bardziej jest udostępnianie innym tej pracy odpłatnie lub nieodpłatnie.
Każde naruszenie praw autorskich będzie ścigane z całą surowością
prawa.
Autor dołożył wszelkich starań, aby zebrany tutaj materiał był poprawny i
rzetelny. Niemniej jednak nie daję gwarancji bezbłędności. Autor zrzeka
się jakiejkolwiek odpowiedzialności za ewentualne straty spowodowane
korzystaniem z zamieszczonych poniżej informacji. Korzystanie z
niniejszej pracy jest akceptacją powyższej formuły.
Miłej i owocnej nauki!!!
SPIS TREŚCI
1. SQL – wstępne informacje
2. DDL – tworzenie,modyfikacja i usuwanie tablic, typy danych
3. DML - tworzenie,modyfikacja i usuwanie wierszy
4. DQL – wyszukiwanie danych, frazy SELECT, FROM, WHERE
5. Warunki filtrujące
6. Warunki łączące
7. Warunki filtrujące z pytaniami zagnieżdżonymi
8. Funkcje agregujące
9. Grupowanie – fraza GROUP BY
10. Filtracja grup – fraza HAVING
11. Pytania zagnieżdżone skorelowane z funkcjami agregującymi
12. Porządkowanie wyników – fraza ORDER BY
13. Perspektywy (widoki, tablice wirtualne)
14. Ochrona integralności danych
15. Więzy referncyjne
16. Zadania
17. Schemat bazy danych wykorzystany w przykładach
1. SQL – STRUCTURED QUERY LANGUAGE
Warianty języka SQL :
- interaktywny
- obsadzony (wbudowany) w innych językach
o statyczny (instrukcje SQL są kompletne)
o dynamiczny (instrukcje sparametryzowane)
Podjęzyki :
- DDL (Data Definition Language) – pozwala na definiowanie tablic
- DML (Data Manipulation Language) – pozwala na tworzemie, aktualizację
wierszy
- DQL (Data Query Language)
- DCL (Data Control Language)
2. DDL – TWORZENIE, MODYFIKACJA I USUWANIE
TABLIC, TYPY DANYCH
-
Tworzenie tablic
CREATE TABLE <tablica>
(<kolumna><typ>[<ograniczenia>],...,[<więzy
integralności>])
-
Typy danych:
o znakowe
ƒ CHARACTER(n), CHAR(n) – łancuch znaków o
stałej długości n
ƒ CHARACTER VARYING(n), VARCHAR(n) – łańcuch
znaków o zmiennej długości nie większej od
n
ƒ LONG VARCHAR, LONG – łańcuchy
nieograniczone ( ≤ 2GB )
o numeryczne
ƒ NUMERIC (p,q) p – precyzja, q – skala
ƒ DECIMAL (p,q), DEC(p,q)
ƒ INETEGER, INT
ƒ SMALLINT
ƒ FLOAT (n)
ƒ REAL
ƒ DOUBLE PRECISION
o
o
o
-
data, czas
ƒ DATE - (rrrr,mm,dd)
ƒ TIME – godz,min,sek
ƒ TIMESTAMP – data + godzina
ƒ INTERVAL – różnica dat i czasów
łańcuch bitów
ƒ BIT(n)
ƒ BIT VARYING (n)
inne
ƒ BOOLEAN
ƒ BYTE – łańcuch 8 bitowy
ƒ MONEY – dopisuje automatycznie symbol waluty
ograniczenia
o NOT NULL – w kolumnie nie może być pustego elementu
o NOT NULL WITH DEFAULT – w puste pole automatycznie
wprowadzana jest wartość domyślna
o UNIQUE
Przykład:
CREATE TABLE uczniowie (nazwisko CHAR [15]), wzrost INT,
waga DEC (5,2))
-
Modyfikowanie struktury tablic
ALTER TABLE <tablica> ADD <kolumna> <typ>
[<ograniczenia>]
ALTER TABLE <tablica> DROP <kolumna>
ALTER TABLE <tablica> MODIFY <kolumna> <typ>
[<ograniczenia>]
ALTER TABLE <tablica> RENAME <kolumna> <nowa nazwa>
ALTER TABLE <tablica> <więzy integralności>
Przykład:
ALTER TABLE uczniowie ADD klasa INT
-
Usuwanie tablic, perspektyw, indeksów
DROP TABLE <tablica>
DROP VIEV <perspektywa>
DROP INDEX <indeks>
3. DML – WPROWADZANIE, MODYFIKACJA I
USUWANIE WIERSZY
-
Wprowadzanie wierszy
INSERT INTO <tablica> [(<lista kolumn>)] VALUES (<lista
wartości>
Przykład:
INSERT INTO uczniowie VALUES (‘NOWAK’, 187, 72,5,1)
INSERT INTO uczniowie (nazwisko, klasa) VALUES
(‘KOWALSKI’, 1)
-
Modyfikowanie wierszy
UPDATE <tablica> SET <kolumna> = <wyrażenie>[...] [WHERE
<warunek>]
Przykład:
UPDATE uczniowie SET wzrost = wzrost + 2 WHERE nazwisko =
‘KOWALSKI’
UPDATE uczniowie SET klasa = 4 WHERE klasa = 3
-
Usuwanie wierszy
DELETE FROM <tablica> [ WHERE <warunek>]
Przykład:
DELETE FROM uczniowie WHERE klasa = 4
DELETE FROM uczniowie
(powoduje usunięcie całej zawartości tablicy uczniowie)
4. DQL – WYSZUKIWANIE DANYCH, FRAZY
SELECT, FROM, WHERE
SELECT <>
FROM <>
WHERE <>
GROUP BY <>
HAVING <>
ORDER BY <>
UNION <>
Fraza SELECT
SELECT [ALL | DISTINCT] {<lista elementów>|*}
PRZYKŁAD:
SELECT *
FROM uczniowie
(wyświetlenie całej zawartości tabeli uczniowie)
SELECT nazwisko, klasa
FROM uczniowie
(wyświetlenie nazwisk uczniów i klas, do których chodzą)
SELECT nazwisko, waga – (wzrost – 100)
AS nadwaga
FROM uczniowie
SELECT MAX (wzrost) FROM uczniowie
SELECT DISTINCT klasa FROM uczniowie
Fraza FROM
FROM <element> [<alias>], ...
Fraza WHERE
WHERE <warunek>
Warunki dzielimy na:
- filtrujące
- łączące
- filtrujące z pytaniami zagnieżdżonymi
5. WARUNKI FILTRUJĄCE
Warunki filtrujące zbudowane są z atrybutów (kolumn) jednej tablicy
-
<kolumna> <operator> <stała>
SELECT *
FROM uczniowie
WHERE klasa = 3
-
<wyrażenie> <operator> <wyrażenie>
SELECT *
FROM uczniowie
WHERE waga – (wzrost – 100) > 10
-
<wyrażenie> [NOT] BETWEEN <dół> AND <góra>
SELECT *
FROM uczniowie
WHERE wzrost BETWEEN 175 AND 180
-
<wyrażenie> [NOT] LIKE <wzorzec tekstowy>
Symbole zastępcze:
_ - zastępuje jeden znak
% - zastępuje ciąg znaków
SELECT *
FROM uczniowie
WHERE nazwisko LIKE ‘Kowalsk_’
SELECT *
FROM uczniowie
WHERE nazwisko LIKE ‘Kowal%’
6. WARUNKI ŁĄCZĄCE
PRZYKŁAD 1:
SELECT nazwisko, nazwa
FROM pracownicy, zespoły
WHERE pracownicy.nrz = zespoły. nrz
SELECT nazwisko, nazwa
FROM pracownicy p, zespoły z
WHERE p.nrz = z. nrz
Obydwa zapytania dadzą te same wyniki. Zapytanie drugie jest jednak krótsze.
PRZYKŁAD 2:
SELECT nazwisko
FROM pracownicy p, dochody d
WHERE p.nrp = d.nrp AND nrz=4 AND kwota > 500
PRZYKŁAD 3:
SELECT nazwa
FROM zespoły z, pracownicy p, dochody d, tematy t
WHERE z.nrz=p.nrz AND p.nrp=d.nrp AND d.nrt=t.nrt AND
t.nazwa = ‘Pojekt generatora’
Wypisuje nazwy zespołów zajmujące się projektem generatora.
7. WARUNKI FILTRUJĄCE Z PYTANIAMI
ZAGNIEŻDŻONYMI
Ogólna postać:
SELECT < > FROM < > WHERE <początek warunku> (SELECT < >
FROM < > WHERE < > ... )
Zastosowanie różnych początków warunków na przykładach
<wyrażenie> <operator>
ZADANIE
Wyszukać nazwisko kierownika Zespołu wdrożeń
SELECT nazwisko
FROM pracownicy
WHERE nrp=
(SELECT kierownik FROM zespoły WHERE nazwa = ‘Zespół
wdrożeń’)
ZADANIE
Wyszukać nazwiska pracowników zespołu nr 3, którzy otrzymali premie wyższe
niż Jaworski
SELECT nazwisko
FROM pracownicy
WHERE nrz=3 AND premia >
(SELECT premia
FROM pracownicy
WHERE nazwisko = ‘Jaworski’
<wyrażenie> <operator> [ANY / ALL]
Pozwala sprawdzić czy wartość wybrana w pytaniu zewnętrznym spełnia
warunek dla jakiejkolwiek / każdej wartości wybranej w pytaniu wewnętrznym.
ZADANIE
Wyszukać nazwy tematów, dla których były jakieś wypłaty.
SELECT nazwa
FROM tematy
WHERE nrt = ANY
(SELECT nrt
FROM dochody)
ZADANIE
Znaleźć nazwiska pracowników, którzy mieli jakieś wypłaty większe niż 1000
SELECT nazwisko
FROM pracownicy
WHERE nrp = ANY
(SELECT nrp
FROM dochody
WHERE kwota > 1000)
ZADANIE
Znaleźć uczniów klasy 1 wyższych niż uczniowie klasy 3
SELECT nazwisko, wzrost
FROM uczniowie
WHERE klasa=1 AND wzrost > ALL
(SELECT wzrost
FROM uczniowie
WHERE klasa = 3)
<wyrażenie> [NOT] IN
Pozwala na sprawdzenie czy wartość wybrana w pytaniu zewnętrznym [nie]
należy do zbioru wartości wybranych w pytaniu wewnętrznym
ZADANIE
Wyszukać nazwiska pracowników, którzy nie brali udziału w realizacji tematu nr 2
SELECT nazwisko
FROM pracownicy
WHERE nrp NOT IN
(SELECT nrp
FROM dochody
WHERE nrt=2)
ZADANIE
Wyszukać nazwy zespołów, których pracownicy uczestniczą w temacie Projekt
generatora
SELECT nazwa
FROM zespoly
WHERE nrz IN
(SELECT nrz
FROM pracownicy
WHERE nrp IN
(SELECT nrp
FROM dochody
WHERE nrt =
(SELECT nrt
FROM tematy
WHERE nazwa = ‘Projekt generatora’)))
<wyrażenie> [NOT] EXISTS
Zwraca prawdę [fałsz] gdy zbiór wierszy wybranych w pytaniu wewnętrznym nie
jest pusty.
ZADANIE
Znaleźć nazwy tematów, w których były jakieś wypłaty.
SELECT nazwa
FROM tematy t
WHERE EXISTS
(SELECT *
FROM dochody d
WHERE d.nrt=t.nrt)
ZADANIE
Wyszukać nazwiska pracowników, którzy nie brali udziału w żadnym temacie.
SELECT nazwisko
FROM pracownicy p
WHERE NOT EXISTS
(SELECT *
FROM dochody d
WHERE p.nrp=d.nrp)
ZADANIE
Wyszukać nazwiska pracowników, którzy uczestniczyli we wszystkich tematach.
SELECT nazwisko
FROM pracownicy p
WHERE NOT EXISTS
(SELECT *
FROM tematy t
WHERE NOT EXISTS
(SELECT *
FROM dochody d
WHERE d.nrt = t.nrt AND d.nrp = p.nrp)
8. FUNKCJE AGREGUJĄCE
SUM (<argument>)
AVG (<argument>)
MAX (<argument>)
MIN (<argument>)
COUNT (<argument>)
ZADANIE
Wypisz ilość wierszy tablicy zespoły
SELECT COUNT(*)
FROM zespoly
ZADANIE
Znaleźć maksymalną i minimalną wypłatę w ramach tematu nr 6 oraz sumę
wypłat w tym temacie.
SELECT MAX (kwota), MIN (kwota), SUM (kwota)
FROM dochody
WHERE nrt=6
ZADANIE
Znaleźć maksymalną wypłatę jaką otrzymali pracownicy zespołu wdrożeń w
ramach projektu generatora.
SELECT MAX (kwota)
FROM zespoly z, pracownicy p, dochody d, tematy t
WHERE z.nrz = p.nrz AND p.nrp = d.nrp AND d.nrt = t.nrt AND
z.nazwa = ‘Zespół wdrożeń’ AND t.nazwa = ‘Projekt
generatora’
ZADANIE
Znaleźć liczbę pracowników otrzymujących wypłaty.
SELECT COUNT (*)
FROM dochody
Jest to rozwiązanie błędne dlatego, że jeden pracownik może mieć wiele wypłat i
wszystkie zostaną policzone. Prawidłowe zapytanie wyglądać będzie tak:
SELECT COUNT (DISTINCT nrp)
FROM dochody
9. GRUPOWANIE – FRAZA GROUP BY
Ogólna postać
SELECT <lista kolumn 1> <lista funkcji agregujących>
FROM < >
WHERE < >
GROUP BY <lista kolumn 2>
ZADANIE
Wyznaczyć liczbę pracowników w poszczególnych zespołach.
SELECT nrz, COUNT (*)
FROM pracownicy
GROUP BY nrz
ZADANIE
Wyszukać maksymalną kwotę oraz sumę kwot dla poszczególnych zespołów
realizujących projekt generatora
SELECT z.nazwa, MAX (kwota), SUM (kwota)
FROM zespoły z, pracownicy p, dochody d, tematy t
WHERE z.nrz = p.nrz AND p.nrp = d.nrp AND d.nrt = t.nrt AND
t.nazwa = ‘Projekt generatora’
GROUP BY z.nazwa
ZADANIE
Podać nazwiska wszystkich pracowników, sumę ich wypłat i liczbę
wykonywanych przez nich tematów
SELECT nazwisko, SUM(kwota), COUNT(*)
FROM pracownicy p, dochody d
WHERE p.nrp = d.nrp
GROUP BY nazwisko, p.nrp
10. FILTRACJA GRUP – FRAZA HAVING
Ogólna postać:
HAVING <warunek filtrujący>
ZADANIE
Wyświetl numery zespołów, które mają więcej niż 15 lub mniej niż 5
pracowników.
SELECT nrz, COUNT(*)
FROM pracownicy
GROUP BY nrz
HAVING COUNT (*) > 15 OR COUNT (*) < 5
ZADANIE
Znaleźć nazwiska pracowników (podać też sumę ich wypłat), którzy zarobili w
sumie więcej niż Jaworski
SELECT nazwisko, SUM(kwota)
FROM pracownicy p1, dochody d1
WHERE p1.nrp = d1.nrp
GROUP BY nazwisko, p1.nrp
HAVING SUM (kwota) >
(SELECT SUM(kwota)
FROM pracownicy p2, dochody d2
WHERE p2.nrp = d2.nrp AND nazwisko = ‘JAWORSKI’
11. PYTANIA ZAGNIEŻDŻONE SKORELOWANE Z
FUNKCJAMI AGREGUJĄCYMI
ZADANIE
Znaleźć najwyższego ucznia każdej klasy.
SELECT klasa, nazwisko, wzrost
FROM uczniowie u1
WHERE wzrost =
(SELECT MAX(wzrost)
FROM uczniowie u2
WHERE u2.klasa = u1.klasa
ZADANIE
Podać numery pracowników, którzy mieli maksymalne wypłaty w poszczególnych
tematach.
SELECT nrt, nrp, kwota
FROM dochody d1
WHERE kwota =
(SELECT MAX(kwota)
FROM dochody d2
WHERE d1.nrt = d2.nrt)
12. PORZĄDKOWANIE WYNIKÓW – FRAZA
ORDER BY
Ogólna postać:
ORDER BY {<wyrażenie>|<nr>}[ASC|DESC]
ASC – kolejność rosnąca (domyślnie)
DESC – kolejność malejąca
PRZYKŁAD
SELECT *
FROM pracownicy
ORDER BY nrz,nazwisko
SELECT nazwisko, waga – (wzrost – 100), klasa
FROM uczniowie
ORDER BY 3, 2 DESC
Liczby 3, 2 wskazują odpowiednio na atrybuty (kolumny) klasa i waga – (wzrost –
100)
13. PERSPEKTYWY (WIDOKI, TABLICE WIRTUALNE)
Perspektywą nazywamy konstrukcję widzianą przez użytkownika jako tablicę.
Cele tworzenia perspektyw:
- uproszczenie zapytań. Gdy baza składa się z wielu tablic, często zdarzają
się złożone zapytania dotyczące kilku tablic.
- ograniczenie dostępu do tablic. Gdy mamy dużą tablicę, z której
korzystają różne grupy użytkowników o ograniczonych prawach do
danych, rozwiązaniem jest tworzenie tablicy wirtualnej udostępniającej
tylko część danych.
TWORZENIE PERSPEKTYW
CREATE VIEV <perspektywa> [(<lista kolumn>)]
AS <instrukcja SELECT>
[WITH CHECK OPTION ]
W definicji perspektywy niedopuszczalne są:
- złączenia
- grupowanie
- wyrażenia, funkcje agregujące i DISTINCT na liście frazy SELECT
- fraza UNION
Jeśli tworzymy perspektywę na innej perspektywie i ma być ona aktualizowalna,
to ta poprzednia też musi być modyfikowalna.
Dopuszczalne są pytania zagnieżdżone, ale zbudowane na tej samej tablicy co
pytanie zewnętrzne.
14. OCHRONA INTEGRALNOŚCI DANYCH
Integralność:
- semantyczna, związana z znaczeniem danych
- transakcji, związana z operacjami na danych
Kontrola integralności semantycznej może być realizowana przez:
- ograniczenia nakładane na dziedziny atrybutów
- więzy referencyjne
Ograniczenia dziedziny:
CREATE DOMAIN <dizedzina><typ>[<ograniczenie>]
PRZYKŁAD:
CREATE DOMAIN pieniadze dec (2,2) constraint
15. WIĘZY REFERENCYJNE
Klucz główny (PRIMARY KEY) – kolumna / grupa kolumn których wartości
jednoznacznie identyfikują pola tablic.
Cechy klucza głównego:
- tylko jeden dla danej tablicy
- ma wartości unikalne, niepuste (NOT NULL)
- zazwyczaj musi istnieć unikalny indeks zdefiniowany na kluczu głównym
Cechy kluczy obcych (FOREIGN KEY)
- definicja klucza obcego musi odpowiadać definicji klucza głównego w
innej tablicy.
- niepustej wartości klucza obcego musi odpowiadać istniejąca wartość
klucza głównego w tablicy nadrzędnej
- dopuszcza się wartości puste kluczy obcych
OGRANICZENIA NA USUWANIE DANYCH
-
restrykcyjne (RESTRICT), usunięcie rekordu nadrzednego jest możliwe,
jeśli nie istnieje żaden rekord podrzędny z nim związany.
kaskadowe (CASCADE), usunięcie rekordu nadrzędnego powoduje
automatyczne usunięcie wszystkich rekordów podrzędnych z nim
związanych.
wstawianie wartości pustych (SET NULL), usunięcie rekordu
nadrzędnego powoduje wstawienie rekordów pustych do rekordów
podrzędnych z nim związanych w miejsce kluczy obcych.
DEFINIOWANIE KLUCZY:
PRIMARY KEY <nazwa klucza>(<kolumna>,...)
FOREIGN KEY <nazwa klucza>(<kolumna>,...)
REFERENCES <tablica nadrzędna>
[ ON DELETE RESTRICT ]
CASCADE
SET NULL
lub
[ ON UPDATE ...]
16. ZADANIA
ZAD 1.
Podac nazwy tematow i numery pracownikow o najwyzszych sumarycznych
dochodach w danym temacie.
select nrt,nrp from dochody d
group by nrp,nrt
having sum(kwota) >= all
(select sum(kwota) from dochody d1
where d1.nrt=d.nrt
group by nrp)
order by nrt,nrp;
ZAD 2;
Podac nazwy tematów dla ktorych srednia pojedynczych zarobkow jest wieksza
od najnizszego pojedynczego zarobku w tym temacie pracownika, ktory w tym
temacie zarobil w sumie najwiecej. Mozna zalozyc, ze nie ma dwoch
pracownikow o tych samych sumarycznych dochodach.
select nazwatemat from temat t, dochody d
where t.nrt=d.nrt
group by t.nrt,nazwatemat
having avg(d.kwota) >
(
// min zarobek pracownika //
select min(kwota) from dochody d1
where d1.nrt=t.nrt and
d1.nrp =
(
// nr pracownika o najwiekszym sumarycznym zarobku //
select nrp from dochody d2
where d2.nrt=t.nrt
group by nrp,nrt
having sum(kwota) >= all
(
// sumaryczne zarobki pracownikow w tym temacie //
select sum(kwota) from dochody d1
where d1.nrt=d.nrt
group by nrp
)
)
);
17. SCHEMAT BAZY DANYCH WYKORZYSTANY W
PRZYKŁADACH
RELACJA
ATRYBUT
TYP
------------------
------------------
--------
DOCHODY
PRACOWNICY
TEMAT
ZESPOL
NRT
INTEGER
KWOTA
DECIMAL
NRP
SMALLINT
NRP
SMALLINT
KOBIETA
CHAR
DATA_UR
TIMESTMP
NAZWISKO
CHAR
NRZ
SMALLINT
NAZWATEMAT
CHAR
DATA_ODB
TIMESTMP
NRT
INTEGER
NRPKT
SMALLINT
NAZWAZESP
CHAR
NRZ
SMALLINT
NRPKZ
SMALLINT

Podobne dokumenty