본문 바로가기
2019/ORACLE

SQL JOIN equi / non-equi / self / outer / inner

by SOLYI 2019. 11. 18.

 

  설멍 사용 방법
Equi join 동일 컬럼 기준으로 조인

from employees e, departments d

where e.department_id = d.department_id

Non-Equi join 동일 컬럼 없이 다른 조건을 사용하여 조인

from emp, salgrade
where sal between losan and hisal;

from emp e, salgrade s
where e.sal>s.losal and e.sal<=s.hisal;

Self join

시소를 연상

한 테이블 내에서 조인 

=자기 자신과 조인


from emp e1, emp e2 
where e1.mgr = e2.empno;

Outer join

조인 조건에 만족하지 않는 행도 나타냄

select d.dname, empno, e.ename 
from emp e, dept d 
where e.deptno(+) = d.deptno;

left outer join

왼쪽 값 전체 출력

FROM DEPT01 LEFT OUTER JOIN DEPT02
ON DEPT01.DEPTNO = DEPT02.DEPTNO;

right outer join

오른쪽 값 전체 출력

FROM DEPT01 RIGHT OUTER JOIN DEPT02 
ON DEPT01.DEPTNO = DEPT02.DEPTNO;

full outer join

전체 출력

from a1 full outer join a2
on a1.id= a2.id;

inner join

겹치는 값만 출력

SELECT * FROM table1 INNER JOIN table2
ON table1.column1 = table2.column2

별칭 붙이기

From 절에서 테이블 이름을 명시하고

공백 별칭 (as는 없어야한다)

from employees e, departments d

where e.department_id = d.department_id

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
--join--
select empno, ename, deptno
from emp;
select dname, loc, deptno
from dept;
 
 
--cross join
select *
from emp, dept;
 
select *
from emp, dept
where emp.deptno = dept.deptno;
 
--deptno만 출력하려고 할 경우 에러 발생
--emp와 dept 중, 어느 deptno인지 모르므로, emp.deptno 라고 표현 해주어야 한다.
select empno, ename, job, emp.deptno, sal, dname, loc
from emp, dept
where emp.deptno = dept.deptno;
cs

 

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
--equi join--
select * from emp, dept
where emp.deptno = dept.deptno;  
 
select * from emp e, dept d
where e.deptno = d.deptno;
 
--뉴욕에서 근무하는 사원의 이름과 급여를 출력하시오
select ename, sal
from emp e, dept d
where e.deptno=d.deptno
    and loc = 'NEW YORK';
 
--ACCOUNTING 부서 소속 사원의
--이름과 입사일을 출력하시오
select ename, hiredate
from emp e, dept d
where e.deptno= d.deptno
    and dname = 'ACCOUNTING';
 
--성과급을 받는 사원의 사원이름, 급여, 성과급을
-- 급여 많이 받는 순으로,
-- 같은 급여를 받을 시에는 성과급을 많이 받는 사원 순으로 출력하시오
select first_name || ' ' ||last_name, salary, salary*commission_pct as "성과금"
from employees
where commission_pct is not null
order by salary desc, salary*commission_pct desc;
 
 
--직급이 manager인 사원의 이름, 부서명을 출력하시오
select ename, dname
from emp e, dept d
where e.deptno = d.deptno
    and job = 'MANAGER';
 
--table 3개 연결
--hr에서 사원번호와 이름, 급여, 부서명, 직책명을 출력하시오.
select employee_id, first_name, salary, department_name, job_title
from employees e, departments d, jobs j
where e.department_id = d.department_id
    and e.job_id = j.job_id;
 
--hr에서 사원번호와 이름, 급여, 부서명, 근무하는 도시와 국가를 출력하시오
select employee_id, first_name, salary, department_name, city, country_name
from employees e, departments d, countries c, locations l
where e.department_id = d.department_id
    and d.location_id = l.location_id
    and l.country_id = c.country_id;
 
 
--non-equi join--
select * from salgrade;
select sal from emp;
 
select empno, ename, sal, grade
from emp e, salgrade s
where e.sal>s.losal and e.sal<=s.hisal;
 
select * from emp;
 
--self join = null값은 보이지 않는다.
select  e1.ename, e2.ename
from emp e1, emp e2 
where e1.mgr = e2.empno;
 
--매니저가 KING인 사원의 이름과 직급을 출력하세요
select e1.ename, e1.job
from emp e1, emp e2
where e1.mgr = e2.empno
    and e2.ename = 'KING';
    
--ALLEN과 동일한 부서에서 근무하는 사원의 사원이름을 출력하시오.
select e2.ename
from emp e1, emp e2
where e1.deptno = e2.deptno
    and e1.ename = 'ALLEN'
    and e2.ename <> 'ALLEN';
 
--outer join-- 시소를 연상하면 이해하기 편하다
--조인 조건에 만족하지 못하였더라도 해당 로우를 나타내고 싶을 때에
--사용하는 것이 외부 조인(Outer Join) 입니다. 
select e1.ename, e2.ename
from emp e1, emp e2
where e1.mgr = e2.empno(+);
 
--매니저값이 null인 KING사원은 CEO이므로, null자리에 CEO를 써준다.
select e1.ename, nvl(e2.ename, 'CEO')
from emp e1, emp e2
where e1.mgr = e2.empno(+);
 
--
select distinct deptno
from emp;
select distinct deptno
from dept;
 
--부서명, 사원번호, 사원이름
select d.dname, empno, e.ename
from emp e, dept d
where e.deptno(+= d.deptno;
 
 
--full outer join--
--모든 값 출력 --full outer
--ansi 표준 sql문
--Oracle 에는 full outer join이 없기 때문에 ansi표준을 사용한다.
select *
from a1, a2
where a1.id(+= a2.id;
 
select *
from a1 full outer join a2
on a1.id= a2.id;
 
--inner join--
--겹치는 값만 출력
select *
from a1 inner join a2
on a1.id= a2.id;
 
--왼쪽값 전체출력
--where a1.id = a2.id(+); 값과 동일
select *
from a1 left outer join a2
on a1.id= a2.id;
--//left join 만 써도된다 (outer 생략 가능)
 
select *
from a1 left join a2
on a1.id= a2.id;
 
 
--오른쪽값 전체출력 
--where a1.id(+) = a2.id; 값과 동일
--//left와 마찬가지로 right join 만 써도된다.
select *
from a1 right outer join a2
on a1.id= a2.id;
cs
반응형

'2019 > ORACLE' 카테고리의 다른 글

SQL 문제 및 문제풀이 (~JOIN)  (2) 2019.11.19
정규화 개념 / 키 / 제1~3정규화 / 비정규화  (0) 2019.11.19
SQL group by (문제)  (0) 2019.11.18
SQL group by having  (0) 2019.11.18
SQL sum avg count max min  (0) 2019.11.18