CROSS JOIN/SELF JOIN
CROSS JOIN
- 두 테이블의 모든 행 조합을 반환하는 조인
- 결과 행 수는 두 테이블 행 수의 곱
- 카테시안 곱(
Cartesian Product)이라고도 함
- 조인 조건을 빠뜨리면 의도치 않은 CROSS JOIN이 발생
CROSS JOIN
SELECT E.EMP_NAME, D.DEPT_NAME
FROM EMPLOYEE E, DEPARTMENT D;
SELECT E.EMP_NAME, D.DEPT_NAME
FROM EMPLOYEE E
CROSS JOIN DEPARTMENTD D;
SELF JOIN
- 같은 테이블을 두 번 조인하는 방식
- 반드시 서로 다른 별칭을 사용해야 함
계층 구조나 자기참조 컬럼이 있을 때 사용
- EMPLOYEE의 MANAGER_ID는 EMP_ID를 참조하는 자기 참조 컬럼임
ON절
- JOIN 조건을 ON 절에 명시하는 ANSI 표준 문법
- 조인 조건과 행 필터 조건을 분리할 수 있음
- 컬럼명이 달라도 사용 가능
- ON 절에서 테이블 별칭을 사용할 수 있음
USING 절
- 공통 컬럼명만 명시해 조인하는 방법
- 컬럼명을 반드시 괄호로 묶음
- USING 컬럼에는 테이블명·별칭을 붙일 수 없음
USING절 주의사항
- USING 컬럼에 테이블명·별칭을 붙이면 오류가 발생
- SELECT E.DEPT_ID FROM EMPLOYEE E JOIN DEPARTMENT D USING(DEPT_ID) -> 오류
- SELECT E.DEPT_ID FROM EMPLOYEE JOIN DEPARTMENT USING(DEPT_ID) -> 정상
NATURAL JOIN
- 공통 컬럼을 자동으로 찾아 모두 조인 조건으로 사용
- ON·USING 절과 함께 사용할 수 없음
- 조인 컬럼에는 테이블명·별칭을 붙일 수 없음
서브쿼리의 개념과 분류
서브쿼리란?
- 서브쿼리는 SQL문 안에 포함되어 실행되는 또 다른 SELECT 문
- 서브쿼리를 포함하는 바깥쪽 SQL 문을 메인쿼리라고 함
- 메인쿼리에 필요한 값을 계산하거나, 비교 대상을 제공
- 서브쿼리는 반드시 괄호 ()로 감싸야함
- 서브쿼리 안에 또 다른 서브 쿼리를 중첩할 수 있음
- 서브쿼리에는 일반적으로 ORDER BY 절을 사용할 수 없음
- 단, 인라인 뷰의 TOP-N 처리에는 예외적으로 사용
SELECT 컬럼
FROM 테이블
WHERE 컬럼 비교 연산자(SELECT ... FROM ... WHERE...),
| 절 | 분류 명칭 | 용도 |
|---|
| SELECT 절 | 스칼라 서브쿼리 (Scalar Subquery) | 메인 쿼리의 컬럼 위치에서 단일 값(단일 행, 단일 열)을 반환하여 연산이나 출력에 사용 |
| FROM 절 | 인라인 뷰 (Inline View / Derived Table) | 임시 테이블 형태로 결과를 생성하여 주로 조인 대상이나 가상의 테이블로 사용 |
| WHERE 절 | 중첩 서브쿼리 (Nested Subquery) | 조건절에서 데이터를 필터링하기 위한 비교 기준으로 사용 (단일 행, 다중 행, 연관 서브쿼리 등) |
| HAVING 절 | 그룹 조건 서브쿼리 | 그룹화(GROUP BY)된 결과에 대한 집계 조건(HAVING)에서 필터링 기준으로 사용 |
| INSERT / UPDATE / DELETE | DML 문장 내 서브쿼리 | 데이터를 삽입(SELECT 결과를 INSERT), 수정(SET 절에서 값 변경), 삭제(WHERE 절 조건)할 때 사용 |
단일행 서브쿼리
(1) 단일행 서브쿼리의 개념과 연산자
- 단일행 서브쿼리는 결과가 1행 1열로 반환되는 서브쿼리
- 단일 값과 비교하므로 단일행 비교 연산자(=, <>,>,<,>=,<=)를 사용
- 집계함수(MAX, MIN, AVG 등)를 쓰면 자연스럽게 1행 1열이 반환
- 결과가 2행 이상이면 오류가 발생
- 공집합인 경우 집계 함수는 NULL 1행을 반환하며, =비교는 UNKNOWN이 됨
SELECT 컬럼
FROM 테이블
WHERE [=|<>\>|<|>=|<=](SELECT 단일값 FROM 테이블)