DB/SQL

[SQL] 서브쿼리 - TODO

journey-dev 2023. 5. 21. 23:22

- 서브쿼리는 메인쿼리(외부쿼리)의 칼럼을 모두 사용할 수 있음

- 메인쿼리(외부쿼리)는 서브쿼리의 칼럼을 사용할 수 없음

- 서브쿼리는 소괄호로 감싸서 사용

서브쿼리에서는 ORDER BY 절을 사용하지 못하고, 메인쿼리 마지막 문장에 사용 가능

 

스칼라 서브쿼리(Scalar Sub Query): 하나의 컬럼처럼 사용 (표현 용도)
FROM (SELECT ...)         -- 인라인 뷰(Inline View): 하나의 테이블처럼 사용 (테이블 대체 용도)
WHERE col = (SELECT ...)  -- 일반 서브쿼리: 하나의 변수(상수)처럼 사용 (서브쿼리의 결과에 따라 달라지는 조건절)Copy

 

 

 

1. 중첩 서브쿼리( Nested Subquery ) (일반 서브쿼리)

where문에서 사용하는 서브쿼리.

예제1)

SELECT mem_name, height FROM member
WHERE heigth > (SELECT height FROM member WHERE mem_name = '에이핑크');
-- 에이핑크의 height보다 큰 height인 데이터를 조회

 

예제2) 프로그래머스 - 식품분류별 가장 비싼 식품의 정보 조회하기

select CATEGORY,PRICE,PRODUCT_NAME // 4. 이후 뽑아야 하는 컬럼명만 출력
from FOOD_PRODUCT   
where (CATEGORY,PRICE) in  // 2. 가상의 테이블과 상품 데이터를 비교하면서 가격과 카테고리각 맞는 데이터만 추린다.

 // 1. 카테고리가 ~인 테이터를 가지고 가상의 동적 테이블을 만드는데, 이때 카테고리별 최대 값 컬럼을 넣어준다.
(select CATEGORY, max(PRICE) as maxPrice  
 from FOOD_PRODUCT 
 where CATEGORY in ('과자','국','김치','식용유') group by CATEGORY )
order by PRICE desc  // 3.정렬해주고

서브쿼리 실행 결과

 

코드 실행 결과

 

 

 

2. 스칼라 서브쿼리( Scalar Subquery )

select에서 사용하는 서브쿼리.  
하나의 열 처럼 사용된다. 다른 테이블의 어떤 값을 가져올 때 쓰임. 

결과는 반드시 하나의 행, 하나의 컬럼 이어야 됨. (결과로 여러행, 여러 컬럼이 나오면 안됨)

select절 서브쿼리는 데이터가 많아지면 실행속도가 느려지기 때문에 잘 사용x

 

 

[예제] ANIMAL_OUTS 테이블의 ANIMAL_ID, NAME 컬럼과 ANIMAL_INS 테이블의 ANIMAL_TYPE 수

SELECT ANIMAL_ID, NAME , 
(SELECT COUNT(ANIMAL_TYPE) FROM ANIMAL_INS ) AS '견종'
FROM ANIMAL_OUTS 

 

3. 인라인 뷰

from에서 사용하는 서브쿼리. 

가상의 테이블을 만든다고 생각하면 됨.

무조건 컬럼명과 테이블명을 별칭해 주어야 한다. (새로운 테이블 이기 떄문에, 컬럼명을 새로 지정해줘야 해서)

인라인 뷰에서는 ORDER BY절을 사용할 수 있다

from (select ~ as별칭 from ~  ) 별칭

 

 


참고자료

https://suy379.tistory.com/106#3._WHERE%EC%A0%88_%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC

https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC-%EC%A0%95%EB%A6%AC#

https://eehoeskrap.tistory.com/77