SELECT ์์ฑ๋ช
๋๋ ํํ์, ๊ทธ๋ฃนํจ์() -- ๊ทธ๋ฃนํจ์์ GROUP BY์ ์ฐธ์ฌํ ์์ฑ๋ช
๋๋ ํํ์๋ง ์ฌ ์ ์๋ค.
FROM ํ
์ด๋ธ๋ช
WHERE ์กฐ๊ฑด์ -- (1) WHERE์ ์์ ๊ทธ๋ฃนํ ๋์์ด ์๋ ํ์ ์ ์ธ์ํจ๋ค.
-- WHERE์ ์๋ ๊ทธ๋ฃนํจ์๊ฐ ์ฌ ์ ์๋ค.
GROUP BY ์์ฑ๋ช
๋๋ ํํ์ -- (2) GROUP BY ์ ์์ **๊ทธ๋ฃนํ ๋ฐฉ์์ ์ง์ **ํ๋ค.
-- ์์ฑ๋ช
๋๋ ํํ์์ ๊ฐ์ด ๊ฐ์ ํ๋ผ๋ฆฌ ๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๋๋ค.
-- GROUP BY ์ ์ด ์์ผ๋ฉด ์กฐํ๋ ํ ์ ์ฒด๊ฐ ํ๋์ ํ๊ทธ๋ฃน์ด๋ค.
HAVING ์กฐ๊ฑด์ -- (3) HAVING ์ ์์๋ ์กฐ๊ฑด์์ ๊ทธ๋ฃนํจ์๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์
-- ๊ทธ๋ฃนํจ์ ์ ์ฉ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํด์ ์กฐ๊ฑด์์ ์ ์ํ ์ ์๋ค.
-- GROUP BY์ ์ํ SELECT ์คํ๊ฒฐ๊ณผ์ ๋ํ ์กฐ๊ฑด์์ด๋ค.
-- HAVING ์กฐ๊ฑด์์ ๋ง์กฑํ๋ ํ๊ทธ๋ฃน๋ง ์กฐํํ๊ฒ ํ๋ค.
SELECT๊ตฌ๋ฌธ์์ ๊ทธ๋ฃนํจ์์ ์คํ์
WHERE(๊ทธ๋ฃนํ๋์ ํํฐ๋ง) - GROUP BY(๊ทธ๋ฃนํ) - HAVING(๊ทธ๋ฃนํ ๊ฒฐ๊ณผ ํํฐ๋ง)
์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
-- ํ๊ทธ๋ฃน์ด 'ํ
์ด๋ธ ์ ์ฒด์ธ ๊ฒฝ์ฐ' : ํ๊ทธ๋ฃน์ด ํ๋์ด๋ฏ๋ก ์กฐํ๊ฒฐ๊ณผ๊ฐ ํ ํ ์กฐํ๋๋ค.
SELECT COUNT(*)
FROM EMPLOYEES;
SELECT SUM(SALARY)
FROM EMPLOYEES;
-- ํ๊ทธ๋ฃน์ด '์กฐํ๋ ํ ์ ์ฒด์ธ ๊ฒฝ์ฐ' : ํ๊ทธ๋ฃน์ด ํ๋์ด๋ฏ๋ก ์กฐํ๊ฒฐ๊ณผ๊ฐ ํ ํ ์กฐํ๋๋ค.
SELECT COUNT(*)
FROM EMPLOYEES
WHERE SALARY < 10000;
SELECT AVG(SALARY)
FROM EMPLOYEES
WHERE SALARY < 10000;
-- ํน์ ์์ฑ์ ๋ํ์ฌ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ํ๋ผ๋ฆฌ ๊ทธ๋ฃนํ์ ํ๋ ๊ฒฝ์ฐ : ํ๊ทธ๋ฃน์ด ์ฌ๋ฌ ๊ฐ์ด๋ฏ๋ก ์กฐํ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ๊ฐ ์กฐํ๋๋ค.
-- GROUP BY ๋ ํ๊ทธ๋ฃน์ ๋๋๋ค. ์ฌ๋ฌ ๊ฐ์ ํ๊ทธ๋ฃน์ ์์ฑํ๋ค.
SELECT COUNT(*)
FROM EMPLOYEES
GROUP BY JOB_ID; -- GROUP BY๋ก ๋๋์ด์ง ํ๊ทธ๋ฃน๋ง๋ค ๊ทธ๋ฃนํจ์๊ฐ ์คํ๋๋ค.
SELECT COUNT(*)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;
-- ํ๊ทธ๋ฃน์ ์์ฑํ๊ธฐ ์ํด์ GROUP BY ์ ์ ์ฌ์ฉํ๋ ์ปฌ๋ผ๋ช
ํน์ ํํ์๋ง SELECT์ ์์ ๊ทธ๋ฃนํจ์์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
-- GROUP BY ์ ์์ ์ฌ์ฉํ์ง ์์ ์ปฌ๋ผ๋ช
์ SELECT ์ ์ ์ฌ์ฉํ ์ ์๋ค.
-- ์์ฌ์ง ๋ณ ๋ถ์๊ฐฏ์๋ฅผ ์กฐํํ๊ธฐ
SELECT LOCATION_ID, COUNT(*)
FROM DEPARTMENTS
GROUP BY LOCATION_ID;
-- ์์๋ถ์๊ฐ ์๋ ์ง์๋ค์ ๋ํ์ฌ ์์๋ถ์ ๋ณ ์ง์์ ์กฐํํ๊ธฐ
SELECT DEPARTMENT_ID, COUNT(*)
FROM EMPLOYEES
WHERE DEPARTMENT_ID IS NOT NULL -- WHERE ์กฐ๊ฑด ์์ด๋ NULL ๊ฐ์ธ ํ๋ ํ๊ทธ๋ฃน์ด ๋๋ค.
GROUP BY DEPARTMENT_ID
ORDER BY DEPARTMENT_ID;
-- ์
์ฌ๋
๋ ๋ณ ์ฌ์์ ์กฐํํ๊ธฐ
-- ํํ์์ ์ฌ์ฉํ ์ ์๋ค. ํํ์์ ๊ฒฐ๊ณผ๊ฐ์ด ๊ฐ์ ํ๋ผ๋ฆฌ ๋ฌถ๋๋ค.
SELECT TO_CHAR(HIRE_DATE, 'YYYY') YEAR, COUNT(*)
FROM EMPLOYEES
GROUP BY TO_CHAR(HIRE_DATE, 'YYYY') -- ๋จ์ผํ ํจ์์ธ TO_CHAR(HIRE_DATE, 'YYYY') ์ ๊ฒฐ๊ณผ๊ฐ์ด ๊ฐ์ ํ๋ผ๋ฆฌ ๊ฐ์ ํ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๋๋ค.
ORDER BY YEAR;
-- ๊ธ์ฌ๋ฑ๊ธ๋ณ ์ฌ์์ ์กฐํํ๊ธฐ
-- ์ฌ์ํ
์ด๋ธ๊ณผ ๊ธ์ฌ๋ฑ๊ธํ
์ด๋ธ์ ์กฐ์ธํ๊ณ , ๊ธ์ฌ๋ฑ๊ธํ
์ด๋ธ์ ๋ฑ๊ธ์ด ๊ฐ์ ํ๋ผ๋ฆฌ ํ๊ทธ๋ฃน์ ์์ฑ
SELECT S.GRADE, COUNT(*) GRADE_CNT
FROM EMPLOYEES E, SALARY_GRADE S
WHERE E.SALARY >= S.MIN_SALARY AND E.SALARY <= S.MAX_SALARY
GROUP BY S.GRADE
ORDER BY S.GRADE;
-- ์
์ฌ๋
๋๋ณ ์ฌ์์๋ฅผ ์กฐํํ์ ๋ ์
์ฌํ ์ฌ์์๊ฐ 20๋ช
์ด์์ผ๋ก ์
์ฌํ ํด์ ๊ทธ ํด์ ์
์ฌํ ์ฌ์์๋ฅผ ์กฐํํ๊ธฐ
SELECT TO_CHAR(HIRE_DATE, 'YYYY') YEAR, COUNT(*) YEAR_HIRED_CNT
FROM EMPLOYEES
GROUP BY TO_CHAR(HIRE_DATE, 'YYYY')
HAVING COUNT(*) >= 20
ORDER BY YEAR;
์ปฌ๋ผ๋ช
1
, ์ปฌ๋ผ๋ช
2
) ์ปฌ๋ผ๋ช
1
๋ก ๋จผ์ ๊ทธ๋ฃนํํ๊ณ ๊ฐ์ ๊ทธ๋ฃน ์์์ ์ปฌ๋ผ๋ช
2
๋ก ๊ทธ๋ฃนํํ ๋ค์์ปฌ๋ผ๋ช
1
์ ๊ทธ๋ฃน์ ๋ํ ๊ทธ๋ฃนํจ์ ๊ฒฐ๊ณผ์ปฌ๋ผ๋ช
2
์ ๊ทธ๋ฃน์ ๋ํ ๊ทธ๋ฃนํจ์ ๊ฒฐ๊ณผ ๋ฅผ ์ ๊ณตํ๋ค.์ปฌ๋ผ๋ช
1
, ์ปฌ๋ผ๋ช
2
) ์ ์๋ ์ปฌ๋ผ๋ช
์ผ๋ก ๊ฐ๊ฐ ๋ฐ๋ก ๊ทธ๋ฃนํํด์ ๊ทธ๋ฃนํจ์ ์ ์ฉํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ค.-- ๋ถ์๋ณ, ์ง์ข
๋ณ ์ฌ์์๋ฅผ ์กฐํํ๊ธฐ
-- * ๋ถ์๋ณ๋ก ๋จผ์ ๊ทธ๋ฃนํ ํ, ๊ฐ์ ๋ถ์ ๋ด์์ ์ง์ข
๋ณ๋ก ๋ค์ ๊ทธ๋ฃนํํด์ ์ง์ข
๋ณ ์ฌ์์๋ฅผ ์กฐํํ๋ค.
SELECT DEPARTMENT_ID, JOB_ID, COUNT(*)
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (50, 80)
GROUP BY DEPARTMENT_ID, JOB_ID -- DEPARTMENT_ID๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ทธ ์์์ ๋ค์ JOB_ID๋ก ๊ทธ๋ฃนํํ๋ค.
ORDER BY DEPARTMENT_ID ASC, JOB_ID ASC;
-- ๋ถ์๋ณ, ์ง์ข
๋ณ ์ฌ์์๋ฅผ ์กฐํํ๊ธฐ - ROLLUP()ํจ์๋ก ๋ถ์๋ณ ์๊ณ, ์ ์ฒด ํฉ๊ณ๋ฅผ ์กฐํํ๊ธฐ
-- * ๋ถ์๋ณ๋ก ๋จผ์ ๊ทธ๋ฃนํ ํ, ๊ฐ์ ๋ถ์ ๋ด์์ ์ง์ข
๋ณ๋ก ๋ค์ ๊ทธ๋ฃนํํด์ ์ง์ข
๋ณ ์ฌ์์, ๋ถ์๋ณ ์ฌ์์, ์ ์ฒด ์ฌ์์๋ฅผ ์กฐํํ๋ค.
SELECT DEPARTMENT_ID, JOB_ID, COUNT(*)
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (50, 80)
GROUP BY ROLLUP(DEPARTMENT_ID, JOB_ID) -- ๋ถ๋ถํฉ(ํฐ ๊ทธ๋ฃน๋ณ), ์ ์ฒดํฉ ํ์ ๋ณด์ฌ์ค๋ค.
ORDER BY DEPARTMENT_ID ASC, JOB_ID ASC;
-- ๋ถ์๋ณ, ์ง์ข
๋ณ ์ฌ์์๋ฅผ ์กฐํํ๊ธฐ - GROUPING SETS()ํจ์๋ก ๋ถ์๋ณ, ์ง์ข
๋ณ ๊ทธ๋ฃนํจ์์ ๊ฐ ์คํ๊ฒฐ๊ณผ ์กฐํํ๊ธฐ
-- * ์ ์ฒด์ ๋ํ์ฌ ๋ถ์๋ณ๋ก ์ฌ์์๋ฅผ ์กฐํํ๊ณ , ๋ ์ ์ฒด์ ๋ํ์ฌ ์ง์ข
๋ณ๋ก ์ฌ์์๋ฅผ ์กฐํํ๋ค.
SELECT DEPARTMENT_ID, JOB_ID, COUNT(*)
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (50, 80)
GROUP BY GROUPING SETS(DEPARTMENT_ID, JOB_ID) -- ๋ถ์๋ณ ํฉ๊ณ, ์ง์ข
๋ณ ํฉ๊ณ๋ฅผ ๊ฐ๊ฐ ๋ณด์ฌ์ค๋ค.
ORDER BY DEPARTMENT_ID ASC, JOB_ID ASC;
๐ก GROUP BY์ ์ปฌ๋ผ๋ช /ํํ์์ ์ฌ๋ฌ ๊ฐ ์ ์ ์ ์๋ค.
.
-- ๊ธ์ฌ๋ฑ๊ธ๋ณ ์ฌ์์ ์กฐํํ๊ธฐ
-- ์ฌ์ํ
์ด๋ธ๊ณผ ๊ธ์ฌ๋ฑ๊ธํ
์ด๋ธ์ ์กฐ์ธํ๊ณ , ๊ธ์ฌ๋ฑ๊ธํ
์ด๋ธ์ ๋ฑ๊ธ์ด ๊ฐ์ ํ๋ผ๋ฆฌ ํ๊ทธ๋ฃน์ ์์ฑ
SELECT S.GRADE, COUNT(*) GRADE_CNT
FROM EMPLOYEES E, SALARY_GRADE S
WHERE E.SALARY >= S.MIN_SALARY AND E.SALARY <= S.MAX_SALARY
GROUP BY S.GRADE
ORDER BY S.GRADE;
-- ์์ ๊ฐ์ด ํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ง ์ง๊ณํ ์ ์๋ค. (ํด๋น ์ฌ์์ด ์กด์ฌํ์ง ์๋ ๋ฑ๊ธ์ ํ์ธ ๋ถ๊ฐํ๋ค)
-- ์๋์ ๊ฐ์ด ํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์๋ ๋ฑ๊ธ๋ ํจ๊ป ์ง๊ณํ ์ ์๋ค.
-- ์์์ ์์ฑํ SELECT๋ฌธ์ ์คํ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์์ ํ
์ด๋ธ X๋ก ๊ฐ์ฃผํ๊ณ , SALARY, GRADE์ ์กฐ์ธํ๊ธฐ
--SELECT Y.GRADE, NVL(X.GRADE_CNT, 0) CNT -- X.GRADE_CNT ๊ฐ์ด NULL์ธ ๊ฒฝ์ฐ 0์ผ๋ก ๋ฐํํ๋ค.
--FROM X, SALARY_GRADE Y
--WHERE X.GRADE (+) = Y.GRADE -- X.GRADE์ S.GRADE์ A๋ฑ๊ธ๊ณผ ์ฐ๊ฒฐํ ํ์ด ์์ผ๋ฏ๋ก (+) ํ์ฌ ํฌ๊ด์กฐ์ธ์์ผ์ค๋ค.
--ORDER BY Y.GRADE ASC;
--๊ฐ์์ ํ
์ด๋ธ X ์๋ฆฌ์ ์ SELECT๋ฌธ์ ์์ฑํ๋ค.
SELECT Y.GRADE, NVL(X.GRADE_CNT, 0) CNT
FROM (SELECT S.GRADE, COUNT(*) GRADE_CNT -- ๋ณ์นญ GRADE_CNT๋ ๊ดํธ ๋ฐ์์ ๊ฐ์์ ํ
์ด๋ธ X์ ์ปฌ๋ผ๋ช
์ด๋ค.
FROM EMPLOYEES E, SALARY_GRADE S -- ๋ณ์นญ S๋ ๊ดํธ ์์์๋ง ์ ํจํ๋ค. ์๋ณ์ ์ํด ์ฌ์ฉํ ๊ฒ ๋ฟ์ด๋ค.
WHERE E.SALARY >= S.MIN_SALARY AND E.SALARY <= S.MAX_SALARY
GROUP BY S.GRADE) X, SALARY_GRADE Y
WHERE X.GRADE(+) = Y.GRADE -- S.GRADE๊ฐ ์๋๋ผ X.GRADE๋ผ๊ณ ํด์ผ ํ๋ค.
ORDER BY Y.GRADE ASC;
```