SQL2
Group
SQL์๋ ๋ฐ์ดํฐ์ ์ต์๊ฐ, ์ต๋๊ฐ, ํ๊ท , ํฉ ๋ฑโฆ ์ ์ฝ๊ฒ ๊ตฌํ๋ ํจ์๋ฅผ ์ง์ํ๋ค.
๊ทธ๋ฐ๋ฐ ์ด๊ฒ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ค๋ฅ๋ฅผ ๋ง๋๊ฒ๋๋ค.
SELECT
name, MAX(salary)
FROM emp_test;
์์ ๊ฐ์ด ์์ฑ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์ต๋๊ฐ์ 1๊ฐ๋ง ์กด์ฌํ๊ณ name์ ์ฌ๋ฌ๊ฐ๊ฐ ์กด์ฌํ๊ธฐ์ 1 ๋ ๋ค์๋ฅผ ๋ถ๋ฌ์ฌ ์๊ฐ ์๋ค.
1 ๋ ๋ค์๋ฅผ ์ง์ํ๊ธฐ ์ํด์ GROUP ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
SELECT
name, MAX(salary)
FROM emp_test
GROUP by name;
# ์์ ๊ฐ์ด GROUPํค์๋๋ฅผ ํตํด name์ ๊ทธ๋ฃนํํ์ฌ 1 ๋ 1๋ก ๋ง๋ค์ด ์ค๋ค.
// WHERE , GROUP
SELECT
NVL(dept_name, '<๋ถ์๋ฐฐ์น์ >')๋ถ์, AVG(salary) ์๊ธ
FROM emp_test
GROUP by dept_name;
SELECT
NVL(dept_name, '<๋ถ์๋ฐฐ์น์ >')๋ถ์, AVG(salary) ์๊ธ
FROM emp_test
WHERE dept_name = '๊ด๋ฆฌ๋ถ'
GROUP by dept_name;
WHERE์ GROUP์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค. โ์์๋ฅผ ๋ฐ๊ฟ๋ ๊ด์ฐฎ์ง ์์๊น?โโ ๋ผ๋ ์๊ฐ์ด ๋ค ์ ์๋ค.
๊ฒฐ๋ก ์ ๋ฐ๊ฟ ์ ์๋ค.
๋ง์ฝ ํ
์ด๋ธ ๋ฐ์ดํฐ๊ฐ 10๋ง๊ฐ 20๋ง๊ฐ ์ฒ๋ผ ๋ง์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ค๋ฉด ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํ๋ฅผ ํ๊ณ WHERE์ผ๋ก ๋ฝ์๋ด๋๊ฒ ํจ์จ์ ์ผ๊น
์๋๋ฉด ํ์ํ ๋ฐ์ดํฐ๋ง WHERE๋ก ๋ฝ๊ณ ๊ทธ๋ฃนํ ํ๋๋ฐ ํจ์จ์ ์ผ์ง ํ๋ฒ ์๊ฐํด ๋ณด์
๋น์ฐํ ํ์๊ฐ ๋ ํจ์จ์ ์ผ ๊ฒ์ด๋ค. SQL์์๋ ๋น์ฐํ ๋ ํจ์จ์ ์ธ WHERE => GROUP์ ์ง์ํ๋ค.
๊ทธ๋ฃนํํ ๋ฐ์ดํฐ๋ฅผ ์กฐ๊ฑด๋ฌธ์ ํตํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ตฌํ๋ ค๋ฉด HAVING ์ด๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
WHERE๋ ์์ฐจ๊ตฌ์กฐ๋ก ๊ทธ๋ฃนํ ํ์ง๋ ์์ ๊ทธ๋ฃน์ ์กฐ๊ฑด์ ์ค ์ ์๊ธฐ์ ๊ทธ๋ฃน์ด ๋๋ํ ์กฐ๊ฑด์ ์ง์ ํ๋ค.
SELECT
dept_name ๋ถ์, avg(salary) ํ๊ท , sum(salary) ํฉ, count(dept_name) ์ธ์์
FROM emp_test
WHERE dept_name is not null and dept_name not in('๋๊ธฐ๋ฐ๋ น')
GROUP by dept_name
HAVING count(*) >= 5;
Join
์์
์ ์จ๋ดฃ๋ค๋ฉด ์
๋ผ๋ฆฌ์ ๋ณํฉ์ด๋ ์ฐธ์กฐ๋ฅผ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
SQL ๋ํ ๋น์ฐํ ์ง์ํ๋๋ฐ ์ด๊ฒ์ JOIN์ด๋ผ๊ณ ํ๋ค.
- ๋ ์ด์์ ํ ์ด๋ธ์ ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์
- ๋ณดํต ๊ณตํต๋ ๊ฐ์ ์ฌ์ฉ
- ์ต์ ํ๋์ ์นผ๋ผ์ด ๋ ํ ์ด๋ธ ์ฌ์ด์์ ๊ณต์ ๋์ด์ผ ํจ
JOIN์ 4๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
- Equi Join
- Non-equijoin
- Outer join
- Self join
Equi Join
์กฐ๊ฑด์ Equality Condition(=)์ ์ด๋ค์ง๋ ์กฐ์ธ Index๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ผ๋ก ์กฐ์ธ ๊ฐ๋ฅ
SELECT
c_emp.name, c_emp.dept_id, s_dept.id , s_dept.dept_name
FROM c_emp , s_dept
WHERE c_emp.dept_id = s_dept.id;
SELECT
c.name, c.dept_id, s.id , s.dept_name
FROM c_emp c , s_dept s
WHERE c.dept_id = s.id;
# ๋ ๋ค ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ฉฐ FROM์ [as] ๋ก ์๋ณ์ฑ์ ์ค, ์๋ณ์ฑ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅ
Non-equijoin
์ด๋ ํ ์นผ๋ผ๋ ์ผ์นํ์ง ์์ ๋ ๋ฒ์๊ตฌํ์ฌ ์กฐ์ธ์ด ๊ฐ๋ฅํ๋ค. WHERE์ ์๋ BETWEEN a AND b ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์กฐ์ธ
SELECT
c.name ์ด๋ฆ , c.salary ์๊ธ , sg.grade ์๊ธ๋ฑ๊ธ
FROM c_emp c , sal_grade sg
WHERE c.salary BETWEEN 3000 AND 4000; // JOIN
// ๋ฒ์์ ์ซ์์ ์ํ๋ ๋ฑ๊ธ์ ๊ตฌํจ
SELECT
c.name ์ด๋ฆ , c.salary ์๊ธ , sg.grade ์๊ธ๋ฑ๊ธ , s.dept_name ๋ถ์๋ช
FROM c_emp c , sal_grade sg , s_dept s
WHERE c.salary BETWEEN sg.losal AND sg.hisal // Non-Equijoin
AND c.dept_id = s.id // Equi Join
AND s.dept_name IN('๊ฐ๋ฐ๋ถ','์์
๋ถ')
ORDER by ์๊ธ๋ฑ๊ธ ASC;
Outer Join
์กฐ์ธ์ ์กด์ฌํ์ง ์๋ NULL์ false์ด๊ธฐ์ ๋ฆฌํดํ์ง ์๋๋ค.
ํ์ง๋ง ํ์ํ ์ํฉ์ด ์์ ์ ์๋ค ์ด๋ Outer Join (+) ๋ฅผ ์ฌ์ฉํ๋ฉด NULL์ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ๋ฆฌํด ํ ์ ์๋ค.
SELECT
c.name ์ด๋ฆ , s.dept_name ๋ถ์๋ช
FROM c_emp c , s_dept s
WHERE c.dept_id = s.id(+); // (+)๋ฅผ ๋ถ์ฌ์ค์ผ๋ก์จ NULL์ ๊ฐ์ง ๋ฐ์ดํฐ๋ ๋ฆฌํด
Self Join
Equi Join๊ณผ ๊ฐ์ผ๋ ์ฌ๋ฌ๊ฐ์ ํ ์ด๋ธ์ด ์๋ ํ๋์ ํ ์ด๋ธ๋ก ์กฐ์ธ์ ํ๋ค. ๊ฐ์ ํ ์ด๋ธ์ ๋๊ฐ์ alias๋ฅผ ์์ฑํ์ฌ ์์ฑ๋ ์๋ณ์๋ฅผ ํตํด ํ ์ด๋ธ์ ์กฐ์ธํ๋ค.(์ธ์คํด์ค)
SELECT
a.empno ์ฌ๋ฒ , a.ename ์ด๋ฆ , b.empno ๊ด๋ฆฌ์์ฌ๋ฒ , b.ename ๊ด๋ฆฌ์์ด๋ฆ
FROM emp a , emp b // ๊ฐ์ ํ
์ด๋ธ์ [AS] ๋ก 2๊ฐ์ ์๋ณ์๋ฅผ ์ค (JAVA์ ์ธ์คํด์ค)
WHERE a.mgr = b.empno(+)
ORDER by a.empno;
์์ ๊ฐ์ด ํ๋์ ํ ์ด๋ธ์ ์กฐ์ธ์์ผ์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์๋ค.
์๋ธ์ฟผ๋ฆฌ(Subquery)
์ฟผ๋ฆฌ๋ฅผ ํตํด์๋ง ์ป์ ์ ์๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ฟผ๋ฆฌ์ ์ฟผ๋ฆฌ๋ฅผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํตํด ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
์๋ธ์ฟผ๋ฆฌ๋?
- ๋ค๋ฅธ ํ๋์ ์ฟผ๋ฆฌ์ ๋ค์ด๊ฐ SELECT ์ฟผ๋ฆฌ๋ฅผ ๋งํ๋ค.
- SELECT, UPDATE, DELETE, INSERT ๋ฌธ์ ์ด์ฉ๋๋ค.
- MAIN ์ฟผ๋ฆฌ๊ฐ ์์ํ๊ธฐ์ ๋จผ์ ์์ํ๋ค.
์๋ธ์ฟผ๋ฆฌ ์ข ๋ฅ
- ๋จ์ผ ํ(Sing-Row) : ํ๋์ ํ๋ง์ ๊ฒ์ํ๋ ์ฟผ๋ฆฌ
- ๋ค์ค ํ(Multiple-Row) : ํ๋ ์ด์์ ํ์ ๊ฒ์ํ๋ ์ฟผ๋ฆฌ
- ๋ค์ค ์ด(Multiple-Column) : ํ๋ ์ด์์ ์นผ๋ผ์ ๊ฒ์ํ๋ ์ฟผ๋ฆฌ
// ๋จ์ผ ํ(Sing-Row)
SELECT
id ์ฌ๋ฒ , name ์ด๋ฆ , salary ๊ธ์ฌ
FORM c_emp
WHERE dept_id = ( SELECT
dept_id
FROM c_emp
WHERE name = '์ด์์ ' );
SELECT
name, salary, dept_id
FORM c_emp
WHERE salary IN(select
MIN(salary)
FROM c_emp
GROUP by dept_id);
// ๋ค์ค ํ(Multiple-Row)
SELECT
name, salary, dept_id
FORM c_emp
WHERE (salary, dept_id) in( select
MIN(salary), dept_id
FROM c_emp
GROUP by dept_id);
// ๋ค์ค ์ด(Multiple-Column)
SELECT
c.name, c.salary, c.dept_id
FORM c_emp c , (SELECT
dept_id, MIN(salary) min
FROM c_emp
GROUP by dept_id) [as] vt // vt์ ์๋ณ์๋ฅผ ์ค
WHERE c.dept_id = vt.dept_id
AND c.salary= vt.min;
Leave a comment