๐ก SELECT ๋ฌธ ํด์ ์์
- ํด์5: SELECT ์ปฌ๋ผ๋ช AS ๋ณ์นญ, ๊ณ์ฐ์, ํจ์์
- ํด์1: FROM ํ ์ด๋ธ๋ช
ํด์2: WHERE ์ปฌ๋ผ๋ช | ํจ์์ ๋น๊ต์ฐ์ฐ์ ๋น๊ต๊ฐ
ํด์3: GROUP BY ๊ทธ๋ฃน์ ๋ฌถ์ ์ปฌ๋ผ๋ช- ํด์4: HAVING ๊ทธ๋ฃนํจ์์ ๋น๊ต์ฐ์ฐ์ ๋น๊ต๊ฐ
- ํด์6: ORDER BY ์ปฌ๋ผ๋ช | ๋ณ์นญ | ์ปฌ๋ผ์๋ฒ ์ ๋ ฌ๋ฐฉ์(ASC/DESC) [NULLS FIRST | LAST]
โ NULLS FIRST | LAST NULL ๊ฐ์ด ์์ ๋์ค๊ฒ ํ ๊ฒ์ธ์ง ๋ค์ ๋์ค๊ฒ ํ ๊ฒ์ธ์ง๋ฅผ ๋ป ํจ.
: ๊ฐ์ ๊ฐ๋ค์ด ์ฌ๋ฌ๊ฐ ๊ธฐ๋ก๋ ์ปฌ๋ผ์ ๊ฐ์ง๊ณ ๊ฐ์ ๊ฐ๋ค์ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์
GROUP BY ์ปฌ๋ผ๋ช | ํจ์์, ...
- ์ฌ๋ฌ๊ฐ์ ๊ฐ์ ๋ฌถ์์ ํ๋๋ก ์ฒ๋ฆฌํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํจ.
- ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ ๊ฐ์ ๋ํด์ SELECT์ ์์ ๊ทธ๋ฃนํจ์๋ก ์ฌ์ฉํจ.
- ๊ทธ๋ฃนํจ์๋ ๋จ ํ๊ฐ์ ๊ฒฐ๊ณผ ๊ฐ๋ง ์ฐ์ถํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฃน์ด ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฐ์
- ์ฌ๋ฌ๊ฐ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ฐ์ถํ๊ธฐ ์ํด ๊ทธ๋ฃนํจ์๊ฐ ์ ์ฉ๋ ๊ธฐ๋ถ์ ORDER BY์ ์ ๊ธฐ์ ํ์ฌ ์ฌ์ฉ
[EMPLOYEE ํ ์ด๋ธ์์ ๋ถ์์ฝ๋, ๋ถ์๋ณ ๊ธ์ฌ ํฉ ์กฐํ] --1) ๋ถ์์ฝ๋๋ง ์กฐํ SELECT DEPT_CODE FROM EMPLOYEE; --23ํ--2) ์ ์ฒด ๊ธ์ฌ ํฉ ์กฐํ SELECT SUM(SALARY) FROM EMPLOYEE; --1ํ SELECT DEPT_CODE, SUM(SALARY) FROM EMPLOYEE; -- ์ค๋ฅ ๋ฐ์ ORA-00937: ๋จ์ผ ๊ทธ๋ฃน์ ๊ทธ๋ฃน ํจ์๊ฐ ์๋๋๋ค --์ค๋ฅ ๋ฐ์ํ ์ ๋ด์ฉ ์๋ง๊ฒ ์์ ํ๊ธฐ! SELECT DEPT_CODE, SUM(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE; --> DEPT_CODE๊ฐ ๊ฐ์ ํ๋ผ๋ฆฌ ํ๋์ ๊ทธ๋ฃน์ด ๋จ.
[EMPLOYEE ํ ์ด๋ธ์์ ์ง๊ธ์ฝ๋๊ฐ ๊ฐ์ ์ฌ๋์ ์ง๊ธ์ฝ๋, ๊ธ์ฌํ๊ท , ์ธ์์๋ฅผ ์ง๊ธ์ฝ๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์กฐํ] SELECT JOB_CODE, ROUND(AVG(SALARY)),COUNT(*) FROM EMPLOYEE GROUP BY JOB_CODE ORDER BY JOB_CODE ;[EMPLOYEE ํ ์ด๋ธ์์ ์ฑ๋ณ(๋จ/์ฌ)๊ณผ ๊ฐ ์ฑ๋ณ ๋ณ ์ธ์ ์, ๊ธ์ฌ ํฉ์ ์ธ์ ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์กฐํ] SELECT DECODE(SUBSTR(EMP_NO,8,1),'1', '๋จ', '2','์ฌ') ์ฑ๋ณ , COUNT(*) "์ธ์ ์" , SUM(SALARY) "๊ธ์ฌ ํฉ" FROM EMPLOYEE GROUP BY DECODE(SUBSTR(EMP_NO,8,1),'1', '๋จ', '2','์ฌ') --> ๋ณ์นญ์ฌ์ฉ์ด ์๋๋ค! ๋ณ์นญ ๋๋ ์ปฌ๋ผ์์๋ฅผ ์์ฑํ๋ฉดX SELECT์ ์ ํด์ํ๊ธฐ ์ ์ด๊ธฐ ๋๋ฌธ ORDER BY "์ธ์ ์" ; --> ํด์์์๋ก ์ธํด ๋ณ์นญ ์ฌ์ฉO
๐ WHERE์ GROUP BY ์ ์ ํผํฉํ์ฌ ์ฌ์ฉ
[EMPLOYEE ํ ์ด๋ธ์์ ๋ถ์์ฝ๋๊ฐ D5, D6์ธ ๋ถ์์ ํ๊ท ๊ธ์ฌ, ์ธ์ ์ ์กฐํ] SELECT DEPT_CODE, ROUND(AVG(SALARY)), COUNT(*) FROM EMPLOYEE WHERE DEPT_CODE IN('D5','D6') GROUP BY DEPT_CODE ;[EMPLOYEE ํ ์ด๋ธ์์ ์ง๊ธ๋ณ 2000๋ ๋ ์ดํ (2000๋ ํฌํจ) ์ ์ฌ์๋ค์ ๊ธ์ฌ ํฉ์ ์กฐํ (์ง๊ธ์ฝ๋ ์ค๋ฆ์ฐจ์)] SELECT JOB_CODE , SUM(SALARY) FROM EMPLOYEE ๋ฐฉ๋ฒ 1 - WHERE HIRE_DATE >= TO_DATE('2000-01-01') ๋ฐฉ๋ฒ 2 - WHERE EXTRACT (YEAR FROM HIRE_DATE) >= 2000 ๋ฐฉ๋ฒ 3 - WHERE SUBSTR(TO_CHAR(HIRE_DATE, 'YYYY'),1,4) >= '2000' GROUP BY JOB_CODE ORDER BY 1;
GROUP BY์ ์ ์ฌ๋ฌ ์ปฌ๋ผ์ ๋ฌถ์ด์ ๊ทธ๋ฃน์ผ๋ก ์ง์ ๊ฐ๋ฅํ๋ค. ์ฆ, ๊ทธ๋ฃน ๋ด ๊ทธ๋ฃน์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ!
ํ์ง๋ง ์ฃผ์์ฌํญ์ด ์๋ค..!
โ GROUP BY ์ฌ์ฉ ์ ์ฃผ์ ์ฌํญ
SELECT ๋ฌธ์ GROUP BY ์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ, SELECT ์ ์ ๋ช
์ํ ์กฐํํ๋ ค๋ ์ปฌ๋ผ ์ค ๊ทธ๋ฃน ํจ์๊ฐ ์ ์ฉ๋์ง ์์ ์ปฌ๋ผ์ ๋ชจ๋ GROUP BY ์ ์ ์์ฑํด์ผ ํ๋ค ๐
[EMPLOYEE ํ ์ด๋ธ์์ ๋ถ์๋ณ๋ก ๊ฐ์ ์ง๊ธ์ธ ์ฌ์์ ์๋ฅผ ์กฐํ/ ๋ถ์์ฝ๋ ์ค๋ฆ์ฐจ์, ์ง๊ธ์ฝ๋ ๋ด๋ฆผ์ฐจ์] SELECT DEPT_CODE, JOB_CODE, COUNT(*) FROM EMPLOYEE GROUP BY DEPT_CODE , JOB_CODE โกDEPT_CODE๋ก ๊ทธ๋ฃน์ ๋๋๊ณ , ๋๋ ์ง ๊ทธ๋ฃน๋ด์์ JOB_CODE๋ก ๋ ๊ทธ๋ฃน์ ๋ถ๋ฅ(=>์ธ๋ถํ) ORDER BY DEPT_CODE, JOB_CODE DESC; โก GROUP BY ํํ์์ด ์๋๋๋ค.
: ๊ทธ๋ฃนํจ์๋ก ๊ตฌํด ์ฌ ๊ทธ๋ฃน์ ๋ํ ์กฐ๊ฑด์ ์ค์ ํ ๋ ์ฌ์ฉ
HAVING ์ปฌ๋ผ๋ช | ํจ์์ ๋น๊ต์ฐ์ฐ์ ๋น๊ต๊ฐ[๋ถ์๋ณ ํ๊ท ๊ธ์ฌ๊ฐ 3๋ฐฑ๋ง์ ์ด์์ธ ๋ถ์๋ฅผ ์กฐํ(๋ถ์์ฝ๋ ์ค๋ฆ์ฐจ์)] SELECT DEPT_CODE , ROUND(AVG(SALARY)) FROM EMPLOYEE -- WHERE AVG(SALARY) >= 3000000 โก ํ์ฌ๋์ ๊ธ์ฌ๊ฐ 3๋ฐฑ๋ง ์ด์์ด๋ผ๋ ์กฐ๊ฑด์ด๊ธฐ์ ์๊ตฌ์ฌํญ ์ถฉ์กฑX/๋ถ์๋ณ ํ๊ท ๊ธ์ฌ๋ก ๊ตฌํด์ผํจ! โก WHERE ์ ์ ํ ์ด๋ธ ๋น ํ๋ํ๋์ ์กฐ๊ฑด์ ๊ตฌํ๋ ๊ฒ ! GROUP BY DEPT_CODE HAVING AVG(SALARY) >=3000000 โกDEPT_CODE ๊ทธ๋ฃน ์ค ๊ธ์ฌ ํ๊ท ์ด 3๋ฐฑ๋ง ์ด์์ธ ๊ทธ๋ฃน๋ง ์กฐํ โก HAVING์ ํ ์ด๋ธ์ ๊ทธ๋ฃน์ ์กฐ๊ฑด์ ๊ตฌํ๋ ๊ฒ!(๋ฐ๋์ ๊ทธ๋ฃนํจ์๊ฐ ์ฌ์ฉ๋๋ค) ORDER BY DEPT_CODE ;[EMPLOYEE ํ ์ด๋ธ์์ ์ง๊ธ๋ณ ์ธ์์๊ฐ 5๋ช ์ดํ์ธ ์ง๊ธ์ฝ๋, ์ธ์์ ์กฐํ(์ง๊ธ์ฝ๋ ์ค๋ฆ์ฐจ์)] SELECT JOB_CODE, COUNT(*) FROM EMPLOYEE GROUP BY JOB_CODE HAVING COUNT(*)<=5 โก HAVING ์ ์์๋ ๊ทธ๋ฃน ํจ์๊ฐ ๋ฐ๋์ ์์ฑ๋๋ค!!! ORDER BY 1;
: ๊ทธ๋ฃน ๋ณ ์ฐ์ถ ๊ฒฐ๊ณผ ๊ฐ์ ์ง๊ณ๋ฅผ ๊ณ์ฐํ๋ ํจ์ (๊ทธ๋ฃน๋ณ๋ก ์ค๊ฐ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๊ฐ)
โก GROUP BY ์ ์์๋ง ์ฌ์ฉํ ์ ์๋ ํจ์!
- ROLLUP : GROUUP BY ์ ์์ ๊ฐ์ฅ ๋จผ์ ์์ฑ๋ ์ปฌ๋ผ์ ์ค๊ฐ ์ง๊ฒ๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์
SELECT DEPT_CODE, JOB_CODE, COUNT(*) FROM EMPLOYEE GROUP BY ROLLUP(DEPT_CODE , JOB_CODE) ORDER BY 1;
- CUBE : GROUP BY ์ ์ ์์ฑ๋ ๋ชจ๋ ์ปฌ๋ผ์ ์ค๊ฐ ์ง๊ณ๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์
SELECT DEPT_CODE, JOB_CODE, COUNT(*) FROM EMPLOYEE GROUP BY CUBE(DEPT_CODE , JOB_CODE) ORDER BY 1;
: ์ฌ๋ฌ SELECT์ ๊ฒฐ๊ณผ(RESULT SET)๋ฅผ ํ๋์ ๊ฒฐ๊ณผ๋ก ๋ง๋๋ ์ฐ์ฐ์
- UNION (ํฉ์งํฉ) : ๋ SELECT ๊ฒฐ๊ณผ๋ฅผ ํ๋๋ก ํฉ์นจ (๋จ, ์ค๋ณต์ ํ๋ฒ๋ง ์์ฑ)
- INTERECT (๊ต์งํฉ) : ๋ SELECT ๊ฒฐ๊ณผ ์ค ์ค๋ณต๋๋ ๋ถ๋ถ๋ง ์กฐํ
- UNION ALL : UNION + INTERSECT ํฉ์งํฉ์์ ์ค๋ณต ๋ถ๋ถ ์ ๊ฑฐ X
- MINUS (์ฐจ์งํฉ) : A ์์ A, B ๊ต์งํฉ ๋ถ๋ถ์ ์ ๊ฑฐํ๊ณ ์กฐํ
[EMPLOYEE ํ ์ด๋ธ์์ ๋ถ์์ฝ๋๊ฐ 'D5' ์ธ ์ฌ์์ ์ฌ๋ฒ, ์ด๋ฆ, ๋ถ์์ฝ๋, ๊ธ์ฌ] SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY FROM EMPLOYEE WHERE DEPT_CODE = 'D5';[๊ธ์ฌ๊ฐ 300๋ง ์ด๊ณผ์ธ ์ฌ์์ ์ฌ๋ฒ, ์ด๋ฆ, ๋ถ์์ฝ๋, ๊ธ์ฌ] SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY > 3000000;
โก ๊ทธ๋ ๋ค๋ฉด ๋๊ฐ์ง์ ๋ด์ฉ์ ์งํฉ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ์ฐ๊ฒฐํ์ฌ ๋ํ๋ด๋ณด๊ธฐ!!
1. UNION SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY FROM EMPLOYEE WHERE DEPT_CODE = 'D5' UNION SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY > 3000000; โก์ค๋ณต๊ฐ ์ ๊ฑฐ๋๊ณ ํฉ์น ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ํ๋ฒ๋ง ์์ฑ๋๋ค (์ฌ๋ด์ , ๋๋ถํผ์ด ์ค๋ณต๋์ด ํ๋ฒ๋ง ๋์ด)
2. INTERSECT SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY FROM EMPLOYEE WHERE DEPT_CODE = 'D5' INTERSECT SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY > 3000000; โก์ค๋ณต๋๋ ์ฌ๋๋ง ๋์ด (์ฌ๋ด์ , ๋๋ถํผ๋ง ๋์ด)
3. UNION ALL SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY FROM EMPLOYEE WHERE DEPT_CODE = 'D5' UNION ALL SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY > 3000000; โก ํฉ์งํฉ์์ ์ค๋ณต์ ๊ฑฐ ์ํ๊ณ ๋์ค๋ ๊ฒ (์ฌ๋ด์ , ๋๋ถํผ ๋๋ฒ์ฉ ๋์ด)
4. MINUS SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY FROM EMPLOYEE WHERE DEPT_CODE = 'D5' MINUS SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY > 3000000; โก A(์์ ์ ์ ๊ฒ)๋ B(๋ค์ ์ ์ ๊ฒ)์ ๊ต์งํฉ ๋ถ๋ถ์ ์ ๊ฑฐํ๊ณ ๋๋จธ์ง๊ฐ ๋์ด (์ฌ๋ด์ , ๋๋ถํผ ๋นผ๊ณ ๋์ด)
โโ ์งํฉ์ฐ์ฐ์ ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
์กฐํํ๋ ์ปฌ๋ผ์ ํ์ (๋ฌธ์-๋ฌธ์/ ์ซ์-์ซ์ ๋ฑ), ๊ฐ์๊ฐ ๋ชจ๋ ๋์ผํด์ผ ํ๋ค!! ๐
SELECT EMP_ID , EMP_NAME , DEPT_CODE , SALARY FROM EMPLOYEE WHERE DEPT_CODE = 'D5' UNION SELECT EMP_ID , EMP_NAME , DEPT_CODE ,1 FROM EMPLOYEE WHERE SALARY > 3000000; ํ ์ด๋ธ์ด ๋ฌ๋ผ๋ ์งํฉ ์ฐ์ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ ๊ด์ฐฎ์! โก ์ฆ, ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ์ด์ง๋ง ์ปฌ๋ผ์ ํ์ , ๊ฐ์๋ง ์ผ์นํ๋ฉด ์งํฉ ์ฐ์ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ! SELECT EMP_ID , EMP_NAME FROM EMPLOYEE UNION SELECT DEPT_ID, DEPT_TITLE FROM DEPARTMENT;