[์˜ค๋ผํด SQL ์‹ค์Šต] ํ•จ์ˆ˜์™€ GROUP BY ์ •๋ณตํ•˜๊ธฐ

2025. 6. 24. 17:03ใ†DB

๐Ÿ“˜์˜ค๋ผํด ํ•จ์ˆ˜ ์‹ค์Šต ์ •๋ฆฌ

์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์€ SQLD ์ž๊ฒฉ์ฆ์„ ๊ณต๋ถ€ํ•˜๋˜ ์‹œ์ ˆ ์‹ค์Šตํ–ˆ๋˜ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ, ์ตœ๊ทผ ์˜ค๋ผํด ์ˆ˜์—…์„ ๋‹ค์‹œ ๋“ค์œผ๋ฉฐ ๋ณต์Šต ๊ฒธ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋‚ ์งœ ํ•จ์ˆ˜์™€ NULL ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ ๋“ฑ์„ ํฌํ•จํ•˜๋ฉฐ, ๋‚˜์ค‘์— ์‹ค๋ฌด๋‚˜ ์‹œํ—˜ ์ „ ํ”ผ๋“œ๋ฐฑ ๋ชฉ์ ์œผ๋กœ ๋˜์งš๊ธฐ ์ข‹๊ฒŒ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.


 

๐Ÿ“Œ SQL ๋ฌธ ์ž‘์„ฑ ์ˆœ์„œ์™€ ์‹คํ–‰ ์ˆœ์„œ

  • ์ž‘์„ฑ ์ˆœ์„œ: SELECT โ†’ FROM โ†’ WHERE โ†’ GROUP BY โ†’ HAVING โ†’ ORDER BY
  • ์‹คํ–‰ ์ˆœ์„œ: FROM โ†’ WHERE โ†’ GROUP BY โ†’ HAVING โ†’ SELECT โ†’ ORDER BY

๐Ÿ”  ๋ฌธ์ž์—ด ํ•จ์ˆ˜

  • UPPER() : ์†Œ๋ฌธ์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜
  • LOWER() : ๋Œ€๋ฌธ์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜
  • LENGTH() : ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜
  • SUBSTR() : ๋ฌธ์ž์—ด์˜ ํŠน์ • ๋ถ€๋ถ„์„ ์ถ”์ถœ
  • REPLACE() : ๋ฌธ์ž์—ด ๋‚ด ํŠน์ • ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ์น˜ํ™˜
SELECT FIRST_NAME,
       UPPER(FIRST_NAME) AS "๋Œ€๋ฌธ์ž",
       LOWER(FIRST_NAME) AS "์†Œ๋ฌธ์ž"
FROM EMPLOYEES;

SELECT LENGTH('HELLO WORLD') AS "๋ฌธ์ž์—ด ๊ธธ์ด"
FROM DUAL;

SELECT SUBSTR('๊ด‘์ฃผ์ธ๊ณต์ง€๋Šฅ์‚ฌ๊ด€ํ•™๊ต ๊ฐœ๊ฐ•', 7, 4) AS "์‚ฌ๊ด€ํ•™๊ต"
FROM DUAL;

SELECT REPLACE('์ธ๊ณต์ง€๋Šฅ#์‚ฌ๊ด€ํ•™๊ต', '#', '-') AS "์น˜ํ™˜๊ฒฐ๊ณผ"
FROM DUAL;

๐Ÿ”ข ์ˆซ์ž ํ•จ์ˆ˜

  • ROUND() : ๋ฐ˜์˜ฌ๋ฆผ
  • MOD() : ๋‚˜๋จธ์ง€ ๊ฐ’์„ ๊ตฌํ•จ
SELECT ROUND(12345.56789, 2) AS "์†Œ์ˆ˜์  2์ž๋ฆฌ ๋ฐ˜์˜ฌ๋ฆผ",
       MOD(123, 10) AS "๋‚˜๋จธ์ง€"
FROM DUAL;

๐Ÿ“… ๋‚ ์งœ ํ•จ์ˆ˜

  • SYSDATE : ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„
SELECT SYSDATE
FROM DUAL;

โ€ป ๋‚ ์งœ ํฌ๋งท ์„ค์ •: ๋„๊ตฌ > ํ™˜๊ฒฝ์„ค์ • > NLS > ๋‚ ์งœํ˜•์‹: YYYY-MM-DD HH24:MI:SS


๐Ÿ” ๋ช…์‹œ์  ํ˜•๋ณ€ํ™˜ ํ•จ์ˆ˜

  • TO_NUMBER() : ๋ฌธ์ž์—ด → ์ˆซ์ž
  • TO_CHAR() : ์ˆซ์ž/๋‚ ์งœ → ๋ฌธ์ž์—ด
  • TO_DATE() : ๋ฌธ์ž์—ด → ๋‚ ์งœ
SELECT TO_NUMBER('1,000', '9999') + 900 AS "์ˆซ์ž ๋ณ€ํ™˜"
FROM DUAL;

SELECT FIRST_NAME,
       SALARY,
       TO_CHAR(SALARY, 'L999,999') AS "๊ธ‰์—ฌ (๋ฌธ์žํ˜•)"
FROM EMPLOYEES;

SELECT TO_DATE('20250624','YYYY/MM/DD') AS "๋‚ ์งœ๋ณ€ํ™˜"
FROM DUAL;

โ“ NULL ์ฒ˜๋ฆฌ ํ•จ์ˆ˜

  • NVL() : NULL์ด๋ฉด ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
  • NVL2() : NULL ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ’ ๋ฐ˜ํ™˜
SELECT EMPLOYEE_ID, FIRST_NAME, COMMISSION_PCT,
       NVL(COMMISSION_PCT, 0) AS "๋ณด๋„ˆ์Šค (NULL๋Œ€์ฒด)"
FROM EMPLOYEES;

SELECT EMPLOYEE_ID, FIRST_NAME, MANAGER_ID,
       NVL2(MANAGER_ID, '์ง์›', '๋Œ€ํ‘œ') AS "์ง๋ฌด"
FROM EMPLOYEES;

๐ŸŽฏ ์กฐ๊ฑด ํ•จ์ˆ˜ - DECODE()

์กฐ๊ฑด์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒ

SELECT EMPLOYEE_ID, FIRST_NAME, MANAGER_ID,
       DECODE(MANAGER_ID, NULL, '๋Œ€ํ‘œ', '์ง์›') AS "์ง๋ฌด",
       DECODE(MANAGER_ID, 
              100, '๋Œ€ํ‘œ',
              101, '์ „๋ฌด',
              102, '์ƒ๋ฌด',
              103, 'ํŒ€์žฅ',
              '์ง์›') AS "์ง๊ธ‰"
FROM EMPLOYEES;

 


๐Ÿ“˜๊ทธ๋ฃน ํ•จ์ˆ˜(Group Function)์™€ GROUP BY

์ด๋ฒˆ ์žฅ์—์„œ๋Š” ์˜ค๋ผํด์˜ ์ง‘๊ณ„ ํ•จ์ˆ˜(๊ทธ๋ฃน ํ•จ์ˆ˜)์™€ GROUP BY ์ ˆ์„ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ง‘๊ณ„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ง‘๊ณ„ ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ํ–‰์„ ์ž…๋ ฅ๋ฐ›์•„ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹ค์ค‘ํ–‰ ํ•จ์ˆ˜์ด๋ฉฐ, GROUP BY์™€ ํ•จ๊ป˜ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ ์ง‘๊ณ„ ํ•จ์ˆ˜ ๊ฐœ์š”

  • COUNT() : ํ–‰์˜ ์ˆ˜(๊ฐœ์ˆ˜)
  • SUM() : ํ•ฉ๊ณ„
  • MAX() : ์ตœ๋Œ€๊ฐ’
  • MIN() : ์ตœ์†Œ๊ฐ’
  • AVG() : ํ‰๊ท 
-- ์ง์› ํ…Œ์ด๋ธ”์—์„œ ์ง์› ID์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ์˜ˆ์ œ
SELECT COUNT(EMPLOYEE_ID)
FROM EMPLOYEES;

โ— ์ง‘๊ณ„ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ ์œ ์˜์‚ฌํ•ญ

  1. ์ง‘๊ณ„ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค (๋‹ค์ค‘ํ–‰ → ๋‹จ์ผ๊ฒฐ๊ณผ)
  2. ์ง‘๊ณ„ ํ•จ์ˆ˜๋Š” NULL ๊ฐ’์„ ์ œ์™ธํ•˜๊ณ  ์—ฐ์‚ฐํ•ฉ๋‹ˆ๋‹ค
  3. ์ง‘๊ณ„ ํ•จ์ˆ˜์™€ ์ผ๋ฐ˜ ์ปฌ๋Ÿผ์„ ๊ฐ™์ด SELECTํ•  ๊ฒฝ์šฐ GROUP BY๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
-- ์•„๋ž˜ ์ฟผ๋ฆฌ๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ (์ง‘๊ณ„ํ•จ์ˆ˜์™€ ์ผ๋ฐ˜ ์ปฌ๋Ÿผ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ GROUP BY ์—†์Œ)
-- SELECT DEPARTMENT_ID, COUNT(*) FROM EMPLOYEES;

-- ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: GROUP BY ์‚ฌ์šฉ
SELECT DEPARTMENT_ID, COUNT(*)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;

โœจ COUNT(*) vs COUNT(์ปฌ๋Ÿผ๋ช…)

  • COUNT(*) : NULL ํฌํ•จ ์ „์ฒด ํ–‰ ์ˆ˜๋ฅผ ๊ณ„์‚ฐ
  • COUNT(์ปฌ๋Ÿผ) : ํ•ด๋‹น ์ปฌ๋Ÿผ์—์„œ NULL ์ œ์™ธํ•œ ํ–‰ ์ˆ˜ ๊ณ„์‚ฐ
-- ์ „์ฒด ํ–‰ ์ˆ˜ ๊ณ„์‚ฐ (NULL ํฌํ•จ)
SELECT COUNT(*) FROM EMPLOYEES;

-- DEPARTMENT_ID๊ฐ€ ์žˆ๋Š” ํ–‰๋งŒ ๊ณ„์‚ฐ (NULL ์ œ์™ธ)
SELECT COUNT(DEPARTMENT_ID) FROM EMPLOYEES;

๐Ÿ‘ฅ GROUP BY๋ฅผ ์‚ฌ์šฉํ•œ ์ง‘๊ณ„ ์˜ˆ์ œ

GROUP BY ์ ˆ์€ ํŠน์ • ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ์ง‘๊ณ„ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

SELECT DEPARTMENT_ID, AVG(SALARY) AS "๋ถ€์„œ๋ณ„ ํ‰๊ท  ๊ธ‰์—ฌ"
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;

โœ๏ธ ์ž๊ฒฉ์ฆ์ด ์žˆ๋‹ค๊ณ  ๋์ด์•„๋‹Œ ๊พธ์ค€ํžˆ ๋ฐ˜๋ณตํ•™์Šต์„ ํ†ตํ•ด ๋จธ๋ฆฟ์†์— ์ƒˆ๊ฒจ๋ด์š”^~^