MySQL 서브 쿼리에 대해서 총 정리
서브 쿼리
: 하나의 SQL문 안에 포함되어있는 SQL문
: 메인 쿼리가 서브 쿼리를 포함하는 종속적인 관계를 가짐
- 예시
SELECT * FROM tableA a
WHERE (SELECT b.name FROM table B WHERE b.age = a.age) = a.nickName
: tableA에 대한 쿼리문에 tableB에 대한 쿼리문이 포함되어있다
- JOIN
: 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현하는 구문
JOIN과 서브쿼리의 차이
- JOIN
: 조인은 참여하는 모든 테이블이 대등한 관계에 있기 때문에 조인에 참여하는 모든 테이블의 컬럼을 어느 위치에서라도 자유롭게 사용할 수 있음
: 집합간의 곱의 관계이기 때문에 1:1 관계 테이블이 조인하면 1레벨의 집합이 형성되고, 1:M 관계가 조인하면 M 레벨의 집합이 됨. M:N의 경우 M*N 레벨의 집합이 생성됨
- 서브 쿼리
: 서브 쿼리는 메인 쿼리의 모든 컬럼을 사용할 수 있지만, 메인 쿼리는 서브 쿼리의 컬럼을 사용할 수 없음
: 서브 쿼리의 레벨과는 상관없이 항상 메인 쿼리의 레벨로 결과 집합이 생성됨
서브 쿼리를 사용할때 주의점
: 서브 쿼리를 괄호로 감싸서 작성한다
: 서브 쿼리는 단일 행 또는 복수 행 비교 연산자와 함께 사용할 수 있음
: 서브 쿼리에서는 ORDER BY를 사용하지 못함
서브 쿼리를 사용할 수 있는 곳
: SELECT
: FROM (인라인 뷰)
: WHERE
: HAVING
: ORDER BY
: INSERT 문의 VALUES
: UPDATE 문의 SET
서브 쿼리의 종류
- 단일 행 서브 쿼리
: 행 하나에 대한 서브 쿼리
SELECT * FROM tableA a
WHERE a.id = (SELECT b.id FROM tableb WHERE a.name = b.name)
- 다중 행 서브 쿼리
: 여러 행에 대한 서브 쿼리
SELECT * FROM tableA a
WHERE a.id IN (SELECT b.id FROM tableb WHERE a.name = b.name)
- 다중 컬럼 서브 쿼리
: 여러 컬럼에 대한 서브 쿼리
SELECT * FROM tableA a
WHERE (a.id, a.age) IN (SELECT b.id, b.age FROM tableb WHERE a.name = b.name)
Reference