MySQL์์ ๋จ์ผํ ํจ์์ ๋ค์คํ ํจ์๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํ์์ ์ด์ฃ !
์ค๋์ ๊ทธ ํจ์๋ค์ ๋ํด ํ๋ํ๋ ์์๋ณผ ๊ฑฐ์์. ์์ธํ ์์ ์ ํจ๊ป ์ฝ๊ฒ ์ค๋ช
ํ ํ
๋ ๋๊น์ง ๋ฐ๋ผ์ ์ฃผ์ธ์! ๐
๋จ์ผํ ํจ์๋ ๊ฐ ํ์์ ํ๋์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ๋ ํจ์์
๋๋ค.
์ฆ, ๊ฐ ํ์ ๊ฐ์ ํน์ ๋ฐฉ์์ผ๋ก ๋ณํํ์ฌ ํ ๊ฐ์ ๊ฒฐ๊ณผ๋ง ์ป์ ์ ์์ด์!
๋ค์คํ ํจ์๋ ์ฌ๋ฌ ํ์ ๋ฐ์์ ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ด๋ ํจ์์์.
๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ ํ ๊ณ์ฐ์ ์งํํ ๋ ์ ์ฉํ๋ต๋๋ค!
ABS(์ซ์)
: ์ ๋๊ฐ ๊ตฌํ๊ธฐSELECT ABS(-10) AS absolute_value;
-- ๊ฒฐ๊ณผ: 10
CEILING(์ซ์)
: ์์์ ์ฌ๋ฆผSELECT CEILING(4.3) AS ceiling_value;
-- ๊ฒฐ๊ณผ: 5
FLOOR(์ซ์)
: ์์์ ๋ด๋ฆผSELECT FLOOR(4.7) AS floor_value;
-- ๊ฒฐ๊ณผ: 4
ROUND(์ซ์, ์๋ฆฟ์)
: ์์์ ๋ฐ์ฌ๋ฆผSELECT ROUND(123.456, 2) AS rounded_value;
-- ๊ฒฐ๊ณผ: 123.46
TRUNCATE(์ซ์, ์๋ฆฟ์)
: ์์์ ์๋ฅด๊ธฐSELECT TRUNCATE(123.456, 2) AS truncated_value;
-- ๊ฒฐ๊ณผ: 123.45
POW(X, Y)
: X์ Y ์ ๊ณฑSELECT POW(2, 3) AS power_value;
-- ๊ฒฐ๊ณผ: 8
MOD(๋ถ์, ๋ถ๋ชจ)
: ๋๋จธ์ง ๊ตฌํ๊ธฐSELECT MOD(10, 3) AS mod_value;
-- ๊ฒฐ๊ณผ: 1
GREATEST(์ซ์1, ์ซ์2, ...)
: ๊ฐ์ฅ ํฐ ๊ฐ ์ฐพ๊ธฐSELECT GREATEST(10, 20, 5, 30) AS greatest_value;
-- ๊ฒฐ๊ณผ: 30
LEAST(์ซ์1, ์ซ์2, ...)
: ๊ฐ์ฅ ์์ ๊ฐ ์ฐพ๊ธฐSELECT LEAST(10, 20, 5, 30) AS least_value;
-- ๊ฒฐ๊ณผ: 5
RAND()
: ๋์ ์์ฑSELECT RAND() AS random_value;
-- ๊ฒฐ๊ณผ: 0๊ณผ 1 ์ฌ์ด์ ๋์ (์: 0.345679)
ASCII(๋ฌธ์)
: ์์คํค ์ฝ๋ ๊ตฌํ๊ธฐSELECT ASCII('A') AS ascii_value;
-- ๊ฒฐ๊ณผ: 65
CHAR(ASCII)
: ์์คํค ์ฝ๋๋ก ๋ฌธ์ ๋ณํSELECT CHAR(65) AS char_value;
-- ๊ฒฐ๊ณผ: A
CONCAT('๋ฌธ์์ด1', '๋ฌธ์์ด2', ...)
: ๋ฌธ์์ด ๊ฒฐํฉSELECT CONCAT('Hello', ' ', 'World') AS concatenated_string;
-- ๊ฒฐ๊ณผ: 'Hello World'
CONCAT_WS('๊ตฌ๋ถ์', '๋ฌธ์์ด1', ...)
: ๊ตฌ๋ถ์๋ฅผ ์ฌ์ฉํ ๋ฌธ์์ด ๊ฒฐํฉSELECT CONCAT_WS('-', '2024', '09', '10') AS concatenated_with_separator;
-- ๊ฒฐ๊ณผ: '2024-09-10'
INSERT('๋ฌธ์์ด', ์์์์น, ๊ธธ์ด, '์๋ก์ด ๋ฌธ์์ด')
: ๋ฌธ์์ด์ ์ผ๋ถ ๋์นSELECT INSERT('Hello World', 7, 5, 'Softeer') AS inserted_string;
-- ๊ฒฐ๊ณผ: 'Hello Softeer'
REPLACE('๋ฌธ์์ด', '๊ธฐ์กด๋ฌธ์์ด', '๋ฐ๊ฟ๋ฌธ์์ด')
: ๋ฌธ์์ด ์นํSELECT REPLACE('Hyundai Softeer', 'Hyundai', 'Samsung') AS replaced_string;
-- ๊ฒฐ๊ณผ: 'Samsung Softeer'
INSTR('๋ฌธ์์ด', '์ฐพ๋ ๋ฌธ์์ด')
: ๋ฌธ์์ด์ ์์น ์ฐพ๊ธฐSELECT INSTR('Hyundai Softeer', 'Softeer') AS position;
-- ๊ฒฐ๊ณผ: 9
MID('๋ฌธ์์ด', ์์์์น, ๊ฐ์)
: ๋ถ๋ถ ๋ฌธ์์ด ์ถ์ถ (MySQL์์ ์ฌ์ฉ)SELECT MID('Hyundai Softeer', 9, 7) AS mid_string;
-- ๊ฒฐ๊ณผ: 'Softeer'
SUBSTRING('๋ฌธ์์ด', ์์์์น, ๊ฐ์)
: ๋ถ๋ถ ๋ฌธ์์ด ์ถ์ถ (๋ชจ๋ DBMS์์ ์ฌ์ฉ ๊ฐ๋ฅ)SELECT SUBSTRING('Hyundai Softeer', 9, 7) AS substring_value;
-- ๊ฒฐ๊ณผ: 'Softeer'
FORMAT(์ซ์, ์๋ฆฟ์)
: ์ซ์๋ฅผ 3์๋ฆฌ๋ง๋ค ์ผํ๋ก ๊ตฌ๋ถSELECT FORMAT(1234567.891, 2) AS formatted_number;
-- ๊ฒฐ๊ณผ: '1,234,567.89'
LTRIM('๋ฌธ์์ด')
: ์ผ์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐSELECT LTRIM(' Hello World') AS left_trimmed_string;
-- ๊ฒฐ๊ณผ: 'Hello World'
RTRIM('๋ฌธ์์ด')
: ์ค๋ฅธ์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐSELECT RTRIM('Hello World ') AS right_trimmed_string;
-- ๊ฒฐ๊ณผ: 'Hello World'
TRIM('๋ฌธ์์ด')
: ์์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐSELECT TRIM(' Hello World ') AS trimmed_string;
-- ๊ฒฐ๊ณผ: 'Hello World'
LCASE('๋ฌธ์์ด')
๋๋ LOWER('๋ฌธ์์ด')
: ์๋ฌธ์๋ก ๋ณํSELECT LOWER('HELLO WORLD') AS lower_case_string;
-- ๊ฒฐ๊ณผ: 'hello world'
UCASE('๋ฌธ์์ด')
๋๋ UPPER('๋ฌธ์์ด')
: ๋๋ฌธ์๋ก ๋ณํSELECT UPPER('hello world') AS upper_case_string;
-- ๊ฒฐ๊ณผ: 'HELLO WORLD'
LEFT('๋ฌธ์์ด', ๊ฐ์)
: ์ผ์ชฝ์์ ์ง์ ๋ ๊ฐ์๋งํผ ๋ฌธ์์ด ์ถ์ถSELECT LEFT('Hyundai Softeer', 7) AS left_string;
-- ๊ฒฐ๊ณผ: 'Hyundai'
RIGHT('๋ฌธ์์ด', ๊ฐ์)
: ์ค๋ฅธ์ชฝ์์ ์ง์ ๋ ๊ฐ์๋งํผ ๋ฌธ์์ด ์ถ์ถSELECT RIGHT('Hyundai Softeer', 7) AS right_string;
-- ๊ฒฐ๊ณผ: 'Softeer'
REVERSE('๋ฌธ์์ด')
: ๋ฌธ์์ด์ ๋ค์ง๊ธฐSELECT REVERSE('Hyundai Softeer') AS reversed_string;
-- ๊ฒฐ๊ณผ: 'reetfoS iadnyuH'
LENGTH('๋ฌธ์์ด')
: ๋ฌธ์์ด์ ๋ฐ์ดํธ ๊ธธ์ด ๊ตฌํ๊ธฐSELECT LENGTH('Hello') AS length_string;
-- ๊ฒฐ๊ณผ: 5
SELECT LENGTH('ํ๊ธ') AS length_korean_string;
-- ๊ฒฐ๊ณผ: 6 (ํ๊ธ์ UTF-8์์ 3๋ฐ์ดํธ)
BIT_LENGTH('๋ฌธ์์ด')
: ๋ฌธ์์ด์ ๋นํธ ๊ธธ์ด ๊ตฌํ๊ธฐSELECT BIT_LENGTH('Hello') AS bit_length_string;
-- ๊ฒฐ๊ณผ: 40 (5 characters * 8 bits)
CHAR_LENGTH('๋ฌธ์์ด')
: ๋ฌธ์์ด์ ๋ฌธ์ ๊ฐ์ ๊ตฌํ๊ธฐSELECT CHAR_LENGTH('Hello') AS char_length_string;
-- ๊ฒฐ๊ณผ: 5
SELECT CHAR_LENGTH('ํ๊ธ') AS char_length_korean_string;
-- ๊ฒฐ๊ณผ: 2 (ํ๊ธ์ 2๊ฐ์ ๋ฌธ์)
NOW()
: ํ์ฌ ๋ ์ง์ ์๊ฐ ๋ฐํSELECT NOW() AS current_datetime;
-- ๊ฒฐ๊ณผ: '2024-09-10 14:23:56'
SYSDATE()
: ์์คํ
๋ ์ง์ ์๊ฐ ๋ฐํSELECT SYSDATE() AS system_date_time;
-- ๊ฒฐ๊ณผ: '2024-09-10 14:23:56'
CURRENT_TIMESTAMP()
: ํ์ฌ ํ์์คํฌํ ๋ฐํSELECT CURRENT_TIMESTAMP() AS current_timestamp;
-- ๊ฒฐ๊ณผ: '2024-09-10 14:23:56'
CURDATE()
๋๋ CURRENT_DATE()
: ํ์ฌ ๋ ์ง ๋ฐํSELECT CURDATE() AS current_date;
-- ๊ฒฐ๊ณผ: '2024-09-10'
CURTIME()
๋๋ CURRENT_TIME()
: ํ์ฌ ์๊ฐ ๋ฐํSELECT CURTIME() AS current_time;
-- ๊ฒฐ๊ณผ: '14:23:56'
DATE_ADD(๋ ์ง, INTERVAL ๊ธฐ์ค ๊ฐ)
: ๋ ์ง์ ํน์ ๊ธฐ๊ฐ ๋ํ๊ธฐSELECT DATE_ADD('2024-09-10', INTERVAL 5 DAY) AS added_date;
-- ๊ฒฐ๊ณผ: '2024-09-15'
ADDDATE(๋ ์ง, INTERVAL ๊ธฐ์ค ๊ฐ)
: ๋ ์ง์ ๊ธฐ๊ฐ ๋ํ๊ธฐSELECT ADDDATE('2024-09-10', INTERVAL 1 MONTH) AS added_date;
-- ๊ฒฐ๊ณผ: '2024-10-10'
DATE_SUB(๋ ์ง, INTERVAL ๊ธฐ์ค ๊ฐ)
: ๋ ์ง์์ ํน์ ๊ธฐ๊ฐ ๋นผ๊ธฐSELECT DATE_SUB('2024-09-10', INTERVAL 7 DAY) AS subtracted_date;
-- ๊ฒฐ๊ณผ: '2024-09-03'
SUBDATE(๋ ์ง, INTERVAL ๊ธฐ์ค ๊ฐ)
: ํน์ ๋ ์ง์์ ๊ธฐ๊ฐ ๋นผ๊ธฐSELECT SUBDATE('2024-09-10', INTERVAL 1 MONTH) AS subtracted_date;
-- ๊ฒฐ๊ณผ: '2024-08-10'
YEAR(๋ ์ง)
: ๋ ์ง์์ ์ฐ๋๋ง ๋ฐํSELECT YEAR('2024-09-10') AS year_value;
-- ๊ฒฐ๊ณผ: 2024
MONTH(๋ ์ง)
: ๋ ์ง์์ ์๋ง ๋ฐํSELECT MONTH('2024-09-10') AS month_value;
-- ๊ฒฐ๊ณผ: 9
MONTHNAME(๋ ์ง)
: ๋ ์ง์์ ์์ ์ด๋ฆ ๋ฐํSELECT MONTHNAME('2024-09-10') AS month_name;
-- ๊ฒฐ๊ณผ: 'September'
DAYNAME(๋ ์ง)
: ๋ ์ง์์ ์์ผ ์ด๋ฆ ๋ฐํSELECT DAYNAME('2024-09-10') AS day_name;
-- ๊ฒฐ๊ณผ: 'Tuesday'
DAYOFMONTH(๋ ์ง)
: ๋ ์ง์์ ํด๋น ์ผ(day)๋ง ๋ฐํSELECT DAYOFMONTH('2024-09-10') AS day_of_month;
-- ๊ฒฐ๊ณผ: 10
DAYOFWEEK(๋ ์ง)
: ๋ ์ง์ ์์ผ์ ์ซ์๋ก ๋ฐํ (1: ์ผ์์ผ, 7: ํ ์์ผ)SELECT DAYOFWEEK('2024-09-10') AS day_of_week;
-- ๊ฒฐ๊ณผ: 3 (ํ์์ผ)
WEEKDAY(๋ ์ง)
: ๋ ์ง์ ์์ผ์ ์ซ์๋ก ๋ฐํ (0: ์์์ผ, 6: ์ผ์์ผ)SELECT WEEKDAY('2024-09-10') AS week_day;
-- ๊ฒฐ๊ณผ: 1 (ํ์์ผ)
DAYOFYEAR(๋ ์ง)
: ๋ ์ง๊ฐ ํด๋น ์ฐ๋์ ๋ช ๋ฒ์งธ ๋ ์ธ์ง ๋ฐํSELECT DAYOFYEAR('2024-09-10') AS day_of_year;
-- ๊ฒฐ๊ณผ: 254
WEEK(๋ ์ง)
: ๋ ์ง์ ์ฃผ์ฐจ ๋ฐํSELECT WEEK('2024-09-10') AS week_number;
-- ๊ฒฐ๊ณผ: 36
FROM_DAYS(๋ ์)
: ์ฃผ์ด์ง ์ผ์๋ฅผ ๋ ์ง๋ก ๋ณํSELECT FROM_DAYS(738000) AS date_from_days;
-- ๊ฒฐ๊ณผ: '2021-09-29'
TO_DAYS(๋ ์ง)
: ๋ ์ง๋ฅผ ์ผ์๋ก ๋ณํSELECT TO_DAYS('2024-09-10') AS days_value;
-- ๊ฒฐ๊ณผ: 739320
LAST_DAY(๋ ์ง)
: ํด๋น ๋ ์ง์ ๋ฌ ๋ง์ง๋ง ๋ ๋ฐํSELECT LAST_DAY('2024-09-10') AS last_day_of_month;
-- ๊ฒฐ๊ณผ: '2024-09-30'
DATE_FORMAT(๋ ์ง, 'ํ์')
: ๋ ์ง๋ฅผ ์ง์ ํ ํ์์ผ๋ก ๋ณํSELECT DATE_FORMAT('2024-09-10', '%Y-%m-%d') AS formatted_date;
-- ๊ฒฐ๊ณผ: '2024-09-10'
DATEDIFF(๋ ์ง1, ๋ ์ง2)
: ๋ ๋ ์ง ์ฌ์ด์ ์ฐจ์ด ๊ณ์ฐSELECT DATEDIFF('2024-09-15', '2024-09-10') AS date_difference;
-- ๊ฒฐ๊ณผ: 5
TIMEDIFF(์๊ฐ1, ์๊ฐ2)
: ๋ ์๊ฐ์ ์ฐจ์ด ๊ณ์ฐSELECT TIMEDIFF('12:00:00', '08:00:00') AS time_difference;
-- ๊ฒฐ๊ณผ: '04:00:00'
๋ ผ๋ฆฌ ์ฐ์ฐ์ด๋ ์กฐ๊ฑด ์ฒ๋ฆฌ์์ ์์ฃผ ์ฌ์ฉํ๋ ํจ์๋ค๋ ์์๋ณผ๊ฒ์!
IF(๋
ผ๋ฆฌ์, ๊ฐ1, ๊ฐ2)
: ๋
ผ๋ฆฌ์์ด ์ฐธ์ด๋ฉด ๊ฐ1, ๊ฑฐ์ง์ด๋ฉด ๊ฐ2 ๋ฐํSELECT IF(1 > 0, '์ฐธ', '๊ฑฐ์ง') AS result;
-- ๊ฒฐ๊ณผ: '์ฐธ'
IFNULL(๊ฐ1, ๊ฐ2)
: ๊ฐ1์ด NULL์ด๋ฉด ๊ฐ2๋ก ๋์ฒด, NULL์ด ์๋๋ฉด ๊ฐ1 ๋ฐํSELECT IFNULL(NULL, '๋์ฒด ๊ฐ') AS result;
-- ๊ฒฐ๊ณผ: '๋์ฒด ๊ฐ'
NULLIF(๊ฐ1, ๊ฐ2)
: ๊ฐ1์ด ๊ฐ2์ ๊ฐ์ผ๋ฉด NULL ๋ฐํ, ๋ค๋ฅด๋ฉด ๊ฐ1 ๋ฐํSELECT NULLIF(5, 5) AS result;
-- ๊ฒฐ๊ณผ: NULL
์ง๊ณ ํจ์๋ ์ฌ๋ฌ ํ์ ๋ฌถ์ด ์์ฝํ๊ณ ํต๊ณ๋ฅผ ๊ตฌํ๋ ๋ฐ ์ฌ์ฉํด์.
COUNT(ํ๋๋ช
)
: NULL์ด ์๋ ๋ ์ฝ๋ ์ ๋ฐํSELECT COUNT(column_name) AS count_value
FROM table_name;
SUM(ํ๋๋ช
)
: ํ๋ ๊ฐ์ ํฉ๊ณ ๋ฐํSELECT SUM(column_name) AS total_sum
FROM table_name;
AVG(ํ๋๋ช
)
: ํ๋ ๊ฐ์ ํ๊ท ๋ฐํSELECT AVG(column_name) AS average_value
FROM table_name;
MAX(ํ๋๋ช
)
: ํ๋ ๊ฐ ์ค ์ต๋๊ฐ ๋ฐํSELECT MAX(column_name) AS max_value
FROM table_name;
MIN(ํ๋๋ช
)
: ํ๋ ๊ฐ ์ค ์ต์๊ฐ ๋ฐํSELECT MIN(column_name) AS min_value
FROM table_name;
GROUP BY ์ ์ SQL์์ ๋ฐ์ดํฐ๋ฅผ ํน์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ง๊ณ ํจ์๋ฅผ ์ ์ฉํ์ฌ ์์ฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
GROUP BY
์ ์ ์ฌ์ฉํ ๋, ํจ๊ป ์์ฃผ ์ฌ์ฉ๋๋ ์ง๊ณ ํจ์๋ก๋ COUNT()
, SUM()
, AVG()
, MAX()
, MIN()
๋ฑ์ด ์์ต๋๋ค.
GROUP BY ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
GROUP BY
๋ ํน์ ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ์ฌ, ๊ฐ ๊ทธ๋ฃน์ ๋ํด ์ง๊ณ ์์
์ ์ํํ ์ ์์ต๋๋ค.
์ง๊ณ ํจ์์ ์ ์ฉ:
GROUP BY
์ ํจ๊ป ์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, ๊ฐ ๊ทธ๋ฃน์ ๋ํด ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, COUNT()
ํจ์๋ ๊ฐ ๊ทธ๋ฃน์ ์ํ ํ์ ์๋ฅผ ์ธ๊ณ , SUM()
ํจ์๋ ๊ทธ๋ฃน ๋ด ์ซ์ ๊ฐ์ ํฉ๊ณ๋ฅผ ๊ตฌํด์ค๋๋ค.
GROUP BY ์ ์ ์๋ตํ๋ ๊ฒฝ์ฐ:
GROUP BY
์ ์ ์๋ตํ๋ฉด, ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๊ฐ์ฃผํ์ฌ ์ง๊ณ ํจ์๊ฐ ์ ์ฉ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์์ฝํ ํ๋์ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋ฉ๋๋ค.
SELECT ์ ์ ์กฐ๊ฑด:
GROUP BY
์ ์ ์ฌ์ฉํ ๋๋, SELECT
์ ์ ๋ฐ๋์ GROUP BY
๋ก ๋ฌถ์ธ ํ๋์ ํจ๊ป ์ง๊ณ ํจ์ ๋๋ ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฆ, ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ง ์์ ํ๋๋ฅผ SELECT
์ ์ ํฌํจํ๋ ค๋ฉด, ๋ฐ๋์ ๊ทธ ํ๋์ ์ง๊ณ ํจ์๊ฐ ์ ์ฉ๋์ด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ํ
์ด๋ธ employees
๊ฐ ์๊ณ , ๊ฐ ํ์๋ ์ง์์ ๋ถ์์ ๊ธ์ฌ ์ ๋ณด๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ ์ ์ฒด ์ง์์ ๊ธ์ฌ ํฉ๊ณ๋ฅผ ๊ตฌํ๊ณ ์ถ์ ๋๋ GROUP BY
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ง๊ณ ํจ์ SUM()
์ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
SELECT SUM(salary) AS total_salary
FROM employees;
-- ๊ฒฐ๊ณผ: ๋ชจ๋ ์ง์์ ๊ธ์ฌ ํฉ๊ณ
์ด ์ฟผ๋ฆฌ๋ GROUP BY
์์ด ์ ์ฒด ํ
์ด๋ธ์ ๊ธ์ฌ ํฉ๊ณ๋ฅผ ๋ฐํํฉ๋๋ค.
๋ค์์ ๋ถ์๋ณ๋ก ๊ธ์ฌ ํฉ๊ณ๋ฅผ ๊ตฌํ๋ ์์ ์
๋๋ค. ๊ฐ ๋ถ์์ ์ํ ์ง์๋ค์ ๊ธ์ฌ ํฉ๊ณ๋ฅผ ๊ตฌํ๊ธฐ ์ํด GROUP BY department
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;
-- ๊ฒฐ๊ณผ: ๊ฐ ๋ถ์๋ณ ๊ธ์ฌ ํฉ๊ณ
์ด ์ฟผ๋ฆฌ๋ ๋ถ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃน์ ๋ฌถ๊ณ , ๊ฐ ๋ถ์์ ์ํ ์ง์๋ค์ ๊ธ์ฌ ํฉ๊ณ๋ฅผ ๋ฐํํฉ๋๋ค.
๋ถ์๋ณ ์ง์ ์๋ฅผ ๊ตฌํ๊ณ ์ถ์ ๋๋, COUNT()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋ถ์์ ์ํ ์ง์ ์๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
-- ๊ฒฐ๊ณผ: ๊ฐ ๋ถ์๋ณ ์ง์ ์
์ด ์ฟผ๋ฆฌ๋ ๊ฐ ๋ถ์์ ์ํ ์ง์ ์๋ฅผ ๋ฐํํฉ๋๋ค. COUNT(*)
๋ ํด๋น ๋ถ์์ ์ํ ํ์ ๊ฐ์๋ฅผ ์ธ์ด์ค๋๋ค.
๋ค์์ ๋ถ์๋ณ๋ก ๊ธ์ฌ์ ์ต๋๊ฐ, ์ต์๊ฐ, ํ๊ท ๊ฐ์ ๊ตฌํ๋ ์์ ์ ๋๋ค. ํ ๋ฒ์ ์ฟผ๋ฆฌ๋ก ์ฌ๋ฌ ์ง๊ณ ํจ์๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
SELECT department, MAX(salary) AS max_salary, MIN(salary) AS min_salary, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
-- ๊ฒฐ๊ณผ: ๊ฐ ๋ถ์๋ณ ์ต๋ ๊ธ์ฌ, ์ต์ ๊ธ์ฌ, ํ๊ท ๊ธ์ฌ
์ด ์ฟผ๋ฆฌ๋ ๋ถ์๋ณ๋ก ์ต๋ ๊ธ์ฌ, ์ต์ ๊ธ์ฌ, ํ๊ท ๊ธ์ฌ๋ฅผ ๊ณ์ฐํ์ฌ ๋ฐํํฉ๋๋ค.
์ด๋ฒ์๋ ํ์๋ณ๋ก ์ต๊ณ ์ ์๋ฅผ ๊ธฐ๋กํ ๊ณผ๋ชฉ์ ์กฐํํ๋ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ ํ์๋ค์ ์ ์๋ฅผ ์ ์ฅํ ํ
์ด๋ธ scores
์์ ํ์๋ณ๋ก ์ต๊ณ ์ ์๋ฅผ ๊ตฌํ ํ, ํด๋น ์ ์๋ฅผ ๋ฐ์ ๊ณผ๋ชฉ์ ์กฐํํ๋ ๋ฐฉ์์
๋๋ค.
SELECT a.student_id, s.student_name, s.subject, a.max_score
FROM scores s
JOIN (
SELECT student_id, MAX(score) AS max_score
FROM scores
GROUP BY student_id
) a
ON s.student_id = a.student_id
AND s.score = a.max_score;
์ด ์ฟผ๋ฆฌ๋ ํ์๋ณ๋ก ๊ฐ์ฅ ๋์ ์ ์๋ฅผ ๊ธฐ๋กํ ๊ณผ๋ชฉ๊ณผ ๊ทธ ์ ์๋ฅผ ๋ฐํํฉ๋๋ค. ๋ด๋ถ์ GROUP BY student_id
๋ก ํ์๋ณ๋ก ์ต๊ณ ์ ์๋ฅผ ๊ณ์ฐํ ํ, ์ธ๋ถ ์ฟผ๋ฆฌ์์ ํด๋น ์ ์์ ํด๋นํ๋ ๊ณผ๋ชฉ์ ์ฐพ์ ๋ฐํํฉ๋๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ์๋ณ ์ต๊ณ ์ ์๋ฅผ ๋ฐ์ ๊ณผ๋ชฉ์ ์กฐํํ ์๋ ์์ต๋๋ค.
SELECT student_id, subject, score
FROM scores
WHERE (student_id, score) IN (
SELECT student_id, MAX(score)
FROM scores
GROUP BY student_id
)
ORDER BY student_id;
์ด ์ฟผ๋ฆฌ์์๋ WHERE
์ ์ ์ฌ์ฉํ์ฌ ์ต๊ณ ์ ์๋ฅผ ๋ฐ์ ํ์๋ค์ ์ ๋ณด๋ฅผ ์กฐํํ ํ, ๊ฐ ํ์์ ์ต๊ณ ์ ์์ ํด๋นํ๋ ๊ณผ๋ชฉ์ ๋ฐํํฉ๋๋ค.
HAVING ์ ์ฌ์ฉ:
GROUP BY
์ ๋ก ๊ทธ๋ฃนํํ ๊ฒฐ๊ณผ์ ์กฐ๊ฑด์ ์ถ๊ฐํ ๋๋ HAVING
์ ์ ์ฌ์ฉํฉ๋๋ค. HAVING
์ ์ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํด ์กฐ๊ฑด์ ํํฐ๋งํ๋ ์ญํ ์ ํฉ๋๋ค.
WHERE ์ ๊ณผ HAVING ์ ์ ์ฐจ์ด:
WHERE
์ ์ ๊ทธ๋ฃนํ๋๊ธฐ ์ ์ ๊ฐ๋ณ ํ์ ์กฐ๊ฑด์ ์ ์ฉํ์ฌ ํํฐ๋งํฉ๋๋ค. ๋ฐ๋ฉด, HAVING
์ ์ ๊ทธ๋ฃนํ๋ ํ ์ง๊ณ๋ ๊ฒฐ๊ณผ์ ์กฐ๊ฑด์ ์ ์ฉํฉ๋๋ค. ์ง๊ณ ํจ์(SUM
, AVG
, COUNT
๋ฑ)๊ฐ ์ฌ์ฉ๋ ์กฐ๊ฑด์ ๋ฐ๋์ HAVING
์ ์ ์์ฑํด์ผ ํฉ๋๋ค.
Query ์คํ ์์:
SQL ์ฟผ๋ฆฌ ์คํ ์์๋ฅผ ๋ณด๋ฉด GROUP BY
์ ์ WHERE
์ ์ดํ์ ์คํ๋ฉ๋๋ค. ๋ฐ๋ผ์ GROUP BY
๋ก ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํ ํํฐ๋ง์ WHERE
์ ์ด ์๋ HAVING
์ ์์ ์ํ๋ฉ๋๋ค. ์ง๊ณ๋ ๋ฐ์ดํฐ์ ๋ํ ์กฐ๊ฑด์ HAVING
์ ์ ํตํด ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
HAVING
์ ์ ๊ทธ๋ฃนํ๋ ๊ฒฐ๊ณผ์ ๋ํด ์กฐ๊ฑด์ ์ ์ฉํฉ๋๋ค.
์ด๋ ๊ทธ๋ฃนํ ์ด์ ์ ์กฐ๊ฑด์ ๊ฑฐ๋ WHERE
์ ๊ณผ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
๋ค์์ ํ์๋ณ๋ก ์ํ์์ ํ๊ท ์ ์๊ฐ 70์ ์ด์์ธ ํ์์ ์ ๋ณด๋ฅผ ์กฐํํ๋ ์์ ์ ๋๋ค.
SELECT student_id, AVG(score) AS average_score
FROM scores
GROUP BY student_id
HAVING AVG(score) >= 70;
GROUP BY student_id
๋ก ํ์๋ณ ๊ทธ๋ฃน์ ๋ฌถ๊ณ , ๊ฐ ํ์์ ํ๊ท ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.HAVING AVG(score) >= 70
์ ํตํด ํ๊ท ์ ์๊ฐ 70์ ์ด์์ธ ํ์๋ง ํํฐ๋งํ์ฌ ์กฐํํฉ๋๋ค.WHERE
์ ์ ๊ทธ๋ฃนํ ์ด์ ์ ์กฐ๊ฑด์ ๊ฑธ๊ณ ,
HAVING
์ ์ ๊ทธ๋ฃนํ ์ดํ์ ์กฐ๊ฑด์ ๊ฑธ๊ฒ ๋ฉ๋๋ค.
๋ค์์ 100์ ๋ง์ ์์ 50์ ์ด์์ ๋ฐ์ ํ์๋ค ์ค์์ ํ๊ท ์ ์๊ฐ 70์ ์ด์์ธ ํ์๋ค์ ์กฐํํ๋ ์์ ์ ๋๋ค.
SELECT student_id, AVG(score) AS average_score
FROM scores
WHERE score >= 50
GROUP BY student_id
HAVING AVG(score) >= 70;
WHERE score >= 50
์์ ๊ฐ ํ์์ ๊ฐ๋ณ ์ํ ์ ์๊ฐ 50์ ์ด์์ธ ๊ฒฝ์ฐ๋ง ํํฐ๋ง๋ฉ๋๋ค.GROUP BY student_id
๋ก ํ์๋ณ๋ก ๊ทธ๋ฃน์ ๋๋ ํ, HAVING AVG(score) >= 70
์ ํตํด ํ๊ท ์ ์๊ฐ 70์ ์ด์์ธ ํ์๋ง ์กฐํ๋ฉ๋๋ค.์ด ์์ ๋ฅผ ํตํด, WHERE
์ ๊ณผ HAVING
์ ์ด ์ ์ฉ๋๋ ์์ ๊ณผ ๊ทธ ์ฐจ์ด์ ์ ํ์ธํ ์ ์์ต๋๋ค.
์ฆ, WHERE
๋ ๊ฐ๋ณ ํ์ ์กฐ๊ฑด์ ๊ฑธ๊ณ , HAVING
์ ๊ทธ๋ฃนํ๋ ๊ฒฐ๊ณผ์ ์กฐ๊ฑด์ ์ ์ฉํด์!
์ด๋ ๊ฒ GROUP BY
์ HAVING
์ ์ ํจ๊ป ์ฌ์ฉํ๋ฉด, ๋ฐ์ดํฐ๋ฅผ ๋์ฑ ์ ๊ตํ๊ฒ ํํฐ๋งํ๊ณ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.