본문 바로가기

Data/MariaDB

DB] IN / EXSITS / ANY / ALL / limit

 

IN & EXISTS

1. IN 
- '=' 비교만 가능, OR 조건의 검색 결과 내용을 가져온다.
- 서브쿼리가 먼저 실행된다.

세 쿼리문의 결과는 같다.

 

2. EXISTS
- 기본적으로 IN과 같으나 참 / 거짓 반환
- 메인쿼리 비교조건이 서브쿼리의 결과 중에 '만족하는 값이 하나라도 있으면 참(1)/거짓(0) 반환
- 메인쿼리가 먼저 실행된다.

서브쿼리의 결과가 만족하므로 1이 반환

첫번째 쿼리문의 결과는 모든 값이 다 나왔다.
서브쿼리에 해당하는 값이 있다 => exist를 거쳐 '1'을 반환 => 결국 두번재 쿼리문과 같아진다.

where 절에 1이 들어가면 참 => 모든 값을 보여준다.
where 절에 0이 들어가면 거짓 => 아무 값도 보여주지 않는다.

 

EXISTS 사용 방법

1) 메인쿼리가 먼저 실행된다.

실행결과

 

2) emp 의 모든 값을 가져오고(메인쿼리)
등가 조인에 만족하는 값만 걸러서 가져온다.(서브쿼리)

실행 결과

=> 그냥 등가조인 아닌감,,?******

 

3) IN과 EXISTS 비교해보기

- 일반적으로 EXISTS 는 IN 보다 성능이 좋다고 알려져 있다. 

-  IN 의 경우 서브쿼리에서 검색, 이후 메인쿼리에서 또다시 검색이 진행된다. (검색 2회)

- EXISTS 는 메인쿼리에서 모든 데이터를 가져온 후, 서브쿼리에서 검색을 진행한다. (검색 1회)

- 성능은 일반적으로 1만건 이상의 데이터에서 고려하자.

- 가져오는 것과 검색은 다름. 가져오는 건 걍 가져오는 거고 검색은 위에서부터 훑으면서 가기 때문에 검색 횟수가 성능에 영향을 미침.

 

 

ANY & ALL

 

1. ANY
: 기본적으로 IN과 비슷함 (OR 조건)

= ANY : IN과 같다.
> ANY : 최소값 보다 크면
< ANY : 최대값 보다 작으면 

= ANY
> ANY
< ANY

 

 

2. ALL
- ALL 은 ANY와 모든 게 반대
- 서브쿼리의 결과 중에서 모든 값이 일치하면 참(1) 반환

= ALL : AND 조건
> ALL : 최대값 보다 크면
< ALL : 최소값 보다 작으면

- AND 조건 : 서브쿼리 안의 결과값이 1개 이상이 나오면 안된다.

첫번째 쿼리문의 서브쿼리가 두번재 쿼리인데 결과값이 1,3 으로 1개 이상이기 때문에 첫번재 쿼리문의 결과값으로는 아무것도 나오지 않는다.

- all 에서는 and 조건이나 or 조건과는 상관없이 서브쿼리 안의 결과값이 무조건 1개 이어야 한다.

마찬가지로 두번재 쿼리가 첫번째의 서브쿼리. 결과값이 1 하나이므로 첫번재 쿼리도 결과값을 나타낸다.

 

> ALL / < ALL

 

 

LIMIT

결과값 중에서 상위 n 개 까지만 불러온다.

총 18개 데이터

 

1) limit n : n 개를 불러온다. 

상위 5개

 

2) limit n,m : n 부터 m 개를 불러온다.
n - 어디서부터 (0부터 시작)
m - 몇 개

n이 0부터 시작이므로 n = 5 이면 6번째 데이터 부터 5개
6 ~ 10

 

3) offset : 시작점을 지정 (0부터 시작)

limit 5 (= 상위 5개 가져와라) offset 5 (= 6번째 데이터부터)

결과값은 2번과 같다.

limit 6 (= 상위 6개 가져와라) offset (= 11번째 데이터부터)
결과값