subquery

yun·2023년 9월 4일
0

정의

  • 하나의 SQL문 안에 포함된 또 다른 SQL문

실행순서

  • 메인쿼리가 서브쿼리를 포함하는 종속적인 관계
  • 관련 예시: inline view로 사용된 서브쿼리 r에서 가져온 컬럼을 메인쿼리에서 사용할 수 있다.
select r.name, r.oil_bank, o.brand, r.price as '주유금액', o.price as '가격'
from oil_price o,
	(select name, oil_bank, price from refueling where price >= 100000) r
where o.shop_name = r.oil_bank;

종류

Scalar Subquery

  • SELECT절에 사용
  • 결과는 하나의 컬럼이어야 한다.
SELECT column1, (SELECT column2 FROM table2 WHERE condition)
FROM table1
WHERE condition;

Inline View

  • FROM절에 사용
  • 메인쿼리에서는 인라인 뷰에서 조회한 컬럼만 사용 가능하다.
SELECT a.column, b.column
FROM table1 a, (SELECT column1, column2 FROM table2) b
WHERE condition;

Nested Subquery

  • WHERE절에 사용
  • 괄호 사용 필수

Single Row

  • 비교연산자(=, >, >=, <, <=, <>, !=)와 사용되는 경우, 서브쿼리의 검색 결과는 한 개 행의 결과값을 가져야 한다. (검색 결과 2개 이상이면 비교 불가, 에러 발생)
SELECT column_names
FROM table_name
WHERE column_name = (SELECT column_name
					FROM table_name
					WHERE condition)
ORDER BY column_name;

Multiple Rows

  • 존재여부를 판단
    • execution plan을 expalain으로 확인해 보면 좋다
      • in: 조건에 해당하는 컬럼 값 확인
        SELECT column_names
        FROM table_name
        WHERE column_name IN (SELECT column_name
        					  FROM table_name
        					  WHERE condition)
        ORDER BY column_names;
      • exists: 조건에 해당하는 row의 존재 여부 확인(성능 면에서 in보다 낫다)
        SELECT column_names
        FROM table_name
        WHERE EXISTS (SELECT column_name
        			  FROM table_name
        							  WHERE condition)
        ORDER BY column_names;
      • any
        SELECT column_names
        FROM table_name
        WHERE column_name = ANY (SELECT column_name
        						FROM table_name
        						WHERE condition)
        ORDER BY column_names;
      • all
        SELECT column_names
        FROM table_name
        WHERE column_name = ALL (SELECT column_name
        						FROM table_name
        						WHERE condition)
        ORDER BY column_names;

Multiple Columns

SELECT column_names
FROM tablename a
WHERE (a.column1, a.column2, ...) IN (SELECT b.column1, b.column2, ...)
    							      FROM tablename b
    								  WHERE a.column_name = b.column_name)
ORDER BY column_names;

0개의 댓글