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;

Categories:

Updated:

Leave a comment