Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags more
Archives
Today
Total
관리 메뉴

luke

[MySQL] - Sub Query, ANY, ALL (서브쿼리, ANY, ALL) 본문

DB/MySQL

[MySQL] - Sub Query, ANY, ALL (서브쿼리, ANY, ALL)

luke-king 2024. 5. 20. 20:27

 

 

 

 

 

[MySQL] - Sub Query, ANY, ALL (서브쿼리, ANY, ALL)

 

 

 

 

Sub Query(서브쿼리)

  • 다른 쿼리 내부에 포함되어 있는 SELECT 문을 의미한다.
  • 서브쿼리를 포함하고 있는 쿼리를 외부쿼리(outer query)라고 한다.
  • 서브쿼리는 내부쿼리(inner query)라고도 한다.
  • JOIN이나 UNION과 같은 동작을 수행할 수 있는 또 다른 방법을 제공한다.
  • JOIN이나 UNION 보다 조금 더 읽기 편하다.
  • 서브쿼리의 결과가 둘 이상이 되면 에러가 발생한다.

 

<예시>

SELECT * FROM a_table
WHERE user_age = 
( SELECT user_age            -- 여기서 부터 SubQuery --
  FROM a_table
  WHERE user_name ='짱구');

 

서브쿼리문 이 언제 어떻게 쓰이는지 예시를 들어보겠다.

이 쿼리문은 내가 나이가 몇 살인 아이의 친구들 리스트를 출력하려고 한다.

하지만 나이는 기억이 안 나고 그 나이대의 아이의 이름만 확실히 기억난다.

이름은 '짱구' 다. 이럴 경우 서브쿼리문을 사용하면 위 () 안에 있는 쿼리문과 같이 

user_name(컬럼) 이 '짱구'인 a_table (테이블) 안에 있는 user_age (컬럼) 값을 찾는다.

(이렇게 되면 user_age의 값인 5를 추출해 낸다.)

 

 

 

<결과>

SubQuery문 실행 결과

 

그렇다면 WHERE 절에 있는 조건식은 a_table 안의 user_age = 5 인 값들을 모두 출력한다.

 

 

ANY(SOME)

1. 서브쿼리의 여러 개의 결과 중 한 가지만 만족하면 true이다.

2. SOME은 ANY와 동일한 의미로 사용한다.

 

비교 연산자와 ANY

  • > ANY :최소값 보다 크면
  • >= ANY : 최소값 보다 크거나 같으면
  • < ANY : 최대값 보다 작으면
  • <= ANY : 최대값 보다 작거나 같으면
  • = ANY : IN과 같은 기능

 

<예시>

SELECT * FROM a_table
WHERE user_age < ANY 
( SELECT user_age
  FROM a_table
  WHERE user_sex ='남');

 

 

 

<결과>(서브쿼리문 실행 결과, 전체 쿼리문 실행 결과)

서브쿼리 실행 결과
전체 쿼리문 실행 결과

 

< ANY를 사용했을 때 서브쿼리에 있는 쿼리문은 조건이 user_sex는 '남'인 a_table에 있는 user_age 값들인 5,42를 추출한 걸 확인할 수 있다. 이때 전체 쿼리문을 실행한다면 < ANY는 서브쿼리문의 최대값 보다 큰 값들을 추출한다.

 

 

 

ALL

1. 서브쿼리의 여러 개의 결과 중 모두 만족하면 true이다.

 

 

비교 연산자와 ALL

  • > ALL  : 최대값 보다 크면
  • >= ALL : 최대값 보다 크거나 같으면
  • < ALL : 최소값 보다 작으면
  • <= ALL : 최소값 보다 작거나 같으면
  • =   ALL  : 서브 쿼리의 결과가 1건이면 괜찮지만 여러 건이면 오류 발생

 

<예시>

SELECT * FROM a_table
WHERE user_age < ALL
( SELECT user_age
  FROM a_table
  WHERE user_sex ='남');

 

 

<결과>

전체 쿼리문 실행 결과

 

서브쿼리문 실행은 위의 ANY와 같다. 다만 전체 쿼리문 실행 결과가 다를 뿐이다.

ALL은 ANY와 다르게 비교 연산자도 다르다. 이점 유의해서 확인해야 한다.