[제로베이스][SQL] 서브쿼리

한결·2024년 2월 5일
post-thumbnail

SUBQUERY

서브쿼리

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

  • 서브쿼리는 메인쿼리의 칼럼 사용 가능
  • 메인쿼리는 서브쿼리의 칼럼 사용 불가

❗️주의사항

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

종류

  • 스카라 서브쿼리 (Scalar Subquery) - SELECT 절에 사용
  • 인라인 뷰 (Inline View) - FROM 절에 사용
  • 중첩 서브쿼리 (Nested Subquery) - WHERE 절에 사용

SCALAR SUBQUERY

SELECT column1, (SELECT column2 FROM table2 WHERE condition)
FROM table1
WHERE condition;

  1. 서울은평경찰서의 강도 검거 건수와 서울시 경찰서 전체의 평균 강도 검거 건수를 조회


INLINE VIEW

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

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


NESTED SUBQUERY

서브쿼리가 비교연산자와 사용되는 경우,
서브쿼리의 검색 결과는 한 개의 결과값을 가져야 한다. (두개 이상인 경우 에러)

SELECT column_names
FROM table_name
WHERE column_name = (SELECT column_name
					FROM table_name
                    WHERE condition)
ORDER BY column_name;


MULTIPLE ROW - IN

서브쿼리 결과 중에 포함 될 때

SELECT column_names
FROM table_name
WHERE column_name IN (SELECT column_name
					  FROM table_name
                      WHERE condition)
ORDER BY column_name;

SNL에 출연한 영화배우를 조회


MULTIPLE ROW - EXISTS

서브쿼리 결과에 값이 있으면 반환

SELECT column_names
FROM table_name
WHERE EXISTS (SELECT column_name
			  FROM table_name
              WHERE condition)
ORDER BY column_name;

범죄 검거 혹은 발생 건수가 2000건 보다 큰 경찰서 조회


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에 출연한 적이 있는 연예인 이름 조회


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;


MULTI COLUMN SUBQUERY

서브쿼리 내에 메인쿼리 컬럼이 같이 사용되는 경우.

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


profile
낭만젊음사랑

0개의 댓글