DAY-25. Oracle, ์„œ๋ธŒ์ฟผ๋ฆฌ

4 minute read

๐Ÿ” 2022-04-05

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

โ— ์ˆ˜์—…์„ ๋“ฃ๊ณ , ๊ฐœ์ธ์ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ ์€ ๊ฒƒ ์ด๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋„ ์žˆ์Œ

2022-04-05

๐Ÿ”” set Operator (์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž)

  • ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์กฐ์ธ ์—†์ด ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹
  • ๊ฐ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฒฐ๊ณผ๊ฐ’์„ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ์‹
  • ์—ฌ๊ฑฐ ๊ฐœ์˜ sql๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

์กฐ๊ฑด

  1. select ์ ˆ์—์„œ ์กฐํšŒํ•˜๋ ค๋Š” โ€˜์ปฌ๋Ÿผ์˜ ์ˆ˜๊ฐ€ ๋™์ผโ€™
  2. select ์ ˆ์˜ ์ข…์ผ ์œ„์น˜์— ์กด์žฌํ•˜๋Š” ์ปฌ๋Ÿผ์˜ โ€˜๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์ƒํ˜ธ ํ˜ธํ™˜ ๊ฐ€๋Šฅโ€™

UNION(ํ•ฉ์ง‘ํ•ฉ)

์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ฒซ๋ฒˆ์งธ ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ ์คŒ

  • ๊ฐ ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒํ•˜๋Š” ์ปฌ๋Ÿผ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ
  • ์กฐํšŒํ•˜๋ ค๋Š” ์ปฌ๋Ÿผ์ด ์„œ๋กœ ์ƒํ˜ธํ˜ธํ™˜ ๋ถˆ๊ฐ€ํ•œ(๊ฐ™์€ ํƒ€์ž…์ด ์•„๋‹ˆ๋ฉด) ๋ฐ์ดํ„ฐ์ด๋ฉด union ์‚ฌ์šฉ x

๐Ÿ’ก UNION์€ ์ปฌ๋Ÿผ์˜ ์ˆ˜์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์•„์•ผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

SELECT no_a from A // 1,5,3,4,2
SELECT no_b from B; // 7,6,3,8,5,9

SELECT no_a from A
UNION
SELECT no_b from B;

// 1,2,3,4,5,6,7,8,9 (์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋Š” ์ œ๊ฑฐ ๋˜๊ณ  ์ถœ๋ ฅ)

UNION ALL (ํ•ฉ์ง‘ํ•ฉ)

์ข…๋ณต๋œ ๋ฐ์ดํ„ฐ์ œ๊ฑฐ๋ฅผ ์•ˆํ•˜๊ณ  , ์ •๋ ฌ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ค€๋‹ค

โ†’ ์กฐํšŒ๋œ ๊ฒฐ๊ณผ๊ฐ’์˜ ์ฒซ๋ฒˆ์งธ ํ…Œ์ด๋ธ” ์•„๋ž˜๋กœ ๋‘๋ฒˆ์งธ ํ…Œ์ด๋ธ” ๊ฒฐ๊ณผ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ด์–ด๋ถ™์ด๋Š” ์‹.

SELECT no_a from A // 1,5,3,4,2
SELECT no_b from B; // 7,6,3,8,5,9

SELECT no_a from A
UNION ALL
SELECT no_b from B;  // 5 3 4 2 7 6 3 8 5 9

INTERSECT (๊ต์ง‘ํ•ฉ)

๋‘ ํ…Œ์ด๋ธ”์˜ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘ ๊ณตํ†ต๋œ ๊ฒฐ๊ณผ ๊ฐ’๋งŒ ๋ณด์—ฌ ์คŒ.

SELECT no_a from A // 1,5,3,4,2
SELECT no_b from B; // 7,6,3,8,5,9

SELECT no_a from A
INTERSECT
SELECT no_b from B;     // 3 5

MINUS (์ฐจ์ง‘ํ•ฉ)

๋‘ ํ…Œ์ด๋ธ”์˜ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘ ๊ณตํ†ต๋œ ์š”์†Œ๋ฅผ ๋บ€ ํ•œ ํ…Œ์ด๋ธ”์˜ ๊ฒฐ๊ณผ๊ฐ’๋งŒ ๋ณด์—ฌ์คŒ

SELECT no_a from A // 1,5,3,4,2
SELECT no_b from B; // 7,6,3,8,5,9

SELECT no_a from A
MINUS
SELECT no_b from B;  // 1,2,4 (์ค‘๋ณต ์ œ๊ฑฐ ํ›„ A๋ถ€๋ถ„์„ ๋ณด์—ฌ์คŒ)

SELECT no_b from B
MINUS
SELECT no_a from A;  // 6,7,8,9(์ค‘๋ณต ์ œ๊ฑฐ ํ›„ B๋ถ€๋ถ„์„ ๋ณด์—ฌ์คŒ)

1.png

๐Ÿ”” ์„œ๋ธŒ์ฟผ๋ฆฌ (SubQuery)

ํ•˜๋‚˜์˜ sql ๋ฌธ์•ˆ์— ํฌํ•จ๋œ ๋‹ค๋ฅธ sql๋ฌธ ()์•ˆ์— sql ๋ฌธ ์‚ฝ์ž…

โ†’ ๋ฉ”์ธ ์ฟผ๋ฆฌ๊ฐ€ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ์ข…์†์ ์ธ ๊ด€๊ณ„

โ†’ ์†Œ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์คŒ / ์—ฐ์‚ฐ์ž์˜ ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜ / order by ์ ˆ์€ subquery๋‚ด์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

select
    emp_id, emp_name
from employee
    where emp_id = (select manager_id from employee where emp_name ='์ „์ง€์—ฐ');

// select manager_id from employee where emp_name ='์ „์ง€์—ฐ'์˜ ๊ฐ’์ด 214๊ฐ€ ๋„์ถœ๋˜์–ด
// where emp_id = 214๊ฐ€ ๋œ๋‹ค.

๋‹จ์ผํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ

์„œ๋ธŒ์ฟผ๋ฆฌ ์กฐํšŒ ๊ฒฐ๊ณผ ๊ฐ’์ด 1๊ฐœ(ํ–‰)์ผ ๊ฒฝ์šฐ

๐Ÿ”Ž
// ์ „ ์ง์›์˜ ๊ธ‰์—ฌ ํ‰๊ท ๋ณด๋‹ค ๊ธ‰์—ฌ๋ฅผ ๋งŽ์ด ๋ฐ›๋Š” ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์‚ฌ์›๋ช…, ์ง๊ธ‰์ฝ”๋“œ, ์›”๊ธ‰ ์กฐํšŒ


select
    emp_id , emp_name , job_code , salary
from employee
    where salary > 3047662;

// ์œ„ ๋‘๊ฐœ์˜ ์ฟผ๋ฆฌ๋ฌธ์„ ํ•˜๋‚˜๋กœ

select
    emp_id , emp_name , job_code , salary
from employee
    where salary > (select  floor(avg(salary)) from employee);
๐Ÿ”Ž
// ์œค์€ํ•ด ์ง์›๊ณผ ๊ธ‰์—ฌ๊ฐ€ ๊ฐ™์€ ์‚ฌ์›๋“ค์„ ๊ฒ€์ƒ‰ -> ์‚ฌ๋ฒˆ, ์‚ฌ์›๋ช…, ๊ธ‰์—ฌ ์ถœ๋ ฅ

select
    emp_id, emp_name, salary
from employee
    where salary = (select salary from employee where emp_name = '์œค์€ํ•ด')
            and emp_name != '์œค์€ํ•ด';

๋‹ค์ฃผํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ

์„œ๋ธŒ์ฟผ๋ฆฌ ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ(์—ฌ๋Ÿฌ ํ–‰) ์ผ ๋•Œ

โ†’ ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ ์•ž์—๋Š” = , ! = ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ๋ถˆ๊ฐ€

โ†’ in, not in, any, all, exists ๋“ฑ์„ ์ด์šฉ

๐Ÿ”Ž
//์ฐจํƒœ์—ฐ, ์ „์ง€์—ฐ ์‚ฌ์›์˜ ๊ธ‰์—ฌ๋“ฑ๊ธ‰(sal_level)๊ณผ ๊ฐ™์€ ๋“ฑ๊ธ‰์„ ๊ฐ€์ง„ ์‚ฌ์›์˜ ์ง๊ธ‰๋ช…, ์‚ฌ์›๋ช…, ๊ธ‰์—ฌ๋“ฑ๊ธ‰ ์ถœ๋ ฅ

select * from job;
select emp_name , sal_level from employee where emp_name in('์ฐจํƒœ์—ฐ','์ „์ง€์—ฐ');
select emp_name, sal_level from employee where sal_level in ('S5','S4');

select
    job_name "์ง๊ธ‰๋ช…",
    emp_name "์‚ฌ์›๋ช…",
    sal_level "๊ธ‰์—ฌ๋“ฑ๊ธ‰"
from employee join job
     using(job_code)
where sal_level in (select sal_level from employee where emp_name in('์ฐจํƒœ์—ฐ','์ „์ง€์—ฐ'));

any

์„œ๋ธŒ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘์— ํ•˜๋‚˜๋ผ๋„ ์ฐธ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์ฐธ (or)

๊ฐ’ > any(1,2,3) : ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฐ’์ด ์˜ค๋ฅธ์ชฝ์˜ ์ตœ์†Œ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๋œ๋‹ค.-> ๊ฐ’์ด 1 ๋ณด๋‹ค ํฌ๋ฉด ์ฐธ
๊ฐ’ < any(1,2,3) : ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฐ’์ด ์˜ค๋ฅธ์ชฝ์˜ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋œ๋‹ค -> ๊ฐ’์ด 3๋ณด๋‹ค ์ž‘์œผ๋ฉด ์ฐธ
๊ฐ’ = any(1,2,3) : in๊ณผ ๊ฐ™์€ ์˜๋ฏธ
๊ฐ’ != any(1,2,3) : not in ๊ณผ ๊ฐ™์€ ์˜๋ฏธ
๐Ÿ”Ž
// ๊ธ‰์—ฌ๊ฐ€ 200๋งŒ์› ํ˜น์€ 300๋งŒ์›๋ณด๋‹ค ํฐ ์‚ฌ๋žŒ์˜ ์‚ฌ์›๋ช…, ๊ธ‰์—ฌ ์ถœ๋ ฅ

select
    emp_name,salary
from employee
    where salary > any(2000000,3000000); // salary๊ฐ€ 2000000๋ณด๋‹ค ํฌ๋ฉด ์ถœ๋ ฅ
๐Ÿ”Ž
// D1, D5์˜ ๋ถ€์„œ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง„ ์‚ฌ์›๋“ค์˜ ๊ธ‰์—ฌ๋ณด๋‹ค ์ ๊ฒŒ ๋ฐ›๋Š” ์‚ฌ์›๋“ค์˜ ์‚ฌ์›๋ช…, ๊ธ‰์—ฌ, ๋ถ€์„œ์ฝ”๋“œ ์ถœ๋ ฅ
// D1, D5 ๋ถ€์„œ ์ง์›์€  ์ถœ๋ ฅ X
// ์ •๋ ฌ์€ ๋ถ€์„œ์ฝ”๋“œ ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ

// 1 ๋ฒˆ์งธ ๋ฐฉ๋ฒ•
select
    emp_name, salary, nvl(dept_code,'์ธํ„ด') "๋ถ€์„œ์ฝ”๋“œ"
from employee
where salary < any(select salary from employee where dept_code in('D1','D5'))
        and dept_code not in ('D1','D5') or dept_code is null
															// null ๊ฐ’๋„ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ์ฝ”๋“œ dept_code is null
order by 3;

// 2 ๋ฒˆ์งธ ๋ฐฉ๋ฒ•
select
    emp_name, salary, dept_code "๋ถ€์„œ์ฝ”๋“œ"
from employee
where salary < any(select salary from employee where dept_code in('D1','D5'))
        and nvl(dept_code,'์—†์Œ') not in ('D1','D5')
order by 3;

๐Ÿ’ก null ๊ฐ’ ๋น„๊ต๋Š” is null ํ˜น์€ is not null๋กœ๋งŒ ๋น„๊ต ๊ฐ€๋Šฅ

all

์„œ๋ธŒ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘์— ๋ชจ๋“  ๊ฒƒ์ด ์ฐธ์ด์—ฌ์•ผ๋งŒ ํ•จ

๊ฐ’ > all(1,2,3) : ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฐ’์ด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์ตœ๋Œ€๊ฐ’ ๋ณด๋‹ค ์ปค์•ผํ•œ๋‹ค
๊ฐ’ < all(1,2,3) : ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฐ’์ด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์ตœ์†Œ๊ฐ’ ๋ณด๋‹ค ์ž‘์•„์•ผํ•œ๋‹ค
๊ฐ’ = all(1,2,3) : ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฐ’์ด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๊ฐ’์˜ ๋ชจ๋‘์™€ ๋˜‘๊ฐ™์•„์•ผํ•œ๋‹ค -> and ์—ฐ์‚ฐ์ž

๋‹ค์ค‘์—ด ์„œ๋ธŒ์ฟผ๋ฆฌ

์„œ๋ธŒ์ฟผ๋ฆฌ ์กฐํšŒ ๊ฒฐ๊ณผ ์—†์ด ์—ฌ๋Ÿฌ๊ฐœ(์—ด) ์ผ ๋•Œ


๐Ÿ”Ž
// ํ‡ด์‚ฌํ•œ ์—ฌ์ง์› -> ๊ฐ™์€ ๋ถ€์„œ, ๊ฐ™์€ ์ง๊ธ‰์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์›์˜ ์‚ฌ์›๋ช…, ์ง๊ธ‰์ฝ”๋“œ, ๋ถ€์„œ์ฝ”๋“œ, ์ž…์‚ฌ์ผ ์กฐํšŒ

select dept_code, job_code
from employee
    where ent_yn ='Y'
    and substr(emp_no,8,1) = 2;

select
    emp_name, job_code, dept_code, hire_date
from employee
    where dept_code ='D8' and job_code = 'J6';

select
    emp_name, job_code, dept_code, hire_date
from employee
    where (dept_code ,job_code) in (select dept_code, job_code from employee where ent_yn ='Y' and substr(emp_no,8,1) = 2);
  • dept_code์™€ job_code โ†’ ์—ด์ด ๋‘๊ฐœ๋‹ค โ†’ ๋‹ค์ค‘์—ด ์„œ๋ธŒ์ฟผ๋ฆฌ ์ด์šฉ โ†’ where ์ ˆ ์•ˆ์— () in ()์œผ๋กœ ํ™œ์šฉ
๐Ÿ”Ž
๊ธฐ์ˆ ์ง€์›๋ถ€์ด๋ฉด์„œ ๊ธ‰์—ฌ๊ฐ€ 200๋งŒ์›์ธ ์ง€์›์˜ ์‚ฌ์›๋ช…, ๋ถ€์„œ์ฝ”๋“œ, ๊ธ‰์—ฌ, ๋ถ€์„œ์˜ ์ง€์—ญ๋ช… ์ถœ๋ ฅ

select * from employee join department on(dept_code = dept_id) where dept_title ='๊ธฐ์ˆ ์ง€์›๋ถ€' and salary = 2000000;

// ๋ฐฉ๋ฒ• 1
select
    emp_name,dept_code,salary,local_name
from employee join department
        on(dept_code = dept_id) join location
        on(location_id = local_code)
where dept_title ='๊ธฐ์ˆ ์ง€์›๋ถ€' and salary = 2000000;

// ๋ฐฉ๋ฒ• 2 -> department๋ฅผ ์—ฐ๊ฒฐ ํ‚ค๋กœ ํ•ด์„œ ์‚ฌ์šฉ
select
    emp_name,dept_code,salary,local_name,local_code
from employee, location
    where (dept_code, local_code) in (select dept_id, location_id from department where dept_title = '๊ธฐ์ˆ ์ง€์›๋ถ€')
    and salary = 2000000;

// employee์™€ location์€ ์ง์ ‘ ์—ฐ๊ฒฐํ•œ ํ‚ค๊ฐ€ ์—†๊ธฐ์— department์‚ฌ์šฉ

join์—์„œ๋„ group by ๊ฐ€๋Šฅ

//๋ถ€์„œ์ฝ”๋“œ, ๋ถ€์„œ๋ช…, ๋ถ€์„œ๋ณ„ ํ‰๊ท ๊ธ‰์—ฌ, ๋ถ€์„œ๋ณ„ ์ธ์›์ˆ˜

select
	nvl(dept_code,'์—†์Œ') "๋ถ€์„œ์ฝ”๋“œ",
	nvl(dept_title,'์—†์Œ') "๋ถ€์„œ๋ช…",
	floor(avg(salary)) "๋ถ€์„œ๋ณ„ ํ‰๊ท ๊ธ‰์—ฌ",
	count(*) "๋ถ€์„œ๋ณ„ ์ธ์›์ˆ˜"
from employee left outer join department
		on(dept_code = dept_id)
group by dept_code, dept_title  // dept_code๋กœ๋งŒ ํ•˜๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ dept_title(department์— ์žˆ์Œ)๋„ ํ•„์š”
order by 1;

Categories:

Updated:

Leave a comment