2010-10-21 PLAN WYKŁADU Definicja, historia, cechy SQL Standardy SQL Formy i podzbiory SQL Typy danych Składnia DML DDL DCL Perspektywy Definicja dziedziny, asercja BAZY DANYCH Wykład 3,4 dr inż. Agnieszka Bołtuć DEFINICJA SQL HISTORIA SQL SQL (ang. Structured Query Language) - strukturalny język zapytań używany do tworzenia, modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych. Strukturalny język zapytań jest zbiorem komend używanych do wprowadzania, modyfikowania i przeglądania zawartości relacyjnych baz danych, Język SQL pełni trzy główne funkcje: tworzenie bazy i definiowanie jej struktur, wykonywanie zapytań na bazie w celu uzyskania danych niezbędnych do wygenerowania odpowiedzi oraz kontrolowanie bezpieczeństwa bazy danych. Historia SQL sięga początku lat 70-tych, gdy w IBM powstał język Sequel, Pierwszy SZBD wykorzystujący Sequel powstał w 1973 roku w firmie IBM i nazywał się System R, Pierwsza komercyjna wersja SZBD (opracowana dla wojska, CIA i agencji rządowych) została wypuszczona przez firmę Oracle w 1977 roku; wykorzystywała język SQL. 1 2010-10-21 STANDARDY JĘZYKA SQL W 1986 roku Amerykański Narodowy Instytut Normalizacji (ANSI), a w 1987 Międzynarodowa Organizacja Normalizacyjna (ISO) oficjalnie przyjęły standard języka SQL, Nadal jednak istnieją różnice w wersjach języka SQL biorąc pod uwagę różnych producentów. CECHY JĘZYKA SQL jest językiem wysokiego poziomu (4GL), jest językiem deklaratywnym, jest językiem ustandaryzowanym, jest podjęzykiem danych, jest językiem interpretowanym, jest językiem zbliżonym konstrukcją do naturalnego języka angielskiego, jest oparty na algebrze relacji, zawiera logikę trójwartościową. STANDARDY JĘZYKA SQL Rok Nazwa Zmiany 1986 SQL-86/SQL-87 Pierwsza publikacja standardu organizacji ANSI i ISO 1989 SQL-89 Małe udoskonalenia w stosunku do oryginału 1992 SQL-92/SQL2 Zasadnicze zmiany w stosunku do oryginału (najbardziej popularny standard do dziś) 1999 SQL-99/SQL3 Aktualizacja standardu z 1992 poprzez: nowe sposoby selekcji, nowe reguły integralności, pewne elementy struktury obiektowej 2003 SQL-2003 Obsługa formatu XML i pól z automatycznie generowanymi wartościami 2008 SQL-2008 WADY I ZALETY Zalety: deklaratywny charakter, standaryzacja, przejrzystość, czytelność, dobre podstawy matematyczne, Wady: nie przestrzeganie standardu przez dostawców, ograniczenie do danych atomowych. 2 2010-10-21 FORMY SQL SQL interakcyjny (autonomiczny) Statyczny kod SQL (Static SQL) Osadzony SQL (Embedded SQL) Język modułów Dynamiczny kod SQL (Dynamic SQL) TYPY DANYCH W STANDARDZIE ANSI (SQL-92) CHARACTER(n), CHAR(n) - napis znakowy o stałej długości n, CHARACTER VARYING(n), VARCHAR(n) – napis znakowy o zmiennej długości, nie przekraczającej podanego rozmiaru n, BIT(n) – ciąg bitów długości n, do danych graficznych i dźwiękowych (usunięto w SQL-2003), BIT VARYING(n) - ciąg bitów zmiennej długości (usunięto w SQL-2003), NUMERIC, NUMERIC(p,s), DECIMAL – typ dziesiętny, liczby o ustalonej precyzji p i skali s, INTEGER, INT - typ całkowity, PODZBIORY SQL SQL DML (ang. Data Manipulation Language – „język manipulacji danymi”) – SELECT, INSERT, UPDATE, DELETE, SQL DDL (ang. Data Definition Language – „język definicji danych”) – CREATE, DROP, ALTER, SQL DCL (ang. Data Control Language – „język kontroli nad danymi”) – COMMIT, ROLLBACK, etc. TYPY DANYCH W STANDARDZIE ANSI (SQL-92) FLOAT, REAL – typ zmiennopozycyjny, DATE - data w formacie: YYYY-MM-DD, TIME - czas w formacie: HH:MM:SS, TIMESTAMP - data wraz z czasem - znacznik czasu w formacie: YYYY-MM-DD HH:MM:SS, INTERVAL - przedział czasu, LOB – duże obiekty binarne lub znakowe, BLOB – dane binarne, podtyp LOB (dodano w SQL3), CLOB – dane znakowe, podtyp LOB (dodano w SQL3), XML - dane w języku XML (dodano w SQL3), BOOLEN – wartości logiczne: true, false, unknown. 3 2010-10-21 TYPY DANYCH W RÓŻNYCH SZBD w Oracle mamy number(p,s) w Oracle nie mamy typu TIME w Oracle mamy typ LONG – dokumenty tekstowe, w MySQL mamy YEAR- rok w formacie YYYY, w MS SQL Server mamy typ DATATIME, MONEY, etc. KATEGORIE SKŁADNI Identyfikatory – nazwy obiektów stworzonych przez użytkownika lub proces systemowy, Literały – wartości wprowadzone do systemu, nie będące wartościami NULL, Słowa kluczowe i zarezerwowane – słowa mające specjalne znaczenie dla parsera SQL: nazwy poleceń i funkcji. IDENTYFIKATORY LITERAŁY Zasady tworzenia nazw (SQL3): Każda wartość liczbowa, znakowa, łańcuchowa, czasowa czy logiczna nie będąca identyfikatorem, Dla typów liczbowych m.in.: 12, -134, 5.67, 3E2, 7E-2, Dla typów znakowych i łańcuchowych: ‘most’, ‘tekst’, Przy stosowaniu typów DATE: ‘2003-10-12’ Nie dłuższy niż 128 znaków, Może zawierać cyfry, litery i symbole, Musi zaczynać się od litery (lub innego dopuszczalnego symbolu) Nie może zawierać spacji ani innych znaków specjalnych, Nie może być słowem kluczowym lub zarezerwowanym, Istnieje identyfikator ograniczony (np. „rejestracja samochodu:”), który może występować spacja. 4 2010-10-21 OPERATORY OPERATORY Arytmetyczne: +, -, *, / Logiczne: NOT, AND, OR Łączenia napisów: || Algebraiczne: UNION, UNION ALL, INTERSECT, Porównań: =, <, >, <=, >=, <> Przynależności do listy wartości: IN SOME, ANY, ALL – „dla pewnego”, „dla każdego” Przynależności do przedziału: BETWEEN/NOT EXISTS, NOT EXISTS – sprawdzające czy EXCEPT(MINUS) BETWEEN Wzorca w tekście: LIKE/NOT LIKE Testujący NULL: IS NULL/IS NOT NULL otrzymujemy pusty czy pełny zbiór wyników HIERARCHIA OPERATORÓW PRZYKŁADOWE FUNKCJE MATEMATYCZNE () /, * -, + =, >, <, >=, <=, <> NOT AND ALL, ANY, BETWEEN, IN, LIKE, OR, SOME ABS(x) – wartość bezwględna x, POWER(podstawa,wykładnik) – podnosi wartość pierwszego argumentu do potęgi, SQRT(x) – pierwiastek kwadratowy, RAND() – generowanie liczby zmiennoprzecinkowej z przedziału 0-1 CEILING(x) – zaokrąglenie liczby do najbliższej większej liczby całkowitej, FLOOR(x) – zaokrąglanie liczby do najbliższej mniejszej liczby całkowitej, ROUND(x) - zaokrąglanie liczby do najbliższej liczby całkowitej 5 2010-10-21 W YBRANE FUNKCJE PRZETWARZAJĄCE ŁAŃCUCHY SUBSTRING(łańcuch, początek, długość) – zwraca określoną cześć łańcucha, UPPER(s), LOWER(s) – zmieniają wielkości znaków w łańcuchu, REVERSE(s) – odwraca kolejność znaków w łańcuchu, TRIM(s) – usuwa niepożądane znaki z początku lub końca łańcucha, LENGTH(s) – wyznacza długość łańcucha, W YBRANE FUNKCJE PRZETWARZAJĄCE DATY SKŁADNIA POLECEŃ SQL Klauzule (SELECT, FROM, etc.), Wyrażenia, Predykaty, Wielkość liter w składni nie ma znaczenia, „Białe” znaki są pomijane, Kończymy średnikiem. Wyrażenia w SQL: atrybuty, stałe liczbowe i łańcuchowe, konkatenacja łańcuchów, działania arytmetyczne, funkcje. CURRENT_DATE(), SYSDATE(), GETDATE(), NOW() ,etc. – bieżąca data lub data i godzina, DAY() – wydobywanie dnia z daty, MONTH() – wydobywanie miesiąca z daty, YEAR() – wydobywanie roku z daty, MONTH_BETWEEN(data1,data2) - ilość miesięcy pomiędzy wyspecyfikowanymi datami, etc. DML - SELECT Służy do wydobywania danych z bazy, Najprostsza postać instrukcji SELECT SELECT [DISTINCT] wyrażenia FROM nazwa_tabeli [WHERE warunki]; Klauzule SELECT i FROM są obowiązkowe, DISTINCT i WHERE opcjonalne, 6 2010-10-21 KLAUZULA SELECT KLAUZULA FROM, WHERE Określa jakie kolumny znajdą się w relacji wynikowej, Słowo DISTINCT oznacza eliminację powtarzających się wierszy, * oznacza wypisanie danych ze wszystkich kolumn tabeli, SELECT * FROM samochody; SELECT rejestracja, marka FROM samochody; SELECT DISTINCT marka, kolor FROM samochody; FROM - określa tabele z których będą pobierane dane, WHERE – określa warunki jakie muszą spełniać wiersze relacji wyjściowej, SELECT * FROM samochody WHERE marka=‘mercedes’; SELECT * FROM samochody WHERE marka=‘mercedes’ AND kolor=‘srebrny’; SELECT * FROM samochody WHERE rocznik>’1980’; SELECT * FROM samochody WHERE rejestracja LIKE ‘BI%’; SELECT - ALIASY Wyrażeniom na liście SELECT mogą zostać nadane nazwy – aliasy, Aliasem mogą być proste identyfikatory oraz ograniczone identyfikatory, SELECT [DISTINCT] wyrażenie [[AS] alias] FROM nazwa_tabeli [WHERE warunki]; SELECT marka, Sysdate()-rocznik AS ile FROM samochody; SELECT marka, Sysdate()-rocznik AS „ile lat” FROM samochody; SELECT - SORTOWANIE Wyniki zapytania mogą być posortowane w porządku rosnącym – ASC (domyślnym) lub malejącym DESC, W klauzuli ORDER BY mogą występować atrybuty relacji wejściowej, aliasy, numer na liście wyrażeń SELECT, SELECT [DISTINCT] wyrażenie [[AS] alias] FROM nazwa_tabeli [WHERE warunki] [ORDER BY wyrażenie [ASC|DESC]; SELECT * FROM samochody ORDER BY rocznik DESC; 7 2010-10-21 SELECT - GRUPOWANIE W SQL istnieje możliwość podziału wynikowych wierszy na grupy i wykonania funkcji sumarycznych na wartościach należących do tych grup, SELECT [DISTINCT] wyrażenie [[AS] alias] FROM nazwa_tabeli [WHERE warunki] [GROUP BY wyrażenie [HAVING warunki]] [ORDER BY wyrażenie [ASC|DESC]; SELECT - GRUPOWANIE Na liście GROUP BY mogą być tylko nazwy kolumn, Na liście klauzuli SELECT mogą znaleźć się jedynie: stałe, kolumny grupujące, funkcje sumaryczne oraz wyrażenie zawierające wszystkie powyższe, Dwa wiersze o takich samych wartościach kolumn grupujących wliczając w to NULL idą do tej samej grupy, FUNKCJE SUMARYCZNE SELECT – GROUP BY - PRZYKŁADY COUNT AVG SUM MAX, MIN SELECT rocznik, COUNT (*) FROM samochody GROUP BY rocznik; Argumentami funkcji może być wyrażenie, bądź DISTINCT wyrażenie, W przypadku COUNT możemy użyć także * - będą to wszystkie wiersze spełniające warunek WHERE, Wyrażenia o wartości NULL nie są brane pod uwagę przy obliczaniu wartości funkcji (oprócz COUNT), SELECT marka, kolor, COUNT(rejestracja) FROM samochody GROUP BY marka, kolor; SELECT marka, SUM(cena) FROM samochody GROUP BY marka; 8 2010-10-21 KLAUZULA HAVING Określa warunki jakie muszą być spełnione aby podzbiór trafił do relacji wynikowej (dotyczy tylko danych po agregacji), SELECT marka, SUM(cena), COUNT(*) FROM samochody GROUP BY marka HAVING COUNT(*)>=3; OPERATORY ALGEBRAICZNE NA ZAPYTANIACH instrukacja_SELECT operator instrukcja_SELECT Operatory: UNION, UNION ALL – sumowanie zbiorów będących wynikami zapytań, INTERSECT – przecięcie zbiorów wyników, EXCEPT – różnica zbiorów wyników. Dodajemy ALL jeśli chcemy otrzymać wyniki bez eliminacji powtarzających się wierszy. OPERATORY ALGEBRAICZNE NA ZAPYTANIACH Mogą być stosowane gdy liczba i typy kolumn w składowych zapytania są takie same, Relacja wynikowa nie posiada nazw kolumn, a nazwy atrybutów w zbiorze wynikowym pochodzą z listy pierwszej klauzuli SELECT, Zapytania wykonywane są w kolejności ich wystąpienia, Klauzula ORDER BY może wystąpić jedynie na samym końcu całego zapytania, a do wynikowych kolumn odwołujemy się używając kolejnych numerów, OPERATORY ALGEBRAICZNE NA ZAPYTANIACH SELECT wlasciciel FROM samochody WHERE marka=‘mercedes’ EXCEPT SELECT wlasciciel FROM samochody WHERE marka=‘fiat’; SELECT marka FROM samochody WHERE data_rejestracji=‘1999’ INTERSECT SELECT marka FROM samochody WHERE data_rejestracji=‘1998’; 9 2010-10-21 OPERATORY ALGEBRAICZNE NA ZAPYTANIACH ZŁĄCZENIA RELACJI W ZAPYTANAICH Złączenie tabel odbywa się poprzez wstawienie więcej niż jednej relacji w klauzuli FROM, Najczęściej złączenie uzyskujemy biorąc pod uwagę naturalne powiązania między wierszami tabel klucz główny <-> klucz obcy, SELECT rejestracja||’*’ FROM samochody WHERE marka=‘mercedes’ UNION SELECT rejestracja FROM samochody WHERE marka<>’mercedes’ ORDER BY 1; ILOCZYN KARTEZJAŃSKI Daje w wyniki wszystkie możliwe kombinacje wierszy, Liczba krotek wynikowych jest iloczynem ilości krotek w obu relacjach wejściowych, Rzadko stosowany gdyż ze względu na ogrom rozmiaru może wystąpić błąd zapytania, SELECT * FROM relacja1 CROSS JOIN relacja2 [WHERE warunki] [ORDER BY wyrażenie]; SELECT * FROM samochody CROSS JOIN wypadki; SELECT * FROM samochody, wypadki; Typy złączeń: iloczyn kartezjański (CROSS JOIN) złączenie naturalne (NATURAL JOIN) złączenie zewnętrzne (RIGHT|LEFT|FULL JOIN) samozłączenie (JOIN) ZŁĄCZENIE NATURALNE daje w wyniku iloczyn kartezjański łączonych relacji ograniczony do tych krotek, dla których atrybuty o tych samych nazwach i typach w obu relacjach miały równe wartości, Można wprowadzać aliasy nazw relacji, wówczas należy pamiętać o tym, że nazw oryginalnych nie można już używać, SELECT * FROM samochody JOIN wypadki w ON rejestracja=w.rejestracja; SELECT * FROM samochody NATURAL JOIN wypadki; SELECT * FROM samochody JOIN wypadki USING (rejestracja); 10 2010-10-21 ZŁĄCZENIE ZEWNĘTRZNE ZŁĄCZENIE ZEWNĘTRZNE Złączenie zewnętrzne rozszerza wynik prostego złączenia o te wiersze z jednej tabeli, dla których w trakcie złączania nie znaleziono odpowiadających wierszy w drugiej tabeli, Jest to możliwe dzięki „wirtualnym krotkom” wypełnionym wartością NULL, Wyróżniamy złączenie: lewostronne (LEFT JOIN), prawostronne (RIGHT JOIN) i pełne – będące sumą wyników dwóch pierwszych złączeń (FULL JOIN), SELECT * FROM relacja1 [alias1] [NATURAL] {LEFT|RIGHT|FULL} [OUTER] JOIN relacja2 [alias2] {ON (warunek_połączenia) | USING (atrybut) } [WHERE warunki] [ORDER BY wyrażenia]; ZŁĄCZENIE ZEWNĘTRZNE - PRZYKŁADY SAMOZŁĄCZENIE SELECT w.data,w.strata, s.model FROM samochody s LEFT JOIN wypadki w ON s.rejestracja=w.rejestracja WHERE w.rejestracja IS NULL; SELECT s.marka, COUNT(w.rejestracja) FROM wypadki w RIGHT JOIN samochody s ON s.rejestracja=w.rejestracja GROUP BY s.marka; Złączenie tabeli z nią samą, Ta sama tabela występuje w dwóch (lub więcej) rolach wskazywanych przez aliasy dołączone do nazwy tabeli w klauzuli FROM, SELECT prac.nazwisko, kier.nazwisko FROM pracownicy prac JOIN pracownicy kier ON prac.nrboss=kier.nrpracownika; SELECT s.rejestracja FROM samochody s JOIN samochody c ON s.cena>c.cena WHERE c.rejestracja=‘BID123’; 11 2010-10-21 PODZAPYTANIA PODZAPYTANIA WIERSZOWE I TABLICOWE Podzapytania mogą występować wewnątrz klauzul WHERE, HAVING, SELECT i FROM, Maja taką samą postać jak zapytania, są ujęte w nawiasy, Mogą być częścią wyrażeń, Mogą być wielokrotnie zagnieżdżane, Podzapytanie może wystąpić jako argument predykatów porównań oraz przynależności do listy wartości, W podzapytaniu nie można używać klauzul ORDER BY, UNION. Często używa się operatorów IN, NOT IN, SOME, ALL, EXISTS, NOT EXIST OPERATORY ANY I ALL OPERATORY ANY I ALL - PRZYKŁAD stosowane w zapytaniach z podzapytaniami tablicowymi, warunek z operatorem ANY jest prawdziwy, jeśli jest spełniony dla chociaż jednej wartości, zwracanej przez podzapytanie do zapytania zewnętrznego, warunek z operatorem ALL jest prawdziwy wtedy, gdy spełniony jest dla wszystkich wartości odczytywanych przez podzapytanie. Wierszowe – zwraca jeden rekord wynikowy SELECT * FROM samochody WHERE rocznik= (SELECT DISTINCT max(rocznik) FROM samochody WHERE marka=‘fiat’); Tablicowe – zwraca zbiór wynikowy złożony z jednego lub wielu rekordów SELECT rejestracja FROM samochody WHERE (marka, cena) IN (SELECT marka, max(cena) FROM samochody GROUP BY marka); SELECT rejestracja FROM samochody WHERE cena > ANY (SELECT cena FROM samochody WHERE marka=‘mercedes’); SELECT rejestracja FROM samochody WHERE cena > ALL (SELECT cena FROM samochody WHERE marka=‘mercedes’); 12 2010-10-21 PODZAPYTANIE ZWYKŁE Zbiór wynikowych wierszy nie zmienia się i nie zależy do wierszy w głównym zapytaniu, Wykonywane w pierwszej kolejności (tylko raz), jako wynik pośredni trafiają do zapytania zewnętrznego. SELECT rejestracja FROM samochody WHERE cena < (SELECT avg(cena) FROM samochody); SELECT rejestracja FROM samochody WHERE cena < (SELECT avg(cena) FROM samochody) AND rocznik = (SELECT min(rocznik) FROM samochody) ; OPERATOR EXIST Występuje w podzapytaniach skorelowanych, Przyjmuje wartość prawdy gdy podzapytanie zwróci przynajmniej jeden rekord, Podzapytanie może zwracać również literał. SELECT nazwisko FROM pracownicy p WHERE EXISTS (SELECT * FROM pracownicy WHERE id_szefa = p.id_prac); SELECT nazwisko FROM pracownicy p WHERE EXISTS (SELECT 1 FROM pracownicy WHERE id_szefa = p.id_prac); PODZAPYTANIE SKORELOWANE Zbiór wyników podzapytania zależy od wartości występujących w wierszach w głównym zapytaniu, Wykonywane dla każdego wiersza z zapytania zewnętrznego (wielokrotnie). SELECT rejestracja, cena FROM samochody s WHERE cena > (SELECT avg(cena) FROM samochody z WHERE z.marka=s.marka); PODZAPYTANIA W KLAUZULI HAVING obowiązują te same zasady co w przypadku klauzuli WHERE SELECT marka, AVG(cena) FROM samochody GROUP BY marka HAVING AVG(cena) > (SELECT AVG(cena) FROM samochody); 13 2010-10-21 PODZAPYTANIA W KLAUZULI FROM PODZAPYTANIE W KLAUZULI SELECT Podzapytanie tworzy zbiór danych dla zapytania zewnętrznego: Takie podzapytanie jest źródłem danych dla nowego atrybutu w wyniku zapytania zewnętrznego. Podzapytanie musi zwracać co najwyżej jedną wartość dla rekordu przeglądanego przez zapytanie zewnętrzne. Należy również zdefiniować alias dla atrybutu definiowanego przez podzapytanie. SELECT marka, srednia_cena FROM (SELECT marka, avg(cena) FROM samochody GROUP BY marka); SELECT s.wlasciciel, (SELECT COUNT(*) FROM samochody z WHERE z.wlasciciel=s.wlasciciel) AS L_sam FROM wlasciciele s; DDL – CREATE TABLE CREATE TABLE Najprostsza postać deklaracji schematu relacyjnego przyjmuje następującą postać: CREATE TABLE samochody( rejestracja Char(7), rocznik Date DEFAULT Sysdate, właściciel Numeric, marka Varchar(10) DEFAULT ‘Fiat’); CREATE TABLE nazwa_tabeli (nazwa_kolumny typ_danych (rozmiar) [DEFAULT wartośc_domyślna]); - PRZYKŁAD CREATE TABLE zwierzeta ( gatunek CHARACTER VARYING (100), jajorodny CHAR(1) DEFAULT ‘T’, liczba_konczyn NUMERIC(2), data_odkrycia DATE); 14 2010-10-21 CREATE TABLE - WIĘZY CREATE TABLE – PRIMARY KEY CREATE TABLE nazwa_tabeli (nazwa_kolumny typ_danych (rozmiar) [ [CONSTRAINT nazwa] więzy_atr] … [ [CONSTRAINT nazwa] więzy_rel]); Podstawowe rodzaje więzów: PRIMARY KEY NOT NULL REFERENCES nazwa_tabeli () UNIQUE CHECK CREATE TABLE samochody( rejestracja Char(7) PRIMARY KEY, rocznik Date, właściciel Numeric, marka Varchar(10) DEFAULT ‘Fiat’, data_rejestracji Date); CREATE TABLE - UNIQUE CREATE TABLE – NOT NULL CREATE TABLE samochody( rejestracja Char(7) PRIMARY KEY, rocznik Date, właściciel Numeric, marka Varchar(10) DEFAULT ‘Fiat’, vin char(13) UNIQUE); CREATE TABLE samochody( rejestracja Char(7) PRIMARY KEY, rocznik Date, właściciel Numeric, marka Varchar(10) DEFAULT ‘Fiat’, vin char(13), UNIQUE (vin)); CREATE TABLE samochody( rejestracja Char(7), rocznik Date, właściciel Numeric, marka Varchar(10) DEFAULT ‘Fiat’, data_rejestracji Date, PRIMARY KEY (rejestracja)); CREATE TABLE samochody( rejestracja Char(7) PRIMARY KEY, rocznik Date, właściciel Numeric NOT NULL, marka Varchar(10) DEFAULT ‘Fiat’, vin char(13) UNIQUE NOT NULL); 15 2010-10-21 CREATE TABLE – KLUCZ OBCY CREATE TABLE samochody( rejestracja Char(7) PRIMARY KEY, rocznik Date, właściciel Numeric REFERENCES właściciele(nr), marka Varchar(10) DEFAULT ‘Fiat’, data_rejestracji Date NOT NULL); CREATE TABLE samochody( rejestracja Char(7) PRIMARY KEY, rocznik Date, właściciel Numeric, marka Varchar(10) DEFAULT ‘Fiat’, data_rejestracji Date NOT NULL FOREIGN KEY właściciel REFERENCES właściciele(nr)); KLUCZ OBCY – INTEGRALNOŚĆ REFERENCYJNA ON UPDATE SET NULL – modyfikacja wartości klucza głównego w krotce spowoduje zapisanie do wskazujących na nią atrybutów tworzących klucz obcy wartości NULL, ON UPDATE CASCADE – modyfikacja wartości j.w. w krotce spowoduje zapisanie do wskazujących na nią atrybutów tworzących klucz obcy nowej wartości klucza głównego lub wartości unikalnej, ON UPDATE SET DEFAULT - modyfikacja j.w. w krotce spowoduje zapisanie do wskazujących na nią atrybutów tworzących klucz obcy ich wartości domyślnych. KLUCZ OBCY – INTEGRALNOŚĆ REFERENCYJNA ON DELETE SET NULL – usunięcie krotki z relacji z kluczem głównym spowoduje zapisanie do wskazujących na nią atrybutów tworzących klucz obcy wartości NULL, ON DELETE CASCADE – usunięcie krotki j.w. spowoduje usunięcie wszystkich krotek, które zawierają klucz obcy wskazujący na usuwaną krotkę, ON DELETE SET DEFAULT – usunięcie krotki j.w. spowoduje zapisanie do wskazujących na nią atrybutów tworzących klucz obcy ich wartości domyślnych, KLUCZ OBCY – INTEGRALNOŚĆ REFERENCYJNA CREATE TABLE samochody( rejestracja Char(7) PRIMARY KEY, rocznik Date, marka Varchar(10) DEFAULT ‘Fiat’, data_rejestracji Date NOT NULL, właściciel Numeric REFERENCES właściciele(nr), ON DELETE SET NULL, ON UPDATE CASCADE ); 16 2010-10-21 CREATE TABLE – OGRANICZENIE ATRYBUTU CREATE TABLE – OGRANICZENIE RELACJI CREATE TABLE samochody( rejestracja Char(7) PRIMARY KEY, rocznik Date CHECK (rocznik>’1970’), właściciel Numeric REFERENCES właściciele(nr), marka Varchar(10) DEFAULT ‘Fiat’, data_rejestracji Date NOT NULL); CREATE TABLE samochody( rejestracja Char(7) PRIMARY KEY, rocznik Date NOT NULL, marka Varchar(10) DEFAULT ‘Fiat’, data_rejestracji Date, CHECK (rocznik<data_rejestracji)); CREATE TABLE samochody( rejestracja Char(7) PRIMARY KEY, rocznik Date CHECK (rocznik>’1970’), właściciel Numeric REFERENCES właściciele(nr), marka Varchar(10) DEFAULT ‘Fiat’, rodzaj Char(1) CHECK (rodzaj IN (‘s’ , ’h’)) ); CREATE TABLE samochody( rejestracja Char(7) PRIMARY KEY, rocznik Date NOT NULL, marka Varchar(10) DEFAULT ‘Fiat’, rodzaj Char(1), CHECK (rodzaj=‘h’ OR rejestracja NOT LIKE ‘BI%’)); CREATE TABLE – NADAWANIE NAZW WIĘZOM CREATE TABLE – PODZAPYTANIE (ORACLE) CREATE TABLE samochody( rejestracja Char(7) CONSTRAINT numer_sam PRIMARY KEY, marka Varchar(10) DEFAULT ‘Fiat’, data_rejestracji Date); CREATE TABLE nazwa_tabeli (nazwa_kolumny [DEFAULT wartosc] [ [CONSTRAINT nazwa] więzy_atr] … [ [CONSTRAINT nazwa] więzy_rel]) AS SELECT zapytanie; CREATE TABLE samochody( rejestracja Char(7) PRIMARY KEY, rocznik Date NOT NULL, marka Varchar(10) DEFAULT ‘Fiat’, rodzaj Char(1), CONSTRAINT rodzaj_rej CHECK (rodzaj=‘h’ OR rejestracja NOT LIKE ‘BI%’)); CREATE TABLE auta (rejestracja PRIMARY KEY, marka, kolor,cena) AS SELECT rejestracja, marka, kolor, 1.25*cena FROM samochody; 17 2010-10-21 RENAME Zmiana nazwy relacji DROP TABLE DROP TABLE nazwa_tab [CASCADE]; RENAME stara_nazwa TO nowa_nazwa; Gdy inne tabele zawierają klucze obce do usuwanej tabeli to usunięcie nie powiedzie się, RENAME samochody TO auta; Np. DROP TABLE samochody; - nie powiedzie się, DROP TABLE samochody CASCADE; - usunie tabele razem z wiązami spójności referencyjnej dla odpowiedniej kolumny. ALTER TABLE ALTER TABLE nazwa_tab klauzula_zmiany_schem; Możliwości: dodanie nowej kolumny wraz z ograniczeniami atrybutu lub definicji ograniczenia relacji– ADD, modyfikacja definicji atrybutu – ALTER COLUMN/ MODIFY, usunięcie kolumny lub ograniczenia integralnościowego – DROP COLUMN. ALTER TABLE - ADD ALTER TABLE nazwa_tabeli ADD [COLUMN nazwa typ(rozmiar) [DEFAULT wartość] ograniczenia | CONSTRAINT nazwa ograniczenie]; ALTER TABLE samochody ADD COLUMN vin Char (17) UNIQUE; ALTER TABLE samochody ADD CONSTRAINT ogr_mark CHECK (marka IN (‘fiat’, ‘seat’)); 18 2010-10-21 ALTER TABLE - DROP ALTER TABLE – ALTER COLUMN ALTER TABLE nazwa_tabeli DROP [ COLUMN ( nazwa ) | CONSTRAINT ( nazwa ) ]; ALTER TABLE nazwa_tabeli MODIFY ( nazwa typ(rozmiar) [DEFAULT wartość] ograniczenia ); ALTER TABLE samochody DROP CONSTRAINT numer_sam; ALTER TABLE samochody ALTER COLUMN vin CHARACTER VARYING (20) NOT NULL; ALTER TABLE samochody DROP COLUMN cena; DML- INSERT INTO INSERT INTO Wstawianie wierszy do tabeli, Można ograniczyć się do kolumn o podanych nazwach (w reszcie wstawiamy NULL), Wiersz można wypełnić wartościami zwróconymi przez podzapytanie. INSERT INTO samochody VALUES (‘BIR5678’, ‘2002’, 2, ‘2002-10-09’, ‘biały’, ‘opel’); INSERT INTO nazwa_tabeli [(nazwy_kolumn)] VALUES (wartości [DEFAULT] [NULL]); INSERT INTO samochody (rejestracja, kolor, marka) VALUES (‘BIR5678’, ‘biały’, NULL); INSERT INTO samochody_new (SELECT * FROM samochody WHERE cena<20000); 19 2010-10-21 UPDATE Modyfikacja (aktualizacja) wartości zapisanych w bazie danych, UPDATE nazwa_tabeli SET nazwy_kolumn=wyrażenia [DEFAULT] [NULL] [WHERE warunek]; UPDATE - PODZAPYTANIE UPDATE nazwa_tabeli SET nazwy_kolumny= (SELECT nazwa_kolumny2 FROM nazwa_tabeli2 [WHERE warunki]) [WHERE warunek]; UPDATE samochody SET cena=cena*1.05; UPDATE samochody SET cena=cena*1.05 WHERE marka=‘mercedes’; UPDATE samochody SET właściciel=3, kolor=‘czerwony’ WHERE rejestracja=‘SER2345’; DELETE Usuwanie danych z tabeli, UPDATE samochody SET cena=cena+ (SELECT avg(cena) FROM samochody) WHERE marka=‘mercedes’; COMMIT, ROLLBACK DELETE FROM nazwa_tabeli [WHERE warunek]; DELETE FROM samochody; DELETE FROM samochody WHERE data_rej IS NULL; Utrwalenie zmian wprowadzonych przez polecenia INSERT, DELETE, UPDATE, inaczej wyniki wykonanych poleceń są widoczne jedynie w ramach bieżącej sesji, COMMIT; Rezygnacja z wprowadzenia zmian do bazy danych, ROLLBACK; 20 2010-10-21 PERSPEKTYWY Są zapytaniami zapewniającymi użytkownikowi właściwe widoki na dane składowane w bazie danych, Są wyrażeniami języka SQL przechowywanymi w bazie danych i określonymi nazwą, Wyniki zapytania tworzącego perspektywę nie są fizycznie składowane na dysku, ale są generowane za każdym razem, gdy do perspektywy zostanie skierowane zapytanie, Umożliwiają wykonywanie podobnych operacji jakie są wykonywane na tabelach: przeglądanie, wyszukiwanie – zawsze, wstawianie, modyfikowanie i usuwanie danych – pod pewnymi warunkami. Perspektywy pozwalają na: definiowanie struktur, które umożliwią wygodne korzystanie z systemu pojedynczym użytkownikom lub ich klasom, ograniczenie dostępu do danych, uproszczenie pracy administratora, podsumowywania składowych danych. PERSPEKTYWY – KONKRETNE ZASTOSOWANIA Zapewnienie bezpieczeństwa przez ograniczenie zbiorów wynikowych do tych danych, które rzeczywiście są potrzebne użytkownikowi, Mogą stanowić podstawę dla innych perspektyw, co pozwala na swobodne operowanie danymi, Oferowanie danych użytkownikowi w bardziej przystępnej formie. PERSPEKTYWY - TWORZENIE PERSPEKTYWY - USUWANIE CREATE VIEW nazwa [ (nazwa1, nazwa2, ...)] AS SELECT zapytanie definiujące perspektywę [ WITH CHECK OPTION ]; DROP VIEW nazwa [RESTRICT | CASCADE]; CREATE VIEW kabriolety AS SELECT rejestracja, marka, kolor, cena FROM samochody; CREATE VIEW terenowe (marka, data, cena) AS SELECT marka, data, cena*1.2 FROM samochody WHERE kolor=‘czerwony’; DROP VIEW terenowe; DROP VIEW terenowe CASCADE; - usunięcie razem wszystkich perspektyw zależnych, DROP VIEW terenowe RESTRICT; - odrzucenie usunięcia perspektywy, jeśli istnieją inne zależne. 21 2010-10-21 PERSPEKTYWY MODYFIKOWALNE oparte na jednej relacji ( w Oracle i Access może być więcej niż jedna), bez słowa DISTINCT, bez wywołań funkcji podsumowujących, bez funkcji operujących na zbiorach, bez operatorów zbiorów, bez klauzuli ORDER BY, GROUP BY, HAVING, Klauzula WHERE nie może zawierać podzapytań. PERSPEKTYWY Z OPCJĄ SPRAWDZANIA Zapewnia ograniczenie danych operowanych przy użyciu perspektywy do danych określonych przez jej warunek WHERE. CREATE VIEW drogie (rejestracja, marka, data, cena) AS SELECT marka, data, cena FROM samochody WHERE cena>100000 WITH CHECK OPTION; są modyfikowane przez polecenia UPDATE i DELETE, aby można było korzystać z INSERT, konieczne jest, aby perspektywy udostępniały wszystkie atrybuty klucza podstawowego oraz wszystkie atrybuty obowiązkowe relacji bazowej, jeżeli perspektywa zawiera atrybuty stanowiące wynik wyrażeń, to polecenia INSERT i UPDATE nie mogą dotyczyć tych atrybutów. INSERT INTO drogie (rejestracja, marka, data, cena) VALUES (‘TY789’,’seat’,2007,45000); DEFINICJA DZIEDZINY ATRYBUTÓW DEFINICJA ASERCJI Są to typy danych definiowane łącznie z więzami spójności. CREATE DOMAIN nazwa typ (rozmiar) [CHECK (VALUE warunek)] [DEFAULT wartosc]; CREATE DOMAIN rej CHAR(6) CHECK (VALUE LIKE ‘BI____’) DEFAULT ‘BI1111’; CREATE TABLE samochody (rejestracja DOMAIN rej PRIMARY KEY, …); ALTER DOMAIN, DROP DOMAIN UPDATE drogie SET cena=30000 WHERE marka=‘fiat’; Więzy spójności definiowane poza instrukcjami CREATE TABLE, ALERT TABLE. CREATE ASSERTION nazwa CHECK (warunek); CREATE ASSERTION suma_ceny CHECK ( 1000000>=ALL (SELECT SUM(cena) FROM samochody GROUP BY marka)); DROP ASSERTION 22 2010-10-21 TWORZENIE SYNONIMÓW NAZW Konstrukcja pozwalająca na tworzenie synonimów nazw tabel i perspektyw. CREATE SYNONYM nazwa FOR nazwa_tabeli_lub_perspektywy; CREATE SYNONYM pomoc FOR samochody; DROP SYNONYM TWORZENIE SEKWENCJI Niektóre SZDB (np. Oracle) oferują konstrukcję (przechowywana jako obiekt) służącą do generowania jednoznacznych numerów dla wartości kluczy głównych i jednoznacznych. CREATE SEQUENCE nazwa [INCREMENT BY k] [START WITH n]; n – pierwsza generowana liczba naturalna, k – wartość o jaką wzrasta każdy kolejno generowany numer. UŻYCIE SEKWENCJI W YKŁAD PRZYGOTOWANO NA PODSTAWIE nazwa_sewkwencji.NextVal – generowanie kolejnej wartości w sekwencji, nazwa_sewkwencji.CurrVal – ostatnio wygenerowana wartość w sekwencji, CREATE SEQUENCE numery_prac INCREMENT BY 3 START WITH 10; L. Banachowski, E. Mrówka-Matejewska, K. Stencel, Systemy baz danych. Wykłady i ćwiczenia, PJWSTK, 2004, K. Kline, D. Kline, SQL. Almanach. Opis poleceń języka, Helion, 2004, P. Wilton, J. Colby, SQL od podstaw, Helion, 2006, J. D. Ullman, J. Widom, Podstawowy wykład z systemów baz danych, WNT, 1999, http://wazniak.mimuw.edu.pl/ INSERT INTO pracownicy (nr, nazwisko, stanowisko) VALUES (numery_prac.NextVal, ‘adam’,’bobrowski’); 23