본문 바로가기

DB/SQLD

SQL 활용 - 표준 조인

반응형

표준 조인(Standard join)

다양한 DBMS 벤더에서 자기들만의 문법을 쓰다가 표준을 정의해서 같이 쓰는중이다.

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
1. INNER JOIN
: join 조건에서 동일한 값이 있는 행만 반환한다.
// inner join 은 그동안 where 절에서 사용하던 join조건을 from 절에서 사용하겠다는 뜻이다.
 
SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;
// INNER 생략 가능 => FROM EMP JOIN DEPT
 
2. NATURAL JOIN
: 두 테이블 간의 '동일한 이름'을 갖는 '모든' 칼럼들에 대해 EQUI JOIN 수행
// ** NATURAL JOIN을 쓰면 USING 조건절, ON 조건절, WHERE 절에서 JOIN 조건을 정의할 수 없다.
SELECT DEPTNO, EMPNO, ENAME, DNAME
FROM EMP NATURAL JOIN DEPT;
// 자동으로 두 테이블의 DEPTNO 라는 부서번호를 공통 칼럼을 인식하여 JOIN을 처리한 것이다.
// JOIN에 사용된 칼럼들은 같은 데이터유형이면서 ALIAS나 테이블명과 같은 접두사를 붙일 수 없다.
// SELECT EMP.DEPTNO, .... 이런식으로 사용 불가.
 
SELECT * 
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;
// 이렇게 쓰면 NATURAL JOIN한 것과 출력되는 형식이 조금 다르다.
// NATURAL은 자동으로 조인한 컬럼이 제일 앞에나오고 다른 컬럼이 나오고
// INNER는 컬럼이 중복되서 2번나오고, 두 테이블칼럼이 순서대로 나온다.
 
3. USING 조건절
NATURAL JOIN 에서 모든 일치되는 컬럼들에 대해 JOIN이 이루어지지만
FROM 절의 USING 조건을 이용하면 원하는 칼럼에 대해서만 선택적으로 EQUI조인 가능.
SELECT *
FROM DEPT JOIN DEPT_TEMP
USING (DEPTNO);
// INNER JOIN의 USING 조건절로 수행
// USING 조건절을 이용한 EQUI JOIN에서도 NATURAL JOIN과 마찬가지로 ALIAS 사용불가
 
SELECT *
FROM DEPT JOIN DEPT_TEMP
USING (LOC, DEPTNO);
// 두개의 컬럼으로 INNER JOIN 수행
 
4. ON 조건절
JOIN 서술부(ON 조건절)와 비 JOIN 서술부(WHERE 조건절)를 분리하여 이해가 쉬우며, 칼럼명이 다르더라도 JOIN조건 사용할 수 있는 장점.
SELECT E.EMPNO, E.NAME, E.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO);
WHERE E.DEPTNO = 30;
//USING과 다르게 ON 조건절은 ALIAS나 테이블명 명과 같은 접두사 사용해야함.
//WHERE 절과 혼용하기.
 
SELECT TEAM_NAME, TEAM_ID, STADIUM_NAME
FROM TEAM JOIN STADIUM
ON TEAM.TEAM_ID = STADIUM.HOMETEAM_ID
ORDER BY TEAM_ID;
 
 
SELECT P.PLAYER_NAME 선수명, P.POSITION 포지션, T.REGION_NAME 연고지명, T.TEAM_NAME 팀명, S.STADIUM_NAME 구장명
FROM PLAYER P JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID
   JOIN STADIUM S
ON T.STADIUM_ID = S.STADIUM_ID
WHERE P.POSITION = 'GK'
ORDER BY 선수명;
 
5. CROSS JOIN (=카티션프로덕트)
: 그냥 모든 경우의 수 조인, M개 컬럼과 N개 컬럼을 기준으로 조인하면 M*N개의 레코드 생성
// 별로 필요한 경우가 많지 않다. 튜닝이나 리포트 작성용으로 고의적으로 사용하는 경우가 있을 순 있다.
SELECT ENAME, DNAME
FROM EMP CROSS JOIN DEPT
 
6. OUTER JOIN
INNER 조인과 대비하여 OUTER 조인이라 불림. 동일한 값이 없는 행도 반환할 때 사용.**
SELECT STADIUM_NAME, STADIUM.STADIUM_ID, SEAT_COUNT, HOMETEAM_ID, TEAM_NAME
FROM STADIUM LEFT OUTER JOIN TEAM
ON STADIUM.HOMETEAM_ID = TEAM.TEAM_ID
ORDER BY HOMETEAM_ID;
// 이렇게하면 홈팀이 없는 경기장정보도 나옴 즉, STADIUM테이블에만 있는 경기장 정보도 나옴
// RIGHT OUTER JOIN 은 오른쪽에 있는 테이블이 기준이 되어 결과 출력
// LEFT랑 반대.
 
FULL OUTER JOIN
합집합과 같은 결과를 나타냄 왼쪽,오른쪽 둘다 동일한 값이 없는 행도 나옴
SELECT *
FROM DEPT FULL OUTER JOIN DEPT_TEMP
ON DEPT.DEPTNO = DEPT_TEMP.DEPTNO;
 
 


Point

1. join은 반드시 사용하고 중요하다.

2. outer join 결과 예측

3. natural join 과 inner join 차이

4. on, using 조건절 사용 조건


반응형

'DB > SQLD' 카테고리의 다른 글

SQL 활용 - 계층형 질의  (0) 2017.09.08
SQL 활용 - 집합 연산자  (0) 2017.09.06
SQL 기본 - join  (0) 2017.09.05
SQL 기본 - order by 절  (0) 2017.09.04
SQL 기본 - group by, having 절  (0) 2017.09.03