Bazy danych Język SQL część 1 Wykład dla studentów matematyki 15 marca 2015
SQL Język 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ń.
Przykłady W przykładach używać będziemy zoologicznej bazy danych o następujacym schemacie Gatunki(nazwa,kontynent,groźny,chroniony) Zwierzaki(imię,gatunek,wiek,waga) Potrawa(nazwa,koszt) Jada(gatunek,potrawa,ile) Podkreślone atrybuty oznaczaja klucze.
Zapytania: polecenie SELECT Uproszczona postać SELECT jakie atrybuty FROM z jakich tabel WHERE jakie warunki muszą spełniać wybrane wiersze
Proste zapytanie Jak nazywaja się lwy? SELECT imie FROM Zwierzaki WHERE gatunek = lew ;
Wynik zapytania imie Kocio Puszek...
Realizacja zapytania 1 Weź tabelę podana we frazie FROM. 2 Wybierz wiersze używajac warunku z frazy WHERE (selekcja). 3 Wybierz tylko kolumny wskazane fraza SELECT (rzutowanie).
Semantyka operacyjna 1 Wprowadzamy zmienna krotkowa (np. nazywajac a się 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.
Fraza SELECT Wyróżniony symbol * oznacza wszystkie atrybuty relacji. Przykład: SELECT * FROM Zwierzaki WHERE gatunek = lew ;
Wynik imie gatunek wiek waga Kocio lew 4 120 Puszek lew 7 87............
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;
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 mężczyzn.
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.
Inne warunki Niektóre inne warunki elementarne SQL (operatory można poprzedzać w nich symbolem NOT aby odwrócić warunek) x IN (x 1,..., x n ) 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 się wyrażeń regularnych. x IS NULL Wartości puste
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 się wyrażenie COALESCE(v1, v2). Jego wartościa jest v1, o ile nie jest NULL, w przeciwnym razie v2.
Tworzenie tabel CREATE TABLE nazwa( kolumna typ więzy-spójności,... ); DROP TABLE nazwa;
Tworzenie tabeli Gatunki CREATE TABLE Gatunki ( nazwa VARCHAR(30) PRIMARY KEY, kontynent VARCHAR(25), grozny BOOLEAN, chroniony BOOLEAN );
Tworzenie tabeli Zwierzaki CREATE TABLE Zwierzaki ( imie VARCHAR(20) PRIMARY KEY, gatunek VARCHAR(30) REFERENCES Gatunki, wiek INTEGER CHECK (wiek > 0), waga NUMERIC(5) );
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......;
Typy danych Najbardziej przydatne to CHAR(n) VARCHAR(n), VARCHAR2(n) NUMERIC(n), NUMERIC(n, m) INTEGER, INT DATE BOOLEAN.
Konwersja Do konwersji między typami służy konstrukcja CAST, np. CAST(wczoraj AS TEXT) zamienia wartość typu DATE w kolumnie wczoraj na tekst.
Więzy 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 UNIQUE CHECK (nazwa = lower(nazwa)) oznacza, że nazwa nie może zawierać dużych liter. Wymusza unikalność wartości w kolumnie
Więzy 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
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ę odnoszac a się do tabeli Jajko. Tabela ta jeszcze nie istnieje! Zmiana kolejności poleceń nic nie pomoże.
Polecenia modyfikacji schematu W takich sytuacjach trzeba użyć poleceń modyfikacji schematu. Najpierw tworzymy tabele nie określajac więzów kluczy obcych: CREATE TABLE Kura ( imie CHAR(8) PRIMARY KEY, jajko INTEGER ); CREATE TABLE Jajko ( numer INTEGER PRIMARY KEY, kura CHAR(8) );
Dodawanie więzów Nowe więzy dodajemy do tabeli poleceniem: ALTER TABLE tabela ADD CONSTRAINT nazwa ograniczenie; W naszym przypadku potrzebne będa 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;
Opóźnione sprawdzanie więzów Fraza INITIALLY DEFERRED DEFERRABLE żada od SQL odroczenia sprawdzania więzó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 więzów nie można byłoby wstawić żadnego wiersza do tabel Kura ani Jajko, ponieważ już pierwszy INSERT naruszałby więzy (chyba że dopuścimy wartości puste NULL).
Usuwanie więzów Nazwane więzy można usuwać poleceniem: ALTER TABLE tabela DROP CONSTRAINT nazwa; Należy pamiętać, aby przed usunięciem tabel zawsze przedtem usunać ręcznie więzy cykliczne, w przeciwnym razie SQL nie pozwoli na usunięcie tabel. W niektóre systemy akceptuja modyfikator CASCADE w poleceniu DROP, który powoduje próbę automatycznego usunięcia takich cykli. ALTER TABLE Jajko DROP CONSTRAINT Jajko_Kura; ALTER TABLE Kura DROP CONSTRAINT Kura_Jajko; DROP TABLE Jajko; DROP TABLE Kura;
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);
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(*)!).
Funkcja COUNT Funkcja COUNT liczy wiersze i często ma argument zastępczy: 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 występuje w tej kolumnie SELECT COUNT(DISTINCT gatunek) FROM Zwierzaki;
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 eliminację powtórzeń można przeprowadzić również grupowaniem: SELECT kontynent FROM Gatunki GROUP BY kontynent;
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;
Grupowanie Chcac znaleźć najwyższa średnia po grupach, nie możemy po prostu napisać MAX(AVG(wyrażenie)) [Oracle akceptuje taka konstrukcję, 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;
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 listę nazw kolumn. Wartości dla kolumn dopuszczajacych NULL można pominać. INSERT INTO Gatunki(nazwa,chroniony,kontynent) VALUES ( krowa,false, Europa );
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
Modyfikacja wierszy Zawartość niektórych kolumn musi czasem ulegać zmianom. Takich zmian dokonuje się poleceniem UPDATE UPDATE tabela SET kolumna = wartość,... WHERE warunek; Zmiana dotyczy wszystkich wierszy, dla których jest spełniony warunek. Jeśli warunek został pominięty, 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ęsto jedenak zmiana jest wymuszona przez zmiany w otaczajacym świecie UPDATE Zwierzaki SET wiek = wiek + 1;
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ł pominięty, usuwane sa wszystkie wiersze w tabeli. DELETE FROM Gatunki WHERE nazwa = krowa ;