Day28 Database-2

์›ฐ์น˜์Šคยท2022๋…„ 11์›” 30์ผ
0

221130

๐Ÿ“Œ 7. ์„œ๋ธŒ์ฟผ๋ฆฌ(Subquery)

์„œ๋ธŒ์ฟผ๋ฆฌ๋ž€? ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ ์•ˆ์— ๋˜ ๋‹ค์‹œ ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Group by ์ ˆ์„ ์ œ์™ธํ•œ ์ฟผ๋ฆฌ๊ตฌ๋ฌธ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • ์„œ๋ธŒ์ฟผ๋ฆฌ ์œ ํ˜•: ๋‹จ์ผํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ, ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ

[where์ ˆ์— ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ๋ฒ•]
select ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2, ์ปฌ๋Ÿผ3
ย ย ย ย ย ย ย ย ย from ํ…Œ์ด๋ธ”๋ช…
ย ย ย ย ย ย ย ย ย where ์ปฌ๋ ด๋ช… = (select ์ปฌ๋Ÿผ๋ช…
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย from ํ…Œ์ด๋ธ”๋ช…
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย where ์กฐ๊ฑด๋ฌธ);

โœ employeesํ…Œ์ด๋ธ”์—์„œ Able๋ณด๋‹ค ๊ธ‰์—ฌ๋ฅผ ๋” ๋งŽ์ด ๋ฐ›๋Š” ์‚ฌ์›๋“ค์˜
ย ย ย ย ย employee_id, last_name, salary๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select employee_id, last_name, salary
from employees
where salary > (select salary
				from employees
                where last_name = 'abel');


๐Ÿ“‚ ๋‹จ์ผํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ(Single-row subquery)

: ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์˜ค์ง ํ•˜๋‚˜์˜ ํ–‰์ด ๋ฐ˜ํ™˜๋˜๋Š” ์œ ํ˜•
ย ย ๋ฉ”์ธ์ฟผ๋ฆฌ์— ๋‹จ์ผํ–‰ ๋น„๊ต์—ฐ์‚ฐ์ž ์‚ฌ์šฉํ•˜๋ฉด ๋จ.

  • ๋‹จ์ผํ–‰ ๋น„๊ต์—ฐ์‚ฐ์ž : =, >, >=, <, <=, <>

โœ 141๋ฒˆ ์‚ฌ์›๊ณผ ๋™์ผํ•œ ์—…๋ฌด ๋‹ด๋‹น์ž๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select employee_id, last_name, job_id
from employees
where job_id = (select job_id
				from employees
				where employee_id =141);

โœ 141๋ฒˆ ์‚ฌ์›๊ณผ ๋™์ผํ•œ ์—…๋ฌด ๋‹ด๋‹น์ž๋ฅผ ์ถœ๋ ฅํ•˜๋˜, ๊ฒฐ๊ณผ์— 141๋ฒˆ ์‚ฌ์›์„ ์ œ์™ธํ•˜์‹œ์˜ค.

select employee_id, last_name, job_id
from employees
where job_id = (select job_id
				from employees
				where employee_id =141)
and employee_id <> 141;

โœ employees ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ์ง์› ์ค‘ ๊ธ‰์—ฌ๋ฅผ ๊ฐ€์žฅ ์ ๊ฒŒ ๋ฐ›๋Š” ์‚ฌ์›์˜
ย ย ย ย ย employee_id, last_name, salary,job_id, department_id๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค

select employee_id, last_name, salary, job_id, department_id
from employees
-- where salary = (์šฐ๋ฆฌํšŒ์‚ฌ ์ตœ์†Œ๊ธ‰์—ฌ);
where salary = (select min(salary)
				from employees);

โœ 'Lee'์™€ ๋™์ผ์—…๋ฌด๋ฅผ ๋‹ด๋‹นํ•˜๋ฉด์„œ ๊ธ‰์—ฌ๋Š” ๋” ๋งŽ์ด ๋ฐ›๋Š” ์‚ฌ์›์˜ ์ •๋ณด ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select last_name, job_id, salary
from employees
where job_id = (select job_id
				from employees
				where LAST_NAME = 'Lee')
AND salary > (select salary
			  from employees
              where last_name = 'Lee');

< Having์ ˆ์— ์„œ๋ธŒ์ฟผ๋ฆฌ ์‚ฌ์šฉ ์˜ˆ์ œ >

โœ ๋ถ€์„œ๋ณ„ ์ตœ์†Œ๊ธ‰์—ฌ๋ฅผ ์ถœ๋ ฅํ•˜๋˜, 30๋ฒˆ ๋ถ€์„œ์˜ ์ตœ์†Œ๊ธ‰๋ณด๋‹ค ํฐ ๋ถ€์„œ๋“ค๋งŒ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select department_id, min(salary)
from employees
where department_id is not null
group by department_id
having min(salary) > (select min(salary)
					  from employees
                      where department_id = 30);

โœ ๋ถ€์„œ๋ณ„ ์ตœ์†Œ๊ธ‰์—ฌ์™€ ๋™์ผํ•œ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์ง์›๋“ค์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select employee_id, last_name
from employees
where salary = (select min(salary)		-- ๋ถ€์„œ๋ณ„ ์ตœ์†Œ๊ธ‰์—ฌ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ
				from employees
                group by department_id);


โŒ [์˜ค๋ฅ˜์›์ธ?]
: ๋ฉ”์ธ์ฟผ๋ฆฌ์— ๋‹จ์ผํ–‰ ๋น„๊ต์—ฐ์‚ฐ์ž(=)๋ฅผ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฏ€๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ๋ถ€ํ„ฐ ํ•œ ํ–‰์ด ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ
ย ์—ฌ๋Ÿฌ ํ–‰์ด ๋ฐ˜ํ™˜๋˜์–ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ๋จ.

โญ• [์ˆ˜์ •]
: ๋ถ€์„œ๋ณ„ ์ตœ์†Œ๊ธ‰์—ฌ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ

select employee_id, last_name
from employees
where salary in (select min(salary)
		from employees
               	group by department_id);	//26๋ช…

โŒ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š” ์›์ธ์€?
: (์›๋ž˜๋Š” hass๋งŒ์ด๋ผ๋„ ๋‚˜์™€์•ผํ•˜์ง€๋งŒ) ํšŒ์‚ฌ์— Haas๋ผ๋Š” ์ง์›์ด ์—†์Œ!!
๋‹จ์ผํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ์ธ ๊ฒฝ์šฐ, ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ null์ด๋ฉด ๋ฉ”์ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋„ null๊ฐ’์ด ๋ฐ˜ํ™˜๋จ.

select last_name, job_id
from employees
where job_id = (select job_id
				from employees
                where last_name ='Haas');


๐Ÿ“‚ ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ(Multiple-row subquery)

: ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๋ฉ”์ธ์ฟผ๋ฆฌ๋กœ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ–‰์„ ๋ฐ˜ํ™˜๋˜๋Š” ์œ ํ˜•
ย ย ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ์ธ ๊ฒฝ์šฐ, ๋ฉ”์ธ์ฟผ๋ฆฌ์— ๋‹ค์ค‘ํ–‰ ๋น„๊ต์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

  • ๋‹ค์ค‘ํ–‰ ๋น„๊ต์—ฐ์‚ฐ์ž: in, not in, any, all

=anyย ย ย => (=, or)ย ย ย ย ย (=) in => (=, or)
>anyย ย ย => (>, or) ย ย ย ย : ์ตœ์†Œ๊ฐ’๋ณด๋‹ค ํฐ์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ์—ฐ์‚ฐ์ž
>=any => (>=, or) ย ย : ์ตœ์†Œ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ์—ฐ์‚ฐ์ž
<anyย ย ย => (<, or) ย ย ย ย : ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ์ž‘์€์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ์—ฐ์‚ฐ์ž
<=any => (<=, or) ย ย : ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ์—ฐ์‚ฐ์ž
<>any => (<>, or)ย ย ย : ๋‹ค ๋งŒ์กฑ๋จ. ๊ฑธ๋Ÿฌ์ฃผ๋Š”๊ฒŒ ์—†๊ธฐ๋•Œ๋ฌธ์— ๋ณดํ†ต ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ!
=allย ย ย ย ย => (=, and)ย ย ย : ๋ณดํ†ต ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ!
>allย ย ย ย ย => (>, and)ย ย ย : ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ํฐ์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ์—ฐ์‚ฐ์ž
>=allย ย ย => (>=, and) : ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ์—ฐ์‚ฐ์ž
<allย ย ย ย ย => (<, and)ย ย ย : ์ตœ์†Œ๊ฐ’๋ณด๋‹ค ์ž‘์€์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ์—ฐ์‚ฐ์ž
<=allย ย ย => (<=, and) : ์ตœ์†Œ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ์—ฐ์‚ฐ์ž
<>allย ย ย => (<>, and) (=) not in => (<>, and)


<IN ํ™œ์šฉ ์˜ˆ์ œ>

SELECT employee_id, last_name, manager_id, department_id 
FROM employees 
WHERE manager_id IN (SELECT manager_id 
					 FROM employees 
					 WHERE employee_id IN (174, 141)) 
AND department_id IN (SELECT department_id 
					  FROM employees 
					  WHERE employee_id IN (174, 141)) 
AND employee_id NOT IN(174, 141); 

<Any ํ™œ์šฉ ์˜ˆ์ œ>

select employee_id, last_name, job_id, salary
from employees
where salary < any (select salary
					from employees
                    where job_id='IT_PROG')
and job_id <> 'IT_PROG';

โœ 'IT_PROG' ๋‹ด๋‹น์ž๋“ค๋ณด๋‹ค ๊ธ‰์—ฌ๋ฅผ ์ž‘๊ฒŒ ๋ฐ›๋Š” ์ง์›๋“ค ์ถœ๋ ฅํ•˜๋˜, 'IT_PROG' ์ง์›๋“ค์€ ๋นผ๊ณ  ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select employee_id, last_name, job_id, salary
from employees
where salary < all (select salary
					from employees
					where job_id ='IT_PROG')
and job_id <> 'IT_PROG';	// 44๋ช…

0๊ฐœ์˜ ๋Œ“๊ธ€