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

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

Copyright © The OWASP Foundation Permission is granted to copy, distribute and/or modify this document under the terms of the OWASP License. The OWASP.
Indeksy w bazie danych Oracle
Podział i zastosowanie
Procedury wyzwalane Procedura wyzwalana (ang. trigger) - stanowi kod użytkownika przechowywany wewnątrz bazy i uruchamiany w określonych sytuacjach np.
Bazy danych i inżynieria oprogramowania
Bazy danych II Instrukcja SELECT Piotr Górczyński 25/08/2001.
Relacyjny model danych
PROGRAMOWANIE STRUKTURALNE
Bazy danych 8. SQL podstawy P. F. Góra semestr letni 2004/05.
Język SQL ma ciekawe możliwości tworzenia zapytań
Bazy danych II Instrukcja INSERT Piotr Górczyński 25/08/2001.
25/08/ Bazy danych II Piotr Górczyński MS Access – Action Query.
Język SQL – zapytania zagnieżdżone (podzapytania)
(c) 1999, Instytut Informatyki Politechniki Poznańskiej Rozdział 2: Język bazy danych - SQL Proste zapytania.
SQL – Structured Query Language (2)
SQL-owskie szlaki górskie
Wymagania do projektu i realizacji baz danych:
POWTÓRZENIE Techniki zbierania informacji : Analiza dokumentacji
Budowa wyrażeń w SQL: Wyrażenia języka SQL występują w instrukcji SELECT, oraz służą do formułowania warunków podawanych w klauzuli WHERE instrukcji takich,
POWTÓRZENIE definicja danych; opcje definicji kolumn;
POWTÓRZENIE Kontrola integralności danych; dane wymagane;
Podzapytania – zapytania SELECT umieszczone w innym zapytaniu SELECT
POWTÓRZENIE Metodologia : Pojęcia:
Zapytania SQL: wydajność i optymalizacja
BD-LAB6 Wojciech Pieprzyca
Wykład 5 Wojciech Pieprzyca
Wprowadzenie do systemów baz danych
Projektowanie fizycznej bazy danych
WYKONYWANIE ZAPYTAŃ Przygotował Lech Banachowski na podstawie: 1.Raghu Ramakrishnan, Johannes Gehrke, Database Management Systems, McGrawHill, 2000 (książka.
Język SQL – podstawy zapytań
Język SQL – ciąg dalszy DML (Data Manipulation Language)
Zadania Bazy danych.
Structured Query Language
Bazy Danych II prowadzący: mgr inż. Leszek Siwik
OPERACJA DZIELENIA W SQL
SQL – zapytania posumowanie
SQL – Structured Query Language (3)
Przetwarzanie w oknie - nowa siła zapytań
Wykład 4 Prowadzący: dr Paweł Drozda. Trzy typy instrukcji Wstawianie – INSERT INTO Usuwanie – DELETE FROM Aktualizacje - UPDATE dr Paweł Drozda.
Instrukcje: CREATE, INSERT, UPDATE, DELETE, DROP
SQL - Structured Query Language
Łączenie tabel Odpowiedzi.
Wyprowadzanie informacji z bazy danych - kwerendy wybierające Marzena Nowakowska Katedra Informatyki Stosowanej, WZiMK, PŚk.
PL/SQL – dalsza wędrówka
Język manipulacji danymi – SQL cz. I
Temat 1: Strukturalny język zapytań SQL
1 SBD, L.Banachowski Podstawy SQL - języka relacyjnych i obiektowo-relacyjnych baz danych (SQL2, SQL'1999, Oracle) Powtórzenie wyk ł adu 3.
Wykład II Język SQL – polecenia DQL Powtórzenie wiadomości – cz. 1
Bazy Danych W03: Spójność relacji i JOINy Wojciech St
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski 1 informatyka +
Bazy Danych W04: JOIN (złączenia) Wojciech St
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski 1 informatyka +
Komendy SQL do pracy z danymi
Język SQL – polecenie Select
Relacja (ang.relation) Po podzieleniu danych na tabele i zdefiniowaniu pól kluczy podstawowych trzeba wprowadzić do systemu bazy danych informacje na temat.
Bazy Danych Wprowadzenie
BAZY DANYCH Microsoft Access Akademia Górniczo-Hutnicza Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej Katedra Automatyki i.
„Filtry i funkcje bazodanowe w EXCELU”
1 SYSTEMY BAZ I HURTOWNI DANYCH Wstęp. 2 Literatura: 1.„Podstawowy wykład z systemów baz danych” – J.Ullman, J.Widom, WNT, „Systemy baz danych.
1 Definicja danych: Do utworzenia tabeli służy instrukcja CREATE TABLE, wymagająca podania nazwy tworzonej tabeli, nazwy każdej kolumny w tej tabeli, typu.
Wybieranie wierszy: 1 Warunek WHERE Rodzaje warunków: - liczbowe - liczbowe z zakresu - znakowe.
Relacyjne Bazy Danych Wykład 02/03 Wojciech St
Podstawy SQL.
Widoki (views) - Perspektywy:
Ćwiczenie 1 Podaj liczbę wizyt w nieruchomościach w kolejnych dniach poprzedniego miesiąca kalendarzowego: SELECT data_wizyty, COUNT(*) AS liczba FROM.
SYSTEMY BAZ I HURTOWNI DANYCH
Własności relacji: Baza danych jest zbiorem relacji, o następujących własnościach: każda relacja w bazie danych jest jednoznacznie określona przez swoją.
Zapis prezentacji:

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

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 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 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 | | Białystok | Mała 2 |mieszkanie| 3 | 412 | | B18 | | Białystok | Leśna 6 |mieszkanie| 3 | 385 | SELECT nieruchomoscnr AS nr, kod, miasto, ulica, typ, pokoje, czynsz FROM nieruchomosc WHERE personelnr='SE23';

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 | | Białystok | Mała 2 |mieszkanie| 3 | 412 | | B18 | | Białystok | Leśna 6 |mieszkanie| 3 | 385 | lub

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 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 | | | | SL21 | Paweł | Kowalski | asystent | | | | SE23 | Anna | Biały | asystent | | | | SL32 | Michał | Brzęczyk | kierownik | | | | SE20 | Sabina | Bober | dyrektor | | | | SL30 | Jan | Wiśniewski | dyrektor | | | | SF10 | Jan | Bogacz | dyrektor | | | mysql> SELECT AVG(pensja) FROM personel; | AVG(pensja) | | |

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 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 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 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| Białystok, Agrestowa 6| |CO93 |Tomasz|Szymański | Białystok, Parkowa 12 |

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 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 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 Ć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 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 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 | | | SE21 | Daniel | Frankowski | kierownik | 1500 | | SE23 | Anna | Biały | asystent | | | SF10 | Jan | Bogacz | dyrektor | | | SL21 | Paweł | Kowalski | asystent | | | SL22 | Monika | Munk | asystent | 1466 | | SL30 | Jan | Wiśniewski | dyrektor | | | SL31 | Julia | Lisicka | asystent | | | SL32 | Michał | Brzęczyk | kierownik | |

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 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 | | | SL30 | Jan | Wiśniewski | dyrektor | |

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

24 mysql> SELECT personelnr, imie, nazwisko, pensja, biuronr FROM personel ORDER BY pensja DESC; | personelnr | imie | nazwisko | pensja | biuronr | | SF10 | Jan | Bogacz | | B001 | | SL30 | Jan | Wiśniewski | | B005 | | SE20 | Sabina | Bober | | B003 | | SL32 | Michał | Brzęczyk | | B005 | | SE23 | Anna | Biały | | B003 | | SL21 | Paweł | Kowalski | | B002 | | SL31 | Julia | Lisicka | | 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 Zapytania dotyczące wielu tabel

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 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 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 | 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 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 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 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 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 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 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 | Złączenie wewnętrzne - przykłady Pierwsza postać polecenia:

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 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 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 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 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 | Lewostronne złączenie zewnętrzne: SELECT biuro2.*, nieruchomosc2.* FROM biuro2 LEFT JOIN nieruchomosc2 ON biuro2.miasto = nieruchomosc2.miasto;

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 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 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 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 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 Ć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 Ć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 Ć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 Ć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 Ć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 Ć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 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 (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 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 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:

| 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 |...

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

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