SELECT

์ผ๋ฐ˜์ ์œผ๋กœ INSERT / UPDATE / DELETE ๋Š” ๊ฑฐ์˜ ๋ ˆ์ฝ”๋“œ ๋‹จ์œ„๋กœ ๋ฐœ์ƒํ•˜๊ธฐ ๋–„๋ฌธ์— ์„ฑ๋Šฅ์ƒ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ SELECT๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ์ง€์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„๋‹ค.

SELECT ์ ˆ์˜ ์ธ๋ฑ์Šค ์‚ฌ์šฉ

์ธ๋ฑ์Šค ์‚ฌ์šฉ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ทœ์น™

๊ธฐ๋ณธ์ ์œผ๋กœ ์ปฌ๋Ÿผ์˜ ๊ฐ’ ์ž์ฒด๋ฅผ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ์ธ๋ฑ์Šค๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

-- ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๋ถˆ๊ฐ€
SELECT *
FROM salaries
WHERE salary * 10 > 1000000;

-- ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๊ฐ€๋Šฅ
SELECT *
FROM salaries
WHERE salary > 1000000 / 10;

๋˜ํ•œ ๋น„๊ต ๋Œ€์ƒ์ด ๋‹ค๋ฅธ ํƒ€์ž…์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜• ๋ณ€ํ™˜์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๊ฒฝ์šฐ์—๋„ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

WHERE ์ ˆ์˜ ์ธ๋ฑ์Šค

WHERE ์กฐ๊ฑด์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปฌ๋Ÿผ์„ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ธ๋ฑ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„๋‹ค. ์—ฌ๊ธฐ์„œ ์‹ค์ œ๋กœ ์ž‘์„ฑ ๋œ ์ˆœ์„œ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ธ๋ฑ์Šค์˜ ์ปฌ๋Ÿผ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ตœ์ ํ™” ์ˆ˜ํ–‰์„ ํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค์˜ ์ปฌ๋Ÿผ ์ˆœ์„œ๋ฅผ ์ž˜ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์œ„์˜ ์„ค๋ช…์€ ๋ชจ๋‘ AND ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ์ด๋ฉฐ, OR ์กฐ๊ฑด์˜ ๊ฒฝ์šฐ์—๋Š” ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค.

SELECT *
FROM employees
WHERE first_name = 'Platypus' -- ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๊ฐ€๋Šฅ
   OR last_name = 'Ogu'; -- ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ

๋งŒ์•ฝ WHERE ์กฐ๊ฑด์— OR ์กฐ๊ฑด์ด ๊ฑธ๋ ค์žˆ๊ณ , ์œ„์™€ ๊ฐ™์ด ์ธ๋ฑ์Šค๊ฐ€ ์„ค์ • ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ AND์˜ ๊ฒฝ์šฐ first_name ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, OR ์—ฐ์‚ฐ์ž๊ฐ€ ์ ์šฉ๋˜์–ด ๊ฐ ์กฐ๊ฑด์ด ๋ณ„๊ฐœ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

GROUP BY ์ ˆ์˜ ์ธ๋ฑ์Šค

GROUP BY ์ ˆ์—์„œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

  • GROUP BY ์ ˆ์— ๋ช…์‹œ๋œ ์ปฌ๋Ÿผ์ด ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ ์ˆœ์„œ์™€ ์œ„์น˜๊ฐ€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

  • ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์ปฌ๋Ÿผ ์ค‘ ๋’ค์ชฝ ์ปฌ๋Ÿผ์€ GROUP BY ์ ˆ์— ๋ช…์‹œ๋˜์ง€ ์•Š์•„๋„ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์•ž์ชฝ ์ปฌ๋Ÿผ์ด GROUP BY ์ ˆ์— ๋ช…์‹œ๋˜์ง€ ์•Š์œผ๋ฉด ์ธ๋ฑ์Šค ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

ORDER BY ์ ˆ์˜ ์ธ๋ฑ์Šค

GROUP BY ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•๊ณผ ๋น„์Šทํ•˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ„์˜ GROUP BY ์ ˆ์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์„ ๋”ฐ๋ฅด๊ฒŒ ๋˜๋ฉฐ ์ถ”๊ฐ€์ ์œผ๋กœ ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

  • ORDER BY ์ ˆ์— ๋ช…์‹œ๋œ ๋ชจ๋“  ์ปฌ๋Ÿผ์ด ์˜ค๋ฆ„์ฐจ์ˆœ์ด๊ฑฐ๋‚˜ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด์•ผ ํ•œ๋‹ค.

WHERE + ORDER BY(or GROUP BY) ์ ˆ์˜ ์ธ๋ฑ์Šค

WHERE ์ ˆ๊ณผ ORDER BY ์ ˆ์„ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

  • WHERE ์ ˆ๋งŒ ์ธ๋ฑ์Šค ์ด์šฉ

    • ORDER BY ์ ˆ์€ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, WHERE ์ ˆ์˜ ๋Œ€์ƒ ์ปฌ๋Ÿผ์ด ์ธ๋ฑ์Šค์— ํฌํ•จ๋ผ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • WHERE ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์กฐํšŒ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณ„๋„๋กœ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

    • WHERE ์ ˆ ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ ์ ์„ ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.

  • ORDER BY ์ ˆ๋งŒ ์ธ๋ฑ์Šค ์ด์šฉ

    • WHERE ์ ˆ์€ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์กฐํšŒ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, ORDER BY ์ ˆ์˜ ์ •๋ ฌ ๋Œ€์ƒ ์ปฌ๋Ÿผ์ด ์ธ๋ฑ์Šค์— ํฌํ•จ๋ผ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • ORDER BY ์ ˆ์˜ ์ˆœ์„œ๋Œ€๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ฝ์œผ๋ฉด์„œ ๋ ˆ์ฝ”๋“œ ํ•œ ๊ฑด์”ฉ WHERE ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

  • WHERE ์ ˆ + ORDER BY ์ ˆ ๋™์‹œ์— ๊ฐ™์€ ์ธ๋ฑ์Šค ์ด์šฉ

    • WHERE ์ ˆ์˜ ๋ฒ”์œ„ ๋น„๊ต ์กฐ๊ฑด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ปฌ๋Ÿผ๊ณผ ORDER BY ์ ˆ์˜ ์ •๋ ฌ ๋Œ€์ƒ ์ปฌ๋Ÿผ์ด ๋ชจ๋‘ ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค์— ์—ฐ์†ํ•ด์„œ ํฌํ•จ๋ผ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • WHERE ์ ˆ์˜ ๋™๋“ฑ ๋น„๊ต ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ปฌ๋Ÿผ๊ณผ ORDER BY ์ ˆ์— ์ •๋ ฌ ๋Œ€์ƒ ์ปฌ๋Ÿผ์ด ์ค‘์ฒฉ ์ƒ๊ด€ ์—†์ด ์ธ๋ฑ์Šค ์ˆœ์„œ๋Œ€๋กœ ํฌํ•จ๋ผ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • ์ œ์ผ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

-- 1
SELECT *
FROM tb_test
WHERE COL_1 = 10
ORDER BY COL_2, COL_3;

-- 2
SELECT *
FROM tb_test
WHERE COL_1 = 10
ORDER BY COL_1, COL_2, COL_3;

์œ„ ์ฟผ๋ฆฌ๋Š” ๋™๋“ฑ ๋น„๊ต์ด๊ธฐ ๋•Œ๋ฌธ์— 1๋ฒˆ์—์„œ COL_1 GROUP BY ์ ˆ์— ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ ์ •๋ ฌ ์ˆœ์„œ์— ๋ณ€ํ™”๊ฐ€ ์—†์–ด(COL_1์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ๊ฑด์ด๊ธฐ ๋•Œ๋ฌธ) ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค. ๋•Œ๋ฌธ์— ์˜ตํ‹ฐ๋งˆ์ด์ €์—์„œ ์‹คํ–‰ ๊ณ„ํš์„ ์ตœ์ ํ™”ํ•˜์—ฌ WHERE + GROUP BY ์ ˆ ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

-- 1
SELECT *
FROM tb_test
WHERE COL_1 > 10
ORDER BY COL_2, COL_3;

-- 2
SELECT *
FROM tb_test
WHERE COL_1 > 10
ORDER BY COL_1, COL_2, COL_3;

ํ•˜์ง€๋งŒ ์œ„ ์ฟผ๋ฆฌ๋Š” ๋ฒ”์œ„ ๋น„๊ต์ด๊ธฐ ๋•Œ๋ฌธ์— COL_1 > 10 ์„ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, 1๋ฒˆ์€ ์ •๋ ฌ์„ ํ•  ๋•Œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๊ณ , 2๋ฒˆ์€ ๊ทธ๋Œ€๋กœ ๋ชจ๋‘ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

GROUP BY + ORDER BY ์ ˆ์˜ ์ธ๋ฑ์Šค

GROUP BY ์ ˆ๊ณผ ORDER BY ์ ˆ์— ๋ช…์‹œ๋œ ์ปฌ๋Ÿผ์˜ ์ˆœ์„œ์™€ ๋‚ด์šฉ์ด ๋ชจ๋‘ ๊ฐ™์•„์•ผ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ ๋ชจ๋‘ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

WHERE + GROUP BY + ORDER BY ์ ˆ์˜ ์ธ๋ฑ์Šค

์œ„์˜ ๊ทœ์น™์ด ๋ชจ๋‘ ์ ์šฉ๋˜๋ฉฐ, ๊ทธ ํ๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

WHERE ์ ˆ ๋น„๊ต ์กฐ๊ฑด ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

NULL ๋น„๊ต

MySQL์—์„œ๋Š” NULL ๊ฐ’๋„ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ์ธ์ •ํ•˜์—ฌ ํฌํ•จ๋œ ๋ ˆ์ฝ”๋“œ๋„ ์ธ๋ฑ์Šค๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.(SQL ํ‘œ์ค€์—์„œ๋Š” NULL ๊ฐ’์€ ๋น„๊ตํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ์Œ) ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์—์„œ NULL ๊ฐ’์„ ๋ ˆ์ธ์ง€ ์Šค์บ”์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

-- 1
SELECT *
FROM titles
WHERE to_date IS NULL;
-- 2
SELECT *
FROM titles
WHERE ISNULL(to_date);
-- 3
SELECT *
FROM titles
WHERE ISNULL(to_date) = 1;
-- 4
SELECT *
FROM titles
WHERE ISNULL(to_date) = true; # 4

1 / 2 ์ฟผ๋ฆฌ๋Š” ์ •์ƒ์ ์œผ๋กœ ๋ ˆ์ธ์ง€ ์Šค์บ”์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, 3 / 4 ์ฟผ๋ฆฌ๋Š” ๋ ˆ์ธ์ง€ ์Šค์บ”์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  ํ’€ ์Šค์บ”์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฌธ์ž์—ด / ์ˆซ์ž ๋น„๊ต

๋ฌธ์ž์—ด / ์ˆซ์ž ์ปฌ๋Ÿผ ๋น„๊ต ์‹œ ๋ฐ˜๋“œ์‹œ ๊ทธ ํƒ€์ž…์— ๋งž๋Š” ์ƒ์ˆ˜๊ฐ’ ์‚ฌ์šฉํ•ด์•ผ ์ธ๋ฑ์Šค๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚ ์งœ ๋น„๊ต

๋‚ ์งœ๋ฅผ ์ €์žฅํ•˜๋Š” ํƒ€์ž…์—๋Š” DATETIME, DATE, TIMESTAMP, TIME ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ ํƒ€์ž…์„ ๋น„๊ตํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

DATE(DATETIME) - ๋ฌธ์ž์—ด ๋น„๊ต

๊ธฐ๋ณธ์ ์œผ๋Ÿฌ ๋ฌธ์ž์—ด ๊ฐ’์„ STR_TO_DATE๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ DATETIME ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.(์ธ๋ฑ์Šค ๋˜ํ•œ ์ •์ƒ ์ ์šฉ) ์ด๋ ‡๊ฒŒ ์ƒ์ˆ˜๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ์— ์˜ํ–ฅ์ด ์—†์ง€๋งŒ, ๋‚ ์งœ ์ปฌ๋Ÿผ์„ DATE_FORMAT, DATE_ADD ๋“ฑ์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

DATE - DATETIME ๋น„๊ต

๋ณ€ํ™˜์„ ๋”ฐ๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—” DATE ์ปฌ๋Ÿผ์„ DATETIME ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. 2023-05-09 -> 2023-05-09 00:00:00 ์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š”๋ฐ, ํ•ด๋‹น ํƒ€์ž… ๋ณ€ํ™˜์€ ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์—ฌ๋ถ€์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์—๋งŒ ์ฃผ์˜๋ฅผ ํ•˜๋ฉด ๋œ๋‹ค.

TIMESTAMP - DATETIME ๋น„๊ต

DATETIME - TIMESTAMP ๋ณ„๋„ ํƒ€์ž… ๋ณ€ํ™˜ ์—†์ด ๋น„๊ต ์‹œ ๋ฌธ์ œ์—†์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

SELECT COUNT(*)
FROM employees
WHERE hire_date < UNIX_TIMESTAMP('2023-05-09 12:05:09'); -- hire_date: datetime ํƒ€์ž…

UNIX_TIMESTAMP ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹จ์ˆœ ์ˆซ์ž ๊ฐ’์— ๋ถˆ๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •์ƒ์ ์œผ๋กœ DATETIME ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์•„ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” FROM_UNIXTIME ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž… ๋ณ€ํ™˜์„ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

SELECT COUNT(*)
FROM employees
WHERE hire_date < FROM_UNIXTIME(UNIX_TIMESTAMP('2023-05-09 12:05:09')); -- hire_date: datetime ํƒ€์ž…

Short Circuit Evaluation

๊ธฐ๋ณธ์ ์œผ๋กœ WHERE ์กฐ๊ฑด ์ค‘ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—” ํ•ด๋‹น ์ปฌ๋Ÿผ์„ ๋จผ์ € ์กฐ๊ฑด ๊ฒ€์‚ฌํ•˜์ง€๋งŒ, ์•„๋‹Œ ๊ฒฝ์šฐ์—” WHERE์— ๋ช…์‹œ๋œ ์ˆœ์„œ๋Œ€๋กœ ์กฐ๊ฑด ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋–„๋ฌธ์— ๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์†Œ๋ชจํ•˜๋Š” ์กฐ๊ฑด์„ ๋‚˜์ค‘์— ๋ช…์‹œํ•˜๋ฉด ๋” ๋น ๋ฅด๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

LIMIT n

์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์—์„œ ์ง€์ •๋œ ์ˆœ์„œ์— ์œ„์น˜ํ•œ ๋ ˆ์ฝ”๋“œ๋งŒ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์ด๋‹ค. MySQL์˜ LIMIT์€ WHERE ์กฐ๊ฑด์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์ฟผ๋ฆฌ์˜ ๋งˆ์ง€๋ง‰์— ์‹คํ–‰๋œ๋‹ค.

SELECT *
FROM employees
WHERE emp_no BETWEEN 10001 AND 10010 -- 1. employees ํ…Œ์ด๋ธ”์—์„œ WHERE ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ „๋ถ€ ์ฝ์Œ
ORDER BY first_name -- 2. 1๋ฒˆ์—์„œ ์ฝ์–ด์˜จ ๋ ˆ์ฝ”๋“œ๋ฅผ first_name ์ปฌ๋Ÿผ๊ฐ’์— ๋”ฐ๋ผ ์ •๋ ฌ
LIMIT 0, 5; -- 3. ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ์—์„œ ์ƒ์‰ฌ 5๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋งŒ ๋ฐ˜ํ™˜

LIMIT์€ ํ•„์š”ํ•œ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ ์กฐํšŒ๋˜๋ฉด ์ฆ‰์‹œ ์ฟผ๋ฆฌ๋ฅผ ์ข…๋ฃŒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ฟผ๋ฆฌ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ธ๋ฑ์Šค ์ฒ˜๋ฆฌ ๋˜์ง€ ์•Š์€ GROUP BY / ORDER BY: ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋ฏธ๋ฏธ

  • DISTINCT: ์œ ๋‹ˆํฌํ•œ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ LIMIT์— ๋ช…์‹œ๋œ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ ๊ธฐ๋Œ€(ํ…Œ์ด๋ธ”์„ ์ฝ๋Š” ๋„์ค‘ ์ค‘๋‹จ)

  • ์œ„์— ํ•ด๋‹นํ•˜์ง€ ์•Š์Œ: ํฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ ๊ธฐ๋Œ€ ๊ฐ€๋Šฅ

ํŽ˜์ด์ง•

์ง๊ด€์ ์œผ๋กœ ํŽ˜์ด์ง•ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ LIMIT์„ ํ†ตํ•ด ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ์™€ ํŽ˜์ด์ง€ ๋‹น ๋ ˆ์ฝ”๋“œ ์ˆ˜๋ฅผ ๊ณฑํ•œ ๊ฐ’์„ LIMIT์— ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ์ผ๋ฐ˜์ ์ธ LIMIT ์‚ฌ์šฉ

SELECT *
FROM salaries
ORDER BY salary
LIMIT 200000, 10;

์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ •๋„์˜ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํŽ˜์ด์ง€๊นŒ์ง€์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

  • ํฌ์ธํ„ฐ(์ปค์„œ) ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ ํŽ˜์ด์ง•

-- ์ฒซ ํŽ˜์ด์ง€ ์กฐํšŒ
SELECT *
FROM salaries
ORDER BY salary
LIMIT 0, 10;

-- ๊ทธ ๋‹ค์Œ ํŽ˜์ด์ง€ ์กฐํšŒ
SELECT *
FROM salaries
WHERE salary >= 5959
  AND NOT (salary = 5959 AND emp_no <= 10001) -- ์ฒซ ํŽ˜์ด์ง€์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ ˆ์ฝ”๋“œ์˜ salary ๊ฐ’
ORDER BY salary
LIMIT 0, 10;

-- ...
-- ๊ณ„์†ํ•ด์„œ ๋‹ค์Œ ํŽ˜์ด์ง€ ์กฐํšŒ
SELECT *
FROM salaries
WHERE salary >= 1295000
  AND NOT (salary = 1295000 AND emp_no <= 20344) -- ์ด์ „ ํŽ˜์ด์ง€์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ ˆ์ฝ”๋“œ์˜ salary ๊ฐ’
ORDER BY salary
LIMIT 0, 10;

์œ„์™€ ๊ฐ™์ด ํฌ์ธํ„ฐ(์ปค์„œ) ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜์— ๋”ฐ๋ผ ๋น„์•ฝ์ ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

COUNT()

๊ฒฐ๊ณผ ๋ ˆ์ฝ”๋“œ์˜ ๊ฑด์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

  • ๋‚ด๋ถ€ ์ธ์ž

    • ์ปฌ๋Ÿผ๋ช… / * / 1 ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • *๋Š” SELECT ์ ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ตœ์ ํ™”ํ•˜์—ฌ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปฌ๋Ÿผ ์‚ฌ์šฉ

      • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ž‘์€ ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์ฒ˜๋ฆฌ(์—†๋Š” ๊ฒฝ์šฐ, ํด๋Ÿฌ์Šคํ„ฐ๋œ PK ์ธ๋ฑ์Šค ์‚ฌ์šฉ)

    • ๋งŒ์•ฝ ์ธ์ž๋กœ ์ปฌ๋Ÿผ์„ ๋„ฃ์€ ๊ฒฝ์šฐ ํ•ด๋‹น ์ปฌ๋Ÿผ์ด NULL์ด ์•„๋‹Œ ๋ ˆ์ฝ”๋“œ๋งŒ ์นด์šดํŠธ

  • WHERE ์กฐ๊ฑด

    • WHERE ์กฐ๊ฑด์ด ์—†๋Š” ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๋ฑ์Šค๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์Šค์บ”ํ•˜์—ฌ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋ฅผ ์นด์šดํŠธ(MyISAM ์—”์ง„: ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ)

      • ์กฐ๊ฑด์ ˆ / GROUP BY ๋‘˜ ๋‹ค ์—†๋Š” ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ

      • **InnoDB์—์„œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ : MVCC ์ง€์›๊ณผ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ„ํ•ด ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ

    • ์กฐ๊ฑด์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—” WHERE ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ DBMS์™€ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌ

  • ORDER BY

    • ๊ฐœ์ˆ˜ ์กฐํšŒ๋ฅผ ํ•˜๋Š” ๋ฐ์— ์ •๋ ฌ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Œ(MySQL 8.0 ๋ฏธ๋งŒ)

    • MySQL 8.0 ์ด์ƒ๋ถ€ํ„ฐ๋Š” ORDER BY๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์˜ตํ‹ฐ๋งˆ์ด์ €์—์„œ ์ตœ์ ํ™”(๋ฌด์‹œ)ํ•˜์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€

JOIN()

์กฐ์ธ ์ž‘์—…์—์„œ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์„ ์ฝ์„ ๋•Œ๋Š” ์ธ๋ฑ์Šค ํƒ์ƒ‰ ์ž‘์—…์„ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์„ ์ฝ์„ ๋•Œ๋Š” ์ธ๋ฑ์Šค ํƒ์ƒ‰ ์ž‘์—…์„ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋งŒํผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ๋•Œ๋ฌธ์— JOIN ์ˆœ์„œ์™€ ์ธ๋ฑ์Šค ์œ ๋ฌด์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์— ํฌ๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋ฅผ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ตœ์ ํ™”ํ•˜์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์ชฝ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

SELECT *
FROM employees e,
     dept_emp de
WHERE e.emp_no = de.emp_no;

์œ„์˜ ์ฟผ๋ฆฌ๊ฐ€ ์กด์žฌํ•  ๋•Œ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.(๋ฌด์กฐ๊ฑด ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.)

emp_no ์ธ๋ฑ์Šคdept_no ์ธ๋ฑ์Šค์กฐ์ธ ์ˆœ์„œ์™€ ์˜ตํ‹ฐ๋งˆ์ด์ € ๋™์ž‘

O

O

์–ด๋Š ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™์œผ๋กœ ์„ ํƒํ•˜๋“  ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ” ์กฐํšŒ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์ ์ ˆํžˆ ์„ ํƒ

O

X

dept_emp ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•˜์—ฌ ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์„ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ , employees ํ…Œ์ด๋ธ”์„ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

X

O

์œ„์™€ ๋ฐ˜๋Œ€๋กœ ๋™์ž‘

X

X

์–ด๋–ค ๊ฒฝ์šฐ์—์„œ๋“  ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์˜ ํ’€ ์Šค์บ”์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ ์ ์€ ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•˜๊ฒŒ ๋œ๋‹ค.

๋˜ํ•œ WHERE ์กฐ๊ฑด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ JOIN ์กฐ๊ฑด์—์„œ์˜ ๋น„๊ต ๋Œ€์ƒ ์ปฌ๋Ÿผ์ด ์„œ๋กœ ๋™์ผํ•ด์•ผ ์ธ๋ฑ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.(์•„๋‹Œ ๊ฒฝ์šฐ ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.)

์ง€์—ฐ ์กฐ์ธ(Delayed Join)

์กฐ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ GROUP BY, ORDER BY ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ตœ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์„ ํ™•๋ฅ ์ด ๋†’๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—” ๋จผ์ € ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  GROUP BY, ORDER BY ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜์–ด ์•„๋ž˜์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์กฐ์ธ์„ ํ•  ์ˆ˜๋ก ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜์™€ ๋ ˆ์ฝ”๋“œ ์ž์ฒด์˜ ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚จ

  • GROUP BY, ORDER BY ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ ๋งŽ๊ฑฐ๋‚˜ ๋ ˆ์ฝ”๋“œ ์ž์ฒด์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๋‹ค๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐœ์ƒ

๋•Œ๋ฌธ์—, ๋จผ์ € GROUP BY, ORDER BY ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ์ง€์—ฐ ์กฐ์ธ ์ ์šฉ ์ „

SELECT e.*
FROM salaries s,
     employees e
WHERE e.emp_no = s.emp_no
  AND s.emp_no BETWEEN 10001 AND 13000
GROUP BY s.emp_no
ORDER BY SUM(s.salary) DESC
LIMIT 10;
  1. employees ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒ

  2. 10001 ~ 13000 ์‚ฌ์ด์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒ

  3. salaries ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธ(์กฐ์ธ ํ›„ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ ์ฆ๊ฐ€)

  4. ์œ„ ๊ฒฐ๊ณผ๋ฅผ ์ž„์‹œํ…Œ์ด๋ธ”์— ์ €์žฅ

  5. GROUP BY ์ž‘์—… ์ˆ˜ํ–‰ํ•˜์—ฌ ์ตœ๋Œ€ 3000๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋กœ ์ค„์–ด๋“ฆ

  6. ORDER BY ์ž‘์—… ์ˆ˜ํ–‰

  7. LIMIT 10์œผ๋กœ ์ตœ์ข… ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜

  • ์ง€์—ฐ ์กฐ์ธ ์ ์šฉ ํ›„

SELECT e.*
FROM (SELECT s.emp_no
      FROM salaries s
      WHERE s.emp_no BETWEEN 10001 AND 13000
      GROUP BY s.emp_no
      ORDER BY SUM(s.salary) DESC
      LIMIT 10) x,
     employees e
WHERE e.emp_no = x.emp_no;
  1. salaries ํ…Œ์ด๋ธ”์—์„œ 10001 ~ 13000 ์‚ฌ์ด์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒ

  2. GROUP BY / ORDER BY / LIMIT ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ตœ๋Œ€ 10๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋กœ ์ค„์–ด๋“ฆ

  3. employees ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธ

์œ„์˜ ์˜ˆ์‹œ๋Š” ์ง€์—ฐ ์กฐ์ธ์„ ์ ์šฉํ–ˆ์„ ๋•Œ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๋Š” ์˜ˆ์‹œ์ด์ง€๋งŒ, ์ง€์—ฐ ์กฐ์ธ์„ ์ ์šฉํ–ˆ์„ ๋•Œ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š” ๊ฒฝ์šฐ๋„ ์กด์žฌํ•œ๋‹ค. ์ง€์—ฐ ์กฐ์ธ์„ ์ ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•˜๋ ค๋ฉด ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

  • LEFT(OUTER) JOIN์ธ ๊ฒฝ์šฐ

    • ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๊ณผ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์€ 1:1 ๋˜๋Š” M:1 ๊ด€๊ณ„์—ฌ์•ผ ํ•œ๋‹ค.

  • INNER JOIN์ธ ๊ฒฝ์šฐ

    • ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๊ณผ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์ด 1:1 ๋˜๋Š” M:1 ๊ด€๊ณ„์—ฌ์•ผ ํ•œ๋‹ค.

    • ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ ˆ์ฝ”๋“œ๋Š” ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์— ๋ชจ๋‘ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

๋ž˜ํ„ฐ๋Ÿด ์กฐ์ธ(Lateral Join)

MySQL 8.0๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ํŠน์ • ๊ทธ๋ฃน๋ณ„๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

-- employees ํ…Œ์ด๋ธ”์—์„œ first_name์ด Matt์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๊ณ , 
-- salaries ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋ฐ›์€ ๊ธ‰์—ฌ 2๊ฑด์„ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ
SELECT *
FROM employees e
         LEFT JOIN LATERAL ( SELECT *
                             FROM salaries s
                             WHERE s.emp_no = e.emp_no
                             ORDER BY s.from_date DESC
                             LIMIT 2) s2 ON s2.emp_no = e.emp_no
WHERE e.first_name = 'Matt';

์—ฌ๊ธฐ์„œ ํŠน์ง•์€ LATERAL ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ ๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€ ์ฟผ๋ฆฌ์˜ FROM ์ ˆ์— ์ •์˜๋œ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. LATERAL ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€์ง„ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์กฐ์ธ ์ˆœ์„œ์ƒ ํ›„์ˆœ์œ„๋กœ ๋ฐ€๋ฆฌ๊ณ , ์™ธ๋ถ€ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ ๋ ˆ์ฝ”๋“œ ๋‹จ์œ„๋กœ ์ž„์‹œ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜์–ด ์ฒ˜๋ฆฌ๋œ๋‹ค.

ORDER BY

ORDER BY๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์–ด๋–ค ์ˆœ์„œ๋กœ ์ •๋ ฌํ•˜์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์ ˆ์ธ๋ฐ, ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ ฌ๋˜์–ด ๋ฐ˜ํ™˜๋œ๋‹ค.

  • ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒ ๋œ ๊ฒฝ์šฐ์—” ์ธ๋ฑ์Šค์˜ ์ •๋ ฌ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜

  • InnoDB์—์„œ ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์„ ํ•œ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜

  • SELECT ์ฟผ๋ฆฌ๊ฐ€ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒ๋์„ ๊ฒฝ์šฐ์—” ๋ ˆ์ฝ”๋“œ ์ˆœ์„œ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ค์›€

ORDER BY 2์™€ ๊ฐ™์ด ์ปฌ๋Ÿผ์˜ ์ˆœ๋ฒˆ์„ ์ง€์ •ํ•˜์—ฌ ์ •๋ ฌํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ด๋Š” ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

Last updated