이 게시글은 패스트캠퍼스의 '데이터베이스와 SQLD 합격패스 Online' 강의를 요약한 내용입니다.
일반 집합 연산자 | 설명 |
---|---|
INNER JOIN | JOIN 조건에서 동일한 값이 있는 행만 반환 |
NATURAL JOIN | 두 테이블 간의 동일한 이름을 갖는 모든 컬럼에 대해 EQUI(=) JOIN 수행 |
USING 조건절 | 같은 이름을 가진 컬럼들 중에서 원하는 컬럼에 대해서만 선택적으로 EQUI JOIN 가능 |
ON 조건절 | 컬럼 명이 다르더라도 JOIN 조건을 사용할 수 있음 |
CROSS JOIN | 일반 집합 연산자의 PRODUCT 개념으로, JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 말함 |
OUTER JOIN | JOIN 조건에서 동일한 값이 없는 행도 반환할 때 사용할 수 있음 |
--INNER JOIN 예시
SELECT A.EMP_NO
, A.EMP_NM
, A.ADDR
, B.DEPT_CD
, B.DEPT_NM
FROM TB_EMP A, TB_DEPT B
WHERE A.DEPT_CD = B.DEPT_CD
AND A.ADDR LIKE '%수원%'
ORDER BY A.EMP_NO
;
SELECT A.EMP_NO
, A.EMP_NM
, A.ADDR
, DEPT_CD
, B.DEPT_NM
FROM TB_EMP A NATURAL JOIN TB_DEPT B
WHERE A.ADDR LIKE '%수원%'
;
NATURAL JOIN을 할 때, JOIN 컬럼에 앨리어스를 지정하면 안된다.
-- 앨리어스를 지정하는 경우, SQL이 실행되지 않는다.
SELECT A.EMP_NO
, A.EMP_NM
, A.ADDR
, B.DEPT_NM
, **B.DEPT_CD**
FROM TB_EMP A NATURAL JOIN TB_DEPT B
WHERE A.ADDR LIKE '%수원%'
;
1) USING 절은 FROM 구문과 함께 사용한다.
2) USING 절에 두 테이블이 공통적으로 가지고 있는 컬럼명을 기재한다.
3) USNING 절에 들어가는 조인 컬럼에는 앨리어스를 쓸 수 없다.
SELECT A.EMP_NO
, A.EMP_NM
, A.ADDR
, B.DEPT_NM
, DEPT_CD
FROM TB_EMP A JOIN TB_DEPT B USING (DEPT_CD)
WHERE A.ADDR LIKE '%수원%'
;
-- 앨리어스를 지정하는 경우, SQL이 실행되지 않는다.
SELECT A.EMP_NO
, A.EMP_NM
, A.ADDR
, B.DEPT_NM
, DEPT_CD
FROM TB_EMP A JOIN TB_DEPT B USING (**B.DEPT_CD**)
WHERE A.ADDR LIKE '%수원%'
;
1) ON 절은 FROM 구문과 함께 사용한다.
2) ON 절 내에 조인 컬럼에 앨리어스를 사용해야 한다.
3) 앨리어스를 정확히 기재하지 않으면 에러가 발생한다.
SELECT A.EMP_NO
, A.EMP_NM
, A.ADDR
, B.DEPT_CD
, B.DEPT_NM
FROM TB_EMP A JOIN TB_DEPT B ON (A.DEPT_CD = B.DEPT_CD)
WHERE A.ADDR LIKE '%수원%'
;
-- 앨리어스를 지정하지 않는 경우, SQL이 실행되지 않는다.
SELECT A.EMP_NO
, A.EMP_NM
, A.ADDR
, **DEPT_CD**
, B.DEPT_NM
FROM TB_EMP A JOIN TB_DEPT B ON (A.DEPT_CD = B.DEPT_CD)
WHERE A.ADDR LIKE '%수원%'
;
1) 3개의 테이블을 조인하는데 조인 조건은 2개가 필요하다.
2) N개의 테이블을 조인하는데 조인 조건은 N-1개가 필요하다.
SELECT
A.EMP_NO
, A.EMP_NM
, A.ADDR
, B.DEPT_CD
, B.DEPT_NM
, C.CERTI_CD
FROM TB_EMP A
, TB_DEPT B
, TB_EMP_CERTI C
WHERE A.DEPT_CD = B.DEPT_CD
AND A.ADDR LIKE '%수원%'
AND A.EMP_NO = C.EMP_NO
ORDER BY A.EMP_NO;
SELECT A.EMP_NO
, A.EMP_NM
, A.ADDR
, B.DEPT_NM
, B.DEPT_CD
, C.CERTI_CD
FROM TB_EMP A JOIN TB_DEPT B
ON (A.DEPT_CD = B.DEPT_CD)
JOIN TB_EMP_CERTI C
ON (A.EMP_NO = C.EMP_NO)
WHERE A.ADDR LIKE '%수원%';
1) LEFT (A = TB_EMP)는 다 나오고, RIGHT(B = TB_DEPT)는 매칭되는 것만 나오게 됨
SELECT A.EMP_NO
, A.EMP_NM
, B.DEPT_CD
, B.DEPT_NM
FROM TB_EMP A, TB_DEPT B
WHERE A.DEPT_CD IN ( '000000', '100001')
AND A.DEPT_CD = B.DEPT_CD(+)
;
SELECT A.EMP_NO
, A.EMP_NM
, B.DEPT_CD
, B.DEPT_NM
FROM TB_EMP A
LEFT OUTER JOIN TB_DEPT B
ON (A.DEPT_CD = B.DEPT_CD)
WHERE A.DEPT_CD IN ( '000000', '100001')
;
1) LEFT (A = TB_EMP)는 매칭되는 것만 나오고, RIGHT(B = TB_DEPT)는 다 나옴
SELECT A.EMP_NO
, A.EMP_NM
, B.DEPT_CD
, B.DEPT_NM
FROM TB_EMP A
, TB_DEPT B
WHERE B.DEPT_CD IN ('100014', '100015', '100001')
AND A.DEPT_CD(+) = B.DEPT_CD ;
SELECT
A.EMP_NO
, A.EMP_NM
, B.DEPT_CD
, B.DEPT_NM
FROM TB_EMP A
FULL OUTER JOIN TB_DEPT B ON (A.DEPT_CD = B.DEPT_CD)
WHERE 1 = 1
AND ( A.EMP_NO IS NULL
OR B.DEPT_CD IS NULL
)
ORDER BY B.DEPT_CD DESC, A.EMP_NO DESC
;
1) EMP_NO가 NULL 이거나, DEPT_CD가 NULL 인 것에 대한 조건을 주었다.
2) EQUI 조인에 실패한 것들만 추출
3) JOIN 조건에서 동일한 값이 없는 행도 반환
SELECT
A.EMP_NO
, A.EMP_NM
, B.DEPT_CD
, B.DEPT_NM
FROM TB_EMP A
FULL OUTER JOIN TB_DEPT B ON (A.DEPT_CD = B.DEPT_CD)
WHERE 1 = 1
AND ( A.EMP_NO IS NULL
OR B.DEPT_CD IS NULL
)
ORDER BY B.DEPT_CD DESC, A.EMP_NO DESC
;