SQL
[SQL] 서브쿼리 조건 처리 _ ANY / ALL로 다중 Row 비교하기
by nemonemonemo
2025. 8. 12.
use sqldb;
select * from usertbl;
- 기본적으로 1개 쿼리문에 1개 조건,,, 여러개이 조건을 사용하는 방식
- 목적
- 서브 쿼리 --> 조건에 있어서 한정
- 필터링을 하고자 하는 값을 기준을 데이터에 종속
- ex) 고객의 이름이 김경호인 고객의 키보다 큰 고객들의 이름과 키를 출력해주세요!
- 내가 직접 기준 쿼리문을 통해서 기준값을 찾아서
# 내가 직접 기준 쿼리문을 총해서 기준값을 찾아서
select name, height from usertbl
where height >= 177;
- 이렇게 2번의 질의를 통해서 원하는 값들을 얻을 수 있음!!
- 굳이,,2번으로 쪼개서 해야할까???
# ==> 이렇게 2번의 질의를 통해서 원하는 값들을 얻을 수 있음!!
# 굳이,,2번으로 쪼개서 해야할까???
# 177을 유도하는 쿼리
select name, height
from usertbl
where height >= (select height from usertbl where name = '김경호');
# -> 최대한 조건에 사용하는 값을 쿼리로 요청해서 할 때는
# 타이트하게 딱 기준값만 도출할 수 있도록 쿼리를 작성해야함
# ==> 아니면 에러가 날 수 있습니다!
- # --> 기본 쿼리 구조 -- select name height from usertbl -- where height >= ? select name, height from usertbl where name = '김경호';
- Q) 지역이 경남인 사람의 키보다 큰 사람들의 이름과 키를 찾아주세요
select name, height from usertbl where addr = '경남';
# --> 2명의 고객이 존재하고, 키의 값이 170,173 2개 존재
# (or) 170보다도 크고, 173보다도 크고
# *** 2개 이상의 레코드로 도출되는 쿼리결과값에서 기준을 명확하게 제시해야함 ***
# any/all
# any : 서브 쿼리에 나오는 값이 여러개가 나온다면... 뭐라도 1개만 만족하면 ok
# all : 서브 쿼리에 나오는 값이 여러개가 나온다면... 모두 만족해야 ok
select name, height from usertbl where height >= 170;
# ==> 결과 : 170이 포함된 9개의 row 출력
select name, height from usertbl where height >= 173;
# ==> 결과 : 173이 포함된 7개의 row 출력
#다시 체크
select name, height from usertbl where addr = '경남';
#select name, height from usertbl where height >= ?; -- ? 기준값으로 하려고
select name, height from usertbl where height >= any(select height from usertbl where addr = '경남');
# --> 조건값에 있는 서브쿼리 결과가 여러개가 나온다면... 170이상과 같은 결과
select name, height from usertbl where height >= all(select height from usertbl where addr = '경남');
# --> 조건갑셍 있는 서브쿼리 결과 여러개가 나온다면 ...170보다도 커야하고, 173보다도 커야하므로
# 173이상의 값들만 찾아주세요 라는 말
- 참고) 주어진 문제를 쿼리문으로 작성하면 -> 결과가 1개 이상 오는데 기준이 뭐냐? ⇒ 명확하게 여러개 값 중에서 어떤 기준으로 할지 명시!!!
select name, height
from usertbl
where height >= (select height
from usertbl
where addr = '경남'); -- 오류남 기준 없어서
정리
- where의 조건의 기준 값을 쿼리문으로 생성을 하면
- 대전제) 쿼리문을 타이트하게 기준값만 받을 수 있도록 작성해야함
- case1) 쿼리문의 row의 수가 1인 경우 : 그냥 진행! 내가 작성할 값 대신
- case2) 쿼리문의 row의 수가 2이상인 경우 : 여러개 중 어떤 기준으로 할지(any/all)