- INNER QUERY라고도 한다. - 하나의 쿼리문안에 포함되어 있는 또 하나의 쿼리문이며, 메인쿼리가 서브쿼리를 포함하는 종속적 관계의 모습이다. - 여러 번의 쿼리를 수행해야 얻을 수 있는 결과를 하나의 중첩된 문장으로 간편하게 조회할 수 있다.
♣ 서브쿼리가 사용가능한 문법 ● SELECT 절 ● FROM 절 ● WHERE 절 ● HAVING 절 ● ORDER BY 절 ● INSERT 문의 VALUES 절 ● UPDATE 문의 SET 절
위 2개의 구문은 동일한 결과를 보이는 서브쿼리 코드이다. 좌측은 WHERE절 안에서 서브쿼리가 쓰이고 있으며, 우측은 FROM절 안에서 서브쿼리가 작성되어 있다. 두 쿼리문은 동일한 결과값을 가져오지만, 성능이나 순서 등이 작성 방식에 따른 차이가 있다. 그러나 현재 수준에서 이를 학습하기에는 심화 내용이므로 지금은 동일한 결과를 조회함에 다양한 방법이 있다는 정도만 파악하고 작성할 수 있는 점이 중요하다.
(2) 서브쿼리 종류( 일반적으론 WHERE절에서 사용 )
서브쿼리의 반환값에 따라 서브 쿼리 종류가 나눠진다.
- 단일 행 서브쿼리 : 서브쿼리의 결과가 1행 ; 단일행 비교연산자와 사용한다.( = , < , <= , >= , > , <> ) # SELECT * FROM stock WHERE price <= ( SELECT AVG( price ) FROM stock ) → 주식 종목 중 평균 가격보다 작거나 같은 종목 출력
- 다중 행 서브쿼리 : 서브쿼리의 결과가 여러 행 ; 여러행이 리턴값으로 실행되며, 다중행 비교연산자와 사용된다.( IN, ALL, ANY, SOME, EXISTS ) # SELECT * FROM stock WHERE name IN ( SELECT name FROM nasdaq_company WHERE name = %시스템 ) → 나스닥에 상장한 회사 중 ~~시스템으로 끝나는 이름의 회사의 정보출력
- 다중 컬럼 서브쿼리 : 서브쿼리의 결과가 여러 칼럼 ; 서브쿼리의 결과가 여러 개의 컬럼이 필요한 경우 사용된다. # SELECT * FROM stock WHERE ( start_year, price ) IN ( SELCET start_year, MAX(price) FROM nasdaq_company ) → 나스닥에 상장한 년도별 가장 가격이 높은 회사 조회
♣ 주의 사항 - 서브쿼리를 괄호로 묶어서 사용 - 서브쿼리 안에서는 Order by 절은 사용 못함 - 연산자로 오른쪽에 사용해야함
(2) 서브쿼리 위치에 따른 분류
- 인라인 뷰
; FROM절에서 사용하는 서브쿼리이다. SELECT절의 결과를 FROM절에서 하나의 테이블처럼 사용하고 싶다면 이용한다.
- 스칼라 서브쿼리
; SELECT절에서 사용하는 서브쿼리이다. SELECT절에서 서브쿼리를 사용하여 하나의 컬럼처럼 사용하기 위한 목적을 지닌다. 하지만 성능이 좋지 않고, 주로 표현하지 않는 방법이다.
댓글