본문 바로가기
IT/SQL

JOIN

by 봉즙 2019. 6. 7.

Join : 하나 이상의 테이블로부터 연관된 데이터를 검색하는 방법. 일반적인 경우 행들은 Primary Key(PK)와 Foreign Key(FK) 값의 연관에 의해 JOIN이 성립되기에 테이블 간의 연결고리가 필요하다. PK, FK 관계가 없더라도 논리적 값들의 연관만으로도 Join이 성립된다. 만약 3개의 테이블을 연결하기 위해서는 최소 2개이상의 연결 고리가 필요하다.

Join의 방법 4가지 

  1. EQUIJOIN : 칼럼 간의 값들이 서로 정확히 일치하는 경우에 사용, 일반적으로 PK, FK 관계에 의함
  2. OUTERJOIN : 한 칼럼의 값이 다른 칼럼의 값과 정확히 일치하지는 않는 경우에 사용
  3. NON-EQUIJOIN : JOIN 조건을 만족하지 않는 경우에도 모든 행들을 다보려는 경우에 사용
  4. SELF JOIN : 같은 테이블에 있는 행들을 join하고자 하는 경우에 사용
  • EQUIJOIN
1
2
3
SELECT 테이블명.칼럼명, 테이블명.칼럼명,....
FROM 테이블1, 테이블2
WHERE 테이블1.칼럼1 = 테이블2.칼럼2;

테이블명.칼럼명 : 검색해올 데이터가 어디서 오는지 테이블과 칼럼을 밝혀준다.

테이블1.칼럼1 = 테이블2.칼럼2 : 두 테이블간에 논리적으로 값을 연결시키는 칼럼  간의 조건을 기술한다.

JOIN을 위한 테이블이 N개라면, JOIN에 대한 조건은 최소한 N-1 개 JOIN 조건이 필요하다.  복합키의 경우에는 모든 키가 JOIN조건에 포함되어야한다.

1
2
3
4
5
from s_emp, s_dept, s_region
where s_emp.dept_id = s_dept.id
and s_dept.region_id = s_region.i

예제)

1
2
3
4
5
--Q4. 직원(S_EMP) 테이블과 부서(S_DEPT)테이블을 JOIN 하여, 사원의 이름과 부서 , 부서명을 나타내시오(join)
SELECT e.name, e.dept_id, d.name--dept_id연결?
from s_emp e, s_dept d
where e.dept_id=d.id
;

※칼럼과 테이블의 ALIAS사용

1
2
3
SELECT e.name 사원명, e.dept_id, d.name 부서명
FROM s_emp e, s_dept d
WHERE e.dept_id = d.id;

테이블명.칼럼명으로 기술할때, 테이블에 대한 ALIAS를 지정하며, 지정했다면 반드시 ALIAS를 테이블명대신 사용해야한다.

1
2
3
4
5
6
7
select e.name,d.name
from s_emp e, s_dept d, s_region r
where e.dept_id = d.Id --e와 d연결
and d.region_id = r.id--d와 r연결
;

 

  • NON-EQUIJOIN
1
2
3
4
5
--Q6. 직원테이블(s_EMP)과 급여 테이블 (SALGRADE) 을 JOIN하여
--사원의 이름과 급여, 그리고 해당 급여등급을 나타내시오.(non-equijoin)
SELECT e.name, e.salary, g.grade --급여등급
FROM s_emp e, salgrade g
WHERE e.salary BETWEEN g.losal AND g.hisal;
 

컬럼의 값이 다른 컬럼의 값과 정확히 일치하지 않는 경우 = 연산자 외의 다른 연산자를 사용하여 Join하는 방법이다.
ex)특정 범위의 등급을 매길 때

  • OUTER JOIN
1
2
3
4
SELECT e.name 사원명, e.id, c.name 고객명
FROM s_emp e, s_custoemr c
WHERE e.id (+= c.sales_rep_id
ORDER BY 2;

Join되지 않은 결과도 출력한다. OUTER JOIN의경우 (+)산자를 사용하며, JOIN할 데이터가 부족한 쪽에 위치시키며, WHERE절에서 비교연산자 기준으로 위치시킨다. 단, OUTER JOIN에서 IN이나 OR를 사용할 수 없다.

예제)

1
2
3
4
5
6
--Q7. 직원(S_EMP)테이블과 고객(S_CUSTOMER)테이블에서 사원의 이름과 사번, 그리고 각 사원의 담당고객 이름을 나타내시오, 단 고객에 대하여
--담당영업사원이 없더라도 모든 고객의 이름을 나타내고 사번순으로 오름차순 정렬하시오.
SELECT e.name 사원명, e.id, c.name 고객명 --OUTERJOIN
FROM s_emp e, s_customer c
WHERE e.id(+= c.sales_rep_id
order by 2;--담당자가 배정되지 않은 고객목록을 나타냄
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

  

1
2
3
4
SELECT e.name 사원명, e.id, c.name 고객명 --OUTERJOIN
FROM s_emp e, s_customer c
WHERE e.id = c.sales_rep_id(+)
order by 3 DESC;--배정된 고객이 없는 담당자의 목록

 

  • SELF JOIN
1
2
3
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의 횟수는 제한이 없다.

1
2
3
4
5
6
7
--Q8. 직원중에 '김정미'와 같은 직책(title)을 가지는 사원의 이름과 직책,급여, 부서번호를 나타내시오(SELF JOIN사용할것)
SELECT a.name 이름, a.title 직책, a.salary 급여, a.dept_id 부서번호
FROM s_emp a, s_emp b
WHERE a.title = b.title --타이틀셀프조인하고  and를써서 김정미랑 같은 직급 골라내고싶은데
AND b.name = '김정미'
AND a.name <> '김정미'
;
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

'IT > SQL' 카테고리의 다른 글

SubQUERY  (0) 2019.06.07
SET연산자  (0) 2019.06.07
Developer 설치  (0) 2019.06.07
SUBGROUP으로 데이터 분류  (0) 2019.06.05
함수 2가지  (0) 2019.06.05

댓글