Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Temat 6
- SQL – wybieranie danych z wielu tabel
- 1. Połącz dane z tabel EMP i DEPT przy pomocy warunku złączenia w WHERE.
- SELECT *
- FROM emp, dept
- WHERE emp.deptno = dept.deptno;
- Gdyby nie było warunku złączenia (WHERE emp.deptno = dept.deptno), to każdy pracownik zostałby wypisany kilkakrotnie, połączony z każdym działem.
- 2. Połącz dane z tabel EMP i DEPT przy pomocy INNER JOIN.
- SELECT *
- FROM emp INNER JOIN dept ON emp.deptno = dept.deptno;
- To zapytanie zadziała dokładnie tak samo jak to z punktu 1. Różnica jest taka, że przy pomocy INNER JOIN możemy oddzielić warunki złączenia od pozostałych warunków.
- 3. Wybierz nazwiska oraz nazwy departamentów wszystkich pracowników w kolejności alfabetycznej.
- SELECT ename, dname
- FROM emp, dept
- WHERE emp.deptno = dept.deptno
- ORDER BY ename
- 4. Wybierz nazwiska wszystkich pracowników wraz z numerami i nazwami departamentów w których są zatrudnieni.
- SELECT ename, dname, emp.deptno
- FROM emp, dept
- WHERE emp.deptno = dept.deptno;
- Wybierając numery departamentów musimy określić, z której tabeli mają być one wybrane (emp.deptno), ponieważ kolumna deptno występuje zarówno w tabeli emp jak i w dept. Wszystko jedno, z której tabeli wybierzemy, ponieważ jak określa warunek WHERE, numery te są sobie równe.
- 5. Dla pracowników o miesięcznej pensji powyżej 1500 podaj ich nazwiska, miejsca usytuowania ich departamentów oraz nazwy tych departamentów.
- SELECT ename, loc, dname
- FROM emp, dept
- WHERE sal > 1500 AND emp.deptno = dept.deptno;
- 6. Utwórz listę pracowników podając ich nazwisko, zawód, pensję i stopień zaszeregowania.
- SELECT ename, job, sal, grade
- FROM emp, salgrade
- WHERE sal BETWEEN losal AND hisal;
- W tym zapytaniu mamy do czynienia ze złączeniem nie po kluczach (klucz główny = klucz obcy) tylko po wartościach atrybutów.
- 7. Wybierz informacje o pracownikach, których zarobki odpowiadają klasie zarobkowej 3.
- SELECT ename, sal, job
- FROM emp, salgrade
- WHERE sal BETWEEN losal AND hisal AND grade = 3;
- 8. Wybierz pracowników zatrudnionych w Dallas.
- SELECT ename, loc
- FROM emp, dept
- WHERE emp.deptno = dept.deptno AND loc = ‘DALLAS’
- 9. Wybierz nazwiska pracowników, nazwy działów i stopnie zaszeregowania.
- SELECT ename, dname, grade
- FROM emp
- INNER JOIN dept ON emp.deptno = dept.deptno
- INNER JOIN salgrade ON sal BETWEEN losal AND hisal
- Oczywiście równie dobre byłoby rozwiązanie bez użycia INNER JOIN (z warunkami złączenia w WHERE).
- 10. Wypisz dane wszystkich działów oraz ich pracowników tak, aby dane działu pojawiły się, nawet jeśli nie ma w dziale żadnego pracownika.
- SELECT *
- FROM dept
- LEFT JOIN emp ON emp.deptno = dept.deptno;
- LEFT JOIN określa, że warunek złączenia może, ale nie musi być spełniony aby rekord z tabeli dept został wyświetlony. Jeżeli warunek nie jest spełniony (np. dla działu 40 w którym nikt nie pracuje), wyświetlą się dane działu, a pozostałe pola (te z tabeli emp) będą ustawione na NULL. Pełna składnia to LEFT OUTER JOIN, lecz słowo OUTER można pominąć.
- 11. Wypisz dane wszystkich działów oraz ich pracowników tak, aby dane pracownika pojawiły się, nawet jeśli pracownik nie jest przypisany do działu.
- SELECT *
- FROM dept
- RIGHT JOIN emp ON emp.deptno = dept.deptno;
- 12. Wybierz pracowników (nazwisko, numer działu) z działu 30 i 20.Wypisz dział 20 bez nazwisk.
- SELECT ename, deptno FROM emp WHERE deptno = 20
- UNION
- SELECT ‘’, deptno FROM emp WHERE deptno = 30;
- Dwa apostrofy w drugim zapytaniu są potrzebne, ponieważ obydwa zapytania muszą zwracać tą samą liczbę kolumn.
- Możemy jednak zauważyć, że wypisał się tylko jeden pracownik z działu 30, a z pewnością jest ich więcej. Jest to spowodowane tym, że UNION usuwa duplikaty podobnie do DISTINCT, więc wszystkie rekordy (‘’, 30) zostają zbite w jeden rekord. Aby pozbyć się tego problemu, musimy dodać jakieś pole, które rozróżni rekordy, np. empno lub użyć UNION ALL.
- 13. Wypisz stanowiska występujące w dziale 10 oraz 30.
- SELECT job FROM emp WHERE deptno = 10
- UNION
- SELECT job FROM emp WHERE deptno = 30;
- Oczywiście można to też zrobić bez użycia UNION np.:
- SELECT DISTINCT job FROM emp
- WHERE deptno IN (10, 30);
- 14. Wypisz stanowiska występujące zarówno w dziale 10 jak i 30.
- SELECT job FROM emp WHERE deptno = 10
- INTERSECT
- SELECT job FROM emp WHERE deptno = 30;
- 15. Wypisz stanowiska występujące w dziale 10 a nie występujące w dziale 30.
- SELECT job FROM emp WHERE deptno = 10
- MINUS SELECT job FROM emp WHERE deptno = 30;
- lub (MS SQL):
- SELECT job FROM emp WHERE deptno = 10
- EXCEPT SELECT job FROM emp WHERE deptno = 30;
- 16. Wybierz pracowników, którzy zarabiają mniej od swoich kierowników.
- SELECT pracownik.ename, pracownik.sal
- FROM emp pracownik, emp kierownik
- WHERE pracownik.mgr = kierownik.empno AND pracownik.sal < kierownik.sal
- W tym zapytaniu musimy złączyć tabelę emp z samą sobą (mgr jest kluczem obcym z tabeli emp i wskazuje kierownika). Musimy więc użyć dwukrotnie tabeli emp po FROM. Aby wiedzieć, do której z tabel emp się odwołujemy, musimy nadać aliasy (pracownik i kierownik) a następnie odwoływać się do nich tak, jakby były to normalne tabele.
- 17. Dla każdego pracownika wypisz jego nazwisko oraz nazwisko jego szefa. Posortuj według nazwiska szefa.
- SELECT pracownik.ename, kierownik.ename
- FROM emp pracownik, emp kierownik
- WHERE pracownik.mgr = kierownik.empno
- ORDER BY kierownik.ename
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement