Plan wykładu 2 BAZY DANYCH Wykład 4: Diagramy związków encji (ERD). SQL podzapytania. Małgorzata Krętowska Wydział Informatyki Politechnika Białostocka Diagramy związków encji elementy ERD liczności związków podklasy klucze zbiory słabych encji SQL podzapytania 3 Proces modelowania i implementacji bazy danych Analiza informacji, które będą zawarte w bazie danych System zarządzania relacyjną bazą danych 4 Elementy ERD Diagram związków encji - Entity-Relationship Diagram E/R (ERD) Zbiory encji Encja - rozróżnialny obiekt Zbiór encji (typ encji) - zbiór podobnych encji Zbiór encji (typ encji) Diagram E/R Schemat bazy danych (Model relacyjny) Wykładowca Krętowska Małgorzata Oniśko Agnieszka Sosnowski Zenon... Encje (Instancje danego typu encji)
5 Elementy ERD Atrybuty - informacje opisujące encję Imię Nazwisko 6 Elementy diagramu E/R Związki - powiązania pomiędzy dwiema lub większą liczbą encji (zbiorów encji) PRACOWNIK Encja1 Nazwa związku Encja2 Id Przykład Baza danych filmów Przykład Baza danych filmów 7 8 Występuje Występuje Posiada Potop Żurek Kingsajz Kingsajz Seksmisja Daniel Olbrychski Katarzyna Figura Katarzyna Figura Jerzy Stuhr Jerzy Stuhr
Przykład Baza danych filmów Liczność związków encji 9 10 N:N Posiada Występuje 1:N Posiada Potop Żurek Kingsajz Seksmisja Studio1 Studio2 Studio1 Studio3 1:1 Kieruje Prezesi Związki wieloargumentowe Role w związkach 11 12 Przykład Studio, które podpisało kontrakt z aktorem może podpisać kontrakt z innym studiem po to, by umożliwić aktorowi udział w filmie. Reprezentacja związku: (studio1, studio2, aktor, film) Studio producenta Studio aktora Reprezentacja w postaci trzech wartości: (studio, aktor, film) Role studia: producent filmu właściciel aktora
Atrybuty związku 13 Gdzie umieścić wynagrodzenie aktora? 14 Przesunięcie atrybutu do zbioru encji wynagrodzenie wynagrodzenie Gaże Przekształcanie w związki binarne Podklasy w ERD 15 Związek kontrakty: (studio1, studio2, film, aktor) 16 Podklasa = specjalny przypadek = mniej encji = więcej własności Przykład: Kreskówki i kryminały to podklasy filmów Studio producenta Studio aktora do aktorów stworzenie dodatkowego zbioru encji, którego elementy traktuje się tak samo jak krotki zbioru związków dla związku wieloargumentowego (łączący zbiór encji) stworzenie związków wiele do jeden ze zbioru łączącego do poszczególnych zbiorów encji wchodzących w skład pierwotnego związku wieloargumentowego dubbinguje Kreskówki isa isa Kryminały broń
Podklasy i dziedziczenie w ERD Klucze 17 Zakładając, że C jest podklasą klasy D na diagramach E/R należy: wprowadzić pomiędzy zbiorami encji C i D specjalny typ związku isa ( an A is a B ) - wierzchołek trójkąta wskazuje klasę nadrzędną wszystkie atrybuty i związki, które odnoszą się wyłącznie do encji C są doczepione do prostokąta oznaczającego C atrybuty i związki, które opisują zarówno C jak i D są doczepione do prostokąta oznaczającego D. Dziedziczenie w ERD: encje można oglądać jako złożone ze składowych, które należą do różnych zbiorów encji, stanowiących części hierarchii isa składowe te są powiązane w całość związkiem isa encja ma te wszystkie atrybuty, które należą do którejkolwiek składowej oraz wchodzi we wszystkie związki, w które są włączone jej składowe 18 Klucze - atrybuty lub zbiory atrybutów, które jednoznacznie identyfikują encję wewnątrz zbioru encji. W zbiorze encji nie mogą występować dwie encje, które miałyby identyczne wartości atrybutów tworzących klucz. Atrybuty, które wchodzą w skład klucza na diagramach ER są podkreślone. W hierarchii isa, tylko zbiór encji z klasy nadrzędnej (korzeń drzewa) może zawierać klucz, który jednoznacznie identyfikuje encje również w podklasach. Każdy zbiór encji musi mieć zdefiniowany klucz. 19 Zbiory słabych encji Zbiory słabych encji - zbiory encji, dla których niektóre lub wszystkie atrybuty klucza wybiera się z innego zbioru encji. Przykład: Mamy dwa zbiory encji: Piłkarze (, wiek) oraz Drużyny (). Jak można zdefiniować klucz dla zbioru encji Piłkarze? Piłkarze wiek numer gra zbiór słabych encji - prostokąt o podwójnych krawędziach Drużyny związki łączące ten zbiór z innymi to związki wiele do jeden - romby o podwójnych krawędziach 20 Wymagania dla zbiorów słabych encji Jeżeli E jest zbiorem słabych encji, wów zbiór encji F, który dostarcza atrybutów klucza do E, musi pozostawać z E w pewnym związku R oraz Związek R musi być binarny, typu wiele do jeden z E do F Atrybuty wchodzące w skład klucza E a pochodzące z F muszą być częścią klucza w F Jeżeli zbiór F jest zbiorem słabym, to kluczowe atrybuty z F przekazywane do E mogą pochodzić z pewnego innego zbioru encji, z którym F jest powiązany poprzez związek typu wiele do jednego. Uogólniając: jeżeli zbiór encji jest oznaczony podwójną ramką, to musi być słaby. Jego klucz składa się z tych jego własnych atrybutów, które są podkreślone oraz atrybutów klucza tych zbiorów encji, z którymi zbiór słaby jest połączony przez związki typu wiele do jeden, a które oznaczono podwójnymi krawędziami.
SQL Podzapytania Podzapytania skorelowane Operator EXISTS Podzapytania Podzapytanie - polecenie SELECT zagnieżdżone w innym poleceniu SELECT. Umożliwia konstruowanie zapytania odwołującego się do wartości wybranych przez inne polecenie SELECT. 21 Przykład: SELECT kolumna1, kolumna2,... FROM tabela WHERE kolumna = (SELECT kolumna FROM tabela WHERE warunek) 22 Podzapytania zwracające jeden wiersz Wynikiem jest pojedynczy wiersz. Przykład: Znaleźć pracowników z pensją równą minimalnemu zarobkowi w firmie. Co należy robić po kolei? 1. Znajdujemy minimalną pensję: SQL> select min(pensja) from pracownik; MIN(PENSJA) ---------- 800 2. Znajdujemy pracowników o pensji równej wartości obliczonej w pierwszym ku: select, stanowisko, pensja from pracownik where pensja =<wynik poprzedniego zapytania> 23 Podzapytania zwracające jeden wiersz Wstawiając zapytanie 1 do 2, otrzymujemy: SQL> select, stanowisko, pensja from pracownik where pensja =(select min(pensja) from pracownik); stanowisko pensja ---------- --------- ---------- SMITH CLERK 800 Przebieg wykonania zapytania: realizacja zapytania wewnętrznego na podstawie wartości zwróconej przez blok wewnętrzny przetwarzany jest blok główny zapytania W przypadku zapytań zwracających jeden wiersz mogą być stosowane zwykłe operatory porównania: =, >, <=,... 24
Sygnalizacja błędów Operatory ANY i ALL Co się stanie, jeżeli podzapytanie zwraca więcej niż jeden wiersz a w warunku zostanie użyty operator do porównywania jednego wyniku? SQL> select, pensja, nr_departamentu from pracownik where pensja = (select min(pensja) from pracownik group by nr_departamentu); where pensja = (select min(pensja) from pracownik group by nr_departamentu) * BŁĄD w linii 2: ORA-01427: jednowierszowe podzapytanie zwraca więcej niż jeden wiersz Podobnie jeżeli podzapytanie nie zwróci żadnego Opearatory ANY i ALL można stosować w podzapytaniach zwracających więcej niż jeden wiersz. Wykorzystuje się je w klauzulach WHERE I HAVING łącznie z operatorami porównywania (=;!=; <; >; <=; >=) Operator ANY powoduje akceptację (spełnienie warunku) po stwierdzeniu zgodności wyrażenia z którąkolwiek z wartości zwracanych przez podzapytanie 25 26 wiersza. Podzapytania - wskazówki Wewnętrzne zapytanie musi być ujęte w nawiasy i musi występować po prawej stronie warunku W podzapytaniu nie wolno stosować klauzuli ORDER BY. Obowiązuje zasada jednej klauzuli ORDER BY dla całego polecenia SELECT. Jeśli jest potrzebna umieszczamy ją jako ostatnią Kolumny występujące na liście wyboru wewnętrznego zapytania muszą występować w kolejności zgodnej z kolejnością kolumn ujętych w nawiasy warunku zapytania głównego. Musi 27 również występować zgodność co do liczby i typu kolumn wybieranych w bloku wewnętrznym i kolumn Podzapytania zwracające wiele atrybutów Znaleźć pracowników o pensjach z listy najniższych zarobków osiąganych w departamentach. SQL> select, pensja, nr_departamentu from pracownik where pensja in (select min(pensja) from pracownik group by nr_departamentu); pensja nr_departamentu ---------- ---------- ---------- SMITH 800 20 JAMES 950 30 MILLER 1300 10 28
29 Podzapytania zwracające wiele atrybutów W jaki sposób można uzyskać informacje o pracownikach zarabiających najmniej w ich departamentach? (Metoda 1) SQL> select, pensja, nr_departamentu from pracownik where (pensja,nr_departamentu) in (select min(pensja), nr_departamentu from pracownik group by nr_departamentu); pensja nr_departamentu ---------- ---------- ---------- SMITH 800 20 JAMES 950 30 MILLER 1300 10 Uwagi WHERE (kolumna1, kolumna 2...) = (SELECT kol1, kol2...) kolumny w bloku zewnętrznym powinny być ujęte w nawiasy i oddzielone przecinkami powinna być zgodność co do liczby i typu kolumn wybieranych w bloku wewnętrznym i kolumn bloku zewnętrznego porównywanych z nimi 30 Podzapytania skorelowane W jaki sposób można uzyskać informacje o pracownikach zarabiających najmniej w ich departamentach? (Metoda 2) SQL> select, pensja, nr_departamentu from pracownik e where pensja = (select min(pensja) from pracownik where e.nr_departamentu=pracownik.nr_departamentu group by nr_departamentu); pensja nr_departamentu ---------- ---------- ---------- SMITH 800 20 JAMES 950 30 MILLER 1300 10 31 Podzapytania skorelowane uwagi Każdy wiersz proponowany przez zapytanie główne przechodzi próbę warunku wyrażonego za pomocą zapytania skorelowanego, w którym występuje odwołanie do wartości kolumn tego wiersza. Wykonanie SELECT z podzapytaniem skorelowanym: pobranie wiersza przez zewnętrzne zapytanie wykonanie wewnętrznego zapytania na podstawie 32 wartości z pobranego w pkt 1. Wiersza zaakceptowanie bądź odrzucenie wiersza na
Podzapytania w klauzuli HAVING Zagnieżdżanie zapytań Wybrać te departamenty, których średnie zarobki przekraczają średni zarobek departamentu 30. Select nr_departamentu, avg(pensja) from pracownik group by nr_departamentu having avg(pensja) >(select avg(pensja) from pracownik where nr_departamentu=30); Znaleźć stanowisko pracy, na którym są najwyższe średnie zarobki. 33 Select stanowisko, avg(pensja) from pracownik Znaleźć pracowników, których zarobki przekraczają najwyższą pensję z departamentu SALES. SQL> select, stanowisko, data_zatrudnienia, pensja from pracownik where pensja> (select max(pensja) from pracownik where nr_departamentu= stanowisko data_zatrudnienia pensja ---------- --------- -------- ---------- JONES MANAGER 81/04/02 2975 SCOTT ANALYST 87/04/19 3000 KING PRESIDENT 81/11/17 5000 FORD ANALYST 81/12/03 3000 (select nr_departamentu from departament where = SALES')); 34 Operator EXISTS W przypadku zapytań skorelowanych ami nie interesuje nas wynik zapytania, ale jedynie czy wiersz o zadanych przez nas warunkach istnieje. Wów wykorzystujemy operator EXISTS. EXISTS (podzapytanie) - zwraca true jeżeli podzapytanie zwróci przynajmniej jeden wiersz NOT EXISTS(podzapytanie) zwraca true jeżeli podzapytanie nie zwróci żadnego wiersza 35