Back to the DataBase

Union합집합 / SubQuery 서브쿼리 /

Backcoder 2022. 7. 15. 20:15

< Union > 

Join    => 컬럼을 합치는 것  
A 테이블의 a,b,c 컬럼과 
B 테이블의   d,e 컬럼을 합쳐서 
a , b,  c ,d ,e  컬럼으로 보여주는 것 

Union  => 레코드를 합치는 것 ( 합집합 )
  => 중복되는거 하나로 봄 

 

create table A(
select * from employees 
where department_id = 50); 

create table B(
select * from employees 
where salary < 10000);

재난지원금 주고싶다. 
50번 부서사람들 한테 줄꺼고 
봉급낮은 사람 줄거다. 
=> 합집합 =>  중복 X => 중복지급 X   

select first_name from A
Union                
select first_name from B; 

     
< Union All  => 중복되던 말던 그냥 다 보여줘 >



< SubQuery 서브쿼리 > 


select - select 서브쿼리 

select department_id from employees
where first_name = 'kelly';   => 50 

켈리 부서번호를 찾아서 (50이네)
그 부서번호의 다른 사원들 찾아보고싶다 

select first_name

from employees 
where department_id = 50

=> 이걸 서브쿼리로 합쳐서 한번에 가능 

Select  first_name, department_id
from employees 
where department_id = 
( Select department_id from employees
where first_name = 'kelly' ) ;   

 

=> 괄호처리 를 해서 서브쿼리임을 알리고 
먼저 실행하게 한다. 

=> 그 결과 값을 넣어서 사용 

 

위와 같이 department_id  =    이퀄을 사용할 경우에는 
- ( )서브쿼리 리턴값의 개수와 타입은 
그걸 받는 개수 타입과 같아야 한다.

예를들어, 부서id 가 50 하나 리턴이면 위의 결과 잘 나오지만 
부서 id 가 50, 80 두개를 리턴하는데,  = 이퀄이면 오류난다. 


=> IN 을 사용한다 

< 다중행 서브쿼리 => IN 사용 > 

 

select first_name, deparment_id
from employees 
where deparment_id  IN
( select department_id 
from emplyees
where first_name = peter); 

( 몇개 나올지 모를때도 IN 쓰면 다 해결.  
반드시 하나만 나오는게 확실할 때만 = 쓴다 

<* NOT IN > => 없을때 ! ( 여집합 )



<  서브쿼리로도,  데이터 여러개 조회 가능  >

select first_name, department_id
from employees 
where ( job_id, department_id ) = 
(select  job_id,  department_id  from employees
where first_name = 'kelly'); 

=> where 조건과 숫자 타입 맞춰서 사용