mysql 서브쿼리(sub query) -any all some
서브쿼리란 쿼리문 안에 또 쿼리문이 들어있는 것을 말한다.
TABLE userTable
name addr mobile height birthDay
-------------------------------------------------------------------------
은지원 경남 010000111 177 2007-12-12
성시경 강원 010000111 179 2007-12-12
김범수 경남 010000111 172 2007-12-12
김경호 경남 010000111 173 2007-12-12
위 테이블에서 김경호 키보다는 큰 키를 구하고자 한다.
1.select * from userTable where height >177
위처럼 조회하면 되는데, 이것을 서브쿼리로 조회를 해보자.
2. 서브쿼리로 ㄱㄱ
select * from userTable where height > (select height from userTable where name='김경호')
위처럼 조회하면 (여기 괄호에 있는 쿼리문이 김경호의 키인 177을 조회해온다. ) (쿼리문~~~~) 이것이 '177'에 해당하는 것이다.
자 간단한 서브쿼리였는데, 이번에는 이렇게 해보자.
주소지가 경남인 사람들보다 큰 사람을 구하자.
3.select * from userTable where height > (select height from userTable where addr='경남')
자 이렇게 하면 에러가 난다. 이유는 경남 이란 것이 여러개 데이타가 좋재하기 때문이다.
"Error Code : 1242. Subquery returns more than 1 row"
라는 에러메시지를 받게 된다.
ANY( =SOME) , ALL를 사용해 위 결과에 대처하자.
select * from userTable where height > ANY(select height from userTable where addr='경남')
라고 조회하면 경남권인 사람의 키인 177이나 173보다는 큰 경우의 로우들을 모두 불러오게 된다.
select * from userTable where height > ALL(select height from userTable where addr='경남')
경남권 사람의 키가 177과 173 이므로, 이 두개 모두 만족해야한다. 즉 177 키 이상인 경우만 해당된다.
SOME은 ANY와 같은 의미로 사용된다.
즉 정리하자면 ANY는 OR의 개념이다. 다수의 로우가 나오면 그중 1개만 만족해도 된다.
하지만 ALL 은 검색된 로우들의 AND라고 보면 된다. 검색된 로우들을 모두 만족해야하기 때문이다.