3 ๋ถ„ ์†Œ์š”

๐Ÿ“š DB ( DataBase )


๐Ÿ“š Subquery

Subquery ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์‚ฌ๋ฒˆ์ด 100์ธ ์‚ฌ์›์˜ ๋ถ€์„œ์ด๋ฆ„์€?

-> join ์‚ฌ์šฉ

select department_name
from employees e inner join departments d
on e.department_id = d.department_id
where e.employee_id = 100;


-> subquery ์‚ฌ์šฉ

select department_name
from departments
where department_id = ( select department_id
                        from employees
                        where employee_id = 100);

Nested Subquery

Nested Subquery - ๋‹จ์ผ ํ–‰

-> 'adam'๊ณผ ๊ฐ™์€ ๋ถ€์„œ์— ๊ทผ๋ฌดํ•˜๋Š” ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ๋ถ€์„œ๋ฒˆํ˜ธ

select employee_id, first_name, department_id
from employees
where department_id = ( 
                        select department_id
                        from employees
                        where first_name='adam'
);

Nested Subquery - ๋‹ค์ค‘ ํ–‰

-> IN
-> ๊ทผ๋ฌด ๋„์‹œ๊ฐ€ 'seattle' ์ธ ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„

select employee_id, first_name
from employees
where department_id in (
                        select department_id
                        from department 
                        where location_id = (
                                             select location_id
                                             from locations
                                             where city = 'seattle'
                                            
                        )
);


-> ANY ( ์ ์–ด๋„ ํ•˜๋‚˜๋งŒ ๋งŒ์กฑํ•˜๋ฉด true )
-> ๋ชจ๋“  ์‚ฌ์› ์ค‘ ์ ์–ด๋„ ( ์ตœ์†Œ ๊ธ‰์—ฌ์ž ๋ณด๋‹ค ) 30๋ฒˆ ๋ถ€์„œ์—์„œ ๊ทผ๋ฌดํ•˜๋Š” ์‚ฌ์›์˜ ๊ธ‰์—ฌ๋ณด๋‹ค ๋งŽ์ด ๋ฐ›๋Š” ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ,์ด๋ฆ„,๊ธ‰์—ฌ,๋ถ€์„œ๋ฒˆํ˜ธ

select employee_id, first_name, salary, department_id
from employees
where salary > any (
                    select salary
                    from employees
                    where department_id = 30
);


-> ALL ( ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋ฉด true )
-> 30๋ฒˆ ๋ถ€์„œ์—์„œ ๊ทผ๋ฌดํ•˜๋Š” ๋ชจ๋“  ( ์ตœ๋Œ€ ๊ธ‰์—ฌ์ž ๋ณด๋‹ค ) ์‚ฌ์›๋“ค ๋ณด๋‹ค ๊ธ‰์—ฌ๋ฅผ ๋งŽ์ด ๋ฐ›๋Š” ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ๊ธ‰์—ฌ, ๋ถ€์„œ๋ฒˆํ˜ธ

select employee_id, first_name, salary, department_id
from employees
where salary > all (
                    select salary
                    from employees
                    where department_id = 30
);

Nested Subquery- ๋‹ค์ค‘ ์—ด

-> ์ปค๋ฏธ์…˜์„ ๋ฐ›๋Š” ์‚ฌ์› ์ค‘ ๋งค๋‹ˆ์ € ์‚ฌ๋ฒˆ์ด 148์ธ ์‚ฌ์›์˜ ๊ธ‰์—ฌ์™€ ๋ถ€์„œ๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„

select employee_id, first_name
from employees
where (salary, depmartment_id) in ( 
                                    select salary, department_id
                                    from employees
                                    where commission_pct is not null
                                    and manager_id = 148
);

Inline View Subquery

-> ๋ชจ๋“  ์‚ฌ์›์˜ ํ‰๊ท  ๊ธ‰์—ฌ๋ณด๋‹ค ์ ๊ฒŒ ๋ฐ›๋Š” ์‚ฌ์›๋“ค๊ณผ ๊ฐ™์€ ๋ถ€์„œ์—์„œ ๊ทผ๋ฌดํ•˜๋Š” ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ๊ธ‰์—ฌ, ๋ถ€์„œ๋ฒˆํ˜ธ

select employee_id, first_name, salary, department_id
from (
        select distinct department_id
        from employees
        where salary < (select avg(salary) from employees)
) d join employees e
on d.department_id = e.department_id;


-> limit ํ™œ์šฉ ( MYSQL์˜ ์žฅ์  )
-> ๋ชจ๋“  ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ , ์ด๋ฆ„, ๊ธ‰์—ฌ ์ถœ๋ ฅ 
-> ์‚ฌ์› ์ •๋ณด๋ฅผ ๊ธ‰์—ฌ์ˆœ์œผ๋กœ ์ •๋ ฌ
-> ํ•œ ํŽ˜์ด์ง€๋‹น 5๋ช…์ด ์ถœ๋ ฅ๋˜๊ณ  
-> ํ˜„์žฌํŽ˜์ด์ง€๊ฐ€ 3ํŽ˜์ด์ง€๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ผ ( 11๋“ฑ ~ 15๋“ฑ ์ถœ๋ ฅ )

select employee_id, first_name, salary
from employees
order by salary desc limit 10, 5;

Scalar Subquery

-> 60๋ฒˆ ๋ถ€์„œ์— ๊ทผ๋ฌดํ•˜๋Š” ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ๊ธ‰์—ฌ, ๋ถ€์„œ๋ฒˆํ˜ธ, 60๋ฒˆ๋ถ€์„œ์˜ ํ‰๊ท  ๊ธ‰์—ฌ

select employee_id, first_name, salary, departname_id,
     (select avg(salary) from employees where department_id = 60) as avg60
from employees
where department_id = 60;

Subquery ํ™œ์šฉ

CREATE

-> employees table ์„ emp_copy๋ผ๋Š” ์ด๋ฆ„์„ ๋ณต์‚ฌ

create table emp_copy
select *
from employees;

-> 50๋ฒˆ ๋ถ€์„œ์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ๊ธ‰์—ฌ, ๋ถ€์„œ๋ฒˆํ˜ธ๋งŒ emp50์ด๋ผ๋Š” ํ…Œ์ด๋ธ” ์ƒ์„ฑ

create table emp50
select employee_id, first_name, salary, department_id
from employees
where department_id=50;

INSERT

-> employees table ์—์„œ ๋ถ€์„œ๋ฒˆํ˜ธ๊ฐ€ 80์ธ ์‚ฌ์›์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ emp_blank์— insert

insert into emp_blank
select *
from employees
where department_id = 80;

UPDATE

-> employees table ์˜ ๋ชจ๋“  ์‚ฌ์›์˜ ํ‰๊ท  ๊ธ‰์—ฌ๋ณด๋‹ค ์ ๊ฒŒ ๋ฐ›๋Š” emp50 table์˜ ์‚ฌ์›์˜ ๊ธ‰์—ฌ๋ฅผ 500 ์ธ์ƒ

update emp50
set sal = sal + 500
where sal < (select avg(salary) from employees);

DELETE

-> employees table ์˜ ๋ชจ๋“  ์‚ฌ์›์˜ ํ‰๊ท  ๊ธ‰์—ฌ๋ณด๋‹ค ์ ๊ฒŒ ๋ฐ›๋Š” emp50 table์˜ ์‚ฌ์›์€ ํ‡ด์‚ฌ

delete from emp50
where sal < (select avg(salary) from employees);

DATABASE Subquery ๋งˆ๋ฌด๋ฆฌ

DB์˜ ๊ฝƒ์ธ Subquery๋ฅผ ๋ฐฐ์›Œ๋ณด์•˜๋‹ค.
ํ™•์‹คํžˆ Join๊ณผ Subquery๋ฅผ ๋ฐฐ์šฐ๋‹ˆ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ํ›จ์”ฌ ๋งŽ์ด ๋Š˜์–ด๋‚ฌ๋‹ค.
๋ฌผ๋ก  ๋ณต์žกํ•˜๊ฒŒ ๊ตฌํ•˜๋ฉด ์–ด๋ ต์ง€๋งŒ ์–ด๋Š์ •๋„ ๊ตฌ์กฐ๋Š” ๋‹ค ์ดํ•ดํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
Subquery๋„ ๋˜‘๊ฐ™์ด ๊ตญ์–ด ! ๋ฅผ ์ž˜ํ•ด์•ผํ•œ๋‹ค.. ใ…‹ใ…‹ ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋„ ์ž˜ ์•Œ์•„์•ผํ•˜๊ณ ..
๊ทธ๋ž˜์•ผ ์ฟผ๋ฆฌ๋ฌธ์„ ์ž˜ ์งค์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.
๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋งŒํผ ์ž˜ ์•Œ์•„๋‘ฌ์•ผํ•œ๋‹ค !!