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 |