[홍쌤의 데이터랩, SQLD n과목 완벽 정리] 영상를 개인이 정리하여 [원작자의 허가 이후] 올린 글이며,
[개인이 추가로 정리한 내용]이 포함되어 있습니다.
목차
조인 (JOIN)
- 여러 테이블의 데이터를 사용하여 동시 출력하거나 참조할 경우 사용
- FROM절에 조인 테이블 나열
- ORACLE 표준과 ANSI 표준은 특히 JOIN에서 다소 상이
- 동일한 열이 여러 테이블에 존재할 경우, 열 이름 앞에 별칭이나 테이블 이름 표시
- N개의 테이블을 조인하려면 N-1개 이상의 조인 조건 필요
ON/USING절
조인 조건을 명시하는 절
ON절
- 조인할 양 컬럼의 컬럼명이 다르더라도 사용 가능 (+ 타입이 다르면 자동형변환)
- EQUI JOIN, NON-EQUI JOIN 수행 시 모두 사용 가능
- ON 조건의 괄호는 생략 가능
- 컬럼명이 같을 경우, 테이블 이름이나 별칭을 사용하여 구분
- ON 조건절에서 조인 조건 명시, WHERE절에는 일반 조건 명시 권장
USING절
- 조인할 컬럼명이 같은 경우 사용
- 대상 컬럼을 기준으로 EQUI JOIN 실행
=> ON절을 이용해 EQUI JOIN을 수행할 시, 문법 및 가독성에 용이하여 사용
- 괄호 필수
e.g.
1) ON -> USING 변경
SELECT ...
FROM A a
INNER JOIN B b
--- ON a.id = b.id;
USING (id); --- 괄호 필수, 위와 같은 동작
조인의 분류
1. 조건의 형태에 따라
1. EQUI JOIN(등가 JOIN)
조인 조건이 동등 조건인 경우
2. NON-EQUI JOIN
조건이 동등 조건이 아닌 경우
2. 조인 결과에 따라
1. INNER JOIN
조인 조건에 성립하는 데이터만 출력하는 경우
2. OUTER JOIN
조인 조건에 성립하지 않는 데이터도 출력하는 경우
=> 기준이 되는 테이블에 따라 (LEFT/RIGHT/FULL) OUTER JOIN으로 나뉨
3. NATURAL JOIN
조인 조건 생략시 두 테이블에 같은 이름으로 자연 연결되는 조인
4. CROSS JOIN
조인 조건 생략시 두 테이블의 발생 가능한 모든 행을 출력하는 조인 (카타시안 곱 주의)
5. SELF JOIN
하나의 테이블을 두 번 이상 참조하여 연결하는 조인
표준 조인
ANSI 표준으로 작성되는 INNER JOIN, CROSS JOIN, NATURAL JOIN, OUTER JOIN(Oracle은 키워드 대신 (+)로 사용 가능)을 말함
조건의 형태에 따른 조인의 종류
1. EQUI JOIN - 조인 조건이 동등한 경우
- 조인 조건의 =(equal) 비교를 통해 같은 값을 가지는 행을 연결하여 결과를 얻는 방법
- SQL 명령문에서 가장 많이 사용
- FROM절에 조인하고자 하는 테이블 모두 명시
- WHERE절에 두 테이블의 공통 컬럼에 대한 조인 조건(동등 비교) 조건을 나열
- NULL 값 끼리의 동등 비교는 수행하지 않음
2. NON-EQUI JOIN - 조인 조건이 동등하지 않은 경우
- 조인 조건의 비교 연산자가 =가 아닌 조인
e.g. >, <=, BETWEEN
결과의 형태에 따른 조인의 종류 (in Oracle/ANSI 표준)
1. INNER JOIN - 조인 조건에 성립하는 데이터를 다룰 때
- 조인 조건이 일치하는 행만 추출 (Oracle default 조인)
- ANSI 표준의 경우 FROM절에 INNER JOIN 혹은 JOIN 명시 (같은 의미)
- ANSI 표준의 경우 USING 이나 ON 조건절을 필수적으로 사용
- Oracle의 경우 WHERE절 사용 (JOIN 키워드 x)
e.g.
1) ANSI 표준
SELECT ...
FROM A a
[INNER] JOIN B b ON a.id = b.id;
2) Oracle 표준
SELECT ...
FROM A a, B b
WHERE a.id = b.id;
2. OUTER JOIN - 조인 조건에 성립하지 않는 데이터도 다룰 때
- 기준이 되는 테이블에 따라 (LEFT/RIGHT/FULL) OUTER JOIN으로 나뉨
- 조인 조건에서 동일한 값이 없는 행도 반환할 때 사용
=> 두 테이블 중 한쪽이 NULL을 가져, INNER JOIN시 출력되지 않을 때 사용
- OUTER 생략 가능 (LEFT OUTER JOIN -> LEFT JOIN)
- Oracle 표준에서는 OUTER JOIN 키워드가 존재하지 않으므로, 기준 테이블의 반대에 (+)를 붙여 사용 가능
2-1. LEFT OUTER JOIN
- FROM절의 왼쪽 테이블의 데이터를 읽은 후, 오른쪽 테이블에서 JOIN 대상을 읽어옴
- 우측 값에서 같은 값이 없는 경우 NULL 출력
활용 예제
학생(left)/교수(right) 엔터티가 있을 때,
학생의 지도교수 테이블 출력(join)시, 지도교수를 담당받지 않은 학생까지 포함(left outer join)
e.g.
1) ANSI 표준
SELECT ...
FROM A a LEFT [OUTER] JOIN B b
ON a.id = b.id
WHERE ...;
2) Oracle 표준
SELECT ...
FROM A a, B b
WHERE a.id = b.id(+) --- LEFT가 기준 테이블 이므로, RIGHT에 (+) 표시
AND ...;
2-2. RIGHT OUTER JOIN
- LEFT OUTER JOIN의 반대
- 테이블 순서를 변경하여 LEFT OUTER JOIN으로 수행 가능
2-3. FULL OUTER JOIN
- 두 테이블 전체 기준으로 결과를 생성하여, 중복 데이터는 삭제 후 리턴
e.g.
1) ANSI 표준
SELECT ..
FROM A a FULL [OUTER] JOIN B b
ON a.id = b.id
2) ORACLE 표준 - UNOIN 활용
SELECT ..
FROM A a, B b
WHERE a.id = b.id(+)
UNION
SELECT ..
FROM A a, B b
WHERE a.id(+) = b.id
3. NATURAL JOIN - 공통 컬럼들이 모두 일치하는 데이터를 다룰 때
- 두 테이블의 동일한 이름과 타입을 가지는 모든 컬럼들에 대해 EQUI JOIN을 수행
- 일치하는 모든 컬럼이 같은 행만 반환
- USING, ON, WHERE 절에서 조건 정의 불가능
- Oracle/ANSI 표준 동일
e.g.
1) Oracle/ANSI 표준
SELECT ...
FROM A
NATURAL JOIN B;
4. CROSS JOIN - 데이터의 모든 조합을 다룰 때
- 테이블 간 JOIN 조건이 없는 경우, 생성 가능한 모든 조합 출력 (m*n개의 카타시안 곱 출력)
- Oracle/ANSI 표준 동일
e.g.
1) Oracle/ANSI 표준
SELECT ...
FROM A
CROSS JOIN B;
5. SELF JOIN - 자기 자신을 참조할 때
- 한 테이블 내 각 행끼리 관계를 갖는 경우의 조인 기법
- 테이블명이 반드시 중복(자기 자신 참조)되므로, 구분을 위해 별칭 사용 필수
- 조인 대상 테이블이 자기 자신으로 바뀐 것 뿐이므로, 다른 조인과 혼재하여 사용 가능
- Oracle/ANSI 표준 동일
'CS - 강의, 서적 > [SQLD] 홍쌤의 데이터랩' 카테고리의 다른 글
[SQLD] 2-10. 집합 연산자 (UNION, UNION ALL, INTERSECT, MINUS) (1) | 2024.09.18 |
---|---|
[SQLD] 2-9. 서브 쿼리 (스칼라 서브 쿼리, 인라인 뷰, WHERE절 서브 쿼리 다수) (0) | 2024.09.18 |
[SQLD] 2-2~6. SQL (Alias, DUAL Table, SELECT, FROM, WHERE, GROUP/ORDER BY, HAVING) (0) | 2024.09.16 |
[SQLD] 2-1. 관계형 데이터베이스 개요 (데이터 무결성, SQL) (0) | 2024.09.16 |
[SQLD] 1-9. Null 속성의 이해 (0) | 2024.09.16 |