1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
--조인(JOIN)
  -- : n개의 테이블간에 필요한 컬럼 정보를 하나로 출력하기 위해 사용됨
 
-- [ Inner JOIN ] : 완전히 일치하는 데이터만 나오는 방식(일반적인 조인 방식)
 
select e.First_name, e.Last_name, e.Email 이메일, d.DEPARTMENT_NAME 부서명
from Employees e, Departments d
where e.DEPARTMENT_ID = d.DEPARTMENT_ID; -- 두 정보가 완전히 일치하는 정보들만 출력됨
-- 즉, 이 경우는 값이 다른 값들은 출력되지 않음
-- 단순히 부서명 컬럼이 하나 더 필요해서 조인을 하는 경우는 이렇게하면 출력되지 않는 값들이 생겨
-- 원하는 데이터들을 뽑아내지 못할 수 있다.
 
select emp.first_name || emp.last_name 이름, emp.email 이메일, emp.department_id,
       dep.department_name 부서명, j.job_title 직급, l.CITY 지역
from Employees emp,
     Departments dep,
     jobs j,
     locations l
where emp.department_id = dep.department_id
      and emp.job_id = j.job_id
      and dep.location_id = l.location_id
      -- 여기까지 조인조건
      and l.city = 'Seattle'; -- 일반조건
           
 
--[ Self JOIN ]
    --  자신의 테이블에서 자신의 테이블을 조인해서 사용하는 방식
    --  왜 필요??
      -- ex) Employees 테이블에서 한 튜플의 직원 정보에서 그 사람의 상급자인 manager_id값이 있다.
          -- 이 manager_id는 상급자의 사원번호인데 이 사원번호 정보는 동일 테이블인 Employees에 있다.
          -- 왜? 상급자도 직원이기 때문에 같은 테이블에 정보가 있고 따라서 같은 테이블을 참고할 일이 생김
          -- 아래의 경우, 셀프조인을 하지 않으면 emp2.FIRST_NAME인 상사의 이름에 해당하는 필드는 가져올 방법이 없다.
 
select emp1.EMPLOYEE_ID, emp1.FIRST_NAME,
       emp2.EMPLOYEE_ID 상사ID,
       emp2.FIRST_NAME 상사이름
from Employees emp1, Employees emp2
where emp1.manager_id = emp2.employee_id;
 
------------------------------------------------------------------------------------------
 
 
--[ Outer JOIN(외부 조인) ]
  -- left outer join, right outer join, full outer join이 있다.
  -- full outer join은 ANSI 표준 문법으로만 작성이 가능하고 ORACLE 전용 문법으로는 불가능하다.
 
select emp.employee_id,
       emp.first_name,
       emp.department_id,
       dep.department_name
from Employees emp, departments dep
where emp.department_id = dep.department_id;
-- 106명 출력
 
select * from Employees; -- 107명 
-- 왜 106명 107명 다를까? 둘다 완전히 일치한 경우만 출력되기 때문(inner join), null값인 경우 출력안됐을 것...
-- 따라서, 이런 경우 Outer Join 방식을 사용해야 함
 
select emp.employee_id,
       emp.first_name,
       emp.department_id,
       dep.department_name,
       loc.CITY
from Employees emp, departments dep, locations loc
where emp.department_id = dep.department_id (+)
      and dep.location_id = loc.location_id (+);
-- 즉, 이러한 방식은 Oracle 전용 문법임, ANSI 표준은 from에 left outer join혹은 right outer join식으로 써야함
-- 즉, 오라클 문법에서 outer join은 (+)로 나타내며, 전부 출력되어야 하는 테이블의 반대편에 붙여주게 된다.
 
 
-- ANSI 표준 방식으로 작성한 3중 left outer join
select emp.employee_id,
       emp.first_name,
       emp.department_id,
       dep.department_name,
       loc.city
from Employees emp left outer join departments dep
  on emp.department_id = dep.department_id
  left outer join locations loc
  on dep.location_id = loc.location_id;
 
      

+ Recent posts