[DB] WHERE절 SUBQUERY: 비연관

젠니·2023년 6월 4일
0

데이터베이스

목록 보기
20/21

14. WHERE절 SUBQUERY: 비연관

SELECT문 안에 포함되어 있는 SELECT문이라고 보면 된다.

주의사항

  • 메인쿼리는 서브쿼리의 컬럼을 참조할 수 없다.

  • WHERE절 서브쿼리에서는 ORDER BY절을 사용할 수 없다.

비연관 서브쿼리

단일값

선수들의 평균 키보다 작은 선수들을 검색하라.

SELECT 		PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버
FROM 		PLAYER
WHERE 		HEIGHT <= (
                        SELECT AVG(HEIGHT)
                        FROM PLAYER
)
ORDER BY 	PLAYER_NAME;

서브쿼리 한번 실행될 때 메인쿼리가 한번 실행되기 때문에, 총 2번 실행한다.

서브쿼리에서 PLAYER 테이블에서 키를 모두 읽고 AVG 단일값을 뽑아낸다. 이 단일값보다 작은 키를 메인쿼리에서 뽑는다.

다중값

Format

SELECT
FROM
WHERE expr 비교연산자 {ANY|SOME|ALL} (subquery);
  • ANY|SOME: value 중 1개가 True면 True
  • ALL: 모든 비교가 True일 때만 True

Example
정현수 선수의 소속팀 정보를 검색하라.

SELECT 		REGION_NAME 연고지명, TEAM_NAME 팀명, E_TEAM_NAME 영문팀명
FROM 		TEAM
WHERE 		TEAM_ID = ANY (
                              SELECT TEAM_ID
                              FROM PLAYER
                              WHERE PLAYER_NAME = '정현수'
)
ORDER BY 	TEAM_NAME;

ANY란? -> '집합에서 어느 한 값을 잡았을 때'

메인쿼리의 TEAM 테이블에서 TEAM_ID가 서브쿼리의 PLAYER 테이블에서 PLAYER_NAME이 정현수인 선수의 TEAM_ID와 같을 때 출력한다.

다중행

Format

SELECT
FROM
WHERE expr [NOT] IN (subquery);
  • IN: 서브쿼리 결과의 어느 한 값이 expr과 동일하면 TRUE

각 팀에서 제일 키가 작은 선수를 검색하라.

SELECT 		TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션,
			BACK_NO 백넘버, HEIGHT 키
FROM 		PLAYER
WHERE 		(TEAM_ID, HEIGHT) IN (
                                    SELECT 	TEAM_ID, MIN(HEIGHT)
                                    FROM 	PLAYER
                                    GROUP BY TEAM_ID
)
ORDER BY 	TEAM_ID, PLAYER_NAME;

메인쿼리의 PLAYER 테이블의 (TEAM_ID, HEIGHT) 중에 PLAYER 테이블의 (TEAM,ID, MIN(HEIGHT))와 같은게 있는지 확인하고 출력한다.

profile
젠니의 개발 라이푸우

0개의 댓글