DAY07. SQL Group Function
๊ทธ๋ฃนํจ์ : ์ง๋จ๋ณ ํต๊ณ(์ง๊ณ)๋ฅผ ๊ตฌํ๋ ํจ์
ํต๊ณํจ์ : ๋ค์คํ(vector:1์ฐจ์) -> ์์๊ฐ(scala:0์ฐจ์)
๋ค์คํ์ ์
๋ ฅํ๋ฉด ํจ์์ ์ํด ์์๊ฐ์ด ์ถ๋ ฅ๋๋ค. (1์ฐจ์->0์ฐจ์) = ์ฐจ์ ์ถ์
1. SUM ํจ์
SELECT SUM(sal) FROM emp; -- empํ
์ด๋ธ์์ 14๋ช
์ ๊ธ์ฌ์ ํฉ๊ณ๊ฐ ์ถ๋ ฅ (1๊ฐ์ row)
-- SELECT sal FROM emp; ๋ 14๊ฐ์ row.
SELECT ename, SUM (sal) FROM emp; -- error ์ด์ : ename์ 14ํ, SUM์ ์ 1ํ
SELECT SUM (comm) FROM emp; -- NULL ์ ์ธํ๊ณ ์ฐ์ฐ
2. AVB ํจ์ (๋ํ๊ฐ)
SELECT AVG(sal) FROM emp;
[์์ ] ‘SCOTT’์ฌ์์ด ์์๋ ๋ถ์์ ๊ธ์ฌ ํฉ๊ณ์ ํ๊ท ์ ๊ตฌํ์์ค. (์๋ธ์ฟผ๋ฆฌ ์ด์ฉ)
SELECT SUM(sal), AVG(sal)
FROM emp
WHERE deptno =
(SELECT deptno FROM emp WHERE ename='SCOTT');
3. MIN/MAX ํจ์ : ์ต์๊ฐ, ์ต๋๊ฐ
SELECT MAX(sal), MIN(sal) FROM emp; -- ์ต๋๊ธ์ฌ, ์ต์๊ธ์ฌ๊ฐ ์ผ๋ง์ธ๊ฐ
SELECT ename MAX(sal), MIN(sal) FROM emp; -- error. WHY? ๋จ์ผ ์นผ๋ผ, ๊ทธ๋ฃนํจ์ ํจ๊ป ์ฌ์ฉX
[์์ ] ๊ฐ์ฅ ์ต๊ทผ์ ์
์ฌํ ์ฌ์์ ์
์ฌ์ผ๊ณผ ์
์ฌํ์ง ๊ฐ์ฅ ์ค๋๋ ์ฌ์์ ์
์ฌ์ผ์ ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ์์ค. (MAX, MIN ํจ์ ์ด์ฉ)
SELECT * FROM emp;
SELECT
MIN (hiredate) "๊ฐ์ฅ ์ค๋๋ ์
์ฌ์ผ", MAX(hiredate) "๊ฐ์ฅ ์ต๊ทผ ์
์ฌ์ผ"
FROM emp;
4. COUNT ํจ์ : ํด๋น ์นผ๋ผ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ํ์ ๊ฐ์ (null ์ ์ธ)
SELECT COUNT (comm), COUNT(*) FROM emp;
SELECT COUNT(job) ์
๋ฌด์ FROM emp; --์
๋ฌด ์
SELECT COUNT(DISTINCT job) ์
๋ฌด์ FROM emp; --์ค๋ณต๋์ง ์๋ ์
๋ฌด ์
[์์ ] 30๋ฒ ๋ถ์ ์์ ์ฌ์์ค์์ ์ปค๋ฏธ์
์ ๋ฐ๋ ์ฌ์์ ์๋ฅผ ๊ตฌํ์์ค
SELECT COUNT(*)
FROM emp
WHERE deptno=30 AND comm IS NOT NULL; -- 4๋ช
์ถ๋ ฅ. WHY? IS NOT NULL๋ก๋ ์ปค๋ฏธ์
๊ฐ์ด 0์ธ ์ฌ๋๋ ํจ๊ป ์ถ๋ ฅ
SELECT COUNT(*)
FROM emp
WHERE deptno=30 AND comm>0; -- 1์์ด๋ผ๋ ์ปค๋ฏธ์
๋ฐ๋ ์ฌ๋์ด ์ถ๋ ฅ๋จ
SELECT ename, comm, deptno
FROM emp
WHERE deptno=30 AND comm>0;
5. ๋ถ์ฐ/ํ์คํธ์ฐจ : ์ฐํฌ๋(์๋ฃ๊ฐ ํฉ์ด์ง ์ ๋๋ฅผ ํ๋์ ์๋ก ๋ํ๋ธ ๊ฐ)
* ๋ถ์ฐ๊ณผ ํ์คํธ์ฐจ๊ฐ ์์์๋ก ์๋ฃ๊ฐ๋ค์ด ํ๊ท ์ ๋ชจ์ฌ์์ผ๋ฏ๋ก ์๋ฃ์ ๋ถํฌ ์ํ๊ฐ ๊ณ ๋ฅธ ๊ฒ์ด๋ค.
SELECT VARIANCE(sal) FROM emp; -- ๋ถ์ฐ
SELECT STDDEV(sal) FROM emp; -- ํ์คํธ์ฐจ
SELECT SQRT(VARIANCE(sal)) FROM emp; --ํ์คํธ์ฐจ
6. GROUP BY ์ : ํน์ ์ปฌ๋ผ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ
/*
SELECT ์นผ๋ผ๋ช
, ๊ทธ๋ฃนํจ์
FROM ํ
์ด๋ธ๋ช
WHERE ์กฐ๊ฑด (์ฐ์ฐ์)
GROUP BY ๋ฒ์ฃผํ ์นผ๋ผ๋ช
;
* ๋ฒ์ฃผํ(์นดํ
๊ณ ๋ฆฌํ) ์นผ๋ผ : ๋ถ์, ์ง๊ธ, ์ฑ๋ณ ๋ฑ ์ง๋จ์ ํ์ฑํ ์ ์๋ ์นผ๋ผ
* ์ฐ์์ฑ ์นผ๋ผ : ๊ธ์ฌ ๋ฑ
*/
[์์ ] ์์ ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ๋ฅผ ๊ตฌํ๊ธฐ
* ๊ทธ๋ฃน๋ฐ์ด ์ ์ด ์์ผ๋ฉด 'SELECT ์ฌ๊ธฐ, ํจ์(์ธ์)'์ ์นผ๋ผ๋ช
์ฝ์
๊ฐ๋ฅ
* ๊ทธ๋ฃน๋ฐ์ด ์ ์ด ์์ผ๋ฉด ์ผ๋ฐ ์ง๊ณํจ์(ROUND)์ ํจ๊ป ์ฌ์ฉ ๊ฐ๋ฅ
SELECT deptno, ROUND (AVG(sal))
FROM emp
GROUP BY deptno;
[์์ ] ์์ ๋ถ์๋ณ ์ต๋ ๊ธ์ฌ์ ์ต์ ๊ธ์ฌ๋ฅผ ๊ตฌํ๊ธฐ
SELECT deptno, MAX(sal), MIN(sal)
FROM emp
GROUP BY deptno
ORDER BY deptno;
[์์ 4] ๋ถ์๋ณ๋ก ๊ฐ์ฅ ๊ธ์ฌ๋ฅผ ๋ง์ด ๋ฐ๋ ์ฌ์์ ์ ๋ณด(์ฌ์ ๋ฒํธ, ์ฌ์์ด๋ฆ, ๊ธ์ฌ, ๋ถ์๋ฒํธ)๋ฅผ ์ถ๋ ฅํ์์ค.
(IN, MAX(), GROUP BY, subQuery ์ด์ฉ)
SELECT * FROM dept;
SELECT * FROM emp;
SELECT empno, ename, sal, deptno
FROM emp
WHERE sal IN
(SELECT MAX(sal) FROM emp GROUP BY deptno); -- ๊ฐ ๋ถ์์ ์ต๋ sal๊ฐ ์ถ๋ ฅ (๋ค์คํ ์๋ธ์ฟผ๋ฆฌ)
7. HAVING์ : GROUP BY์ ์์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฒ์
/*
์ผ๋ฐ SQL๋ฌธ : WHERE ์กฐ๊ฑด์
GROUP BY์ : HAVING ์กฐ๊ฑด์
*/
SELECT deptno, AVG(sal)
FROM emp
GROUP BY deptno
HAVING AVG(sal) >= 2000;
SELECT deptno, AVG(sal)
FROM emp
GROUP BY deptno
WHERE AVG(sal) >= 2000; -- error. WHY? GROUP BY์ ์์๋ WHERE (X)
[์์ ] ๋ถ์์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๊ตฌํ๋ ์ต๋ ๊ธ์ฌ๊ฐ 2900์ด์์ธ ๋ถ์๋ง ์ถ๋ ฅ
SELECT deptno, MAX(sal), AVG(sal)
FROM emp
GROUP BY deptno
HAVING MAX(sal) > 2900;
[์์ ] ์์ 4์ ๊ฒฐ๊ณผ์์ 'SCOTT' ์ฌ์์ ์ ์ธํ๊ณ , ๊ธ์ฌ(SAL)๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์์ค.
SELECT empno, ename, sal, deptno
FROM emp
WHERE ename != 'SCOTT' AND sal IN -- AND์ ์ sal์ ์๋ธ์ฟผ๋ฆฌ์์ ๋์ด์จ ๊ฐ
(SELECT MAX(sal) FROM emp GROUP BY deptno)
ORDER BY sal DESC;
์ฐ์ต๋ฌธ์
/*
* ์งํฉ ํจ์(COUNT,MAX,MIN,SUM,AVG)
* ์์
๋์ ํ
์ด๋ธ : EMP, STUDENT, PROFESSOR
*/
Q1. PROFESSOR ํ
์ด๋ธ์์ POSITION์ ์ ์ถ๋ ฅํ๊ธฐ
SELECT COUNT (DISTINCT position) ์ง์์
FROM professor;
Q2. EMP ํ
์ด๋ธ์์ ์์ ๋ถ์๋ณ ์ต๋ ๊ธ์ฌ์ ์ต์ ๊ธ์ฌ ๊ตฌํ๊ธฐ
SELECT deptno, MAX(sal), MIN(sal)
FROM emp
GROUP BY deptno; -- ~๋ณ๋ก : GROPU BY
Q3. EMP ํ
์ด๋ธ์์ ์ ์ฒด ์ฌ์์ ๊ธ์ฌ์ ๋ํ ๋ถ์ฐ๊ณผ ํ์คํธ์ฐจ ๊ตฌํ๊ธฐ
SELECT VARIANCE(sal), STDDEV(sal) FROM emp; -- ๋ถ์ฐ
Q4. EMP ํ
์ด๋ธ์์ ๊ฐ ๋ถ์๋ณ ์ฌ์์์ ์๋น์ด null ์๋ ์ฌ์์๋ฅผ ์นด์ดํธ ํ์์ค.
--<์ถ๋ ฅ ๊ฒฐ๊ณผ>
/*
๋ถ์๋ฒํธ ์ ์ฒด์ฌ์์ ์๋น์ฌ์์
30 6 4
20 5 0
10 3 0
*/
SELECT deptno ๋ถ์๋ฒํธ, COUNT (*) ์ ์ฒด์ฌ์์, COUNT (comm) ์๋น์ฌ์
-- COUNT ํจ์์ ํน์ง : NULL์ด ์๋ ๊ฐ๋ง ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ IS NOT NULL ๋ช
๋ น์ด ์์ด๋ ๋จ
FROM emp
GROUP BY deptno;
Q5. PROFESSOR ํ
์ด๋ธ์์ ํ๊ณผ๋ณ ๊ธ์ฌ(pay) ํ๊ท ์ด 400 ์ด์ ๋ ์ฝ๋ ์ถ๋ ฅํ๊ธฐ
SELECT deptno, AVG(pay)
FROM professor
GROUP BY deptno -- ํ๊ณผ๋ณ
HAVING AVG(pay) >= 400;
Q6. PROFESSOR ํ
์ด๋ธ์์ ํ๊ณผ๋ณ,์ง์๋ณ ๊ธ์ฌ(pay) ํ๊ท ๊ตฌํ๊ธฐ
SELECT deptno, AVG(pay)
FROM professor
GROUP BY deptno, position; -- 1์ฐจ : ํ๊ณผ๋ณ, 2์ฐจ : ์ง์๋ณ ์ถ๋ ฅ
-- ๊ฐ์ ํ๊ณผ์ ๊ฐ์ ์ง์ฑ
๋ผ๋ฆฌ ๊ธ์ฌ๋ฅผ ๊ณ์ฐํด์ค
Q7. STUDENT ํ
์ด๋ธ์์ grade๋ณ๋ก weight, height์ ํ๊ท ๊ฐ, ์ต๋๊ฐ, ์ต์๊ฐ์ ๊ตฌํ ๊ฒฐ๊ณผ์์ ํค์ ํ๊ท ์ด 170 ์ดํ์ธ ๊ฒฝ์ฐ ๊ตฌํ๊ธฐ
SELECT grade, AVG(weight), MAX(weight), MIN(weight), AVG(height), MAX(height), MIN(height)
FROM student
GROUP BY grade -- grade๋ณ
HAVING AVG(height) <=170 ; -- ํค ํ๊ท 170 ์ดํ