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