1. JOIN
RDBMS๋ฅผ ์ฌ์ฉํ๋ ๊ถ๊ทน์ ๋ชฉ์
INNER JOIN | ๋ ํ ์ด๋ธ์ ๊ต์งํฉ |
LEFT/RIGHT (OUTER) JOIN | 1๊ฐ ํ
์ด๋ธ์๋ง ๋ฐ์ดํฐ๊ฐ ์์ด๋ ์กฐํ ๋จ(๋ฐ๋ ํ
์ด๋ธ์ NULL๋ก ์ถ๋ ฅ) OUTER๋ ๋ถ๋ ์ ๋ถ๋ ๋๊ฐ์ |
FULL OUTER JOIN | ์ ์ฒด ์งํฉ |
๊ฐ๋ณ๊ฒ JOIN ์ค์ตํด ๋ณด์
INNER JOIN -1: ์ ๊ณต code๊ฐ ์ปดํจํฐ๊ณตํ(COMENG)์ธ ์ฌํ์ ์ด๋ฆ ์ถ๋ ฅ
INNER JOIN -2: ์ ๋นํฐ์์ด์ S๋ P๊ฐ ๋ค์ด๊ฐ ํ์ ์ด๋ฆ, ์๋ ์์ผ, ์ ๋นํฐ์์ด ์ถ๋ ฅ
์ฌ๊ธฐ๊น์ง ๋๋ฌด ๊ฐ๋จํ๋ค.
๋ค๋ฅธ ์คํค๋ง๋ฅผ ํ์ฉํ์ฌ ๋ค์ํ JOIN์ ์ค์ตํด ๋ณด์.
LEFT (OUTER) JOIN -1: ํ์ ์ค ํ๋์ ์๊ฐ๊ณผ๋ชฉ๋ ์ ํํ์ง ์์ ํ์ ID์ ์ด๋ฆ ์กฐํ
select s.student_id, s.student_name from student s
left join student_course sc on sc.student_id = s.student_id
where sc.course_id is null;
์ฌ๊ธฐ์๋ LEFT JOIN์ ์ฌ์ฉํด์ฃผ์ด์ผ ํ๋ค.
INNER JOIN์ ๊ต์งํฉ(๋ ๋ค ์ผ์นํ ๋)๋ง ๋ฐํํ๊ธฐ ๋๋ฌธ์, is null์ด ๋จนํ์ง ์๋๋ค.
LEFT JOIN์ ์ฌ์ฉํด์ student ํ ์ด๋ธ ๊ธฐ์ค ๋ชจ๋ ๊ฐ + ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ์ผ์นํ๋ ๊ฐ์ ๊ฐ์ ธ์ค๋๋ก ํ๋ค.
LEFT (OUTER) JOIN -2: ํ์์ ์ด๋ฆ, ์๊ฐํ ๊ณผ๋ชฉ๊ณผ ๊ต์ ์ด๋ฆ ์กฐํ (๋จ, ๊ต์๊ฐ ๋ฐฐ์ ๋์ง ์์ ๊ณผ๋ชฉ๋ ํฌํจ)
select s.student_name, c.course_name, p.professor_name from student s
left outer join student_course sc on sc.student_id = s.student_id
left outer join course c on sc.course_id = c.course_id
left outer join professor p on p.professor_id = c.professor_id;
ํ์ ๊ณผ๋ชฉ ํ ์ด๋ธ๊ณผ์ ์กฐ์ธ โก๏ธ ์๊ฐ๊ณผ๋ชฉ์ ์ ํํ์ง ์์ ๋ชจ๋ ํ์์ด ๊ฒฐ๊ณผ์ ํฌํจ๋จ
๊ณผ๋ชฉ ํ ์ด๋ธ๊ณผ์ ์กฐ์ธ โก๏ธ ๊ณผ๋ชฉ์ ๋ฑ๋ก๋์ง ์์ ๋ชจ๋ ๊ณผ๋ชฉ์ด ๊ฒฐ๊ณผ์ ํฌํจ๋จ(์ฌ์ค ๋ง์ด ์ ๋์ง๋ง.. ๋ ผ๋ฆฌ์ ์ผ๋ก ์ผ๊ด์ฑ..)
๊ต์ ํ ์ด๋ธ๊ณผ์ ์กฐ์ธ โก๏ธ ๊ต์๊ฐ ๋ฐฐ์ ๋์ง ์์ ๊ณผ๋ชฉ๋ ๊ฒฐ๊ณผ์ ํฌํจ ๋จ
๋ ผ๋ฆฌ์ ์ผ๋ก ์ผ๊ด์ฑ์ ๋ง์ถ์ด ํด๋น ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
FULL OUTER JOIN -1: ๊ต์์ ๊ณผ๋ชฉ์ ์ ์ฒด ๋ด์ญ ์กฐํ (๋จ, ๊ต์ ์ค ๊ฐ์๋ฅผ ํ์ง ์๊ฑฐ๋, ์์ง ๊ต์๊ฐ ๋ฐฐ์ ๋์ง ์์ ๊ณผ๋ชฉ๋ ๋ชจ๋ ํฌํจํ์ฌ ์ถ์ถ)
select s.student_id, s.student_name from student s
left join student_course sc on sc.student_id = s.student_id
where sc.course_id is null;
๊ต์ ํ ์ด๋ธ๊ณผ ๊ณผ๋ชฉ ํ ์ด๋ธ ๋ชจ๋ ์๋ก์ ๊ด๊ณ์์ด ์ถ์ถํด์ผ ํ๋ฏ๋ก FULL OUTER JOIN์ ์ฌ์ฉํ๋ค.
โ
ํผํฉ ์ค์ต 1 : ์ปดํจํฐ๊ณตํ๊ณผ ์ฌํ์ ํ์กํ๋ณ ํ๊ท ๋์ด๊ฐ 24์ด ๋ฏธ๋ง์ธ ํ์กํ๊ณผ ํ๊ท ๋์ด๋ฅผ ์กฐํ
1. ์ปดํจํฐ๊ณตํ๊ณผ ์ฌํ์ ๊ตฌํ๊ธฐ
SELECT *
FROM tst_stdntinfo_m s
JOIN tst_stdntdptmt_i d ON s.stnb = d.stnb
WHERE s.stdntgndr_typ = 'F'
AND d.dptmt_cd = 'COMENG'
์ปดํจํฐ๊ณตํ๊ณผ ์ฌํ์์ ๋ชจ๋ ์ ๋ณด๊ฐ ์ถ๋ ฅ๋๋ค.
2. ํ์กํ๋ณ ์ปดํจํฐ๊ณตํ๊ณผ ์ฌํ์ ๊ตฌํ๊ธฐ(?)
SELECT s.STDNTBLD_TYP
FROM tst_stdntinfo_m s
JOIN tst_stdntdptmt_i d ON s.stnb = d.stnb
WHERE s.STDNTGNDR_TYP = 'F'
AND d.dptmt_cd = 'COMENG'
GROUP BY s.stdntbld_typ
์ด๋ ๊ฒ ํ๋ฉด ํ์กํ 4๊ฐ๊ฐ ๊ฐ๊ฐ ์ถ๋ ฅ๋๋ค.
3. [๊ฒฐ๊ณผ] ํ์กํ๋ณ ํ๊ท ๋์ด๊ฐ 24์ด ๋ฏธ๋ง์ธ ํ์กํ๊ณผ ํ๊ท ๋์ด๋ฅผ ์กฐํ
SELECT s.STDNTBLD_TYP, AVG(YEAR(curdate()) - YEAR(s.stdntbth_day)) as avg_age
FROM tst_stdntinfo_m s
JOIN tst_stdntdptmt_i d ON s.stnb = d.stnb
WHERE s.STDNTGNDR_TYP = 'F'
AND d.dptmt_cd = 'COMENG'
GROUP BY s.stdntbld_typ
HAVING avg_age < 24;
๋์ด๋ ํ์ฌ YEAR์์ ํ์ด๋ ๋ ๋๋ฅผ ๋นผ์ฃผ๋ฉด ๊ตฌํ ์ ์๋ค.
curdate()๋ ํ์ฌ ๋ ๋๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ค.
ํ์กํ๋ณ ์กฐํ์ด๋ฏ๋ก group by s.stdntbld_typ์ ํด์ฃผ๊ณ ,
group by์ ์กฐ๊ฑด์ผ๋ก ํ๊ท ๋์ด ์ ์ฝ์ด ์์์ผ๋ ์ด๋ฅผ having์ ์ ์ถ๊ฐํด ์ค๋ค.
group by๋ ๋์ผํ ๊ฐ์ ๊ฐ์ง ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃน๋ณ ์ฐ์ฐ์ ์ ์ฉํ ๋ ์ฌ์ฉํ๋ค. ์ง๊ณํจ์์ ํจ๊ป ์์ฃผ ์ฌ์ฉ๋๋ค.
having์ group by์ ์ ๊ฐ ์ค ์ํ๋ ์กฐ๊ฑด์ ๊ฑธ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
ํ์กํ๋ณ "ํ๊ท ๋์ด๊ฐ 24์ด ๋ฏธ๋ง" >> ์ด ์กฐ๊ฑด์ด having์ ์ ํฌํจ๋๋ค.
'๐๏ธData Base ์๋ ๊ฒ๋ ๋ค์๋ณด์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB ์ฅ์ ํ๋ณต ๊ธฐ๋ฒ: REDO, UNDO (0) | 2024.08.13 |
---|---|
ํธ๋์ญ์ , ๋์์ฑ ์ ์ด (0) | 2024.08.05 |
[DB] Basic SQL, DB ๊ตฌ์ฑ ์์ (0) | 2024.08.04 |