SQL część 1

Transkrypt

SQL część 1
Bazy danych
Jezyk
˛
SQL — cz˛eść 1
Wykład dla studentów matematyki
Zbigniew Jurkiewicz, Instytut Informatyki UW
15 marca 2015
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
SQL
Jezyk
˛
wysokiego poziomu do komunikacji z bazami
danych (ściślej: z systemami zarzadzania
˛
bazami danych)
Podajemy „co ma być zrobione”, a nie „jak to zrobić”.
DBMS sam określa „najlepszy” sposób wykonania
polecenia.
optymalizacja zapytań.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Przykłady
W przykładach używać bedziemy
˛
„zoologicznej” bazy
danych o nastepuj
˛ acym
˛
schemacie
Gatunki(nazwa,kontynent,groźny,chroniony)
Zwierzaki(imie,gatunek,wiek,waga)
˛
Potrawa(nazwa,koszt)
Jada(gatunek,potrawa,ile)
Podkreślone atrybuty oznaczaja˛ klucze.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Zapytania: polecenie SELECT
Uproszczona postać
SELECT jakie atrybuty
FROM z jakich tabel
WHERE jakie warunki musza˛ spełniać wybrane
wiersze
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Proste zapytanie
Jak nazywaja˛ sie˛ lwy?
SELECT imie
FROM Zwierzaki
WHERE gatunek = ’lew’;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Wynik zapytania
imie
Kocio
Puszek
...
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Realizacja zapytania
1
Weź tabele˛ podana˛ we frazie FROM.
2
Wybierz wiersze używajac
˛ warunku z frazy WHERE
(selekcja).
3
Wybierz tylko kolumny wskazane fraza˛ SELECT
(rzutowanie).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Semantyka operacyjna
1
Wprowadzamy zmienna˛ krotkowa˛ (np. nazywajac
˛ a˛ sie˛ tak,
jak tabela), przebiegajac
˛ a˛ po kolejnych wierszach
(krotkach) tabeli.
2
Sprawdzamy czy „bieżaca”
˛
krotka spełnia warunek z frazy
WHERE.
3
Jeśli tak, obliczamy wyrażenia we frazie SELECT
używajac
˛ tej krotki i dopisujemy do wyniku.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Fraza SELECT
Wyróżniony symbol * oznacza „wszystkie atrybuty relacji”.
Przykład:
SELECT *
FROM Zwierzaki
WHERE gatunek = ’lew’;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Wynik
imie
Kocio
Puszek
...
gatunek
lew
lew
...
Zbigniew Jurkiewicz, Instytut Informatyki UW
wiek
4
7
...
waga
120
87
...
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Wyrażenia złożone w WHERE
Operatory arytmetyczne: +, -, *, /.
Operatory porównywania: =, <>, <, >, <=, >=.
Spójniki logiczne: AND, OR, NOT.
Przykład:
SELECT imie
FROM Zwierzaki
WHERE gatunek = ’lew’ AND wiek > 4;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Wartości puste: NULL
Krotki w relacji moga˛ w niektórych kolumnach mieć
wyróżniona˛ wartość NULL.
Znaczenie tej wartości zależy od sytuacji, może to być na
przykład:
Wartość nieznana: istnieje jakaś konkretna wartość, ale jej
nie znamy albo jeszcze nie została ustalona (np. ocena z
egzaminu).
Nie ma zastosowania: w tabeli z danymi osobowymi
wartość w kolumnie „nazwisko panieńskie” dla meżczyzn.
˛
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Porównania z NULL
Logika dla warunków w SQL jest trójwartościowa: true,
false, unknown.
Jakiekolwiek porównanie z wartościa˛ NULL daje wynik
unknown.
Do porównywania wartości pustych należy używać
operatorów IS NULL i IS NOT NULL.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Inne warunki
Niektóre inne warunki elementarne SQL (operatory można
poprzedzać w nich symbolem NOT aby odwrócić warunek)
x IN (x1 , ..., xn )
Przynależność do zbioru, podanego
jawnie przez wyliczenie lub jako zapytanie zagnieżdżone.
x BETWEEN a AND b
Przynależność do przedziału.
x LIKE wzorzec
Dopasowanie do wzorca, we wzorcu %
oznacza dowolny ciag
˛ znaków, zaś _
dowolny pojedynczy znak.
napis SIMILAR TO wzorzec Rozszerzone dopasowanie do wzorców, używa sie˛ wyrażeń regularnych.
x IS NULL
Wartości puste
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Inne wyrażenia
W klauzuli SELECT można używać wyrażenia
CASE WHEN warunek THEN wartość
...
ELSE wartość
END
na przykład do kategoryzacji wartości
SELECT imie, nazwisko,
CASE WHEN wiek IS NULL THEN ’nie wiadomo’
WHEN wiek >= 18 THEN ’dorosły’
ELSE ’nieletni’
END
FROM ...
Do wartości NULL przyda sie˛ wyrażenie COALESCE(v1,
v2). Jego wartościa˛ jest v1, o ile nie jest NULL, w
przeciwnym razie v2.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Tworzenie tabel
CREATE TABLE nazwa(
kolumna typ wi˛
ezy-spójności,
...
);
DROP TABLE nazwa;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Tworzenie tabeli Gatunki
CREATE TABLE Gatunki (
nazwa VARCHAR(30) PRIMARY KEY,
kontynent VARCHAR(25),
grozny BOOLEAN,
chroniony BOOLEAN
);
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Tworzenie tabeli Zwierzaki
CREATE TABLE Zwierzaki (
imie VARCHAR(20) PRIMARY KEY,
gatunek VARCHAR(30) REFERENCES Gatunki,
wiek INTEGER CHECK (wiek > 0),
waga NUMERIC(5)
);
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Tabele robocze
Sa˛ widoczne tylko w sesji, w której zostały utworzone, i
znikaja˛ automatycznie po jej zakończeniu.
CREATE TEMPORARY TABLE nazwa (
...
);
Można je też tworzyć inaczej:
SELECT ... INTO TEMPORARY TABLE nazwa
FROM ...
...;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Typy danych
Najbardziej przydatne to
CHAR(n)
VARCHAR(n), VARCHAR2(n)
NUMERIC(n), NUMERIC(n, m)
INTEGER, INT
DATE
BOOLEAN.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Konwersja
Do konwersji miedzy
˛
typami służy konstrukcja CAST, np.
CAST(wczoraj AS TEXT)
zamienia wartość typu DATE w kolumnie wczoraj na tekst.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Wiezy
˛ spójności
NOT NULL
Wartość nie może być pusta
PRIMARY KEY
Klucz główny — unikalny identyfikator dla wierszy
REFERENCES nazwa-tabeli
Klucz obcy (odwołanie do innej tabeli, zwykle do
jej klucza głównego)
CHECK warunek
Warunek na wartości w wierszu, na przykład
CHECK (nazwa = lower(nazwa))
oznacza, że nazwa nie może zawierać dużych
liter.
UNIQUE
Wymusza unikalność wartości w kolumnie
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Wiezy
˛ spójności
W deklaracjach odwołań do innych tabel można
specyfikować zachowanie w przypadku usuwania lub
modyfikacji wartości klucza obcego:
... ON DELETE SET NULL,
... ON UPDATE CASCADE
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Cykliczne zależności referencyjne
Problem „kury i jajka”. Poniższe polecenia zawsze
powoduja˛ bład
˛
CREATE TABLE Kura (
imie CHAR(8) PRIMARY KEY,
jajko INTEGER REFERENCES Jajko
);
CREATE TABLE Jajko (
numer INTEGER PRIMARY KEY,
kura CHAR(8) REFERENCES Kura
);
Podczas tworzenia tabeli Kura system napotyka fraz˛e
odnoszac
˛ a˛ sie˛ do tabeli Jajko. Tabela ta jeszcze nie
istnieje!
Zmiana kolejności poleceń nic nie pomoże.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Polecenia modyfikacji schematu
W takich sytuacjach trzeba użyć poleceń modyfikacji
schematu.
Najpierw tworzymy tabele nie określajac
˛ wiezów
˛
kluczy
obcych:
CREATE TABLE Kura (
imie CHAR(8) PRIMARY KEY,
jajko INTEGER
);
CREATE TABLE Jajko (
numer INTEGER PRIMARY KEY,
kura CHAR(8)
);
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Dodawanie wiezów
˛
Nowe wiezy
˛ dodajemy do tabeli poleceniem:
ALTER TABLE tabela
ADD CONSTRAINT nazwa ograniczenie;
W naszym przypadku potrzebne bed
˛ a˛ dwa polecenia:
ALTER TABLE Kura ADD CONSTRAINT Kura_Jajko
FOREIGN KEY (jajko) REFERENCES Jajko(numer)
INITIALLY DEFERRED DEFERRABLE;
ALTER TABLE Jajko ADD CONSTRAINT Jajko_Kura
FOREIGN KEY (kura) REFERENCES Kura(imie)
INITIALLY DEFERRED DEFERRABLE;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Opóźnione sprawdzanie wiezów
˛
Fraza INITIALLY DEFERRED DEFERRABLE żada
˛ od
SQL odroczenia sprawdzania wiezów
˛
do chwili
zatwierdzenia transakcji, np. aby wstawić (’Czubatka’, 1)
do tabeli Kura i (1, ’Czubatka’) do tabeli Jajko użyjemy:
INSERT INTO Kura VALUES (’Czubatka’, 1);
INSERT INTO Jajko VALUES (1, ’Czubatka’);
COMMIT;
Bez opóźnionego sprawdzania wiezów
˛
nie można byłoby
wstawić żadnego wiersza do tabel Kura ani Jajko,
ponieważ już pierwszy INSERT naruszałby wiezy
˛ (chyba
że dopuścimy wartości puste NULL).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Usuwanie wiezów
˛
Nazwane wiezy
˛ można usuwać poleceniem:
ALTER TABLE tabela DROP CONSTRAINT nazwa;
Należy pamietać,
˛
aby przed usunieciem
˛
tabel zawsze
przedtem usunać
˛ recznie
˛
wiezy
˛ cykliczne, w przeciwnym
razie SQL nie pozwoli na usuniecie
˛
tabel.
W niektóre systemy akceptuja˛ modyfikator CASCADE w
poleceniu DROP, który powoduje próbe˛ automatycznego
usuniecia
˛
takich cykli.
ALTER TABLE Jajko DROP CONSTRAINT Jajko_Kura;
ALTER TABLE Kura DROP CONSTRAINT Kura_Jajko;
DROP TABLE Jajko;
DROP TABLE Kura;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Eliminacja powtórzeń
Modyfikator DISTINCT służy do usuwania powtórzeń z
wyników zapytań
SELECT DISTINCT kontynent
FROM Gatunki;
Jednakże operacje UNION, INTERSECT i EXCEPT
automatycznie eliminuja˛ powtórzenia, o ile nie
zastosowano modyfikatora ALL
(SELECT gatunek
FROM Zwierzaki
WHERE waga > 100)
UNION ALL
(SELECT gatunek
FROM Zwierzaki
WHERE wiek > 10);
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Funkcje agregujace
˛
Służa˛ do obliczania wartości parametrów „statystycznych”,
dotyczacych
˛
całej tabeli (lub wybranych grup wierszy), a
nie pojedynczych wierszy
SELECT AVG(waga)
FROM Zwierzaki
WHERE gatunek = ’Niedźwiedź’;
Standardowe funkcje to AVG, COUNT, MAX, MIN i SUM.
Wartości puste sa˛ oczywiście pomijane (poza COUNT(*)!).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Funkcja COUNT
Funkcja COUNT liczy wiersze i cz˛esto ma argument
zastepczy:
˛
SELECT COUNT(*)
FROM Zwierzaki
WHERE gatunek = ’Niedźwiedź’;
Jeśli zamiast * jej argumentem jest nazwa kolumny, to nie
sa˛ liczone wiersze, zawierajace
˛ tej kolumnie wartości
puste.
Natomiast poprzedzenie takiego argumentu dodatkowo
modyfikatorem DISTINCT spowoduje obliczenie, ile
różnych wartości wystepuje
˛
w tej kolumnie
SELECT COUNT(DISTINCT gatunek)
FROM Zwierzaki;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Grupowanie
Dzielenie wierszy na grupy fraza˛ GROUP BY ułatwia
równoczesne obliczanie parametrów statystycznych dla
wybranych podzbiorów wierszy
SELECT gatunek, AVG(waga)
FROM Zwierzaki
GROUP BY gatunek;
Zauważmy, że eliminacje˛ powtórzeń można przeprowadzić
również grupowaniem:
SELECT kontynent
FROM Gatunki
GROUP BY kontynent;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Grupowanie
Warunkiem z frazy WHERE można ograniczyć grupowanie
tylko do wybranych wierszy
SELECT gatunek, AVG(waga)
FROM Zwierzaki, Gatunki
WHERE Zwierzaki.gatunek = Gatunki.gatunek
AND kontynent = ’Afryka’
GROUP BY gatunek;
Można jednak także formułować warunki dla całych grup,
używajac
˛ frazy HAVING
SELECT gatunek, AVG(waga)
FROM Zwierzaki, Gatunki
WHERE Zwierzaki.gatunek = Gatunki.gatunek
GROUP BY gatunek
HAVING COUNT(*) > 2;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Grupowanie
Chcac
˛ znaleźć najwyższa˛ średnia˛ po grupach, nie
możemy po prostu napisać MAX(AVG(wyrażenie))
[Oracle akceptuje taka˛ konstrukcje,
˛ ale nie jest to zgodne
ze standardem SQL].
Można jednak napisać proste zapytanie zagnieżdżone:
SELECT MAX(srednia_z_ocen)
FROM (SELECT AVG(ocena) AS srednia_z_ocen
FROM Oceny
GROUP BY indeks) Srednie;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Wstawianie wierszy
Nowe wiersze do tabeli wstawiamy poleceniem INSERT
INSERT INTO tabela
VALUES (wartość,...);
na przykład
INSERT INTO Gatunki
VALUES (’krowa’,’Europa’,FALSE,FALSE);
Wartości można podawać w innej kolejności niż w definicji
tabeli, wtedy jednak trzeba po nazwie tabeli podać w
nawiasach liste˛ nazw kolumn.
Wartości dla kolumn dopuszczajacych
˛
NULL można
pominać.
˛
INSERT INTO Gatunki(nazwa,chroniony,kontynent)
VALUES (’krowa’,FALSE,’Europa’);
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Wstawianie wierszy
Daty zapisujemy wyrażeniem
DATE ’2008-03-11’
a czas wyrażeniem
TIME ’15:00:07’
zaś łaczny
˛
zapis (data + czas) ma postać
TIMESTAMP ’2008-03-11 15:00:10’
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Modyfikacja wierszy
Zawartość niektórych kolumn musi czasem ulegać
zmianom. Takich zmian dokonuje sie˛ poleceniem UPDATE
UPDATE tabela
SET kolumna = wartość, ...
WHERE warunek;
Zmiana dotyczy wszystkich wierszy, dla których jest
spełniony warunek. Jeśli warunek został pominiety,
˛ zmiana
dotyczy wszystkich wierszy w tabeli.
Czasem zmiana słuzy do uzupełnienia lub korekty
informacji
UPDATE Gatunki
SET grozny = FALSE
WHERE nazwa = ’krowa’;
Cz˛esto jedenak zmiana jest wymuszona przez zmiany w
otaczajacym
˛
świecie
UPDATE Zwierzaki
SET wiek = wiek + 1;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem
Usuwanie wierszy
Usuwanie wierszy to najprostsza operacja
DELETE FROM tabela
WHERE warunek;
Usuwane sa˛ wszystkie wiersze, dla których jest spełniony
warunek. Jeśli warunek został pominiety,
˛ usuwane sa˛
wszystkie wiersze w tabeli.
DELETE FROM Gatunki
WHERE nazwa = ’krowa’;
Zbigniew Jurkiewicz, Instytut Informatyki UW
Bazy danych Jezyk
˛
SQL — cz˛eść 1 Wykład dla studentów matem

Podobne dokumenty