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