SubQuery는 3가지 종류가 있다. (어디에서 서브쿼리를 쓰는 지에 따라 이름이 다르다)
- SubQuery (Where 절에 들어간다)
- LnlineView (From 절에 들어간다)
- Scalar Suquery (Select 절에 들어간다)
- MySQL 쿼리 실행 순서
- FROM & JOIN
- 가장 먼저 기본 테이블이 결정되고, 필요한 경우 JOIN을 수행하여 데이터를 결합합니다.
- WHERE
- FROM 절에서 가져온 데이터 중 조건을 만족하는 행만 필터링합니다.
- GROUP BY
- 필터링된 데이터를 특정 기준으로 그룹화합니다.
- HAVING
- 그룹화된 데이터 중 조건을 만족하는 그룹만 남깁니다.
- SELECT
- 최종적으로 출력할 컬럼을 선택합니다. (
SELECT *
또는SELECT column_name
등) - DISTINCT
- 중복 제거를 수행합니다.
- ORDER BY
- 정렬을 수행합니다.
- LIMIT / OFFSET
- 최종 결과에서 출력할 행의 개수를 제한합니다.
- 중복해서 만들지 않는다. 왜냐하면 변경에 대처하기가 힘들기 때문이다.
- 연관 관계를 가지게 테이블을 두 개로 만든다.
- 내 테이블에서 행을 유일하게 결정하는 키 PK = Primary Key
- 다른 테이블을 참조하는 키를 FK = Foreign Key

해당 테이블에서 EMP 테이블에 PK는 EMPNO이고, FK는 DEPTNO이다.
DEPT 테이블에서 봤을 때에는 PK는 DEPTNO이다.
1. SubQuery

Where
에 변수를 담아 출력하고 싶을 때 SubQuery
를 이용하여 select
를 하나 더 사용하여 출력 할 수 있다.사용 할 수 있다.-- RESEARCH 부서 직원 출력
select *
from emp
where deptno = 20;
select deptno
from dept
where dname = 'RESEARCH'; -- 20
select *
from emp
where deptno = (
select deptno
from dept
where dname = 'RESEARCH' -- 2번쨰 select 문을 20 자리에 대입
);
2. Inline View
from
에 들어간다. SQL순서상 where
또는 group by
에는 기본적으로 사용할 수 없다. 하지만 별칭을 포함한 테이블을 from
에 포함하면 where
또는 group by
에 별칭을 사용 할 수 있다.- 2.인라인뷰 (from절에 들어감)
select ename, sal*12 연봉
from emp
where 연봉 = 9600;
-- 실행되지 않음
-- 왜냐하면 select 보다 where가 먼저 실행되기 때문에 별칭을 찾을 수 없음
select e.*
from (
select ename, sal*12 '연봉'
from emp
) e -- 별칭을 주어야함
where 연봉 = 9600;
select *
from
(
select avg(sal) 'avg_sal'
from emp
group by deptno
) e
where e.avg_sal < 2000;
3. Scalar SubQuery
Scalar SubQuery는 연산이 엄청나게 많다. 그래서 규칙을 찾아서 연산의 횟수를 줄여야 효율 적이다(튜닝). 연산의 횟수가 줄어든다면 자연스럽게 속도도 증가한다.

-- 3. 스칼라 서브쿼리 (select절에 있는 SubQuery)
select d.deptno, d.dname, d.loc, 3 '직원수'
from dept d;
-- 10번 부서의 직원 출력
select count(*)
from emp
where deptno = 10; -- 10번 부서에 3명
select d.deptno, d.dname, d.loc,
(
select count(*)
from emp
where deptno = 10
) '직원수' -- 3부분에 대입
from dept d;
select d.deptno, d.dname, d.loc,
(
select count(*)
from emp
where deptno = d.deptno
) '직원수' -- where절에 변수 확인 후 바꿈
from dept d;

Share article