Subquery

eunbi kim·2024년 4월 9일
0
  • Subquery
  • Scalar Subquery
  • Inline View
  • Nested Subquery
  • Multiple Row
  • exercises

Subquery

서브쿼리(Subquery)란, 하나의 sql문 안에 포함되어 있는 또다른 sql문을 말한다.
메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.

  • 서브쿼리는 메인쿼리의 컬럼을 사용할 수 있고,
  • 메인쿼리는 서브쿼리의 컬럼을 사용할 수 없다.

주의사항

  • Subquery는 괄호로 묶어서 사용
  • 단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능
  • Subquery에서는 order by를 사용할 수 없다.

서브쿼리 종류

  • Scalar subquery - Select절에 사용
  • Inline view - From절에 사용
  • Nested subquery - Where절에 사용

Scalar Subquery

SELECT절에서 사용하는 서브쿼리. 결과는 하나의 column이어야 한다.

SELECT column1, (SELECT column2 FROM table2 WHERE condition)
FROM table1
WHERE condition;
  • 서울은평경찰서의 강도 검거 건수와 서울시 경찰서 전체의 평균 강도 검거 건수를 조회

Inline View

FROM절에 사용하는 서브쿼리. 메인쿼리는 인라인 뷰에서 조회한 column만 사용 가능하다.

SELECT a.column, b.column
FROM table1 a, (SELECT column1, column2 FROM table2) b
WHERE condition;

select문으로 조회한 결과를 하나의 테이블처럼 사용해서, from절에서 가져온다.
두 테이블을 만들고 조인하는 형식이다.

  • 경찰서별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회


Nested Subquery

WHERE절에서 사용하는 서브쿼리.

  • Single Row - 하나의 열을 검색하는 서브쿼리
  • Multiple Row - 하나 이상의 열을 검색하는 서브쿼리
  • Multiple Column - 하나 이상의 행을 검색하는 서브쿼리

하나씩 살펴보자.

  1. Single row subquery
    서브쿼리가 비교연산자와 사용되는 경우,
    서브쿼리의 검색 결과는 한 개의 결과값을 가진다.
SELECT column_names
FROM table_name
WHERE column_name = (SELECT column_name
				   	 FROM table_name
                     WHERE condition)
ORDER BY column_name;
  • snl_show 에 출연한 host와 이름이 같은 celeb을 출력하려면

2-1. Multiple row - IN
서브쿼리 결과 중에 컬럼값이 있는 경우 (IN) 반환한다.

SELECT column_names
FROM table_name
WHERE column_name IN (SELECT column_name
				   	 FROM table_name
                     WHERE condition)
ORDER BY column_name;
  • SNL에 출연한 영화배우를 조회, 하나 이상의 행이 있을 때!

IN 대신 join을 써도 되는 예시이다.

2-2. Multiple row - EXISTS
서브쿼리 결과에 값이 있으면 반환

SELECT column_names
FROM table_name
WHERE EXISTS (SELECT column_name
			  FROM table_name
              WHERE condition)
ORDER BY column_name;
  • 범죄 검거 혹은 발생 건수가 2000건보다 큰 경찰서 조회

2-3. Multiple row - ANY
서브쿼리 결과 중에 최소한 하나라도 만족하면 반환 (비교연산자 사용)

SELECT column_names
FROM table_name
WHERE column_name = ANY (SELECT column_name
			             FROM table_name
                         WHERE condition)
ORDER BY column_name;
  • SNL에 출연한 적이 있는 연예인 이름 조회

-> celeb name이 snl_show host에 있으면 true로 return

2-4. Multiple row - ALL
서브쿼리 결과를 모두 만족하면 반환 (비교연산자 사용)

SELECT column_names
FROM table_name
WHERE column_name = ALL (SELECT column_name
			             FROM table_name
                         WHERE condition)
ORDER BY column_name;
  • SNL에 출연한 적이 있는 연예인 이름 조회

-> 전체 조건을 만족하기 위해 서브쿼리 where절에 제한을 둠.

  1. Multi column subquery - 연관 서브쿼리
    서브쿼리 내에 메인쿼리 컬럼이 같이 사용되는 경우,
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;

-> 서브쿼리의 where절을 보면, 메인쿼리의 컬럼(a.column_name)을 사용하고 있다.

  • 강동원과 성별, 소속사가 같은 연예인의 이름, 성별, 소속사를 조회


exercises

문제 1. oil_price 테이블에서 셀프주유의 평균가격과 SK에너지의 가장 비싼 가격을 Scalar subquery를 사용하여 조회

문제 2. oil_price 테이블에서 상표별로 가장 비싼 가격과 상호를 Inline View를 사용하여 조회하세요.

문제 3. 평균가격보다 높은 주유소 상호와 가격을 Nested Subquery를 사용하여 조회하세요.

0개의 댓글