πŸ—„οΈ Backend/Oracle

였라클(Oracle) - (DQL) : ν•¨μˆ˜(닀쀑행 ν•¨μˆ˜)

kongmi 2023. 2. 16. 18:58
  • μ˜€λΌν΄μ—μ„œλŠ” (1)λ‚΄μž₯ν•¨μˆ˜μ™€ μ‚¬μš©μžκ°€ ν•„μš”μ— μ˜ν•΄μ„œ 직접 μ •μ˜ν•œ (2)μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜λ‘œ λ‚˜λˆ„μ–΄μ§.
  • 단일행 ν•¨μˆ˜μ™€ 닀쀑행 ν•¨μˆ˜(집계 ν•¨μˆ˜)둜 λ‚˜λˆ„μ–΄μ§.
SELECT ENAME, SUM(SAL)
    FROM EMP;

⚠️ ν•΄λ‹Ή μ»€λ§¨λ“œλŠ” 였λ₯˜κ°€ λ‚œλ‹€. μ™œ?

πŸ“Œ SUM(SAL)은 κ²°κ³Όκ°€ ν•˜λ‚˜λ§Œ λ‚˜μ˜€λŠ”λ°(SAL ν•­λͺ©μ— λŒ€ν•œ ν•©κ³„μ΄λ―€λ‘œ) ENAME은 각 행이 λ‹€ λ‚˜μ˜€κΈ° λ•Œλ¬Έ 

      이것을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„  GROUP BYλ₯Ό μ΄μš©ν•΄ κ·Έλ£Ή λ‹¨μœ„λ‘œ λ¬Άμ–΄μ•Ό 함!

SELECT DEPTNO, SUM(SAL)
    FROM EMP
    GROUP BY DEPTNO; -- 급여에 λŒ€ν•œ 합계λ₯Ό λΆ€μ„œλ³„λ‘œ λ¬Άμ–΄μ€Œ.

🐸 μ‘μš© 예제. μ§μ—…λ³„λ‘œ κΈ‰μ—¬ 합계, κΈ‰μ—¬ 평균, ν•΄λ‹Ή μ§μ—…κ΅°μ˜ 직원 숫자λ₯Ό 좜λ ₯

SELECT JOB, SUM(SAL), TRUNC(AVG(SAL)), COUNT(*)
    FROM EMP
    GROUP BY JOB
    ORDER BY AVG(SAL) DESC;

SUM ν•¨μˆ˜ (합계)

  • DISTINCT : 쀑볡 제거
  • ALL : μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ 기본적으둜 ALL νŠΉμ„±μ„ κ°€μ§‘λ‹ˆλ‹€.
SELECT SUM(DISTINCT SAL) AS μ€‘λ³΅μ œκ±°, -- SAL ν•­λͺ© 쀑 μ€‘λ³΅μΈκ²Œ 있으면 제거된 ν›„ 더해짐.
    SUM(ALL SAL) AS μ „λΆ€,
    SUM(SAL) AS κΈ°λ³Έ
    FROM EMP;

기타 ꡬ문

SELECT COUNT(*) FROM EMP; -- 전체 λͺ‡ λͺ…인지( == ν–‰μ˜ 수)
SELECT COUNT(COMM) FROM EMP; -- COMMμ—μ„œ NULL이 μ•„λ‹Œ μ‚¬μ›μ˜ 수

🐸 λΆ€μ„œ λ²ˆν˜Έκ°€ 20인 μ‚¬μ› μ€‘ μž…사일이 κ°€μž₯ μ΅œκ·ΌμΈ μ‚¬μ› μΆœλ ₯

SELECT MAX(HIREDATE)
    FROM EMP
    WHERE DEPTNO = 20;

🐸 절 μž‘μ„± μˆœμ„œ

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

GROUP BY

  • ν•˜λ‚˜μ˜ κ²°κ³Όλ₯Ό νŠΉμ • 열을 λ¬Άμ–΄μ„œ 좜λ ₯ν•˜λŠ” 것을 κ·Έλ£Ήν™” ν•œλ‹€κ³  ν•©λ‹ˆλ‹€.
  • 이 λ•Œ, 좜λ ₯ν•΄μ•Ό ν•  λŒ€μƒ μ—΄ 지정을 GROUP BY둜 μˆ˜ν–‰ ν•©λ‹ˆλ‹€.
SELECT TRUNC(AVG(SAL)) 평균급여, DEPTNO
    FROM EMP
    GROUP BY DEPTNO;

🐸 λΆ€μ„œ 번호 및 직책별 평균 κΈ‰μ—¬λ‘œ μ •λ ¬ν•˜κΈ°

SELECT DEPTNO, JOB, AVG(SAL)
    FROM EMP
    GROUP BY DEPTNO, JOB
    ORDER BY DEPTNO, JOB;

🐸 GROUP BY μ ˆμ„ μ‚¬μš©ν•˜μ—¬ λΆ€μ„œ λ²ˆν˜Έλ³„ ν‰κ·  μΆ”κ°€ μˆ˜λ‹Ή μΆœλ ₯

SELECT DEPTNO, NVL(AVG(COMM),0) AS λΆ€μ„œλ³„ν‰κ· μˆ˜λ‹Ή
    FROM EMP
    GROUP BY DEPTNO;

🐸 λΆ€μ„œ μ½”λ“œ, κΈ‰μ—¬ ν•©κ³„, λΆ€μ„œ ν‰κ· , λΆ€μ„œ μ½”λ“œ μˆœ μ •λ ¬

SELECT DEPTNO, SUM(SAL),
    TRUNC(AVG(SAL)) AS 평균급여,
    COUNT(*) μΈμ›μˆ˜
    FROM EMP
    GROUP BY DEPTNO
    ORDER BY DEPTNO;

HAVING 절

  • SELECT문에 GROUP BYκ°€ μ‘΄μž¬ν•  λ•Œλ§Œ μ‚¬μš© κ°€λŠ₯
  • κ·Έλ£Ήν™”λœ κ°’μ˜ λ²”μœ„λ₯Ό μ œν•œν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©
  • WHEREμ ˆμ„ λͺ» μ“°λŠ” μ΄μœ λŠ” GROUP BY와 WHEREκ°€ μˆ˜ν–‰λ˜λŠ” μ‹œμ μ΄ λ‹€λ₯΄κΈ° λ•Œλ¬Έ!
SELECT DEPTNO, JOB, AVG(SAL)
    FROM EMP
    GROUP BY DEPTNO, JOB
        HAVING AVG(SAL) >= 2000
    ORDER BY DEPTNO, JOB;

🐸 WHERE 절과 HAVING μ ˆμ„ λͺ¨λ‘ μ‚¬μš©ν•œ 경우

SELECT DEPTNO, JOB, AVG(SAL)
    FROM EMP
    WHERE SAL <= 2500
    GROUP BY DEPTNO, JOB
        HAVING AVG(SAL) >= 2000
    ORDER BY DEPTNO, JOB;

πŸΈμ—°μŠ΅λ¬Έμ œπŸΆ

1. HAVINGμ ˆμ„ μ‚¬μš©ν•˜μ—¬ EMP ν…Œμ΄λΈ”μ˜ λΆ€μ„œλ³„ μ§μ±…μ˜ 평균 κΈ‰μ—¬κ°€ 500 이상인 μ‚¬μ›λ“€μ˜ λΆ€μ„œ 번호, 직책, λΆ€μ„œλ³„ μ§μ±…μ˜ 평균 κΈ‰μ—¬κ°€ 좜λ ₯

SELECT DEPTNO, JOB, AVG(SAL)
    FROM EMP
    GROUP BY DEPTNO, JOB
        HAVING AVG(SAL) >= 500
    ORDER BY DEPTNO, JOB;

2. EMP ν…Œμ΄λΈ”μ„ μ΄μš©ν•˜μ—¬ λΆ€μ„œλ²ˆν˜Έ, 평균급여, μ΅œκ³ κΈ‰μ—¬, μ΅œμ €κΈ‰μ—¬, μ‚¬μ›μˆ˜λ₯Ό 좜λ ₯, 단, 평균 κΈ‰μ—¬λ₯Ό 좜λ ₯ ν•  λ•ŒλŠ” μ†Œμˆ˜μ  μ œμ™Έν•˜κ³  λΆ€μ„œ λ²ˆν˜Έλ³„λ‘œ 좜λ ₯

SELECT DEPTNO,
    TRUNC(AVG(SAL)) AS "평균 κΈ‰μ—¬",
    MAX(SAL) AS "졜고 κΈ‰μ—¬",
    MIN(SAL) AS "μ΅œμ € κΈ‰μ—¬",
    COUNT(*) AS "사원 수"
    FROM EMP
    GROUP BY DEPTNO
    ORDER BY DEPTNO DESC;

3. 같은 직책에 μ’…μ‚¬ν•˜λŠ” 사원이 3λͺ… 이상인 직책과 인원을 좜λ ₯

SELECT JOB, COUNT(JOB) AS μ‚¬μ›μˆ˜
    FROM EMP
    GROUP BY JOB
        HAVING COUNT(JOB) >= 3;

4. μ‚¬μ›λ“€μ˜ μž…μ‚¬ 연도λ₯Ό κΈ°μ€€μœΌλ‘œ λΆ€μ„œλ³„λ‘œ λͺ‡ λͺ…이 μž…μ‚¬ν–ˆλŠ”μ§€ 좜λ ₯

SELECT EXTRACT(YEAR FROM HIREDATE) AS μž…μ‚¬μΌ,
    DEPTNO,
    COUNT(*) μ‚¬μ›μˆ˜
    FROM EMP
    GROUP BY EXTRACT(YEAR FROM HIREDATE), DEPTNO
    ORDER BY μ‚¬μ›μˆ˜;

5. μΆ”κ°€ μˆ˜λ‹Ήμ„ λ°›λŠ” 사원 μˆ˜μ™€ λ°›μ§€ μ•ŠλŠ” μ‚¬μ›μˆ˜λ₯Ό 좜λ ₯ (O, X둜 ν‘œκΈ° ν•„μš”)

SELECT NVL2(COMM,'O','X') AS μΆ”κ°€μˆ˜λ‹Ή,
    COUNT(NVL2(COMM,'O','X')) AS μ‚¬μ›μˆ˜
    FROM EMP
    GROUP BY NVL2(COMM,'O','X');

6. 각 λΆ€μ„œμ˜ μž…μ‚¬ 연도별 사원 수, 졜고 κΈ‰μ—¬, κΈ‰μ—¬ ν•©, 평균 κΈ‰μ—¬λ₯Ό 좜λ ₯

SELECT DEPTNO,
    EXTRACT(YEAR FROM HIREDATE) AS μž…μ‚¬λ…„λ„,
    COUNT(*) μ‚¬μ›μˆ˜,
    MAX(SAL) μ΅œκ³ κΈ‰μ—¬,
    TRUNC(AVG(SAL)) 평균급여,
    SUM(SAL) 합계
    FROM EMP
    GROUP BY EXTRACT(YEAR FROM HIREDATE),DEPTNO
    ORDER BY DEPTNO;