다중 테이블 연산
✒️ 2025-06-05 18:21 내용 수정
SUBQUERY
- 다른 QUERY문 내부에 존재하는 query문이다.
- 참고 자료 : TCPSchool 서브쿼리
- SUBQUERY는 소괄호() 안에 표현한다.
- QUERY를 구조화 시키기 때문에 여러 번 데이터베이스에 접속하는 과정을 한 번으로 줄여 속도를 증가 시킬 수 있다.
- 복잡한 JOIN이나 UNION과 같은 동작을 수행할 수 있는 또 다른 방법을 제공하고, 복잡한 JOIN이나 UNION보다 가시성이 좋다.
- WHERE, HAVING, SELECT와 DELETE의 FROM, UPDATE의 SET, INSERT의 INTO 등에서 사용할 수 있다.
| 사용 위치 | 특징 |
|---|---|
| FROM절 (IN LINE VIEW) | 하나의 테이블처럼 사용. 이름(별칭)을 지정해야 함 |
| SELECT (SCALAR) | 하나의 컬럼처럼 사용 |
| WHERE절 (SUBQUERY) | 하나의 변수처럼 사용 |
-- WHERE 조건문에서의 SUBQUERY 사용
SELECT 컬럼명1, 컬럼명2, ...
FROM 테이블명
WHERE 컬럼명 연산자 (
SELECT 컬럼명 -- 변수처럼 사용됨
FROM 테이블명
WHERE 조건문
);
-- FROM 절에서의 SUBQUERY 사용
SELECT 컬럼명1, 컬럼명2, ...
FROM (
SELECT 컬럼명1, 컬럼명2, ... -- 테이블처럼 사용됨
FROM 테이블명
WHERE 조건문
) AS 이름
WHERE 조건문;
-- GROUP BY와 HAVING에서의 SUBQUERY 사용
SELECT 컬럼명1, 컬럼명2, ...
FROM 테이블명
WHERE 조건문
GROUP BY 컬럼명
HAVING 집계함수 연산자 (
SELECT 컬럼명
FROM 테이블명
WHERE 조건문
);
-- SELECT에서 사용
SELECT 컬럼명1,
(
SELECT 컬럼명A, 컬럼명B, .. -- 컬럼처럼 사용됨
FROM 테이블명
WHERE 조건문
)
FROM 테이블명
WHERE 조건문;
JOIN
- 데이터베이스 내에서 두 개 이상의 테이블을 연결하여 하나의 테이블이나 결과의 집합으로 표현하는 키워드
- 참고 자료 : TCPSchool JOIN
- JOIN을 사용하면 데이터를 효율적으로 검색하고 처리할 수 있으며, 데이터 중복을 줄이고 일관성을 유지할 수 있다.
1. INNER JOIN
- 각 테이블에서 조건에 일치되는 데이터만 가져온다.
- 교집합 연산과 동일하다.
- INNER JOIN 하려는 두 테이블이 PK(고유키)와 FK(외래키) 관계로 연결되어 있어야 한다.
- ON 조건절과 함께 사용한다.
- ON 조건절 : JOIN 전에 조건을 필터링한다.
- WHERE 조건절 ; JOIN 후에 조건을 필터링하고, 최근엔 자주 사용하지 않는다.
- INNER JOIN의 INNER 표기는 생략할 수 있다.

SELECT 컬럼명1, 컬럼명2, ...
FROM 테이블1 (INNER) JOIN 테이블2 -- INNER 표기 생략 가능
ON 테이블1.JOIN컬럼 = 테이블2.JOIN컬럼;
-- 별칭을 사용해 표현할 수 있다.
SELECT 별칭1.컬럼명1, 별칭1.컬럼명2, 별칭2.컬럼명1, 별칭2.컬럼명2, ...
FROM 테이블1 별칭1 (INNER) JOIN 테이블2 별칭2
ON 별칭1.JOIN컬럼 = 별칭2.JOIN컬럼;
- 여러 컬럼 조건을 기준으로 JOIN할 수 있다.
-- 두 테이블의 속성이 같은 조건 + 특정 컬럼의 필터링 조건
SELECT 별칭1.컬럼명1, 별칭1.컬럼명2, 별칭2.컬럼명1, 별칭2.컬럼명2, ...
FROM 테이블1 별칭1 (INNER) JOIN 테이블2 별칭2
ON 별칭1.JOIN컬럼 = 별칭2.JOIN컬럼
AND 컬럼조건식;
SELECT s.student_id, s.name, g.final_score
FROM students s LEFT JOIN grades g
ON s.student_id = g.student_id
AND g.course_code = 'MA101';
1) SELF INNER JOIN
- 한 테이블 내에서 다른 column을 참조하기 위해 사용한다.
SELECT 테이블1.컬럼명, 테이블1.컬렴명
FROM 테이블1 별칭1 JOIN 테이블1 별칭2 -- 테이블1 = 테이블2, 구분을 위해 별칭 사용
ON 별칭1.JOIN컬럼 = 별칭2.JOIN컬럼;
2) CROSS INNER JOIN
- 두 개 이상의 테이블에서 모든 가능한 조합을 만들어 새로운 테이블을 생성할 때 사용한다.
- 각 행의 모든 가능한 조합을 만들기 때문에 결과 테이블이 매우 클 수 있어서 사용 시 주의해야 한다.
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1 CROSS JOIN 테이블2;
3) Natural JOIN
- 참고 자료 : Geeksforgeeks SQL Natural Join
- 두 테이블의 컬럼 중 이름과 데이터 타입이 같은 컬럼을 찾아 이 컬럼을 기준으로 자동 JOIN을 한다.
- JOIN 연산 결과에서 중복되는 값을 자동으로 제거한다.
- 자동으로 속성을 찾아 JOIN하기에 SQL문이 간단해진다.
- 하지만 두 테이블을 연결하는 속성이 보이지 않기 때문에 어느 속성을 기준으로 연결되었는지 파악하기 어렵고, 여러 속성으로 두 테이블을 JOIN해야 하는 경우에 Natural JOIN을 사용하기 어렵다.
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1 NATURAL JOIN 테이블2;
2. OUTER JOIN
- 두 테이블에서 공통된 값들과 공통되지 않은 값들도 가져온다.
- 교집합 + 차집합 연산
- 참고 자료 : W3School SQL Joins
1) LEFT OUTER JOIN
- 왼쪽 테이블의 모든 행과 두 테이블의 공통된 값들을 가져온다.
- 만약 공통된 값들이 없다면 해당 행은 NULL 값을 반환한다.
- 대부분 왼쪽 테이블의 데이터를 중심으로 분석하는 경우가 많아 RIGHT OUTER JOIN보다 자주 사용한다.

SELECT 별칭1.컬럼명, 별칭2.컬럼명
FROM 테이블1 별칭1 LEFT OUTER JOIN 테이블2 별칭2 -- 테이블1의 전체, 둘의 공통값
ON 별칭1.JOIN컬럼 = 별칭2.JOIN컬럼;
2) RIGHT OUTER JOIN
- LEFT OUTER JOIN의 반대로, 오른쪽 테이블의 모든 행과 두 테이블의 공통된 값들을 가져온다.
- 만약 공통된 값들이 없다면 해당 행은 NULL 값을 반환한다.

SELECT 별칭1.컬럼명, 별칭2.컬럼명
FROM 테이블1 별칭1 RIGHT OUTER JOIN 테이블2 별칭2 -- 테이블2의 전체, 둘의 공통값
ON 별칭1.JOIN컬럼 = 별칭2.JOIN컬럼;
3) FULL OUTER JOIN
- 두 테이블의 모든 값을 반환한다.
- 합집합 연산과 동일하다.
- 만약 공통된 값이 없거나, 한 쪽 테이블에만 존재하는 데이터가 있으면 NULL을 포함하여 반환한다.

SELECT 별칭1.컬럼명, 별칭2.컬럼명
FROM 테이블1 별칭1 FULL OUTER JOIN 테이블2 별칭2 -- 두 테이블 전체
ON 별칭1.JOIN컬럼 = 별칭2.JOIN컬럼;
UNION
- 여러 개의 SELECT 문의 결과를 하나의 테이블이나 결과 집합으로 표현할 때 사용한다.
- 각각의 SELECT 문으로 선택된 필드의 개수, 타입, 필드 순서가 같아야 한다.
- JOIN처럼 두 개의 테이블을 합치는데 사용할 수 있다.
- 참고 자료 : TCPSchool UNION, DB/Postgres 조인(JOIN) 이해하기 : 내부/외부 조인, UNION/UNION ALL
1. UNION
- DISNTINCT 키워드가 기본적으로 적용되어 중복되는 행(레코드)를 제거한 후 두 테이블을 합친 모든 행을 반환한다.
SELECT 테이블1.컬럼명1, 테이블1.컬럼명2
FROM 테이블1
UNION
SELECT 테이블2.컬럼명2, 테이블2.컬럼명2
FROM 테이블2;
2. UNION ALL
- 중복되는 행(레코드)를 제거하지 않고 두 테이블을 합친 모든 행을 반환한다.
SELECT 테이블1.컬럼명1, 테이블1.컬럼명2
FROM 테이블1
UNION ALL
SELECT 테이블2.컬럼명2, 테이블2.컬럼명2
FROM 테이블2;