[DB] 5. SubQuery

편준민's avatar
Feb 26, 2025
[DB] 5. SubQuery
💡
SubQuery는 3가지 종류가 있다. (어디에서 서브쿼리를 쓰는 지에 따라 이름이 다르다)
  • SubQuery (Where 절에 들어간다)
  • LnlineView (From 절에 들어간다)
  • Scalar Suquery (Select 절에 들어간다)

  • MySQL 쿼리 실행 순서
      1. FROM & JOIN
          • 가장 먼저 기본 테이블이 결정되고, 필요한 경우 JOIN을 수행하여 데이터를 결합합니다.
      1. WHERE
          • FROM 절에서 가져온 데이터 중 조건을 만족하는 행만 필터링합니다.
      1. GROUP BY
          • 필터링된 데이터를 특정 기준으로 그룹화합니다.
      1. HAVING
          • 그룹화된 데이터 중 조건을 만족하는 그룹만 남깁니다.
      1. SELECT
          • 최종적으로 출력할 컬럼을 선택합니다. (SELECT * 또는 SELECT column_name 등)
      1. DISTINCT
          • 중복 제거를 수행합니다.
      1. ORDER BY
          • 정렬을 수행합니다.
      1. LIMIT / OFFSET
          • 최종 결과에서 출력할 행의 개수를 제한합니다.

  • 중복해서 만들지 않는다. 왜냐하면 변경에 대처하기가 힘들기 때문이다.
  • 연관 관계를 가지게 테이블을 두 개로 만든다.
    • 내 테이블에서 행을 유일하게 결정하는 키 PK = Primary Key
    • 다른 테이블참조하는 키를 FK = Foreign Key
    • notion image
      해당 테이블에서 EMP 테이블에 PK는 EMPNO이고, FK는 DEPTNO이다. DEPT 테이블에서 봤을 때에는 PK는 DEPTNO이다.

1. SubQuery

notion image
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는 연산이 엄청나게 많다. 그래서 규칙을 찾아서 연산의 횟수를 줄여야 효율 적이다(튜닝). 연산의 횟수가 줄어든다면 자연스럽게 속도도 증가한다.
notion image
-- 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;
notion image
 
Share article

YunSeolAn