괴발개발

[강의 정리]D-52 DB(in, exist, any) 본문

BACK END/DB

[강의 정리]D-52 DB(in, exist, any)

dinoelll 2023. 3. 22. 14:00

[목차]

1. in & exists

2. any & all


1. in & exists

[exists] : 사용 및 반환값
1.메인 쿼리 실행 후 서브쿼리 조건을 비교 한다.
2. 해당 결과가 있는지 1과 0을 반환

[장점]

1. 속도가 우수하다! > in -  메인 돌고 서브 도니까 (데이터 확보하고 하는거니까)

    * in은 조건을 추출하고 그 조건으로 전체 데이터 검색하지만,

    * exists는 메인쿼리를 통해 데이터 확보하고, 서브 쿼리로 조건 걸러낸다.

 

일단

1.in

1. '=' 비교만 가능하고, or 조건의 검색 결과 내용을 가져온다.

   * 서브가 동작한 후에 메인 쿼리가 동작함.

select ename, job from emp e where deptno in (2,4);
select ename, job from emp e where deptno 
	 in (select deptno from dept where loc = 'LA' or loc = 'boston');

2. exist

0. [번외!]

[ exist의 중요한 점!!!!]
0과 1을 반환하는거긴 함. 
but , 테이블이 달라진다면 
조건(where)으로 들어갈 때 걸러서 들어간다!

 

1. 해당 결과가 있는지 1과 0을 반환

보스턴과 la가 있다면 1을 반환 없으면 0을 반환
select exists(select deptno from dept where loc = 'LA' or loc = 'boston') as yn;

 

2.

select ename, job, deptno from emp where 1;

 

이건 조건에 1이면 데이터를 보여주는걸로 먼저 설정하면

 

2-1

select ename, job, deptno from emp 
	where exists(select deptno from dept where loc = 'LA' or loc = 'boston');

 

** 1 = exists 문이니까 이렇게 표현 가능

 

만약 0이라면 보스턴과 la가 같이 일치하는게 없다는거고

그러니까 아무것도 안보여주겠지

 

select ename, job, deptno from emp where 0;
select ename, job, deptno from emp 
	where exists(select deptno from dept where loc = 'korea');

드디어 [사용법]

3. 사용법

1) 메인 퀴리가 먼저 실행

2) 가져온 데이터를 하나하나 조건에 맞는지 여부를 따진다.

3) 결과적으로 확보한 데이터에 loc= 'LA' or loc 'boston' 조건을 추가 해 준다.

 

dept 와 emp

1) 메인 퀴리가 먼저 실행
select ename, job, deptno from emp;

* 메인 쿼리가 실행 - emp  에서 ename, job , deptno 만 가져옴

 

2) 가져온 데이터를 하나하나 조건에 맞는지 여부를 따진다.
select ename, job, deptno from emp e 
	where exists(select deptno from dept d where e.deptno = d.deptno);

deptno가 겹치는거 있어? = '응'

그럼 dept에서 deptno만 가져와 = '응' 1,2,4

 

 1 로 반환 <= exists  (1,2,4) 있으면

 

그럼 emp에서 ename , job, deptno 가져와

emp에서 1,2,4만 가져온 모습

3) 결과적으로 확보한 데이터에 loc= 'LA' or loc 'boston' 조건을 추가 해 준다.

select ename, job, deptno from emp e 
	where exists(select deptno from dept d 
    where e.deptno = d.deptno and (loc = 'LA' or loc = 'boston'));

위에 나온 결과에서 다시 boston과 la인 애들만 데려와!

2번과 4번 애들이니까!!! 

 

2,4번만 추려서 보여줌!

 

최종 exist 결과

2. any & all

[any]

ㅡㅡㅡㅡㅡ<ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ>ㅡㅡㅡㅡㅡㅡㅡ

              최소값                                                                       최대값

[all]

ㅡㅡㅡㅡㅡ<ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ>ㅡㅡㅡㅡㅡㅡㅡ   

              최소값                                                                       최대값                                      

any : in과 같은 효과, '=' 뿐만 아니라 부등호(<, >) 사용가능

1) < any : 최소값 보다 크면
2) > any : 최대값보다 작으면

1) < any : 최소값 보다 크면

직책이 manager 인 직원의 입사일이 가장 빠른 사람보다 늦은 이름과, 직책 , 입사일
select ename, job, hiredate from emp 
	 where hiredate > any(select hiredate from emp where job = 'manager')
	 order by hiredate;

 

 

2) > any : 최대값보다 작으면

 

직책이 manager 인 직원의 입사일이 가장 늦은 사람보다 빠른 이름과, 직책 , 입사일
select ename, job, hiredate from emp 
	 where hiredate < any(select hiredate from emp where job = 'manager')
	 order by hiredate;
all : any와 비슷하다
1) = all 는: and 조건을 사용한다
2) > all : 최대값 보다 크면
3) < all : 최소값 보다 작으면

 

'BACK END > DB' 카테고리의 다른 글

[강의 정리] DB(index, view)  (0) 2023.03.22
emp, dept  (0) 2023.03.22
[강의 정리]D-52 DB#3 (join)  (0) 2023.03.22
[퀴즈 정리]D-51 DB - contraint  (0) 2023.03.22
[강의 정리]D-51 DB(contraint - 제약 조건)  (0) 2023.03.21
Comments