Advertisement
Guest User

Untitled

a guest
May 24th, 2019
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 5.41 KB | None | 0 0
  1. Temat 6
  2. SQL – wybieranie danych z wielu tabel
  3. 1.  Połącz dane z tabel EMP i DEPT przy pomocy warunku złączenia w WHERE.
  4. SELECT *
  5. FROM emp, dept
  6. WHERE emp.deptno = dept.deptno;
  7. 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.
  8. 2.  Połącz dane z tabel EMP i DEPT przy pomocy INNER JOIN.
  9. SELECT *
  10. FROM emp INNER JOIN dept ON emp.deptno = dept.deptno;
  11. 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.
  12. 3.  Wybierz nazwiska oraz nazwy departamentów  wszystkich pracowników w kolejności alfabetycznej.
  13. SELECT ename, dname
  14. FROM emp, dept
  15. WHERE emp.deptno = dept.deptno
  16. ORDER BY ename
  17. 4.  Wybierz nazwiska wszystkich pracowników wraz z numerami i nazwami departamentów w których są zatrudnieni.
  18. SELECT ename, dname, emp.deptno
  19. FROM emp, dept
  20. WHERE emp.deptno = dept.deptno;
  21. 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.
  22. 5.  Dla pracowników o miesięcznej pensji  powyżej 1500 podaj ich nazwiska, miejsca usytuowania ich departamentów oraz nazwy tych departamentów.
  23. SELECT ename, loc, dname
  24. FROM emp, dept
  25. WHERE sal > 1500 AND emp.deptno = dept.deptno;
  26. 6.  Utwórz listę pracowników podając ich nazwisko, zawód, pensję i stopień zaszeregowania.
  27. SELECT ename, job, sal, grade
  28. FROM emp, salgrade
  29. WHERE sal BETWEEN losal AND hisal;
  30. W tym zapytaniu mamy do czynienia ze złączeniem nie po kluczach (klucz główny = klucz obcy) tylko po wartościach atrybutów.
  31. 7.  Wybierz informacje o pracownikach, których zarobki odpowiadają klasie zarobkowej 3.
  32. SELECT ename, sal, job
  33. FROM emp, salgrade
  34. WHERE sal BETWEEN losal AND hisal AND grade = 3;
  35. 8.  Wybierz pracowników zatrudnionych w Dallas.
  36. SELECT ename, loc
  37. FROM emp, dept
  38. WHERE emp.deptno = dept.deptno AND loc = ‘DALLAS’
  39. 9.  Wybierz nazwiska pracowników, nazwy działów i stopnie zaszeregowania.
  40. SELECT ename, dname, grade
  41. FROM emp
  42. INNER JOIN dept ON emp.deptno = dept.deptno
  43. INNER JOIN salgrade ON sal BETWEEN losal AND hisal
  44. Oczywiście równie dobre byłoby rozwiązanie bez użycia INNER JOIN (z warunkami złączenia w WHERE).
  45. 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.
  46. SELECT *
  47. FROM dept
  48. LEFT JOIN emp ON emp.deptno = dept.deptno;
  49. 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ąć.
  50. 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.
  51. SELECT *
  52. FROM dept
  53. RIGHT JOIN emp ON emp.deptno = dept.deptno;
  54. 12. Wybierz pracowników (nazwisko, numer działu) z działu 30 i 20.Wypisz dział 20 bez nazwisk.
  55. SELECT ename, deptno FROM emp WHERE deptno = 20
  56. UNION
  57. SELECT ‘’, deptno FROM emp WHERE deptno = 30;
  58. Dwa apostrofy w drugim zapytaniu są potrzebne, ponieważ obydwa zapytania muszą zwracać tą samą liczbę kolumn.
  59. 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.
  60. 13. Wypisz stanowiska występujące w dziale 10 oraz 30.
  61. SELECT job FROM emp WHERE deptno = 10
  62. UNION
  63. SELECT job FROM emp WHERE deptno = 30;
  64. Oczywiście można to też zrobić bez użycia UNION np.:
  65. SELECT DISTINCT job FROM emp
  66. WHERE deptno IN (10, 30);
  67. 14. Wypisz stanowiska występujące zarówno w dziale 10 jak i 30.
  68. SELECT job FROM emp WHERE deptno = 10
  69. INTERSECT
  70. SELECT job FROM emp WHERE deptno = 30;
  71. 15. Wypisz stanowiska występujące w dziale 10 a nie występujące w dziale 30.
  72. SELECT job FROM emp WHERE deptno = 10
  73. MINUS SELECT job FROM emp WHERE deptno = 30;
  74. lub (MS SQL):
  75. SELECT job FROM emp WHERE deptno = 10
  76. EXCEPT SELECT job FROM emp WHERE deptno = 30;
  77. 16. Wybierz pracowników, którzy zarabiają mniej od swoich kierowników.
  78. SELECT pracownik.ename, pracownik.sal
  79. FROM emp pracownik, emp kierownik
  80. WHERE pracownik.mgr = kierownik.empno AND  pracownik.sal < kierownik.sal
  81. 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.
  82. 17. Dla każdego pracownika wypisz jego nazwisko oraz nazwisko jego szefa. Posortuj według nazwiska szefa.
  83. SELECT pracownik.ename, kierownik.ename
  84. FROM emp pracownik, emp kierownik
  85. WHERE pracownik.mgr = kierownik.empno
  86. ORDER BY kierownik.ename
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement