<์งํฉ ์ฐ์ฐ>
๊ด๊ณ๋์์ ์งํฉ ์ฐ์ฐ์ธ ํฉ์งํฉ, ๊ต์งํฉ, ์ฐจ์งํฉ์ ํด๋นํ๋ ์ฐ์ฐ์
- union
- intersect
- minus
โ
ํ์ : <select๋ฌธ-1> <์งํฉ ์ฐ์ฐ์> <select๋ฌธ-2>
์กฐ๊ฑด : <select๋ฌธ-1>๊ณผ <select๋ฌธ-2>์์ ์ ํ๋ ํ๋์ ๊ฐ์์ ๋์๋๋ ํ๋์ ๋ฐ์ดํฐ ํ์ ์ด ์๋ก ๊ฐ์์ผํจ
โ
UNION
์) ๋ชจ๋ ํ์์ ์ด๋ฆ๊ณผ ๊ต์์ ์ด๋ฆ์ ํจ๊ป ์ถ๋ ฅ
select name from student
union
select name from professor
union ์ฐ์ฐ์๋ ์ฐ์ฐ ๊ฒฐ๊ณผ์ ํฌํจ๋ ์ค๋ณต๋ ๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํจ
โ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ์ถ์ง ์๋ค๋ฉด union all ์ฐ์ฐ์๋ฅผ ์ฌ์ฉ
โ
INTERSECT
์) ์ปดํจํฐ๊ณตํ๊ณผ ํ์๋ค ์ค ์ต์ ํ ๊ณผ๋ชฉ์์ 'A+' ํ์ ์ ๋ฐ์ ํ์๋ค์ ํ๋ฒ์ ๊ฒ์
select s.stu_id
from student s, department d, takes t
where s.dept_id = d.dept_id and s.stu_id = t.stu_id and d.dept_name ='์ปดํจํฐ๊ณตํ๊ณผ' and t.grade = 'A+'
'์ปดํจํฐ๊ณตํ๊ณผ'์ ๋ค๋๋ ํ์๋ค์ ํ๋ฒ๊ณผ takes ํ ์ด๋ธ์์ ํ์ ์ด 'A+'์ธ ํ์๋ค์ ํ๋ฒ์ ๊ต์งํฉ์ ๊ตฌํจ
select stu_id
from student s, department d
where s.dept_id = d.dept_id and d.dept_name = '์ปดํจํฐ๊ณตํ๊ณผ'
intersect
select stu_id from takes where grade = 'A+'
MINUS
์) ์ฐ์ ๊ณตํ๊ณผ ํ์๋ค ์ค์์ ํ๋ฒ๋ 'A+'๋ฅผ ๋ฐ์ง ๋ชปํ ํ์๋ค์ ํ๋ฒ์ ๊ฒ์
select stu_id from student s, department d
where s.dept_id = d.dept_id and dept_name = '์ฐ์
๊ณตํ๊ณผ'
minus
select stu_id from takes
where grade = 'A+'
์ธ๋ถ ์กฐ์ธ(outer join)
์) ๋ชจ๋ ๊ต๊ณผ๋ชฉ์ ๋ํด ๊ต๊ณผ๋ชฉ๋ช , ํ์ ์, ๊ฐ์ค๋ ๋, ๊ฐ์คํ๊ธฐ๋ฅผ ๊ฒ์
select title, credit, year, semester
from course, class
where course.course_id = class.course_id
์ผ์ชฝ ์ธ๋ถ ์กฐ์ธ(left outer join)
- ์ฐ์ฐ์์ ์ผ์ชฝ์ ์์นํ ํ ์ด๋ธ์ ๊ฐ ๋ ์ฝ๋์ ๋ํด์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ์กฐ์ธ ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋ ์ฝ๋๊ฐ ์์ ๊ฒฝ์ฐ์๋ ๊ฒ์ ๊ฒฐ๊ณผ์ ํฌํจ
โ ๊ฒฐ๊ณผ ๋ ์ฝ๋์์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋๋จธ์ง ํ๋์๋ null ์ด ์ฝ์ ๋จ
โ
์ค๋ฅธ์ชฝ ์ธ๋ถ ์กฐ์ธ์ ์ผ์ชฝ ์ธ๋ถ ์กฐ์ธ๊ณผ ๋ฐ๋
โ
์์ ์ธ๋ถ ์กฐ์ธ(full outer join)
- ์์ชฝ ํ ์ด๋ธ์์ ์๋ก ์ผ์นํ๋ ๋ ์ฝ๋๊ฐ ์์ ๊ฒฝ์ฐ, ํด๋น ๋ ์ฝ๋๋ค๋ ๊ฒฐ๊ณผ ํ ์ด๋ธ์ ํฌํจ์ํค๋ฉฐ, ์ด๋ ๋๋จธ์ง ํ๋์ ๋ํด์๋ ๋ชจ๋ null ์ ์ฝ์
์)
select title, credit, year, semester
from course full outer join class
using (course_id)
์ง๊ณ ํจ์
COUNT
ํ์ : count(<ํ๋ ์ด๋ฆ>) or count(distinct<ํ๋ ์ด๋ฆ>)
- ํด๋น ํ๋์ ๊ฐ์ด ๋ช ๊ฐ ์๋์ง ์ถ๋ ฅ
- distinct ์ฌ์ฉ ์ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฐ์๋ฅผ ๊ณ์ฐ
- <ํ๋ ์ด๋ฆ>์ '*'๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ๋ ์ฝ๋์ ๊ฐ์๋ฅผ ๊ณ์ฐ
โ
์) 3ํ๋ ํ์์ด ๋ช ๋ช ์ธ์ง ์ถ๋ ฅ
select count(*)
from student
where year = 3
์) ์ปดํจํฐ๊ณตํ๊ณผ์ ํ์ ์๋ฅผ ์ถ๋ ฅ
select count(*)
from student s, department d
where s.dept_id = d.dept_id and d.dept_name = '์ปดํจํฐ๊ณตํ๊ณผ'
SUM
ํ์ : sum (<ํ๋ ์ด๋ฆ>)
- ์ง์ ๋ ํ๋์ ์ ์ฅ๋ ๊ฐ์ ํฉ์ ๊ณ์ฐ
โ
์) ์ ์ฒด ๊ต์๋ค์ ์ฌ์ง ์ฐ์์ ํฉ
select sum(2019 - year_emp)
from professor
AVG
ํ์: avg(<ํ๋ ์ด๋ฆ>)
- ์ง์ ๋ ํ๋์ ์ ์ฅ๋ ๊ฐ๋ค์ ํ๊ท ์ ๊ณ์ฐ
โ
์) ์ ์ฒด ๊ต์์ ํ๊ท ์ฌ์ง ์ฐ์๋ฅผ ์ถ๋ ฅ
select avg(2019 - year_emp)
from professor
MIN, MAX
ํ์ : max(<ํ๋ ์ด๋ฆ>) , min(<ํ๋ ์ด๋ฆ>)
- ์ง์ ๋ ํ๋ ๊ฐ๋ค ์ค ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๊ตฌํจ
โ
์) 'ACCOUNTING' ๋ถ์์ ์ํ ์ง์๋ค ์ค ์ต๋ ๊ธ์ฌ๊ฐ ์ผ๋ง์ธ์ง ์ถ๋ ฅ
select max(sal)
from emp e, dept d
where e.deptno = d.deptno and dname = 'ACCOUNTING'
โ select ์ ์ ์ง๊ณ ํจ์๊ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ํ๋๋ ๊ฐ์ด ์ฌ์ฉํ ์ ์์
โ
GROUP BY
ํ์ : group by <ํ๋ ๋ฆฌ์คํธ>
- group by ์ ์ select ๋ฌธ์์ where ์ ๋ค์์ ์์น
- group by ์ ์ ์ง์ ๋ ํ๋์ ๊ฐ์ด ๊ฐ์ ๋ ์ฝ๋๋ค๋ผ๋ฆฌ ๊ทธ๋ฃน์ ์ง์ด ๊ฐ ๊ทธ๋ฃน๋ณ๋ก ์ง๊ณ ํจ์๋ฅผ ์ ์ฉํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ
โ
์) ํ๊ณผ(๋ฒํธ)๋ณ๋ก ์์ ํ์ ์๋ฅผ ๊ณ์ฐํ์ฌ ์ถ๋ ฅ
select dept_id, count(*)
from student
group by dept_id
โ group by ์ ์ ํฌํจ๋์ง ์์ ํ๋๋ select ์ ์๋ ํฌํจ๋ ์ ์์
โ
์) ํ๊ณผ ๋ฒํธ ๋์ ํ๊ณผ ์ด๋ฆ์ด ์ถ๋ ฅ๋๋๋ก ์์
select dept_name, count(*)
from student s, department d
where s.dept_id = d.dept_id
group by dept_name
HAVING
- ๊ทธ๋ฃน์ ๋ํ ์กฐ๊ฑด์ ๋ช ์ํ ๋ ์ฌ์ฉ
- ๊ทธ๋ฃน์ ๋ํ ์กฐ๊ฑด์ where ์ ์์ ํํํ์ง ๋ชปํ๋ฏ๋ก having ์ ์ ์ด์ฉํด์ผํจ
ํ์ : having <์ง๊ณ ํจ์์ ๋ํ ์กฐ๊ฑด>
โ
์) ์ง์ ์ซ์๊ฐ 5๋ช ์ด์์ธ ๋ถ์์ ๋ํด ๋ถ์๋ณ ์ง์์, ํ๊ท ๊ธ์ฌ, ์ต๋ ๊ธ์ฌ, ์ต์ ๊ธ์ฌ๋ฅผ ์ถ๋ ฅ
select dname, count(*), avg(sal), max(sal), min(sal)
from emp e, dept d
where e.deptno = d.deptno
group by dname
having count(*) >= 5
where ์ ๊ณผ having ์ , group by์ ์ ๋ชจ๋ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐ
1. from์ ์ ๋ช ์๋ ํ ์ด๋ธ๋ค์ ์กฐ์ธ
2. where์ ์ ๋ช ์๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ฝ๋๋ค์ ๊ฒ์
3. group by์ ์ ๋ช ์๋ ํ๋์ ๊ฐ์ด ๊ฐ์ ๋ ์ฝ๋๋ค๋ผ๋ฆฌ ๊ทธ๋ฃน์ ์ง์ด ์ง๊ณ ํจ์๋ฅผ ์ ์ฉ
4. ๋ง์ง๋ง์ผ๋ก ๊ทธ ์ง๊ณ ํจ์๋ฅผ ์ ์ฉํ ๊ฒฐ๊ณผ๋ค ์ค์์ having ์ ์ ๋ง์กฑํ๋ ๊ฒฐ๊ณผ๋ง ์ ํ
5. select์ ์ ์ง์ ๋ ํ๋ ๋ฐ ์ง๊ณ ํจ์ ๊ณ์ฐ ๊ฒฐ๊ณผ ์ถ๋ ฅ
โ
null์ ์ฒ๋ฆฌ
ํ์: <ํ๋ ์ด๋ฆ> is null, <ํ๋ ์ด๋ฆ> is not null