1. SQL> -- 사원번호와 사원이름과 그 사원이 속한 부서명의 조회
  2. SQL> -- WHERE절에 EMP.DEPTNO = DEPT.DEPTNO의 조건을 주었다. EMP.DEPTNO는 테이블.컬럼명
  3. SQL> SELECT EMP.EMPNO, EMP.ENAME,EMP.DEPTNO,DEPT.DNAME
  4. 2 FROM EMP, DEPT
  5. 3 WHERE EMP.DEPTNO = DEPT.DEPTNO;
  6.  
  7. EMPNO ENAME DEPTNO DNAME
  8. ---------- ---------- ---------- --------------
  9. 7369 SMITH 20 RESEARCH
  10. 7499 ALLEN 30 SALES
  11. 7521 WARD 30 SALES
  12. 7566 JONES 20 RESEARCH
  13. 7654 MARTIN 30 SALES
  14. 7698 BLAKE 30 SALES
  15. 7782 CLARK 10 ACCOUNTING
  16. 7788 SCOTT 20 RESEARCH
  17. 7839 KING 10 ACCOUNTING
  18. 7844 TURNER 30 SALES
  19. 7876 ADAMS 20 RESEARCH
  20. 7900 JAMES 30 SALES
  21. 7902 FORD 20 RESEARCH
  22. 7934 MILLER 10 ACCOUNTING
  23. 1111 MILLER 10 ACCOUNTING
  24.  
  25. 15 개의 행이 선택되었습니다.
  26.  
  27. SQL> SELECT EMPNO, ENAME, DEPTNO, DNAME
  28. 2 FROM EMP, DEPT
  29. 3 WHERE EMP.DEPTNO = DEPT.DEPTNO;
  30. SELECT EMPNO, ENAME, DEPTNO, DNAME
  31. *
  32. 1행에 오류:
  33. ORA-00918: 열의 정의가 애매합니다
  34.  
  35. SQL> -- DEPTNO는 EMP테이블과 DEPT테이블에 모두 존재하므로 어떤 테이블에서 가져올지
  36. SQL> -- 오라클은 판단하지 못한다. DEPTNO 대신에 DEPT.DEPTNO로 해보자
  37. SQL> SELECT EMPNO, ENAME, DEPT.DEPTNO, DNAME
  38. 2 FROM EMP, DEPT
  39. 3 WHERE EMP.DEPTNO = DEPT.DEPTNO;
  40.  
  41. EMPNO ENAME DEPTNO DNAME
  42. ---------- ---------- ---------- --------------
  43. 7369 SMITH 20 RESEARCH
  44. 7499 ALLEN 30 SALES
  45. 7521 WARD 30 SALES
  46. 7566 JONES 20 RESEARCH
  47. 7654 MARTIN 30 SALES
  48. 7698 BLAKE 30 SALES
  49. 7782 CLARK 10 ACCOUNTING
  50. 7788 SCOTT 20 RESEARCH
  51. 7839 KING 10 ACCOUNTING
  52. 7844 TURNER 30 SALES
  53. 7876 ADAMS 20 RESEARCH
  54. 7900 JAMES 30 SALES
  55. 7902 FORD 20 RESEARCH
  56. 7934 MILLER 10 ACCOUNTING
  57. 1111 MILLER 10 ACCOUNTING
  58.  
  59. 15 개의 행이 선택되었습니다.
  60.  
  61. SQL> -- 꼭 조건절에 EMP.DEPTNO = DEPT.DEPTNO 를 명시해 주어야 하는가?
  62. SQL> -- 아래를 수행하면 4장에서 잠시 맛을 본 카테시안 곱이 되버린다.
  63. SQL> -- 여러분은 머리속에 있는 것을 모두 SQL로 표현해야만 합니다. 머리속에 맴돌게 하지
  64. SQL> -- 마시고 표현을 하세요. ^^;
  65. SQL> SELECT EMPNO, ENAME, DEPT.DEPTNO, DNAME
  66. 2 FROM EMP, DEPT;
  67.  
  68. EMPNO ENAME DEPTNO DNAME
  69. ---------- ---------- ---------- -----------
  70. 7369 SMITH 10 ACCOUNTING
  71. 7499 ALLEN 10 ACCOUNTING
  72. 7521 WARD 10 ACCOUNTING
  73. . . . .
  74. . . . .
  75. . . . .
  76. 7900 JAMES 40 OPERATIONS
  77. 7902 FORD 40 OPERATIONS
  78. 7934 MILLER 40 OPERATIONS
  79. 1111 MILLER 40 OPERATIONS
  80.  
  81. 60 개의 행이 선택되었습니다.
  82.  
  83. SQL> -- 조인을 실습하기 위한 환경 만들기.
  84. SQL> UPDATE EMP
  85. 2 SET DEPTNO = NULL
  86. 3 WHERE EMPNO=1111;
  87.  
  88. 1 행이 갱신되었습니다.
  89.  
  90. SQL> SELECT DEPTNO FROM EMP
  91. 2 WHERE EMPNO = 1111;
  92.  
  93. DEPTNO
  94. ----------
  95. SQL> -- 아래의 예제를 유심히 살펴보시길...
  96. SQL> -- 외부조인의 표준과 오라클의 방법이 있는데 표준을 사용할 것을 필자는 권장함...
  97. SQL> -- MS-SQL SERVER 는 (+) 기호로 외부조인이 안됌
  98. SQL> -- 왼쪽 외부 조인 (표준방법)
  99. SQL> SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO
  100. 2 FROM EMP LEFT OUTER JOIN DEPT
  101. 3 ON EMP.DEPTNO = DEPT.DEPTNO;
  102.  
  103. EMPNO ENAME DEPTNO
  104. ---------- ---------- ----------
  105. 7369 SMITH 20
  106. 7499 ALLEN 30
  107. 7521 WARD 30
  108. 7566 JONES 20
  109. 7654 MARTIN 30
  110. 7698 BLAKE 30
  111. 7782 CLARK 10
  112. 7788 SCOTT 20
  113. 7839 KING 10
  114. 7844 TURNER 30
  115. 7876 ADAMS 20
  116. 7900 JAMES 30
  117. 7902 FORD 20
  118. 7934 MILLER 10
  119. 1111 MILLER --> 이 행이 어떻게해서 나왔을까를 생각해야 함
  120.  
  121. 15 개의 행이 선택되었습니다.
  122. SQL> -- 오라클에서는 아래와 같이 왼쪽 외부조인을 수행할 수 있다.
  123. SQL> -- (+) 기호가 붙은 의미는 왼쪽에 있는 테이블(여기서는 EMP)에 덧붙인다는 의미로 보
  124. SQL> -- 면 된다.
  125. SQL> -- SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO
  126. 2 -- FROM EMP, DEPT
  127. 3 -- WHERE EMP.DEPTNO = DEPT.DEPTNO(+);
  128. SQL>
  129. SQL> -- 오른쪽 외부 조인 (표준방법)
  130. SQL> SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO
  131. 2 FROM EMP RIGHT OUTER JOIN DEPT
  132. 3 ON EMP.DEPTNO = DEPT.DEPTNO;
  133.  
  134. EMPNO ENAME DEPTNO
  135. ---------- ---------- ----------
  136. 7369 SMITH 20
  137. 7499 ALLEN 30
  138. 7521 WARD 30
  139. 7566 JONES 20
  140. 7654 MARTIN 30
  141. 7698 BLAKE 30
  142. 7782 CLARK 10
  143. 7788 SCOTT 20
  144. 7839 KING 10
  145. 7844 TURNER 30
  146. 7876 ADAMS 20
  147. 7900 JAMES 30
  148. 7902 FORD 20
  149. 7934 MILLER 10
  150. 40 --> 이 행이 어떻게해서 나왔을까를 생각해야 함
  151.  
  152. 15 개의 행이 선택되었습니다.
  153.  
  154. SQL> -- 오라클에서는 오른쪽 외부 조인인 아래와 같이 해도 된다.
  155. SQL> -- SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO
  156. 2 -- FROM EMP, DEPT
  157. 3 -- WHERE EMP.DEPTNO(+) = DEPT.DEPTNO;
  158. SQL> -- 양쪽 외부 조인 (표준방법)
  159. SQL> SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO
  160. 2 FROM EMP FULL OUTER JOIN DEPT
  161. 3 ON EMP.DEPTNO = DEPT.DEPTNO;
  162.  
  163. EMPNO ENAME DEPTNO
  164. ---------- ---------- ----------
  165. 7369 SMITH 20
  166. 7499 ALLEN 30
  167. 7521 WARD 30
  168. 7566 JONES 20
  169. 7654 MARTIN 30
  170. 7698 BLAKE 30
  171. 7782 CLARK 10
  172. 7788 SCOTT 20
  173. 7839 KING 10
  174. 7844 TURNER 30
  175. 7876 ADAMS 20
  176. 7900 JAMES 30
  177. 7902 FORD 20
  178. 7934 MILLER 10
  179. 1111 MILLER --> 이 행이 어떻게해서 나왔을까를 생각해야 함
  180. 40 --> 이 행이 어떻게해서 나왔을까를 생각해야 함
  181.  
  182. 16 개의 행이 선택되었습니다.
  183.  
  184. SQL> -- 아쉽게도 이렇게 되지는 않는다. 양쪽 외부조인을 할때는 표준을 따라야 한다.
  185. SQL> SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO
  186. 2 FROM EMP, DEPT
  187. 3 WHERE EMP.DEPTNO(+) = DEPT.DEPTNO(+);
  188. WHERE EMP.DEPTNO(+) = DEPT.DEPTNO(+)
  189. *
  190. 3행에 오류:
  191. ORA-01468: outer-join된 테이블은 1개만 지정할 수 있습니다
  192.  
  193. SQL> -- 다음을 비교해 보시기 바랍니다.
  194. SQL> SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO
  195. 2 FROM EMP, DEPT
  196. 3 WHERE EMP.DEPTNO(+) = DEPT.DEPTNO
  197. 4 AND EMPNO(+) = 7521;
  198.  
  199. EMPNO ENAME DEPTNO
  200. ---------- ---------- ----------
  201. 10
  202. 20
  203. 7521 WARD 30
  204. 40
  205.  
  206. SQL> SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO
  207. 2 FROM EMP RIGHT OUTER JOIN DEPT
  208. 3 ON EMP.DEPTNO = DEPT.DEPTNO
  209. 4 WHERE EMP.EMPNO = 7521; --> WHERE 절을 유심히...
  210.  
  211. EMPNO ENAME DEPTNO
  212. ---------- ---------- ----------
  213. 7521 WARD 30
  214.  
  215. SQL> SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO
  216. 2 FROM EMP RIGHT OUTER JOIN DEPT
  217. 3 ON EMP.DEPTNO = DEPT.DEPTNO
  218. 4 AND EMP.EMPNO = 7521; --> ON 절에 AND 를 이용해서 연산을 한다.
  219.  
  220. EMPNO ENAME DEPTNO
  221. ---------- ---------- ----------
  222. 7521 WARD 30
  223. 40
  224. 20
  225. 10
  226.  
  227. SQL> SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO
  228. 2 FROM EMP LEFT OUTER JOIN DEPT --> 왼쪽 외부 조인 사용
  229. 3 ON EMP.DEPTNO = DEPT.DEPTNO
  230. 4 AND EMP.EMPNO IN (7521, 7369, 7788);
  231.  
  232. EMPNO ENAME DEPTNO
  233. ---------- ---------- ----------
  234. 7369 SMITH 20
  235. 7499 ALLEN
  236. 7521 WARD 30
  237. 7566 JONES
  238. 7654 MARTIN
  239. 7698 BLAKE
  240. 7782 CLARK
  241. 7788 SCOTT 20
  242. 7839 KING
  243. 7844 TURNER
  244. 7876 ADAMS
  245. 7900 JAMES
  246. 7902 FORD
  247. 7934 MILLER
  248. 1111 MILLER
  249.  
  250. 15 개의 행이 선택되었습니다.
  251.