[MySQL] 서브 쿼리 (SubQuery) 알아보기
서브 쿼리 (SubQuery)란 다른 쿼리 내부에 포함되어있는 SELECT문을 말한다.
서브 쿼리를 포함하고 있는 쿼리를 외부 쿼리 (OuterQuery)라고 부르며 서브쿼리는 내부 쿼리 (InnerQuery)라고도 부른다. 서브 쿼리는 괄호 () 로 감싸져 표현된다.
서브 쿼리 실행 순서
1. 서브 쿼리 실행 - > 2. 외부 쿼리 실행
SELECT *
FROM MAIN_TABLE
WHERE TARGET_ID IN (
SELECT ID
FROM SUB_TABLE_INDEX
WHERE ID < 500
);
- 서브 쿼리는 하나의 SQL문 안에 포함되어있는 또 다른 SQL문을 말하며 (SELECT * FROM TABLE)과 같이 괄호() 안에 있는 쿼리를 서브 쿼리라고 한다.
- 서브 쿼리(자식 쿼리,내부 쿼리)는 메인 쿼리의 컬럼을 사용할 수 있지만 메인 쿼리(부모 쿼리,외부 쿼리)는 서브 쿼리의 컬럼을 사용할 수 없다. // JAVA 객체 지향의 상속과 같은 개념이다.
서브 쿼리의 장점
서브 쿼리는 쿼리를 구조화 시키므로 쿼리의 각 부분을 명확히 구분할 수 있게 해준다.
서브 쿼리는 복잡한 JOIN이나 UNION과 같은 동작을 수행할 수 있는 또 다른 방법을 제공하며 좀 더 가독성이 좋다.
서브 쿼리의 위치에 따른 명칭
SELECT col1, (SELECT ...) -- 스칼라 서브쿼리(Scalar Sub Query): 하나의 컬럼처럼 사용 (표현 용도)
FROM (SELECT ...) -- 인라인 뷰(Inline View): 하나의 테이블처럼 사용 (테이블 대체 용도)
WHERE col = (SELECT ...) -- 일반 서브쿼리: 하나의 변수(상수)처럼 사용 (서브쿼리의 결과에 따라 달라지는 조건절)
중첩 서브 쿼리 (Nested Subquery)
WHERE문에 나타나는 서브쿼리를 말한다.
- 조건 값을 상수로 할 때
select name, height
from userTbl
where height > 177;
- 조건 값을 SELECT로 특정할 때 (단 결과값이 하나여야 한다.)
select name, height
from userTbl
where height > (select height from userTbl where name in ('김경호'));
- any : 조건에 값이 여러개 들어올 때 사용하며 IN, OR과 동일한 의미이다.
select name, height
from userTbl
where height = any(select height from userTbl where addr in ('경남'));
- all : 도출된 모든 조건값에 대해 만족할 때 사용해며 AND와 동일한 의미이다.
select *
from city
where population > all( select population from city where district = 'New York' );
인라인 뷰 (Inline View)
FROM 문에 나타나는 서브쿼리로 인라인 뷰 일땐 무조건 AS 별칭을 지정해 줘야 한다.
SELECT EX1.name,EX1.salary
FROM (
SELECT *
FROM employee AS Ii
WHERE Ii.office_worker='사원'
) EX1; -- 서브쿼리 별칭
스칼라 서브 쿼리 (Scalar SubQuery)
SELECT문에 나타나는 서브 쿼리로 다른 테이블에서 어떤 값을 가져올 때 쓰인다.
하나의 레코드만 리턴이 가능하며 두 개 이상의 레코드는 리턴할 수 없다.
일치하는 데이터가 없더라도 NULL값을 리턴할 수 있으며 이는 원래 그룹 함수의 특징 중 하나이다.
SELECT D.DEPTNO, (SELECT MIN(EMPNO) FROM EMP WHERE DEPTNO = D.DEPTNO) as EMPNO
FROM DEPT D
ORDER BY D.DEPTNO
서브 쿼리 실행 조건
서브 쿼리는 SELECT문으로만 작성할 수 있으며 반드시 괄호()안에 존재 해야 한다.
괄호가 끝나고 끝에 세미콜론(;)을 쓰지 않는다. 또한 ORDER BY를 사용할 수 없다.
서브 쿼리 사용 가능한 곳
MySQL에서 서브쿼리를 포함할 수 있는 외부 쿼리는 SELECT, INSERT, UPDATE, DELETE, SET, DO문이 있다.
이러한 서브 쿼리는 또 다시 다른 서브 쿼리 안에 포함될 수 있다.