Wykład 4_5
Transkrypt
Wykład 4_5
Bazy danych Język SQL dr Lidia Stępień 1 ● ● Structured Query Language (SQL) – strukturalny język zapytań Umożliwia wykonywanie operacji na relacyjnych bazach danych takich, jak : DDL – język definiowania danych, instrukcje definiowania struktury danych DML – język manipulacji danymi, instrukcje pobierania i modyfikowania danych DCL – język kontroli danych, instrukcje kontroli dostępu do danych Czym jest SQL? ● Polecenia SQL mogą być rozmieszczone w kilku wierszach. ● Koniec polecenia SQL musi być zakończy średnikiem. ● ● ● Dobrym zwyczajem jest umieszczanie klauzul od nowych linii. Nie wolno dzielić słowa pomiędzy wiersze. Dozwolone jest używanie małych lub wielkich liter, chyba że sprawdzamy zawartość pola. Uwagi create table nazwa_tabeli ( nazwa_atrybutu typ (rozmiar) [default wartość domyślna] [ [ constraint nazwa_ogr.] ograniczenie_atr ], …, [ [ constraint nazwa_ogr.] ograniczenie_rel,…] ); drop table nazwa_tabeli; Tworzenie tabeli null wartości puste; not null bez wartości pustych; unique klucz unikalny relacji; primary key klucz podstawowy relacji (nie występuje przy ograniczeniu unique i odwrotnie); foreign key | references referencja do klucza podstawowego lub unikatowego innej relacji ( do definicji klucza obcego); Ograniczenia check( warunek) warunek, który musi być spełniony przez wszystkie wartości atrybutu; Warunek buduje się używając operatorów: ● =, < , !=, ● is NULL, is not NULL, ● like 'wzorzec', ('%' - łańcuch o długości >= 0; '_' - pojedynczy znak), ● between … and … , ● in (…), ● and, or, not. Ograniczenia cd. ● cena > 0 ● imie like '_ _ a%' ● data between '1956-10-12' and '2011-12-31' ● etat in ('adiunkt', 'profesor', 'asystent') ● norma in (1, 2, 3); Przykłady warunków create table Port( nazwa varchar(20) primary key, ocean varchar(10) check ( ocean in ( 'Atlantyk', 'Pacyfik', 'Indyjski'), szerokosc_geo char(4) NOT NULL, dlugosc_geo char(4) NOT NULL ); Przykład 1 create table Regaty( nazwa varchar(20), rok char(4), liczba_uczestn INT2 NOT NULL, constraint kl_gl_Regaty primary key (nazwa, rok) ); Przykład 2 create table Trasa( regaty varchar(20), rok char(4), port varchar(20), kolejnosc INT2 NOT NULL, constraint kl_gl_Trasa primary key (regaty, rok, port), foreign key (port) references Port(nazwa), foreign key (regaty, rok) references Regaty (nazwa, rok) ); Przykład 3 ALTER TABLE nazwa_tabeli ADD nazwa_atrybutu typ (rozmiar) [default wartość domyślna] [ [constraint nazwa_ogr] ograniczenie_atr ]; ADD [ constraint nazwa_ogr] ograniczenie_atr; MODIFY nazwa_atrybutu typ (rozmiar) [default wartość domyślna][ null | not null ]; DISABLE | ENABLE unique | primary key | constraint nazwa_ogr [cascade]; DROP unique | primary key | constraint nazwa_ogr [cascade]; Rozszerzanie i modyfikowanie schematu tabeli alter table dydaktycy add etat varchar2(20); alter table dydaktycy add constraint dyd_etat check (etat in ('dyrektor', 'profesor', 'adiunkt', 'asystent','wykladowca',)); alter table dydaktycy modify tytuł varchar2(8) default 'mgr' not null; alter table dydaktycy alter table dydaktycy disable constraint dyd_etat; drop constraint dyd_etat; Przykład 4 rename stara_nazwa to nowa_nazwa; drop table nazwa_tabeli [cascade constraint]; describe nazwa_tabeli; Operacje na tabeli INSERT INTO nazwa_tabeli [(kolumna, kolumna,...)] VALUES (wartość, wartość, ...); Wstawianie wiersza do tabeli CREATE TABLE osoby( id_osoby number(5) NOT NULL, imie VARCHAR2(15), nazwisko VARCHAR2(15), wiek NUMBER(3), CONSTRAINT id_pk PRIMARY KEY (id_osoby) ); Przykład 5 INSERT INTO osoby VALUES (1, 'Adam', 'Nowak', 19); INSERT INTO osoby VALUES (1, 'Adam', 'Nowak', 22); INSERT INTO osoby VALUES (2, 'Iwona', 'Kowalska', 56); INSERT INTO osoby VALUES (3, 'Lech', 'Nowakowski', 56); INSERT INTO osoby (id_osoby, imie, nazwisko, wiek) VALUES (4, 'Kazimierz', 'Kot', 6); Przykład 6 INSERT INTO osoby (imie) VALUES ('Kazimierz'); INSERT INTO osoby (id_osoby,imie) VALUES (5, 'Jan'); INSERT INTO osoby (id_osoby,nazwisko) VALUES (6, 'Niezbędny'); INSERT INTO osoby (id_osoby, wiek) VALUES (7, 41); Przykład 7 ALTER TABLE osoby ADD plec char(1) check (plec in ('K', 'M')); INSERT INTO osoby VALUES(8, 'Joanna', 'Wyzwolona', 29, 'F'); INSERT INTO osoby VALUES(8, 'Joanna', 'Wyzwolona', 29, 'K'); Przykład 8 ALTER TABLE osoby ADD data_ur date DEFAULT sysdate; INSERT INTO osoby VALUES(9, 'Zenon', 'Laskowik', 26, 'M', '81-APR-12'); INSERT INTO osoby VALUES(10, 'Helena', 'Lis', 2, 'K', DEFAULT); Przykład 9 UPDATE nazwa_tabeli SET kolumna[,kolumna] = {wyrażenie | podzapytanie} [WHERE warunek]; Update DELETE FROM nazwa_tabeli [WHERE warunek]; Usuniecie wierszy spełniających warunek; DELETE FROM osoby WHERE plec = 'K'; Usunięcie wszystkich wierszy: DELETE FROM osoby; DELETE SELECT [DISTINCT] <lista kolumn/wyrażeń> FROM <lista tablic> [ WHERE <warunek> ] [ GROUP BY <lista kolumn> ] [ HAVING <warunek> ] [ UNION/INTERSECT/MINUS <instrukcjaSELECT> ] [ ORDER BY <lista kolumn / numerów> ]; 22 • SELECT - określa, które kolumny z tablic podanych we frazie FROM mają zostać włączone do wyniku (projekcja). Dodatkowo, mogą zostać włączone wyrażenia. • DISTINCT - powoduje wyeliminowanie duplikatów (wierszy powtarzających się). • FROM - określa tablice, na jakich działa instrukcja SELECT. Jeśli jest kilka tablic, dokonywany jest produkt kartezjański tych tablic. SELECT 23 • WHERE - określa warunki wyboru wierszy z tablic wymienionych we frazie FROM (selekcja). • GROUP BY - powoduje wiązanie wierszy wynikowych w grupy o jednakowych wartościach we wskazanych kolumnach, a następnie redukowanie tych grup do pojedynczych wierszy. • HAVING - określa warunki wyboru dla wierszy powstałych w wyniku działania frazy GROUP BY. SELECT 24 • UNION/INTERSECT/MINUS - oblicza sumę/przecięcie/różnicę wyników dwóch instrukcji SELECT, eliminując duplikaty. • ORDER BY - porządkuje wiersze wynikowe rosnąco lub malejąco według wartości wskazanych kolumn/wyrażeń. 25 SELECT SELECT [DISTINCT] <lista kolumn/wyrażeń> FROM <nazwa tablicy> [ WHERE <warunek> ]; Zapytanie proste przeprowadza kombinację projekcji i selekcji (jeśli występuje fraza WHERE) w stosunku do jednej tablicy. Uwaga: <lista kolumn> może przybrać formę * (co oznacza wybór wszystkich kolumn). Zapytania proste 26 Wyświetlić zawartość wszystkich kolumn w tabeli pracownik. select * from pracownik; 27 Przykład 11 Wyświetlić wartości kolumny imie wszystkich wierszy tabeli pracownik. select imie from pracownik; Wyświetlić unikalne wartości kolumny imie tabeli pracownik. select distinct imie from pracownik; Przykład 12 28 literały – dowolny łańcuch znaków, data lub liczba; jest dołączany automatycznie do każdego wyświetlanego wiersza, zgodnie z umiejscowieniem w klauzuli SELECT oraz do nagłówka kolumny, której dotyczy. Przykłady literałów: 'ala ma kota', 1234, '12.03.2011' 29 Literały w klauzuli select Wypisać, rozdzielone napisem ' pracuje od ', nazwiska i datę zatrudnienia wszystkich pracowników. SELECT nazwisko, ' pracuje od ', pracuje_od FROM pracownik; 30 Przykład 13 wyrażenia arytmetyczne - konstruowane są z nazw kolumn i literałów numerycznych z użyciem operatorów: ● potęgowania (^), ● dodawania (+), odejmowania (-), ● mnożenia (*) i dzielenia (/ ). UWAGA: ^ ma najwyższy priorytet, * i / mają wyższy priorytet od + i -; w przypadku operatorów o tej samej ważności wyrażenie wartościowane jest od lewej do prawej lub za pomocą nawiasów. Wyrażenia arytmetyczne w klauzuli SELECT 31 Wyświetlić nazwisko oraz potrojoną wartość sumy płacy minimalnej i maksymalnej z tabeli pracownik. select nazwisko, (placa_min + placa_max)*3 from pracownik; 32 Przykład 14 funkcje – przekształcają wartości kolumn i literałów, do których są stosowane. Przykład 5: Wyświetlić nazwiska wszystkich pracowników wraz z ich dzienną płaca podstawową, którą zaokrąglono do 1 miejsca po przecinku. select nawisko, round(placa_podst/31,1) from pracownik; Funkcje w klauzuli select 33 aliasy nazw atrybutów (kolumn) – alternatywna nazwa kolumny, występuje bezpośrednio po nazwie kolumny. Przykład 6 select nazwisko, (placa_min+placa_max)/2 srednia from pracownik; select nawisko, round(placa_podst/30,1) as dniowka from pracownik; Aliasy w klauzuli select 34 operator konkatenacji || (CONCAT()) umożliwia łączenie wyświetlanych wartości różnych atrybutów w pojedyncze łańcuchy znaków. select numer || ': ' || nazwisko || ' pracuje na etacie ' || etat from pracownik; select CONCAT(numer,': ',nazwisko,' pracuje na etacie ', etat) from pracownik; 35 Operatory języka SQL występujące w wyrażeniach w klauzuli WHERE: Operatory arytmetyczne: ^ potęgowanie, */ mnożenie, dzielenie, +- dodawanie, odejmowanie. Operatory logiczne: NOT, AND, OR. Operatory porównania: =, >, <, >=, <=, < > (!=). Operatory specjalne: IN, BETWEEN, LIKE Operatory porównania z wartością pustą: IS NULL, IS NOT NULL. Wyrażenia 36 Funkcje agregujące: COUNT() - zwraca liczbę wierszy wybranych w zapytaniu AVG() - oblicza średnią arytmetyczną w kolumnie numerycznej SUM() - sumuje wartości kolumn numerycznych MIN() - znajduje wartość minimalną w kolumnie znakowej, numerycznej lub daty MAX() - znajduje wartość maksymalną w kolumnie znakowej, numerycznej lub daty 37 Funkcje zależne od DBMS operujące na datach/godzinach, łańcuchach znakowych, polach tekstowych, wielkich obiektach binarnych,... Wypisać numery i nazwiska pracowników zatrudnionych na etacie asystenta lub adiunkta. SELECT numer, nazwisko FROM pracownik WHERE etat = 'asystent' OR etat = 'adiunkt'; jest równoważne SELECT numer, nazwisko FROM pracownik WHERE etat in ('asystent', 'adiunkt'); Operator IN 38 Wypisać numery i nazwiska pracowników, których płaca podstawowa mieści się w przedziale <1250, 2500>. SELECT numer, nazwisko FROM pracownik WHERE placa_pod >= 1250 AND placa_pod <= 2500; jest równoważne SELECT numer, nazwisko FROM pracownik WHERE placa_pod BETWEEN 1250 AND 2500; Operator BETWEEN...AND... 39 Porównuje zawartość kolumny znakowej z łańcuchem znaków, który może zawierać symbole wieloznaczne. Łańcuch ze znakami wieloznacznymi to wzorzec. Symbole wieloznaczne: _ (podkreślenie) - pasuje do dowolnego pojedynczego znaku, % (procent) - pasuje do dowolnego ciągu znaków. 40 Operator LIKE Wypisać numery i nazwiska pracowników, którzy zatrudnieni są na etacie zawierającym na 3 miejscu literkę d lub ich nazwisko zawiera literę a na dowolnym miejscu. SELECT numer, nazwisko FROM pracownik WHERE etat LIKE '__d%' OR nazwisko LIKE '%a%'; 41 Operator LIKE SELECT numer, nazwisko FROM pracownik WHERE upper(etat) LIKE upper('__d%') OR lower(nazwisko) LIKE lower('%a%'); 42 Operator LIKE (cd.) 1. COUNT(*) – zwraca liczbę wierszy w tablicy wynikowej 2. COUNT(DISTINCT <nazwa kolumny>) – zwraca liczbę różnych wartości we wskazanej kolumnie. 43 Funkcje agregujące COUNT() 1. Na ilu różnych etatach zostali zatrudnieni pracownicy? SELECT COUNT(DISTINCT etat) FROM pracownik; 2. Ilu pracowników zatrudnionych jest na etacie profesora? SELECT COUNT(*) FROM pracownik WHERE upper(etat) = upper('profesor'); Przykład 15 44 SUM([DISTINCT] <nazwa kolumny>) MIN([DISTINCT] <nazwa kolumny>) MAX([DISTINCT] <nazwa kolumny>) AVG([DISTINCT] <nazwa kolumny>) Zwracają odpowiednio: sumę, minimum, maksimum i średnią z wartości podanej kolumny. Dla SUM() i AVG(), kolumna musi być numeryczna, dla MIN() i MAX() kolumna może być też kolumną znakową lub daty. Funkcje agregujące (cd.) 45 Podaj sumę, najmniejszą, największą i średnią płac podstawowych pracowników zatrudnionych na etacie profesora. SELECT SUM(placa_pod) SUMA, MIN(placa_pod) MIN, MAX(placa_pod) MAX, AVG(placa_pod) SR FROM pracownik WHERE upper(etat) = upper('profesor'); 46 Przykład 16 Bez frazy ORDER BY wyniki zapytania ukazują się w porządku nieokreślonym (zwykle w porządku wstawienia ich do tablicy) ORDER BY [[,]<nazwa kolumny/numer> [ASC/DESC]] Uwagi: 1. Numer kolumny we frazie ORDER BY oznacza pozycję kolumny na liście wyboru instrukcji SELECT. Trzeba go użyć, jeśli porządkujemy wg wartości wyrażenia. 2. Domyślnie przyjmowany jest porządek rosnący (ASC). 47 Porządkowanie wyników Wypisać numery i nazwiska pracowników zatrudnionych po '1.01.2011' w malejącym porządku nazwisk. SELECT numer, nazwisko FROM pracownik WHERE pracuje_od > '1.01.2011' ORDER BY nazwisko DESC; lub równoważnie ORDER BY 2 DESC; Przykład 17 48 Jeśli fraza FROM zawiera więcej niż jedną tablicę, instrukcja SELECT wykonuje produkt kartezjański wskazanych tablic. Jeśli dodatkowo występuje fraza WHERE, wykonywana jest operacja relacyjnego złączenia (złączenie naturalne oparte na równości klucza głównego jednej tabeli i odpowiadającego mu klucza obcego drugiej tabeli). 49 SELECT - złączenia Wypisać numery, nazwiska i nazwy zespołów pracowników zatrudnionych na etacie adiunkta. SELECT numer, nazwisko, nazwa FROM pracownik, zespol WHERE pracownik.id_zesp = zespol.id_zesp AND lower(etat) = lower('adiunkt'); 50 Przykład 18 Wypisać numery, nazwiska i nazwy zespołów pracowników zatrudnionych na etacie adiunkta. SELECT p.numer, p.nazwisko, z.nazwa FROM pracownik p, zespol z WHERE p.id_zesp = z.id_zesp AND lower(etat) = lower('adiunkt'); Uwaga: p i z są aliasami tablic. W tym przykładzie służą tylko do skrócenia zapisu. Przykład 18 (wersja 2) 51 Złączenie tablicy z tą samą tablicą nazywamy samozłączeniem. Samozłączenie umożliwia wiązanie ze sobą informacji zawartych w różnych wierszach jednej tablicy. Do dokonania samozłączenia konieczne jest zastosowanie aliasów (nazw korelacji). 52 SELECT – złączenie (cd.) Dla każdego pracownika pokaż listę pracowników, którzy są jego podwładnymi. Wynik uporządkuj rosnąco alfabetycznie wg nazwisk szefów, a potem malejąco wg nazwisk podwładnych. SELECT Szef.nazwisko, Szef.numer, 'jest szefem dla', Podwladny.nazwisko, Podwladny.numer FROM pracownik Podwladny, pracownik Szef WHERE Podwladny.szef = Szef.numer ORDER BY 1, 4 DESC; 53 Przykład 19 GROUP BY <nazwa kolumny>[, <nazwa kolumny> …] [HAVING <warunek>] Fraza ta powoduje powiązanie ze sobą wierszy wynikowych z instrukcji SELECT w grupy wierszy, w których wskazane we frazie GROUP BY kolumny mają tę samą wartość. Następnie każda grupa jest redukowana do pojedynczego wiersza. W tym wierszu występują kolumny z frazy GROUP BY oraz ew. kolumny będące wynikiem funkcji agregujących. Funkcje te wówczas działają na każdej grupie osobno. Następnie eliminowane są wiersze nie spełniające warunku HAVING. GRUPOWANIE 54 Uwaga 1. Każda kolumna występująca we frazie GROUP BY musi wystąpić na liście wyboru instrukcji SELECT. Uwaga 2. W warunku HAVING może wystąpić funkcja agregująca (ale nie w warunku WHERE!). 55 GRUPOWANIE Pokazać ilu podwładnych ma pod sobą każdy szef. Wyniki uporządkować malejąco według numerów szefów. SELECT szef, COUNT(*) FROM pracownik GROUP BY szef; 56 Przykład 20 Dla każdego etatu oblicz średnią płacę podstawową. Pokaż tylko te etaty, dla których ta średnia przekracza 1500. Wynik uporządkuj malejąco wg średniej. SELECT etat, AVG(placa_pod) FROM pracownik GROUP BY etat HAVING AVG(placa_pod) > 1500 ORDER BY 2 DESC; 57 Przykład 21 Dla każdego etatu, zawierającego literkę 'd' na dowolnym miejscu, oblicz średnią płacę podstawową. Pokaż tylko te etaty, dla których ta średnia przekracza 1500. Wynik uporządkuj malejąco wg średniej. SELECT etat, AVG(placa_pod) FROM pracownik WHERE upper(etat) LIKE upper('%d%') GROUP BY etat HAVING AVG(placa_pod) > 1500 ORDER BY 2 DESC; Przykład 22 58 <instrukcja SELECT> UNION / INTERSECT / MINUS [ALL] <instrukcja SELECT> Cel: Realizacja operacji algebry relacji UNION/INTERSECT/MINUS w stosunku do tablic będących wynikiem dwóch lub więcej instrukcji SELECT. Tablice muszą być zgodne. 59 Operacje na tablicach Uwagi: 1. Z tablicy wynikowej usuwane są wiersze powtarzające się (duplikaty), chyba że występuje ALL. 2. Jeśli nazwy kolumn sumowanych, przecięcia lub różnicy tablic są różne, tablica wynikowa przyjmuje nazwy kolumn z pierwszej tablicy. 3. Jeśli po UNION / INTERSECT / MINUS występuje fraza ORDER BY, muszą w niej występować numery, a nie nazwy kolumn. 60 Operacje na tablicach (cd.) Wypisz w porządku alfabetycznym nazwy zespołów, które nie zatrudniają pracowników. SELECT nazwa FROM zespol MINUS SELECT distinct nazwa FROM zespol z, pracownik p WHERE z.id_zesp = p.id_zesp 61 ORDER BY 1; Przykład 23 W złączeniu wewnętrznym w wyniku zwracane są zawsze wiersze z obu tablic (lewej i prawej). Wiersze w jednej tablicy, które nie mają swoich odpowiedników w drugiej tablicy, są odrzucane. W dowolnym złączeniu zewnętrznym zwracane są wszystkie wiersze zwracane przez odpowiednie złączenie wewnętrzne. 62 Złączenia zewnętrzne lewe złączenie zewnętrzne – Dla każdego wiersza wybranego z lewej tablicy, dla którego nie istnieje odpowiedni wiersz w prawej tablicy, zamiast wiersza z prawej tablicy zwracany jest wiersz złożony z wartości pustych. Innymi słowy: Zwracane są wszystkie wiersze z lewej tablicy, nawet te, do których nie pasują żadne wiersze z prawej tablicy. 63 Złączenia zewnętrzne (cd.) Zespol ------------id_zesp ------------10 20 100 30 ------------- Pracownik --------------------------------------------numer | id_zesp --------------------------------------------1020 | 10 1010 | 20 1030 | 10 --------------------------------------------Wynik --------------------------------------------------------------id_zesp | numer | id_zesp --------------------------------------------------------------10 | 1020 | 10 10 | 1030 | 10 20 | 1010 | 20 100 | ? |` ? 30 | ? | ? --------------------------------------------------------------- SQL: SELECT * FROM Zespol z LEFT JOIN Pracownik p ON z.id_zesp = p.id_zesp; Przykład 24 (lewego złączenia zewnętrznego) 64 prawe złączenie zewnętrzne – Dla każdego wiersza wybranego z prawej tablicy, dla którego nie istnieje odpowiedni wiersz w lewej tablicy, zamiast wiersza z lewej tablicy zwracany jest wiersz złożony z wartości pustych. Innymi słowy: Zwracane są wszystkie wiersze z prawej tablicy, nawet te, do których nie pasują żadne wiersze z lewej tablicy. 65 Złączenia zewnętrzne (cd.) Pracownik --------------------------------------------numer | etat --------------------------------------------1020 | adiunkt 1010 | profesor 1030 | dyrektor 1100 | profesor --------------------------------------------- Etat ------------------------nazwa ------------------------adiunkt profesor dyrektor sekretarka asystent ------------------------- Wynik --------------------------------------------------------------numer | etat | nazwa --------------------------------------------------------------1020 | adiunkt | adiunkt 1010 | profesor | profesor 1030 | dyrektor | dyrektor 1100 |` profesor | profesor ? | ? | sekretarka ? | ? | asystent --------------------------------------------------------------- SQL: SELECT * FROM Pracownik RIGHT JOIN Etat ON etat = nazwa; Przykład 25 (prawego złączenia zewnętrznego) 66 pełne złączenie zewnętrzne – Zwraca wyniki lewego i prawego złączenia zewnętrznego (czyli wynik operacji UNION dla wyników lewego i prawego złączenia zewnętrznego). Uwaga 1. DBMS może wprowadzać różne ograniczenia dotyczące złączeń zewnętrznych. Szczegóły – w dokumentacji konkretnego DBMS. 2. Złączenia zewnętrzne nie są przemienne! 67 Złączenia zewnętrzne (cd.) select … from … connect by prior … start with … order by … Zapytanie hierarchiczne Klauzula connect by określa sposób łączenia wierszy relacji w drzewo. Na ogół występują po niej dwie kolumny, których identyczność, a dokładniej równość wartości w dwóch różnych wierszach, powoduje, że wiersze te łączy bezpośrednia krawędź konstruowanego drzewa. connect by prior ... Słowo kluczowe prior: ● występuje przy jednej z dwu kolumn klauzuli connect by; ● precyzuje sposób konstrukcji drzewa – kolumna, przy której występuje jest uważana za nadrzędną; ● w konstrukcji drzewa najpierw jest pobierana wartość kolumny nadrzędnej, a następnie odszukiwane są wszystkie te wiersze, dla których wartość tę przyjmuje również kolumna podrzędna; ● w tworzonym drzewie wiersze te będą dziećmi wiersza, z którego pobrano wartość atrybutu nadrzędnego. connect by prior ... ● W celu utworzenia drzewa wierszy jest konieczne wskazanie jego korzenia – klauzula start with. Po niej występuje warunek selekcjonujący wiersz, od ● którego rozpocznie się proces konstrukcji drzewa. start with ... Tworzymy drzewo wierszy relacji pracownik, którego korzeniem jest wiersz o pustej wartości atrybutu szef (klauzula start with), a więc wiersz reprezentujący pracownika nie posiadającego przełożonego. Z wiersza pobierana jest wartość kolumny numer (pracownika). Następnie są odszukiwane wszystkie wiersze-dzieci, które spełniają warunek podany w klauzuli connect by. Proces ten jest kontynuowany rekurencyjnie, aż do momentu utworzenia pełnego drzewa. Na koniec wiersze drzewa są porządkowane kolejno według kolumny id_zesp i pseudokolumny level. Przykład 24 select lpad(' - ',3*(level-1)) || ' ' || nazwisko || ' ' || etat as Drzewo from pracownik connect by prior numer = szef start with szef IS NULL order by id_zesp, level; Przykład 24 Przykład 24 - wyniki Najpierw zostanie odrzucony wiersz(-e) nie ● spełniający warunku klauzuli where. Następnie zostanie utworzone drzewo ● odwzorowujące zależności służbowe, z pominięciem poddrzewa wiersza nie spełniającego warunku podanego po operatorze and w klauzuli connect by. Przykład 25 select id_zesp,numer,nazwisko from pracownik where nazwisko !='RAJSKI' connect by prior numer=szef and nazwisko !='PODGAJNY' start with szef is null order by id_zesp; Przykład 25 By wygenerować ciąg liczb np. od 1 do 10 w SQL można użyć hierarchicznego (CONNECT BY) zapytania do wewnętrznej tablicy DUAL: select rownum n from dual connect by level <= 10; Przykład 26 Dual jest tablicą automatycznie tworzoną przez bazę Oracle. Znajduje się w schemacie użytkownika SYS, ale jest dostępna dla wszystkim użytkowników pod nazwą DUAL. Zbudowana jest z jednej kolumny DUMMY zdefiniowanej jako VARCHAR(1) i zawiera jeden wiersz o wartości X. Tablica DUAL jest bardzo przydatna w przypadku obliczeń stałych wartości. Zawsze zwraca jeden wiersz. DUAL Dla dat: select trunc(sysdate)+rownum-1 n from dual connect by level <= 10; Przykład 27 I znaków: select chr(ascii('A')+rownum-1) n from dual connect by level <= 10; Przykład 28 select kol_A_1, kol_A_2,... from relacja_A where kol operator ( select kol_B_1, kol_B_2,... from relacja_B where warunek ); Zagnieżdżanie zapytań Tryb nieskorelowany - porównania, np. =, >=, <; - in; - all – powoduje porównanie pojedynczej wartości z każdą wartością wyznaczoną przez podzapytanie. Warunek selekcji zapytania zewnętrznego jest spełniony, jeżeli wszystkie wartości listy spełniają ten warunek. - any – powoduje porównanie pojedynczej wartości (umieszczonej po jego lewej stronie) z każdą wartością wyznaczoną przez podzapytanie. Warunek selekcji zapytania zewnętrznego jest spełniony, jeżeli lista wartości wyznaczonych przez podzapytanie zawiera choć jeden element spełniający ten warunek. Operatory - porównania, np. =, >=, <; - in; - all – powoduje porównanie pojedynczej wartości z każdą wartością wyznaczoną przez podzapytanie. Warunek selekcji zapytania zewnętrznego jest spełniony, jeżeli wszystkie wartości listy spełniają ten warunek. - any – powoduje porównanie pojedynczej wartości (umieszczonej po jego lewej stronie) z każdą wartością wyznaczoną przez podzapytanie. Warunek selekcji zapytania zewnętrznego jest spełniony, jeżeli lista wartości wyznaczonych przez podzapytanie zawiera choć jeden element spełniający ten warunek. Operatory Liczba wartości wyznaczonych przez podzapytanie oraz ich typ muszą być zgodne z liczbą i typem kolumn użytych w warunku selekcji zapytania zewnętrznego. UWAGA select * from ksiazka where cena = ( select min(cena) from ksiazka ); Przykład 29 select id_ksiazki, cena from ksiazka where dziedzina = ( select dziedzina from ksiazka where autor = 7 ); Przykład 30 select * from ksiazka where (cena,autor) in ( select min(cena),autor from ksiazka group by autor ); Przykład 31 select A.autor, count(*) B from ( select autor from ksiazka where dziedzina between 1 and 3) A group by A.autor having B >= 2; Przykład 32 ● ● ● Najpierw wykonywane jest zapytanie zewnętrzne, a dopiero potem podzapytanie z nim skorelowane. Podzapytanie wykonane zostaje dla każdego wiersza przeglądanego przez zapytanie zewnętrzne. W zapytaniu skorelowanym konieczne jest zastosowanie aliasów relacji, na których operuje zapytanie zewnętrzne i odwoływanie się do nich w podzapytaniu. Zapytania zagnieżdżone Tryb skorelowany exists – sprawdza, czy podzapytanie zwraca wartość. not exists – sprawdza, czy podzapytanie nie wyznacza żadnej wartości. Tryb skorelowany - operatory select id_ksiazki, cena, autor from ksiazka p where cena > ( select avg(cena) from ksiazka where autor = p.autor ); Przykład 33 select id_ksiazki, tytul, autor from ksiazka p where not exists ( select autor from ksiazka where autor = p.autor and id_ksiazki != p.id_ksiazki) order by 1; Przykład 34 - Podzapytania nieskorelowane są zawsze wykonywane w kolejności od najbardziej zagnieżdżonego do najbardziej zewnętrznego. - Każde podzapytanie ograniczamy nawiasami ( ) i zagnieżdżamy po prawej stronie warunku zapytania zewnętrznego (zapytania umieszczonego o jeden poziom wyżej w strukturze zagłębienia). Zagnieżdżanie wielopoziomowe - liczba oraz typ kolumn występujących w klauzuli select podzapytania musi być zgodna z liczbą i typem kolumn użytych w warunku zapytania zewnętrznego (zapytania wyższego poziomu zagnieżdżenia); - w podzapytaniach nie używamy klauzuli order by; - klauzula order by może wystąpić wyłącznie jako ostatnia klauzula najbardziej zewnętrznego zapytania; - w podzapytaniu można używać operatorów zbiorowych; w warunkach zapytań zewnętrznych, poza operatorami any i all, można stosować dowolne operatory języka SQL*PLus. Zagnieżdżanie wielopoziomowe select id_ksiazki, tytul, autor, dziedzina, cena from ksiazka where cena > ( select min(cena) from ksiazka where autor in ( select id_autora from autor where imie like '%a%' ) ); Przykład 35 Podzapytania mogą być zagnieżdżane w klauzuli having w celu odrzucenia (przyjęcia) określonych grup krotek w zależności od wyniku podzapytania. UWAGA - Jest swego rodzaju „oknem”, przez które odczytujemy lub modyfikujemy dane z tabeli lub zbioru tabel, na których została zdefiniowana. - Ogranicza zakres dostępnych danych do kolumn i wierszy określonych w definicji perspektywy; - Jest definiowana na bazie w co najmniej jednej tabeli lub innej perspektywy; - Jest pamiętana w systemie wyłącznie w postaci swojej definicji. PERSPEKTYWA Perspektywa nie ma własnych danych – każdorazowe odwołanie się do niej powoduje konieczność zastosowania jej definicji. Perspektywy stosuje się w celu: ● ograniczenia dostępu do tabeli bazy danych; ● uproszczenia zapytań w stosunku kierowanych bezpośrednio do tabeli. PERSPEKTYWY do zapytań Udostępnia dane z pojedynczej tabeli, a w jej definicji nie stosuje się operacji na zbiorach, funkcji ani też grupowania wierszy. Przez perspektywę prostą można pobierać i modyfikować dane. Perspektywa prosta Udostępnia dane wielu tabel oraz operacje na zbiorach, łączenie tabel, funkcje i grupowanie wierszy. Jeżeli ciało polecenia select wykorzystuje: ● operatory zbiorowe, ● funkcje, ● klauzule group by, connect by, start with, ● operator distinct, to do perspektywy można kierować tylko polecenie select Perspektywa złożona Perspektywa złożona bazująca na wielu tabelach i wykorzystująca operacje połączenia umożliwia w ograniczonym zakresie wstawianie, modyfikowanie i usuwanie danych. Polecenie jest możliwe tylko wówczas, gdy dotyczy ono danych znajdujących się tylko w jednej tabeli. Wstawianie wierszy do tabeli bazowej jest możliwe tylko wtedy, gdy perspektywa umożliwia dostęp do wszystkich obowiązkowych kolumn tabeli bazowej. UWAGA Create [or replace] view nazwa_perspektywy [(atr1, atr2, ...)] as select ciało_polecenia_select [with check option]; Klauzula with check option uniemożliwia wstawianie i modyfikowanie wierszy w sposób niezgodny z warunkami selekcji perspektywy. Tworzenie perspektywy create or replace view programowanie as select id_ksiazki, autor from ksiazka where dziedzina = 4 ; select * from programowanie; Przykład 36 create view cena_dziedzina(nazwa, cena_min, cena_max, cena_avg) as select nazwa, min(cena), max(cena), avg(cena) from ksiazka, dziedzina where ksiazka.dziedzina = dziedzina.id_dziedziny group by nazwa; Przykład 37