Ćwiczenie 4
Wybieranie danych z wielu tabel
Złączenie równościowe
Chcemy uzyskać następującą informację: dla każdego pracownika znaleźć jego nazwisko, zawód (tabela EMP) i nazwę departamentu, w którym pracuje (tabela DEPT).
W obu tych tabelach występuje kolumna DEPTNO, określająca numer departamentu i zawierająca takie same wartości, mówiące o związku pomiędzy tymi tabelami. Związek oparty o relację równości nazywamy związkiem równościowym (equi-join).
Warunek równości zapisuje się jak zwykły warunek, z tym, że wartości do porównania są pobierane z różnych tabel.
Aby powiązać ze sobą logicznie tabele EMP i DEPT, napiszemy:
SELECT ENAME, JOB, DNAMEFROM EMP, DEPTWHERE EMP.DEPTNO=DEPT.DEPTNO
Gdy warunek łączenia jest niepoprawny lub zupełnie pominięty, wynikiem będzie
Produkt Kartezjański, w którym wyświetlane są wszystkie kombinacje wierszy.
Złączenia nierównościowe
Złączenia nierównościowe (non-equi-join) nie są oparte o relację równości. Związek pomiędzy wierszami dwóch tabel określa się poprzez zastosowanie innego operatora niż równość.
Na przykład związek pomiędzy tabelami EMP i SALGRADE jest oparty na następujących zasadach: określenie stawki zaszeregowania pracownika polega na wskazaniu do jakiego przedziału (LOSAL, HISAL) należą jego zarobki.
Do utworzenia tego warunku zastosujemy operator BETWEEN…AND.
SELECT ENAME, SAL, S.GRADEFROM EMP E, SALGRADE SWHERE SAL BETWEEN LOSAL AND HISAL;
Aliasy
Aliasy definiuje się w klauzuli FROM. Obowiązują one jedynie w zapytaniu, w którym są zdefiniowane. Należy używać aliasów także w klauzuli SELECT, mimo iż tekstowo występuje ona wcześniej niż klauzula FROM.
SELECT D.DEPTNO, E.ENAME, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO=D.DEPTNO
ORDER BY D.DEPTNO;
Połączenie tabeli samej ze sobą
Dzięki aliasom możemy połączyć tabelę samą ze sobą np ... FROM EMP A, EMP B .. ..
Złączenia zewnętrzne
Podczas łączenia tabel wiersz w tabeli nie mający swojego odpowiednika w drugiej tabeli nie zostanie wybrany. Np. w przykładzie łączenia tabeli EMP i DEPT poprzez kolumnę DEPNO nie został wybrany wiersz tabeli DEPT, gdzie DEPTNO=40 (departament OPERATIONS), ponieważ nikt nie pracuje w tym departamencie.
Aby został również wybrany departament 40 należy użyć złączenia zewnętrznego (outer-join), gdzie wiersz w tabeli DEPT, który nie ma swojego odpowiednika w tabeli EMP zostanie połączony z wierszem tabeli EMP zawierającym same wartości NULL (mimo, że wiersz taki w rzeczywistości nie istnieje).
Złączenie zewnętrzne oznaczamy znakiem (+) po tej stronie równości, która dotyczy tabeli z niepełną informacją.
SELECT ENAME, D.DEPTNO, DNAMEFROM EMP E, DEPT DWHERE E.DEPTNO(+)=D.DEPTNO;
DEPT |
|
EMP |
|
|
|
DNAME |
|
ENAME |
LOC |
|
JOB |
|
|
|
|
|
HIREDATE |
|
|
SAL |
|
|
COMM |
|
|
DEPTNO |
Zadania do zapytań SQL:
Wybierz nazwiska oraz nazwy departamentów wszystkich pracowników w kolejności alfabetycznej nazw departamentów
Wybierz numer (DEPTNO) i nazwę (DNAME) departamentu pracownika o nazwisku FORD.
(dodatkowy warunek AND w klauzuli WHERE)
Dla pracowników o miesięcznej pensji 1500 podaj ich nazwiska, miejsca usytuowania ich departamentów oraz nazwy tych departamentów.
Wybierz pracowników zatrudnionych w Dallas
Obok numeru i nazwiska pracownika podaj numer i nazwisko jego kierownika
(łączenie tabeli z tą samą tabelą)
Zmodyfikuj rozwiązanie poprzedniego zadania w ten sposób, aby wyświetlić także informacje o pracowniku KING, który nie posiada szefa
Znajdź nazwiska szefa każdego pracownika i utwórz kolumnę z tekstem
'nazwisko pracownika pracuje dla nazwisko szefa'
Wskaż dla każdego departamentu najwcześniej zatrudnionych pracowników.
Uporządkuj według dat zatrudnienia
Utwórz listę pracowników z zaszeregowaniem ich do klas zarobkowych.
Wybierz informację o pracownikach, których zarobki odpowiadają klasie 3
SQL Ćwiczenia Strona 1