Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

1 Instrukcja SELECT : SELECT[DISTINCT  ALL] {*  [wyrażenie_kolumnowe [AS nowa_nazwa]],[…]} FROMNazwaTabeli [alias],[...] [WHEREwarunek_selekcji_wierszy]

Podobne prezentacje


Prezentacja na temat: "1 Instrukcja SELECT : SELECT[DISTINCT  ALL] {*  [wyrażenie_kolumnowe [AS nowa_nazwa]],[…]} FROMNazwaTabeli [alias],[...] [WHEREwarunek_selekcji_wierszy]"— Zapis prezentacji:

1 1 Instrukcja SELECT : SELECT[DISTINCT  ALL] {*  [wyrażenie_kolumnowe [AS nowa_nazwa]],[…]} FROMNazwaTabeli [alias],[...] [WHEREwarunek_selekcji_wierszy] [GROUP BY lista_kolumn] [HAVING warunek_selekcji_grup] [ORDER BYlista_kolumn];

2 2 Podzapytania - zapytania SELECT umieszczone w innym zapytaniu SELECT SELECT personelnr, imie, nazwisko, stanowisko FROM personel WHERE biuronr 1. Podzapytanie z równością Podaj wszystkich pracowników zatrudnionych w biurze przy ulicy Dobrej 22: = (SELECT biuronr FROM biuro WHERE ulica = 'Dobra 22');

3 3 mysql> SELECT personelnr, imie, nazwisko, stanowisko FROM personel WHERE biuronr=(SELECT biuronr FROM biuro WHERE ulica = 'Dobra 22'); +------------+--------+------------+------------+ | personelnr | imie | nazwisko | stanowisko | +------------+--------+------------+------------+ | SL30 | Jan | Wiśniewski | dyrektor | | SL31 | Julia | Lisicka | asystent | | SL32 | Michał | Brzęczyk | kierownik | +------------+--------+------------+------------+

4 4 mysql> SELECT * FROM biuro; +---------+---------------+------------+--------+ | biuronr | ulica | miasto | kod | +---------+---------------+------------+--------+ | B001 | Piękna 47 | Białystok | 15-900 | | B002 | Cicha 56 | Łomża | 18-400 | | B003 | Mała 63 | Białystok | 15-900 | | B004 | Miodowa 32 | Grajewo | 19-300 | | B005 | Dobra 22 | Łomża | 18-400 | | B006 | Słoneczna 55 | Białystok | 15-900 | | B007 | Akacjowa 16 | Augustów | 16-300 | | B008 | Miejska 45 | Suwałki | 16-400 | | B009 | Wiejska 45 | Grajewo | 19-300 | | B010 | Świerkowa 5 | Woźniewo | 15-200 | | B011 | Miła 13 | Supraśl | 16-030 | +---------+---------------+------------+--------+

5 5 SELECT nazwisko FROM personel WHERE biuronr mysql> SELECT nazwisko FROM personel WHERE biuronr=(SELECT biuronr FROM personel WHERE nazwisko='Bober') AND nazwisko<>'Bober'; +------------+ | nazwisko | +------------+ | Frankowski | | Kowalska | | Biały | +------------+ =(SELECT biuronr FROM personel WHERE nazwisko='Bober') AND nazwisko<>'Bober'; Podaj nazwiska wszystkich pracowników podległych określonemu dyrektorowi o nazwisku Bober:

6 6 mysql> SELECT personelnr, imie, nazwisko, stanowisko, biuronr FROM personel; +-----------+------------+------------+------------+---------+ | personelnr| imie | nazwisko | stanowisko | biuronr | +-----------+------------+------------+------------+---------+ | SE20 | Sabina | Bober | dyrektor | B003 | | SE21 | Daniel | Frankowski | kierownik | B003 | | SE22 | Małgorzata | Kowalska | asystent | B003 | | SE23 | Anna | Biały | asystent | B003 | | SF10 | Jan | Bogacz | dyrektor | B001 | | SL20 | Paweł | Nowak | kierownik | B002 | | SL21 | Paweł | Kowalski | asystent | B002 | | SL22 | Monika | Munk | asystent | B002 | | SL30 | Jan | Wiśiewski | dyrektor | B005 | | SL31 | Julia | Lisicka | asystent | B005 | | SL32 | Michał | Brzęczyk | kierownik | B005 | +-----------+------------+------------+------------+---------+

7 7 Podaj informacje o nieruchomościach nadzorowanych przez określonego pracownika nr SE23 lub nazwisko Biały: mysql> SELECT nieruchomoscnr AS nr, kod, miasto, ulica, typ, pokoje, czynsz FROM nieruchomosc WHERE personelnr='SE23'; +-----+--------+-----------+---------+----------+------+--------+ | nr | kod | miasto | ulica | typ |pokoje| czynsz | +-----+--------+-----------+---------+----------+------+--------+ | B17 | 15-900 | Białystok | Mała 2 |mieszkanie| 3 | 412 | | B18 | 15-900 | Białystok | Leśna 6 |mieszkanie| 3 | 385 | +-----+--------+-----------+---------+----------+------+--------+ SELECT nieruchomoscnr AS nr, kod, miasto, ulica, typ, pokoje, czynsz FROM nieruchomosc WHERE personelnr='SE23';

8 8 SELECT nieruchomoscnr AS nr, kod, miasto, ulica, typ, pokoje, czynsz FROM nieruchomosc WHERE personelnr=(SELECT personelnr FROM personel WHERE nazwisko='Biały'); mysql> SELECT nieruchomoscnr AS nr, kod, miasto, ulica, typ, pokoje, czynsz FROM nieruchomosc WHERE personelnr=(SELECT personelnr FROM personel WHERE nazwisko='Biały'); +-----+--------+-----------+---------+----------+------+--------+ | nr | kod | miasto | ulica | typ |pokoje| czynsz | +-----+--------+-----------+---------+----------+------+--------+ | B17 | 15-900 | Białystok | Mała 2 |mieszkanie| 3 | 412 | | B18 | 15-900 | Białystok | Leśna 6 |mieszkanie| 3 | 385 | +-----+--------+-----------+---------+----------+------+--------+ lub

9 9 2. Podzapytanie z funkcją agregującą Podaj wszystkich pracowników, których pensja jest wyższa od średniej, pokaż różnice między poszczególnymi pensjami a średnią: SELECT personelnr, imie, nazwisko, stanowisko, pensja, pensja-(SELECT AVG(pensja)FROM personel) AS różnica FROM personel WHERE pensja > (SELECT AVG(pensja) FROM personel) ORDER BY pensja;

10 10 mysql> SELECT personelnr, imie, nazwisko, stanowisko, pensja, pensja- (SELECT AVG(pensja)FROM personel) AS różnica FROM personel WHERE pensja>(SELECT AVG(pensja) FROM personel) ORDER BY pensja; +------------+-----------+------------+------------+--------+-----------+ | personelnr | imie | nazwisko | stanowisko | pensja | różnica | +------------+-----------+------------+------------+--------+-----------+ | SL31 | Julia | Lisicka | asystent | 11266 | 2361.8182 | | SL21 | Paweł | Kowalski | asystent | 11366 | 2461.8182 | | SE23 | Anna | Biały | asystent | 11566 | 2661.8182 | | SL32 | Michał | Brzęczyk | kierownik | 13266 | 4361.8182 | | SE20 | Sabina | Bober | dyrektor | 14050 | 5145.8182 | | SL30 | Jan | Wiśniewski | dyrektor | 14650 | 5745.8182 | | SF10 | Jan | Bogacz | dyrektor | 16250 | 7345.8182 | +------------+-----------+------------+------------+--------+-----------+ mysql> SELECT AVG(pensja) FROM personel; +-------------+ | AVG(pensja) | +-------------+ | 8904.1818 | +-------------+

11 11 3. Podzapytania zagnieżdżone Wyświetl właścicieli nieruchomości, którzy mają więcej niż jedną nieruchomość: SELECT wlascicielnr, nieruchomoscnr, miasto, ulica FROM nieruchomosc WHERE wlascicielnr IN (SELECT wlascicielnr FROM nieruchomosc GROUP BY wlascicielnr HAVING Count(*)>1 ) ORDER BY wlascicielnr;

12 12 mysql> SELECT wlascicielnr, nieruchomoscnr, miasto, ulica FROM nieruchomosc WHERE wlascicielnr IN (SELECT wlascicielnr FROM nieruchomosc GROUP BY wlascicielnr HAVING Count(*)>1 ) ORDER BY wlascicielnr; +--------------+----------------+-----------+------------+ | wlascicielnr | nieruchomoscnr | miasto | ulica | +--------------+----------------+-----------+------------+ | CO87 | B21 | Białystok | Dobra 18 | | CO87 | L94 | Łomża | Akacjowa 6 | | CO93 | B16 | Białystok | Nowa 5 | | CO93 | B17 | Białystok | Mała 2 | | CO93 | L27 | Łomża | Inna 7 | +--------------+----------------+-----------+------------+

13 13 lub Wyświetl dane właścicieli nieruchomości, którzy mają więcej niż jedną nieruchomość: SELECT wlascicielnr, imie, nazwisko, adres FROM wlasciciel WHERE wlascicielnr IN (SELECT wlascicielnr FROM nieruchomosc GROUP BY wlascicielnr HAVING Count(*)>1 ) ORDER BY wlascicielnr;

14 14 mysql> SELECT wlascicielnr, imie, nazwisko, adres FROM wlasciciel WHERE wlascicielnr IN (SELECT wlascicielnr FROM nieruchomosc GROUP BY wlascicielnr HAVING Count(*)>1 ); +------------+------+----------+-----------------------------+ |wlascicielnr|imie |nazwisko |adres | +------------+------+----------+-----------------------------+ |CO87 |Karol |Frankowski|15-900 Białystok, Agrestowa 6| |CO93 |Tomasz|Szymański |15-900 Białystok, Parkowa 12 | +------------+------+----------+-----------------------------+

15 15 Podaj liczbę pracowników zatrudnionych na poszczególnych stanowiskach we wszystkich biurach w Białymstoku: mysql> SELECT stanowisko, COUNT(*) AS liczba FROM personel WHERE biuronr IN (SELECT biuronr FROM biuro WHERE miasto='Białystok') GROUP BY stanowisko; +------------+--------+ | stanowisko | liczba | +------------+--------+ | asystent | 2 | | dyrektor | 2 | | kierownik | 1 | +------------+--------+ SELECT stanowisko, COUNT(*) AS liczba FROM personel WHERE biuronr IN (SELECT biuronr FROM biuro WHERE miasto='Białystok') GROUP BY stanowisko;

16 16 4. Podzapytania zagnieżdżone podwójnie Podaj informacje o nieruchomościach nadzorowanych przez pracowników zatrudnionych w biurze przy ulicy Małej 63: SELECT nieruchomoscnr, miasto, ulica FROM nieruchomosc WHERE personelnr IN (SELECT personelnr FROM personel WHERE biuronr =(SELECT biuronr FROM biuro WHERE ulica = 'Mała 63'));

17 17 mysql> SELECT nieruchomoscnr, miasto, ulica FROM nieruchomosc WHERE personelnr IN (SELECT personelnr FROM personel WHERE biuronr = (SELECT biuronr FROM biuro WHERE ulica = 'Mała 63')); +----------------+-----------+----------+ | nieruchomoscNr | miasto | ulica | +----------------+-----------+----------+ | B16 | Białystok | Nowa 5 | | B17 | Białystok | Mała 2 | | B18 | Białystok | Leśna 6 | | B21 | Białystok | Dobra 18 | +----------------+-----------+----------+

18 18 Ćwiczenie: Podaj informacje o nieruchomościach wynajmowanych przez klienta o nazwisku Wierzba: SELECT nieruchomoscnr, miasto, ulica FROM nieruchomosc WHERE nieruchomoscnr IN (SELECT nieruchomoscnr FROM wynajecie WHERE klientnr IN (SELECT klientnr FROM klient WHERE nazwisko='Wierzba'));

19 19 5. Zastosowanie ANY / SOME Znajdź wszystkich pracowników, którzy mają pensję wyższą niż przynajmniej jeden pracownik biura o numerze B003: SELECT personelnr, imie, nazwisko, stanowisko, pensja FROM personel WHERE pensja > (SELECT pensja FROM personel WHERE biuronr='B003'); ANY

20 20 mysql> SELECT personelnr, imie, nazwisko, stanowisko, pensja FROM personel WHERE pensja > ANY (SELECT pensja FROM personel WHERE biuronr='B003'); +-----------+------------+------------+------------+--------+ | personelnr| imie | nazwisko | stanowisko | pensja | +-----------+------------+------------+------------+--------+ | SE20 | Sabina | Bober | dyrektor | 14050 | | SE21 | Daniel | Frankowski | kierownik | 1500 | | SE23 | Anna | Biały | asystent | 11566 | | SF10 | Jan | Bogacz | dyrektor | 16250 | | SL21 | Paweł | Kowalski | asystent | 11366 | | SL22 | Monika | Munk | asystent | 1466 | | SL30 | Jan | Wiśniewski | dyrektor | 14650 | | SL31 | Julia | Lisicka | asystent | 11266 | | SL32 | Michał | Brzęczyk | kierownik | 13266 | +-----------+------------+------------+------------+--------+

21 21 6. zastosowanie ALL Znajdź wszystkich pracowników, którzy mają pensję wyższą niż pensja każdego z pracowników biura o numerze B003: SELECT personelnr, imie, nazwisko, stanowisko, pensja FROM personel WHERE pensja > (SELECT pensja FROM personel WHERE biuronr='B003'); ALL

22 22 mysql> SELECT personelnr, imie, nazwisko, stanowisko, pensja FROM personel WHERE pensja > ALL (SELECT pensja FROM personel WHERE biuronr='B003'); +------------+-----------+------------+------------+--------+ | personelnr | imie | nazwisko | stanowisko | pensja | +------------+-----------+------------+------------+--------+ | SF10 | Jan | Bogacz | dyrektor | 16250 | | SL30 | Jan | Wiśniewski | dyrektor | 14650 | +------------+-----------+------------+------------+--------+

23 23 mysql> SELECT personelnr, imie, nazwisko, pensja FROM personel WHERE biuronr = 'B003' ORDER BY pensja DESC; +------------+------------+------------+--------+ | personelnr | imie | nazwisko | pensja | +------------+------------+------------+--------+ | SE20 | Sabina | Bober | 14050 | | SE23 | Anna | Biały | 11566 | | SE21 | Daniel | Frankowski | 1500 | | SE22 | Małgorzata | Kowalska | 1366 | +------------+------------+------------+--------+ Pracownicy biura B003 i ich zarobki:

24 24 mysql> SELECT personelnr, imie, nazwisko, pensja, biuronr FROM personel ORDER BY pensja DESC; +------------+------------+------------+--------+---------+ | personelnr | imie | nazwisko | pensja | biuronr | +------------+------------+------------+--------+---------+ | SF10 | Jan | Bogacz | 16250 | B001 | | SL30 | Jan | Wiśniewski | 14650 | B005 | | SE20 | Sabina | Bober | 14050 | B003 | | SL32 | Michał | Brzęczyk | 13266 | B005 | | SE23 | Anna | Biały | 11566 | B003 | | SL21 | Paweł | Kowalski | 11366 | B002 | | SL31 | Julia | Lisicka | 11266 | B005 | | SE21 | Daniel | Frankowski | 1500 | B003 | | SL22 | Monika | Munk | 1466 | B002 | | SE22 | Małgorzata | Kowalska | 1366 | B003 | | SL20 | Paweł | Nowak | 1200 | B002 | +------------+------------+------------+--------+---------+ Wszyscy pracownicy biur i ich zarobki:

25 25 Zapytania dotyczące wielu tabel

26 26 Proste złączenie dwóch tabel SELECT k.klientnr, imie, nazwisko, nieruchomoscnr, uwagi FROM klient k, wizyta w WHERE k.klientnr = w.klientnr; mysql> SELECT k.klientnr, imie, nazwisko, nieruchomoscnr, uwagi FROM klient k, wizyta w WHERE k.klientnr = w.klientnr; +----------+--------+------------+----------------+--------------+ | klientnr | imie | nazwisko | nieruchomoscnr | uwagi | +----------+--------+------------+----------------+--------------+ | CR51 | Michał | Rafalski | A14 | za mały | | CR51 | Michał | Rafalski | B4 | brak jadalni | | CR52 | Ludwik | Wierzba | A14 | brak jadalni | | CR52 | Ludwik | Wierzba | B36 | NULL | | CR52 | Ludwik | Wierzba | B4 | NULL | | CR53 | Janusz | Kalinowski | B4 | za daleko | +----------+--------+------------+----------------+--------------+ Dla każdej z tabel wymienionych w klauzuli FROM można zdefiniować nazwę zastępczą - alias.

27 27 Złączenia tabel: Instrukcja SELECT o postaci: SELECT wyrażenie1, wyrażenie2,... FROM tabela1, tabela2,... zwraca tabelę o kolumnach zawierających wartości podanych wyrażeń, obliczone dla iloczynu kartezjańskiego (pełnego złączenia) podanych tabel.

28 28 SELECT k.klientnr, imie, nazwisko, nieruchomoscnr, uwagi FROM klient k, wizyta w; mysql> SELECT k.klientnr, imie, nazwisko, nieruchomoscnr, uwagi -> FROM klient k, wizyta w; +----------+-----------+-------------+----------------+--------------+ | klientNr | imie | nazwisko | nieruchomoscNr | uwagi | +----------+-----------+-------------+----------------+--------------+ | CO16 | Alicja | Stefańska | A14 | za mały | | CO16 | Alicja | Stefańska | B4 | brak jadalni | | CO16 | Alicja | Stefańska | A14 | brak jadalni | | CO16 | Alicja | Stefańska | B36 | NULL | | CO16 | Alicja | Stefańska | B4 | NULL | | CO16 | Alicja | Stefańska | B4 | za daleko | | CO17 | Katarzyna | Winiarska | A14 | za mały | | CO17 | Katarzyna | Winiarska | B4 | brak jadalni | | CO17 | Katarzyna | Winiarska | A14 | brak jadalni | | CO17 | Katarzyna | Winiarska | B36 | NULL | | CO17 | Katarzyna | Winiarska | B4 | NULL | | CO17 | Katarzyna | Winiarska | B4 | za daleko | | CO18 | Anna | Nowak | A14 | za mały | | CO18 | Anna | Nowak | B4 | brak jadalni | | CO18 | Anna | Nowak | A14 | brak jadalni |... Iloczyn kartezjański

29 29 | CO18 | Anna | Nowak | B36 | NULL | | CO18 | Anna | Nowak | B4 | NULL | | CO18 | Anna | Nowak | B4 | za daleko | | CR51 | Michał | Rafalski | A14 | za mały | | CR51 | Michał | Rafalski | B4 | brak jadalni | | CR51 | Michał | Rafalski | A14 | brak jadalni | | CR51 | Michał | Rafalski | B36 | NULL | | CR51 | Michał | Rafalski | B4 | NULL | | CR51 | Michał | Rafalski | B4 | za daleko | | CR52 | Ludwik | Wierzba | A14 | za mały | | CR52 | Ludwik | Wierzba | B4 | brak jadalni | | CR52 | Ludwik | Wierzba | A14 | brak jadalni | | CR52 | Ludwik | Wierzba | B36 | NULL | | CR52 | Ludwik | Wierzba | B4 | NULL | | CR52 | Ludwik | Wierzba | B4 | za daleko | | CR53 | Janusz | Kalinowski | A14 | za mały | | CR53 | Janusz | Kalinowski | B4 | brak jadalni | | CR53 | Janusz | Kalinowski | A14 | brak jadalni | | CR53 | Janusz | Kalinowski | B36 | NULL | | CR53 | Janusz | Kalinowski | B4 | NULL | | CR53 | Janusz | Kalinowski | B4 | za daleko | | CR54 | Maria | Tomaszewska | A14 | za mały | | CR54 | Maria | Tomaszewska | B4 | brak jadalni | | CR54 | Maria | Tomaszewska | A14 | brak jadalni | | CR54 | Maria | Tomaszewska | B36 | NULL | | CR54 | Maria | Tomaszewska | B4 | NULL | | CR54 | Maria | Tomaszewska | B4 | za daleko | +----------+-----------+-------------+----------------+--------------+

30 30 Złączenia Najczęściej bardziej przydatne są zapytania wykorzystujące równozłączenia tabel, a nie iloczyny kartezjańskie. Operacja złączenia kojarzy dane z dwóch tabel, tworząc pary z wierszy, w których kolumny złączenia mają taką samą wartość. Dla złączenia wewnętrznego – jeżeli wiersz tabeli nie zostanie połączony w parę (z żadnym wierszem z drugiej tabeli), to nie trafia do tabeli wynikowej. Złączenie zewnętrzne zachowuje wiersze niespełniające warunku złączenia.

31 31 Równozłączenia dokonuje się za pomocą odpowiednio dobranego warunku w klauzuli WHERE : SELECT wyrażenie1, wyrażenie2,... FROM tabela1, tabela2,... WHERE warunek Warunek w klauzuli WHERE powinien być wyrażeniem logicznym dotyczącym kolumn złączanych tabel, dyktuje on które wiersze iloczynu kartezjańskiego zostaną uwzględnione w złączeniu. Zapisy w klauzuli FROM : tabela1, tabela2 tabela1 INNER JOIN tabela2 USING (kolumna1, kolumna2,...) są równoważne.

32 32 Złączenie zewnętrzne - inny sposób złączenia tabel MySQL implementuje dwie postacie zapisu lewostronnego (lub prawostronnego) złączenia zewnętrznego. Pierwsza postać: tabela1 LEFT [OUTER] JOIN tabela2 ON warunek ( tabela1 RIGHT [OUTER] JOIN tabela2 ON warunek ) gdzie warunek po słowie kluczowym ON może być dowolnym wyrażeniem logicznym zbudowanym z wykorzystaniem nazw kolumn złączanych tabel.

33 33 Druga postać: tabela1 LEFT [OUTER] JOIN tabela2 USING (kolumna1, kolumna2,...) Lista nazw kolumn po słowie kluczowym USING musi zawierać kolumny występujące w obu złączanych tabelach pod tymi samymi nazwami. Powyższy zapis jest równoważny zapisowi: tabela1 LEFT [OUTER] JOIN tabela2 ON tabela1.kolumna1=tabela2.kolumna1 AND tabela1.kolumna2=tabela2.kolumna2... Słowo kluczowe OUTER jest opcjonalne i nie ma wpływu na efekt złączenia.

34 34 Definicja lewostronnego złączenia zewnętrznego oznacza, że jeżeli w „prawej” tabeli brak wiersza,,pasującego” do pewnego wiersza tabeli,,lewej'' (tzn. spełniającego warunek złączenia), to stworzony zostanie wiersz zawierający wartość NULL we wszystkich kolumnach pochodzących z tabeli,,prawej”. Dodatkowo istnieje operacja naturalnego złączenia lewostronnego: tabela1 NATURAL LEFT [OUTER] JOIN tabela2 będąca skrótowym zapisem złączenia z klauzulą USING zawierającą jako argument listę nazw wszystkich kolumn powtarzających się w obu złączanych tabelach.

35 35 Podaj biura i nieruchomości znajdujące się w tym samym mieście: SELECT biuro2.*, nieruchomosc2.* FROM biuro2 INNER JOIN nieruchomosc2 ON biuro2.miasto = nieruchomosc2.miasto; mysql> SELECT * FROM biuro2; +---------+-----------+ | biuronr | miasto | +---------+-----------+ | B002 | Łomża | | B003 | Białystok | | B004 | Grajewo | +---------+-----------+ mysql> SELECT * FROM nieruchomosc2; +---------------+-----------+ | nieruchomoscr | miasto | +---------------+-----------+ | A14 | Augustów | | B4 | Białystok | | L94 | Łomża | +---------------+-----------+ 1. Złączenie wewnętrzne - przykłady Pierwsza postać polecenia:

36 36 mysql> SELECT biuro2.*, nieruchomosc2.* FROM biuro2 INNER JOIN nieruchomosc2 ON biuro2.miasto = nieruchomosc2.miasto; +---------+------------+----------------+------------+ | biuronr | miasto | nieruchomoscnr | miasto | +---------+------------+----------------+------------+ | B002 | Łomża | L94 | Łomża | | B003 | Białystok | B4 | Białystok | +---------+------------+----------------+------------+ SELECT biuro2.*, nieruchomosc2.* FROM biuro2 INNER JOIN nieruchomosc2 USING(miasto); SELECT biuro2.*, nieruchomosc2.* FROM biuro2, nieruchomosc2 WHERE biuro2.miasto = nieruchomosc2.miasto; Polecenia równoważne:

37 37 Przykład na innych tabelach: SELECT b.biuronr, b.miasto, p.personelnr, p.nazwisko, p.biuronr FROM biuro b INNER JOIN personel p ON b.biuronr = p.biuronr;

38 38 Proste złączenie dwóch tabel - równozłączenie: SELECT k.klientnr, imie, nazwisko, nieruchomoscnr, uwagi FROM klient k, wizyta w WHERE k.klientnr = w.klientnr; mysql> SELECT k.klientnr, imie, nazwisko, nieruchomoscnr, uwagi FROM klient k, wizyta w WHERE k.klientnr = w.klientnr; +----------+--------+------------+----------------+--------------+ | klientnr | imie | nazwisko | nieruchomoscnr | uwagi | +----------+--------+------------+----------------+--------------+ | CR51 | Michał | Rafalski | A14 | za mały | | CR51 | Michał | Rafalski | B4 | brak jadalni | | CR52 | Ludwik | Wierzba | A14 | brak jadalni | | CR52 | Ludwik | Wierzba | B36 | NULL | | CR52 | Ludwik | Wierzba | B4 | NULL | | CR53 | Janusz | Kalinowski | B4 | za daleko | +----------+--------+------------+----------------+--------------+

39 39 Podaj nazwiska wszystkich dyrektorów biur w kolejności wyznaczonej adresami biur: mysql> SELECT biuro.biuronr, miasto, ulica, nazwisko FROM biuro LEFT JOIN personel USING(biuronr) WHERE stanowisko='dyrektor' ORDER BY miasto, ulica; +---------+------------+---------------+-------------+ | biuronr | miasto | ulica | nazwisko | +---------+------------+---------------+-------------+ | B003 | Białystok | Mała 63 | Bober | | B001 | Białystok | Piękna 47 | Bogacz | | B005 | Łomża | Dobra 22 | Wiśniewski | +---------+------------+---------------+-------------+ SELECT biuro.biuronr, miasto, ulica, nazwisko FROM biuro INNER JOIN personel USING(biuronr) WHERE stanowisko='dyrektor' ORDER BY miasto, ulica;

40 40 P odaj biura i nieruchomości znajdujące się w tym samym mieście, umieść również te biura, w których nie zarejestrowano żadnej nieruchomości: mysql> SELECT biuro2.*, nieruchomosc2.* FROM biuro2 LEFT JOIN nieruchomosc2 ON biuro2.miasto = nieruchomosc2.miasto; +---------+------------+----------------+------------+ | biuronr | miasto | nieruchomoscnr | miasto | +---------+------------+----------------+------------+ | B002 | Łomża | L94 | Łomża | | B003 | Białystok | B4 | Białystok | | B004 | Grajewo | NULL | NULL | +---------+------------+----------------+------------+ 2. Lewostronne złączenie zewnętrzne: SELECT biuro2.*, nieruchomosc2.* FROM biuro2 LEFT JOIN nieruchomosc2 ON biuro2.miasto = nieruchomosc2.miasto;

41 41 P odaj biura w których nie zarejestrowano żadnej nieruchomości : mysql> SELECT biuro2.*, nieruchomosc2.* FROM biuro2 LEFT JOIN nieruchomosc2 USING(miasto) WHERE nieruchomosc2.miasto IS NULL; +---------+---------+----------------+--------+ | biuronr | miasto | nieruchomoscnr | miasto | +---------+---------+----------------+--------+ | B004 | Grajewo | NULL | NULL | +---------+---------+----------------+--------+ SELECT biuro2.*, nieruchomosc2.* FROM biuro2 LEFT JOIN nieruchomosc2 USING(miasto) WHERE nieruchomosc2.miasto IS NULL;

42 42 Przykład na innych tabelach: SELECT b.biuronr, b.miasto, p.personelnr, p.nazwisko, p.biuronr FROM biuro b LEFT JOIN personel p ON b.biuronr = p.biuronr;

43 43 Podaj biura i nieruchomości znajdujące się w tym samym mieście, umieść również nieruchomości nie zarejestrowane w żadnym biurze: 3. Prawostronne złączenie zewnętrzne: mysql> SELECT biuro2.*, nieruchomosc2.* FROM biuro2 RIGHT JOIN nieruchomosc2 ON biuro2.miasto = nieruchomosc2.miasto; +---------+------------+----------------+------------+ | biuronr | miasto | nieruchomoscnr | miasto | +---------+------------+----------------+------------+ | NULL | NULL | A14 | Augustów | | B003 | Białystok | B4 | Białystok | | B002 | Łomża | L94 | Łomża | +---------+------------+----------------+------------+ SELECT biuro2.*, nieruchomosc2.* FROM biuro2 RIGHT JOIN nieruchomosc2 ON biuro2.miasto = nieruchomosc2.miasto;

44 44 Podaj nieruchomości nie zarejestrowane w żadnym biurze: mysql> SELECT biuro2.*, nieruchomosc2.* FROM biuro2 RIGHT JOIN nieruchomosc2 USING(miasto) WHERE biuro2.miasto IS NULL; +---------+--------+----------------+-----------+ | biuronr | miasto | nieruchomoscnr | miasto | +---------+--------+----------------+-----------+ | NULL | NULL | A14 | Augustów | +---------+--------+----------------+-----------+ SELECT biuro2.*, nieruchomosc2.* FROM biuro2 LEFT JOIN nieruchomosc2 USING(miasto) WHERE biuro2.miasto IS NULL;

45 45 Przykład na innych tabelach: SELECT b.biuronr, b.miasto, p.personelnr, p.nazwisko, p.biuronr FROM biuro b RIGHT JOIN personel p ON b.biuronr = p.biuronr; Wynik w tym przypadku identyczny jak dla INNER JOIN ze względu na istniejące więzy między tabelami

46 46 Ćwiczenie 1 – INNER JOIN: Podaj dane o nieruchomościach i właścicielach, którzy mają zgłoszone nieruchomości: SELECT wlascicielnr, imie, nazwisko, nieruchomoscnr, czynsz FROM wlasciciel INNER JOIN nieruchomosc USING(wlascicielnr);

47 47 Ćwiczenie 2 – LEFT JOIN: Podaj dane o nieruchomościach i właścicielach, którzy mają zgłoszone nieruchomości, umieść również tych właścicieli, którzy nie mają nieruchomości: SELECT wlascicielnr, imie, nazwisko, nieruchomoscnr, czynsz FROM wlasciciel LEFT JOIN nieruchomosc USING(wlascicielnr);

48 48 Ćwiczenie 3 – LEFT JOIN: Podaj dane o właścicielach, którzy nie mają nieruchomości: SELECT wlascicielnr, imie, nazwisko, nieruchomoscnr, czynsz FROM wlasciciel LEFT JOIN nieruchomosc USING(wlascicielnr) WHERE nieruchomosc.wlascicielnr IS NULL;

49 49 Ćwiczenie 4 – INNER JOIN: Podaj dane o o pracownikach i biurach, do których są przypisani pracownicy: SELECT biuronr, ulica, miasto, personelnr, imie, nazwisko FROM biuro INNER JOIN personel USING(biuronr);

50 50 Ćwiczenie 5 – LEFT JOIN: Podaj dane o pracownikach i biurach, do których są przypisani pracownicy, umieść również te biura, które nie mają pracowników: SELECT biuronr, ulica, miasto, personelnr, imie, nazwisko FROM biuro LEFT JOIN personel USING(biuronr);

51 51 Ćwiczenie 6 – LEFT JOIN: Podaj dane o biurach, które nie mają pracowników: SELECT biuronr, ulica, miasto, personelnr, imie, nazwisko FROM biuro LEFT JOIN personel USING(biuronr) WHERE personel.biuronr IS NULL;

52 52 Wyświetl biura i nieruchomości znajdujące się w tym samym mieście, umieść również te biura, w których nie zarejestrowano żadnej nieruchomości oraz nieruchomości nie zarejestrowane w żadnym biurze: SELECT biuro2.*, nieruchomosc2.* FROM biuro2 FULL JOIN nieruchomosc2 USING(miasto); Pełne złączenie zewnętrzne (w standardzie SQL)

53 53 (SELECT biuro2.biuronr, biuro2.miasto, nieruchomosc2.nieruchomoscNr, nieruchomosc2.miasto AS miasto2 FROM biuro2 LEFT JOIN nieruchomosc2 USING(miasto)) UNION (SELECT biuro2.biuronr, biuro2.miasto, nieruchomosc2.nieruchomoscNr, nieruchomosc2.miasto AS miasto2 FROM biuro2 RIGHT JOIN nieruchomosc2 USING(miasto)); Utworzenie pełnego złączenia zewnętrznego (w MySQL z wykorzystaniem UNION ):

54 54 mysql> (SELECT biuro2.biuronr, biuro2.miasto, nieruchomosc2.nieruchomoscnr, nieruchomosc2.miasto AS miasto2 FROM biuro2 LEFT JOIN nieruchomosc2 USING(miasto)) UNION (SELECT biuro2.biuronr, biuro2.miasto, nieruchomosc2.nieruchomoscnr, nieruchomosc2.miasto AS miasto2 FROM biuro2 RIGHT JOIN nieruchomosc2 USING(miasto)); +---------+-----------+----------------+-----------+ | biuronr | miasto | nieruchomoscnr | miasto2 | +---------+-----------+----------------+-----------+ | B002 | Łomża | L94 | Łomża | | B003 | Białystok | B4 | Białystok | | B004 | Grajewo | NULL | NULL | | NULL | NULL | A14 | Augustów | +---------+-----------+----------------+-----------+

55 55 mysql> (SELECT klientnr, imie, nieruchomoscnr AS numer, miasto, ulica FROM klient LEFT JOIN nieruchomosc ON klient.preferencje=nieruchomosc.typ ORDER BY klientnr) UNION (SELECT klientnr, imie, nieruchomoscnr AS numer, miasto, ulica FROM klient RIGHT JOIN nieruchomosc ON klient.preferencje=nieruchomosc.typ ORDER BY klientnr); Polecenie - UNION Wyświetl nieruchomości które odpowiadają preferencjom klientów i informacje o klientach, umieść również te nieruchomości, do których nie wpisano żadnego typu oraz klientów, którzy nie określili swoich preferencji:

56 56 +----------+-----------+-------+-----------+------------+ | klientnr | imie | numer | miasto | ulica | +----------+-----------+-------+-----------+------------+ | CO17 | Katarzyna | B16 | Białystok | Nowa 5 | | CO17 | Katarzyna | B17 | Białystok | Mała 2 | | CO17 | Katarzyna | B18 | Białystok | Leśna 6 | | CO17 | Katarzyna | L33 | Łomża | Pogodna 3 | | CO17 | Katarzyna | L94 | Łomża | Akacjowa 6 | | CO18 | Anna | B21 | Białystok | Dobra 18 | | CO18 | Anna | L27 | Łomża | Inna 7 | | CR51 | Michał | B21 | Białystok | Dobra 18 | | CR51 | Michał | L27 | Łomża | Inna 7 | | CR52 | Ludwik | B16 | Białystok | Nowa 5 | | CR52 | Ludwik | B17 | Białystok | Mała 2 | | CR52 | Ludwik | B18 | Białystok | Leśna 6 | | CR52 | Ludwik | L33 | Łomża | Pogodna 3 | | CR52 | Ludwik | L94 | Łomża | Akacjowa 6 |...

57 57 +----------+-----------+-------+-----------+------------+ | klientnr | imie | numer | miasto | ulica | +----------+-----------+-------+-----------+------------+... | CR53 | Janusz | B16 | Białystok | Nowa 5 | | CR53 | Janusz | B17 | Białystok | MaĹa 2 | | CR53 | Janusz | B18 | Białystok | LeĹa 6 | | CR53 | Janusz | L33 | Łomża | Pogodna 3 | | CR53 | Janusz | L94 | Łomża | Akacjowa 6 | | CR54 | Maria | B16 | Białystok | Nowa 5 | | CR54 | Maria | B17 | Białystok | MaĹa 2 | | CR54 | Maria | B18 | Białystok | LeĹa 6 | | CR54 | Maria | L33 | Łomża | Pogodna 3 | | CR54 | Maria | L94 | Łomża | Akacjowa 6 | | CR55 | Adaś | NULL | NULL | NULL | | CR66 | Rafał | NULL | NULL | NULL | | CR77 | Jan | NULL | NULL | NULL | | NULL | NULL | B19 | Białystok | Pogodna 5 | +----------+-----------+-------+------------+------------+

58 58 mysql> (SELECT klientnr, imie, nieruchomoscnr AS numer, miasto, ulica FROM klient LEFT JOIN nieruchomosc ON klient.preferencje=nieruchomosc.typ ORDER BY klientnr) UNION (SELECT klientnr, imie, nieruchomoscnr AS numer, miasto, ulica FROM klient RIGHT JOIN nieruchomosc ON klient.preferencje=nieruchomosc.typ ORDER BY klientnr) LIMIT 2; +----------+-----------+-------+------------+---------+ | klientnr | imie | numer | miasto | ulica | +----------+-----------+-------+------------+---------+ | CO17 | Katarzyna | B16 | Białystok | Nowa 5 | | CO17 | Katarzyna | B17 | Białystok | Mała 2 | +----------+-----------+-------+------------+---------+ Polecenie - LIMIT Ograniczenie liczby wyświetlonych rekordów do 2:

59 59 mysql> SELECT personelnr, imie, nazwisko, pensja, biuronr FROM personel LIMIT 8; +------------+-------------+------------+--------+---------+ | personelnr | imie | nazwisko | pensja | biuronr | +------------+-------------+------------+--------+---------+ | SE20 | Sabina | Bober | 14050 | B003 | | SE21 | Daniel | Frankowski | 1500 | B003 | | SE22 | Małgorzata | Kowalska | 1366 | B003 | | SE23 | Anna | Biały | 11566 | B003 | | SF10 | Jan | Bogacz | 16250 | B001 | | SL20 | Paweł | Nowak | 1200 | B002 | | SL21 | Paweł | Kowalski | 11366 | B002 | | SL22 | Monika | Munk | 1466 | B002 | +------------+-------------+------------+--------+---------+ Polecenie - LIMIT Ograniczenie liczby wyświetlonych rekordów do 8:

60 60 Literatura: 1.Podstawowy wykład z systemów baz danych – J.Ullman, J.Widom, WNT, 2001 2.Systemy baz danych: praktyczne metody projektowania, implementacji i zarządzania T.1 i 2 – T.Connolly, C.Begg, RM, Warszawa, 2004 3.Wprowadzenie do systemów baz danych – C.Date, WNT, 2000 4.SQL: omówienie standardu języka – C.Date, H.Darwen, WNT, 2000 5.Implementacja systemów baz danych – H.Garcia-Molina, J.Ullman, J.Widom, WNT, 2003


Pobierz ppt "1 Instrukcja SELECT : SELECT[DISTINCT  ALL] {*  [wyrażenie_kolumnowe [AS nowa_nazwa]],[…]} FROMNazwaTabeli [alias],[...] [WHEREwarunek_selekcji_wierszy]"

Podobne prezentacje


Reklamy Google