본문 바로가기
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)