SELECT name, dept_id, title
FROM s_emp
WHERE dept_id = 100
UNION ALL
SELECT name, dept_id, title
FROM s_emp
WHERE dept_id = 113
ORDER BY 1;
6.1 Join의 개념
- Join이란?
- 하나 이상의 테이블로부터 연관된 데이터를 검색해오는 방법
- 일반적인 경우는 행들은 Primary Key(PK)와 Foreign Key(FK) 값의 연관에 의해 JOIN이 성립된다
- 어떤 경우에는 이러한 PK, FK 관계가 없어도 논리적인 값들의 연관만으로 JOIN이 성립되기도 한다
6.2 Join의 종류
Join 방법 | 의미 |
Equijoin | 칼럼 간의 값들이 서로 정확히 일치하는 경우 일반적으로 PK, FK 관계에 의함 |
Non-Equijion | 한 칼럼의 값이 다른 칼럼의 값과 정확히 일치하지 않는 경우에 사용 |
Outer Join | JOIN 조건을 만족하지 않은 경우에도 모든 행들을 다 보려는 경우 |
Self Join | 같은 테이블에 있는 행들을 JOIN 하고자 하는 경우 |
- Join에 대한 조건이 생략되거나 잘못 기술되면, 한 테이블에 있는 모든 행들이 다른 테이블에 있는 모든 행들과 JOIN 된다 → Cartesian Product
- 이런 결과를 얻지 않기 위해서 반드시 Join 에 WHERE을 기술해야한다
6.3 EQUIJOIN
SELECT 테이블명.칼럼명, 테이블명.칼럼명 ...
FROM 테이블1, 테이블2
WHERE 테이블1.칼럼1 = 테이블2.칼럼2;
--직원(s_emp) 테이블과 부서(s_dept) 테이블을 join하여, 사원의 이름과, 부서, 부서명을 나타내시오
select s_emp.name, s_emp.dept_id, s_dept.name
from s_emp, s_dept
where s_emp.dept_id = s_dept.id;
6.5 칼럼과 테이블의 ALIAS사용
SELECT e.name 사원명, e.dept_id, d.name 부서명
FROM s_emp e, s_dept d
WHERE e.dept_id = d.id;
- 일단 ALIAS를 지정했으면, 테이블명 대신에 반드시 ALIAS를 써야한다.
- 컬럼에 대한 ALIAS를 지정함으로써 출력시 컬럼 표기를 명확히 할 수 있다
6.6 NON-EQUIJOIN
--직원 테이블(S_EMP)과 급여 테이블(SALGRADE)을 JOIN하여 사원의 이름과 급여, 그리고 해당 급여등급을 나타내시오
select e.name, e.salary, g.grade 급여등급
from s_emp e, salgrade g
where e.salary between g.losal and g.hisal;
6.7 OUTER JOIN
--직원(S_EMP)테이블과 고객(S_CUSTOMER)테이블에서 사원의 이름과 사번, 그리고 각 사원의 담당고객 이름을 나타내시오
-- 고객에 대하여 담당영업사원이 없더라고 모든 고객의이름을 나타내고, 사번 순으로 오름차순 정렬하시오
select e.name 사원명, e.id, c.name 고객명
from s_emp e, s_customer c
where e.id(+) = c.sales_rep_id
order by 2;
- OUTER JOIN을 하는 경우네는 (+) 연산자를 사용한다
- (+)를 사용하는 위치는 JOIN할 데이터가 부족한 쪽에 위치 시킨다
- (+)는 WHERE 절에서 비교연산자 기준으로 좌변, 우변의 어느 한쪽에 위치시킨다
- OUTER JOIN에서 IN이나 OR을 사용할 수 없다
6.8 SELF JOIN
select w.id 사번, w.name 사원명, m.id 부서장사번, m.name 부서장명
from s_emp w, s_emp m
where w.manager_id = m.id;
- SELF JOIN으로 하나의 테이블을 마치 여러개인 것처럼 사용가능
- 반드시 테이블에 대한 ALIAS를 각기 다르게 지정해야한다
- 컬럼의 이름 앞에 반드시 테이블의 ALIAS를 붙여한다
- SELF JOIN의 횟수는 제한되어 있지 않다
--직원 중에 '김정미'와 같은 직책(title)을 가지는 사원의 이름과 직책,급여,부서번호를 나타내시오
select s.name 사원이름, s.title 직책, s.salary 급여, s.dept_id 부서번호
from s_emp s, s_emp e
where e.title = '과장' AND s.id = e.id;
6.10 SET 연산자의 종류
Set 연산자 | 의미 |
UNION | 각 QUERY 결과의 합집합 |
UNION ALL | 각 QUERY 결과의 합집합에 공통부분을 더함 |
INTERSECT | 각 QUERY결과의 교집합 |
MINUS | 첫번째 QUERY 결과와 두번째 QUERY결과의 차집합 |
- 첫번째 SELECT 구문에서 기술된 칼럼들과 두번째 SELECT구문에서 기술된 칼럼들은 그 개수와 타입이 일치해야한다
- FROM절 뒤에 기술된 테이블은 서로 다를 수도, 같을 수도 있다
- 칼럼의 HEADING는 첫번쨰 SELECT 구문의 컬럼명이 출력된다
- ORDER BY절은 마지막에 한번만 기술한다