๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณต๋ถ€/Oracle

[ex18] subquery

ex18_subquery

 

Main Query
    - ์—ฌํƒœ๊นŒ์ง€์˜ SQL
    - ์ผ๋ฐ˜์ ์ธ SQL
    - ํ•˜๋‚˜์˜ ๋ฌธ์žฅ์•ˆ์— ํ•˜๋‚˜์˜ select(insert, update, delete)๋กœ ๊ตฌ์„ฑ๋œ ์ฟผ๋ฆฌ
    
    
    Sub Query, ์„œ๋ธŒ ์ฟผ๋ฆฌ, ๋ถ€์† ์งˆ์˜
    - ํ•˜๋‚˜์˜ ๋ฌธ์žฅ์•ˆ์—(select, insert, update, delete)์•ˆ์— ๋˜ ๋‹ค๋ฅธ ๋ฌธ์žฅ(select)์ด ๋“ค์–ด์žˆ๋Š” ์ฟผ๋ฆฌ
    - ํ•˜๋‚˜์˜ select๋ฌธ ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ select๋ฌธ
    - ์‚ฝ์ž… ์œ„์น˜ > ๊ฑฐ์˜ ๋Œ€๋‹ค์ˆ˜์˜ ์ ˆ(select, from์ ˆ, where์ ˆ :: group by์ ˆ, having์ ˆ, order by์ ˆ)
    

-- tblCountry. ์ธ๊ตฌ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ๋‚˜๋ผ์˜ ์ด๋ฆ„? > ์ค‘๊ตญ
select * from tblCountry;

update tblCountry set population = 120560 where name = '์ค‘๊ตญ';

select max(population) from tblCountry; -- ์ธ๊ตฌ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ > 132726
select name from tblCountry where population = 120560; -- ์ค‘๊ตญ


-- ์žฅ์ 
-- 1. 2๊ฐœ์˜ SQL > 1๊ฐœ์˜ SQL
-- 2. ๋ณ€ํ™”์— ๊ฐ•ํ•˜๋‹ค.(์ธ๊ตฌ์ˆ˜ ๋ณ€๋™) > ๊ฐœ๋ฐœ์ž ํŽธ์˜์„ฑ ํ–ฅ์ƒ
select name from tblCountry 
    where population = (select max(population) from tblCountry); --์ฟผ๋ฆฌ ์ž์ฒด๋ฅผ ์ˆซ์ž ํ•˜๋‚˜๋กœ ๋ด„

์„œ๋ธŒ ์ฟผ๋ฆฌ ์‚ฝ์ž… ์œ„์น˜
1. ์กฐ๊ฑด์ ˆ
2. ์ปฌ๋Ÿผ๋ฆฌ์ŠคํŠธ
3. from์ ˆ


1. ์กฐ๊ฑด์ ˆ
: ๋น„๊ต ๋Œ€์ƒ(๋น„๊ต๊ฐ’) ์—ญํ•  > ๊ฐ’
: where์ ˆ, having์ ˆ, case๋ฌธ

a. ๋ฐ˜ํ™˜๊ฐ’์ด 1ํ–‰ 1์—ด > ๋‹จ์ผ๊ฐ’ ๋ฐ˜ํ™˜ > ๊ฐ’ 1๊ฐœ๋กœ ์ทจ๊ธ‰
b. ๋ฐ˜ํ™˜๊ฐ’์ด Nํ–‰ 1์—ด > ๋‹ค์ค‘๊ฐ’(๊ฐ™์€ ์„ฑ์งˆ์˜ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ์ดํ„ฐ) ๋ฐ˜ํ™˜ > ๊ฐ’ N๊ฐœ๋กœ ์ทจ๊ธ‰
c. ๋ฐ˜ํ™˜๊ฐ’์ด 1ํ–‰ N์—ด > ๋‹ค์ค‘๊ฐ’(์„œ๋กœ ๋‹ค๋ฅธ ์„ฑ์งˆ์˜ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ์ดํ„ฐ) ๋ฐ˜ํ™˜ > 
d. ๋ฐ˜ํ™˜๊ฐ’์ด Nํ–‰ N์—ด > ๋‹ค์ค‘๊ฐ’ ๋ฐ˜ํ™˜

 


-- a. ๋ฐ˜ํ™˜๊ฐ’์ด 1ํ–‰ 1์—ด > ๋‹จ์ผ๊ฐ’ ๋ฐ˜ํ™˜ > ๊ฐ’ 1๊ฐœ๋กœ ์ทจ๊ธ‰
select * from tblInsa
    where basicpay >= (select avg(basicpay) from tblInsa);


-- b. ๋ฐ˜ํ™˜๊ฐ’์ด Nํ–‰ 1์—ด > ๋‹ค์ค‘๊ฐ’(๊ฐ™์€ ์„ฑ์งˆ์˜ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ์ดํ„ฐ) ๋ฐ˜ํ™˜ > ๊ฐ’ N๊ฐœ๋กœ ์ทจ๊ธ‰
-- ๊ธ‰์—ฌ๊ฐ€ 260๋งŒ์› ์ด์ƒ ๋ฐ›๋Š” ์ง์›์ด ๊ทผ๋ฌดํ•˜๋Š” ๋ถ€์„œ ์ง์› ๋ช…๋‹จ์„ ๊ฐ€์ ธ์˜ค์‹œ์˜ค. > ๊ธฐํš๋ถ€ + ์ด๋ฌด๋ถ€
-- ORA-01427: single-row subquery returns more than one row
select * from tblInsa
    --where ๋ถ€์„œ = ๊ธฐํš๋ถ€/์ด๋ฌด๋ถ€
    --where buseo = (select buseo from tblInsa where basicpay >= 2600000);
    
    --where buseo = '๊ธฐํš๋ถ€' or buseo = '์ด๋ฌด๋ถ€'
    --where buseo in('๊ธฐํš๋ถ€', '์ด๋ฌด๋ถ€') --๊ฐ™์€ ์„ฑ์งˆ์˜ N๊ฐœ ๋ฐ์ดํ„ฐ > ์—ด๊ฑฐํ˜•
    where buseo in (select buseo from tblInsa where basicpay >= 2600000);


-- 'ํ™๊ธธ๋™'๊ณผ ๊ฐ™์€ ์ง€์—ญ + ๊ฐ™์€ ์ง์œ„ > ์†Œ์† ๋ถ€์„œ ์ง์› ๋ช…๋‹จ
select * from tblInsa where name = 'ํ™๊ธธ๋™'; -- ์„œ์šธ, ๋ถ€์žฅ
select * from tblInsa where city = '์„œ์šธ' and jikwi = '๋ถ€์žฅ'; -- ๊ธฐํš๋ถ€, ์˜์—…๋ถ€

select city from tblInsa where city = 'ํ™๊ธธ๋™'; --์„œ์šธ
select jikwi from tblInsa where name = 'ํ™๊ธธ๋™'; --๋ถ€์žฅ

select buseo from tblInsa 
    where city = (select city from tblInsa where name = 'ํ™๊ธธ๋™') 
        and jikwi = (select jikwi from tblInsa where name = 'ํ™๊ธธ๋™')
            and name <> 'ํ™๊ธธ๋™';

select * from tblInsa
    where buseo in ('๊ธฐํš๋ถ€', '์˜์—…๋ถ€'); --23๋ช…

select * from tblInsa
    where buseo in (select buseo from tblInsa 
    where city = (select city from tblInsa where name = 'ํ™๊ธธ๋™') 
        and jikwi = (select jikwi from tblInsa where name = 'ํ™๊ธธ๋™')
            and name <> 'ํ™๊ธธ๋™');




-- c. ๋ฐ˜ํ™˜๊ฐ’์ด 1ํ–‰ N์—ด > ๋‹ค์ค‘๊ฐ’(์„œ๋กœ ๋‹ค๋ฅธ ์„ฑ์งˆ์˜ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ์ดํ„ฐ) ๋ฐ˜ํ™˜ > N:N ๋น„๊ต
-- 'ํ™๊ธธ๋™'๊ณผ ๊ฐ™์€ ์ง€์—ญ + ๊ฐ™์€ ์ง์œ„ > ์–ด๋–ค ์ง์›๋“ค?
select city from tblInsa where name = 'ํ™๊ธธ๋™'; --์–ด๋А์ง€์—ญ์ธ์ง€
select jikwi from tblInsa where name = 'ํ™๊ธธ๋™'; --์–ด๋А์ง๊ธ‰์ธ์ง€

select * from tblInsa where city = '์„œ์šธ' and jikwi = '๋ถ€์žฅ';

select * from tblInsa 
    where city = (select city from tblInsa where name = 'ํ™๊ธธ๋™') 
        and jikwi = (select jikwi from tblInsa where name = 'ํ™๊ธธ๋™');

-- ํ•œ๊บผ๋ฒˆ์— ๋‚˜์—ด 
select * from tblInsa
    where (city, jikwi) = (select city, jikwi from tblInsa where name = 'ํ™๊ธธ๋™'); -- 2:2๋น„๊ต


select * from tblAddressBook;   --๊ธฐ์˜ˆ์ฃผ(์„ฑ๋ณ„, ๋‚˜์ด, ์ง์—…, ํ‚ค ๊ฐ™์€์‚ฌ๋žŒ)

select * from tblAddressBook
    where (gender, age, job, height) = (select gender, age, job, height 
                                                from tblAddressBook where name = '๊ธฐ์˜ˆ์ฃผ');




-- d. ๋ฐ˜ํ™˜๊ฐ’์ด Nํ–‰ N์—ด > ๋‹ค์ค‘๊ฐ’ ๋ฐ˜ํ™˜
-- ๊ธ‰์—ฌ๊ฐ€ 260๋งŒ ์ด์ƒ ๋ฐ›๋Š” ์ง์›๊ณผ > ๊ฐ™์€ ๋ถ€์„œ + ๊ฐ™์€ ์ง€์—ญ์— ์žˆ๋Š” ๋ชจ๋“  ์ง์›?
select * from tblInsa where basicpay >= 2600000;

-- ์„œ์šธ + ๊ธฐํš๋ถ€ && ๊ฒฝ๋‚จ + ์ด๋ฌด๋ถ€
select city, buseo from tblInsa where basicpay >= 2600000;

select * from tblInsa
    where (city, buseo) in (select city, buseo from tblInsa where basicpay >= 2600000);



--having์ ˆ
select 
    buseo,
    avg(basicpay)
from tblInsa
    group by buseo
        having avg(basicpay) >= (select avg(basicpay) from tblInsa where buseo = '์ด๋ฌด๋ถ€');

 


2. ์ปฌ๋Ÿผ๋ฆฌ์ŠคํŠธ
 : ๋‹จ์ผ ๋ฐ์ดํ„ฐ(๊ฐ’) > ์›์ž๊ฐ’ > ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค > ํ‘œ > ์†์„ฑ(์ปฌ๋Ÿผ)์˜ ๊ฐ’์€ ์›์ž๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค.
 a. ์ปฌ๋Ÿผ๋ช…
 b. ์ƒ์ˆ˜
 c. ์—ฐ์‚ฐ
 d. ํ•จ์ˆ˜

 ์ปฌ๋Ÿผ๋ฆฌ์ŠคํŠธ์—์„œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ
 - ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ’์ด ๋ฐ˜๋“œ์‹œ 1ํ–‰ 1์—ด์ด์–ด์•ผ ํ•œ๋‹ค. > ์Šค์นผ๋ผ ์ฟผ๋ฆฌ
 - ์ •์ ์ฟผ๋ฆฌ > ๋ชจ๋“  ํ–‰์— ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ > ์‚ฌ์šฉ ๋นˆ๋„ ์ ์Œ
 - ์ƒ๊ด€ ์„œ๋ธŒ ์ฟผ๋ฆฌ > ?? > ์‚ฌ์šฉ ๋นˆ๋„ ๋†’์Œ

 

select
    name,
    (select sysdate from dual),
    sysdate
    from tblInsa;

select
    name,
    (select basicpay from tblInsa where name = 'ํ™๊ธธ๋™')
from tblInsa;


-- 
select 
    name, buseo, basicpay,
    avg(basicpay)
from tblInsa;

select
    name, buseo, basicpay,
    (select round(avg(basicpay)) from tblInsa) as "ํ‰๊ท ๊ธ‰์—ฌ"
from tblInsa;

select avg(basicpay) from tblInsa;



-- ์ƒ๊ด€ ์„œ๋ธŒ ์ฟผ๋ฆฌ(*์ค‘์š”*)

select
    name, buseo, basicpay,
    (select round(avg(basicpay)) from tblInsa b where b.buseo = a.buseo) as "์†Œ์† ๋ถ€์„œ ํ‰๊ท  ๊ธ‰์—ฌ"
from tblInsa a; --ํ…Œ์ด๋ธ” ๋ณ„์นญ as ์•ˆ๋ถ™์ด๊ณ 


-- ์‹๋ณ„์ž ์ •๋ฆฌ
select * from tblInsa;

-- ํ˜„์žฌ ์ ‘์†์ค‘์ธ ๊ณ„์ •์€ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.
select * from hr.tblInsa; -- ๊ณ„์ •๋ช…(์Šคํ‚ค๋งˆ).ํ…Œ์ด๋ธ”๋ช… (FM)

select name, buseo, jikwi from hr.tblInsa;

select tblInsa.name, tblInsa.buseo, tblInsa.jikwi from hr.tblInsa;

select hr.tblInsa.name, hr.tblInsa.buseo, hr.tblInsa.jikwi from hr.tblInsa; -- Full


select *, sysdate from tblInsa;

-- ์™€์ผ๋“œ์นด๋“œ(*)์™€ ๋‹ค๋ฅธ ์ปฌ๋Ÿผ์„ ๋™์‹œ์— ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ• > ํ…Œ์ด๋ธ”๋ช…
select tblInsa.*, sysdate from tblInsa;

-- ์ปฌ๋Ÿผ ๋ณ„์นญ > ์œ ํšจํ•œ ์ด๋ฆ„์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ดใ…“ใ……
-- ํ…Œ์ด๋ธ” ๋ณ„์นญ > ์ตœ๋Œ€ํ•œ ์ค„์—ฌ์„œ > ๋ณดํ†ต ์•ŒํŒŒ๋ฒณ 1๊ธ€์ž๋กœ ์ ๋Š”๋‹ค.

-- SQL์˜ ๋ณ„์นญ(Alis) > ๋ณ„๋ช…(X), ๊ฐœ๋ช…(O) > ๋ณ„์นญ ์„ ์–ธ์ดํ›„์˜ ๋‹จ๊ณ„์—์„œ๋Š” ์›๋ž˜ ๊ณ—ใ…‡

select 
    i.*, sysdate  --2.
    from tblInsa i;     --1. ํ…Œ์ด๋ธ” ๋ณ„์นญ



select
    name, buseo, basicpay,
    (select round(avg(basicpay)) from tblInsa where buseo = i.buseo) as "์†Œ์† ๋ถ€์„œ ํ‰๊ท  ๊ธ‰์—ฌ"
from tblInsa i;




drop table tblMen;
drop table tblWomen;

select * from tblMen;
select * from tblWomen;

CREATE TABLE tblmen
(
   name varchar2(30) primary key,
   age number not null,
   height number null,
   weight number null,
   couple varchar2(30) null
);

CREATE TABLE tblwomen
(
   name varchar2(30) primary key,
   age number not null,
   height number null,
   weight number null,
   couple varchar2(30) null
);


INSERT INTO tblmen VALUES ('ํ™๊ธธ๋™', 25, 180, 70, '์žฅ๋„์—ฐ');
INSERT INTO tblmen VALUES ('์•„๋ฌด๊ฐœ', 22, 175, NULL, '์ด์„ธ์˜');
INSERT INTO tblmen VALUES ('ํ•˜ํ•˜ํ•˜', 27, NULL, 80, NULL);
INSERT INTO tblmen VALUES ('๋ฌด๋ช…์”จ', 21, 177, 72, NULL);
INSERT INTO tblmen VALUES ('์œ ์žฌ์„', 29, NULL, NULL, '๊น€์ˆ™');
INSERT INTO tblmen VALUES ('๋ฐ•๋ช…์ˆ˜', 30, 170, NULL, '๊น€์ง€๋ฏผ');
INSERT INTO tblmen VALUES ('์ •์ค€ํ•˜', 31, 183, NULL, '์‹ ๋ณด๋ผ');
INSERT INTO tblmen VALUES ('์ •ํ˜•๋ˆ', 28, NULL, 92, NULL);
INSERT INTO tblmen VALUES ('์–‘์„ธํ˜•', 22, 166, 55, '๊น€๋ฏผ๊ฒฝ');
INSERT INTO tblmen VALUES ('์กฐ์„ธํ˜ธ', 24, 165, 58, '์˜ค๋‚˜๋ฏธ');

INSERT INTO tblwomen VALUES ('๋ฐ•๋‚˜๋ž˜', 23, 150, 55, NULL);
INSERT INTO tblwomen VALUES ('์žฅ๋„์—ฐ', 28, 177, 65, 'ํ™๊ธธ๋™');
INSERT INTO tblwomen VALUES ('๊น€์ง€๋ฏผ', 30, 160, NULL, '๋ฐ•๋ช…์ˆ˜');
INSERT INTO tblwomen VALUES ('๊น€์ˆ™', 34, 158, NULL, '์œ ์žฌ์„');
INSERT INTO tblwomen VALUES ('์˜ค๋‚˜๋ฏธ', 27, NULL, NULL, '์กฐ์„ธํ˜ธ');
INSERT INTO tblwomen VALUES ('๊น€๋ฏผ๊ฒฝ', 22, 169, 88, '์–‘์„ธํ˜•');
INSERT INTO tblwomen VALUES ('ํ™ํ˜„ํฌ', 20, 158, 75, NULL);
INSERT INTO tblwomen VALUES ('์‹ ๋ณด๋ผ', 26, 170, 60, '์ •์ค€ํ•˜');
INSERT INTO tblwomen VALUES ('์ด์„ธ์˜', 28, 163, NULL, '์•„๋ฌด๊ฐœ');
INSERT INTO tblwomen VALUES ('์‹ ๋ด‰์„ ', 27, 162, NULL, NULL);


COMMIT;


-- tblMen <- (์—ฐ์ธ) -> tblWomen; 
select * from tblMen;
select * from tblWomen;

-- ๋‚จ์ž ๋ช…๋‹จ(์ด๋ฆ„, ๋‚˜์ด) ์ถœ๋ ฅ > ์—ฌ์ž์นœ๊ตฌ๊ฐ€ ์žˆ์œผ๋ฉด ์—ฌ์ž์นœ๊ตฌ(์ด๋ฆ„,๋‚˜์ด)๋ฅผ ๊ฐ™์ด ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select 
    name, age, couple,
    (select age from tblWomen where name = tblMen.couple)
from tblMen;

3. from์ ˆ
 : ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์…‹์„ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , ๋˜ ๋‹ค๋ฅธ select๋ฅผ ์‹คํ–‰~
 : ๊ตฌ๋ฌธ์„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ

select
    * 
from (select * from tblInsa); --1. 


select
    * --๋ฉ”์ธ์ฟผ๋ฆฌ์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ(name, buseo, jikwi)
from (select name, buseo, jikwi from tblInsa);


select
    --name, ssn --from์ ˆ์— ssn ์ปฌ๋Ÿผ ์—†์Œ.
    --name
    ์ด๋ฆ„ --์ปฌ๋Ÿผ ์ด๋ฆ„๋„ ์ฃผ์˜
from (select name as ์ด๋ฆ„, buseo, jikwi from tblInsa);


select
    name, len
from (select name, length(name) as len from tblInsa);



-- ORA-00918: column ambiguously defined > ๋™์ผํ•œ ์ปฌ๋Ÿผ๋ช…์ด 2๊ฐœ ์ด์ƒ ๋ฐœ๊ฒฌ
select 
    *
from (select name, age, couple
        , (select age from tblWomen where name = tblMen.couple) as age2 from tblMen);





-- employees. 'Munich'์— ์œ„์น˜ํ•œ ๋ถ€์„œ์— ์†Œ์†๋œ ์ง์› ๋ช…๋‹จ?
select * from employees; --department_id ์†Œ์† ๋ถ€์„œ
select * from departments; --location_id ์œ„์น˜ ์ •๋ณด
select * from locations;


select location_id from locations
    where city = 'Munich';

select department_id from departments
    where location_id = (select location_id from locations
                            where city = 'Munich');
--2๋ฒˆ ์ค‘์ฒฉ
--ORA-01427: single-row subquery returns more than one row
select * from employees
    where department_id in (select department_id from departments
                                where location_id = (select location_id from locations
                                                        where city = 'Seattle'));

 

 

 

 

'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณต๋ถ€ > Oracle' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[ex20] view  (0) 2023.03.26
[ex19] join  (0) 2023.03.25
[ex17] group by  (0) 2023.03.19
[ex16] update, delete  (0) 2023.03.19
[ex14~15] sequence, insert  (0) 2023.03.19