๋ชฉ๋กData๐/DB ์ดํด (15)
EEALL@ONCE

`SUM` ํจ์๋ ์ฃผ์ด์ง ์ด์ ๊ฐ๋ค์ ๋ํ๋ ํจ์์ด๋ฉฐ, `NULL` ๊ฐ์ ๋ฌด์ํฉ๋๋ค. ๋ฐ๋ผ์ `SUM` ํจ์๋ฅผ ์ฌ์ฉํ ๋ `NULL` ๊ฐ์ด ํฌํจ๋์ด ์์ด๋ ๋ฌธ์ ์์ด ๋ง์ ์ด ์ํ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋์ํ๋ ๊ฒ์ด `SUM` ํจ์์ ๊ธฐ๋ณธ ๋์ ๋ฐฉ์์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ํ ์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค: ์ด ํ ์ด๋ธ์์ `amount` ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค: `NULL` ๊ฐ์ ๋ฌด์๋๊ณ ๋๋จธ์ง ๊ฐ๋ค๋ง ํฉ์ฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ฒฐ๊ณผ์ ์ผ๋ก `amount` ์ด์ ํฉ๊ณ๋ 300์ด ๋ฉ๋๋ค. `SUM` ํจ์๋ ๋ฐ์ดํฐ ์ง๊ณ ํจ์ ์ค ํ๋๋ก, ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ฐ๋ผ ํน์ ์ด์ ๊ฐ์ ํฉ์ฐํ๋ ๋ฐ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ด ํจ์๋ฅผ ์ฌ์ฉํ ๋ `NULL` ๊ฐ์ ๋ํ ์ฒ๋ฆฌ์ ๋ํด ๊ฑฑ์ ํ์ง ์์๋ ๋ฉ๋๋ค.
`LAST_DAY` ํจ์๋ MySQL์์ ์ ๊ณตํ๋ ๋ด์ฅ ํจ์ ์ค ํ๋๋ก, ์ธ์๋ก ์ฃผ์ด์ง ๋ ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ํด๋น ์์ ๋ง์ง๋ง ๋ ์ง๋ฅผ ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, `LAST_DAY('2023-08-18')`์ ํธ์ถํ๋ฉด 2023๋ 8์์ ๋ง์ง๋ง ๋ ์ง์ธ 2023๋ 8์ 31์ผ์ ๋ฐํํฉ๋๋ค. ์ด ํจ์๋ฅผ ํ์ฉํ๋ฉด ํน์ ๋ ์ง์ ์์ ๋ง์ง๋ง ๋ ์ง๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ์ฃผ๋ก ์๋ง ์์ ์ด๋ ๋ณด๊ณ ์ ์์ฑ ๋ฑ์์ ํ์ฉ๋ ์ ์์ต๋๋ค. ์๋๋ `LAST_DAY` ํจ์์ ์ฌ์ฉ ์์์ ๋๋ค: SELECT LAST_DAY('2023-08-18'); -- ๊ฒฐ๊ณผ: 2023-08-31
`DATE_ADD` ํจ์๋ MySQL์์ ๋ ์ง์ ์๊ฐ์ ๊ณ์ฐํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ค์์ ์ด ์ฝ๋์ ์์ ์ ์ค๋ช ์ ๋๋ค: SELECT DATE_ADD('2021-08-16', INTERVAL 1 MONTH) AS NewDate; ๊ฒฐ๊ณผ: NewDate 2021-09-16 - `DATE_ADD` ํจ์๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ํน์ ๋ ์ง๋ฅผ ๋ฐ๊ณ , ๋ ๋ฒ์งธ ์ธ์๋ก INTERVAL ํค์๋์ ํจ๊ป ์๊ฐ ๊ฐ๊ฒฉ์ ๋ฐ์ต๋๋ค. - ์์ ๊ฒฝ์ฐ, '2021-08-16'์ 1๊ฐ์์ ์ถ๊ฐํ์ฌ '2021-09-16'์ ๋ฐํํฉ๋๋ค. ์ถ๊ฐ์ ์ธ ์ง๋ฌธ : ํด๋น interval 1 month๋ 30์ผ ๋ค 31์ผ ๋ค๋ฅผ ์๋์ผ๋ก ๋ฑ๋กํด์ฃผ๋๊ฑฐ์ผ? MySQL์ `DATE_ADD` ํจ์์์ `INTERVAL 1 MONTH`๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ฌ์ ์ผ ์์ ๊ด๊ณ์์ด ..
SUBSTRING(string, start, length) ์ฌ๊ธฐ์ string์ ์ถ์ถํ ๋์ ๋ฌธ์์ด์ด๊ณ , start๋ ์ถ์ถ์ ์์ํ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ ๋๋ค. length๋ ์ถ์ถํ๊ณ ์ ํ๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๋ํ๋ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ์์ด "Hello, World!"์์ "World"๋ฅผ ์ถ์ถํ๋ ค๋ฉด: SELECT SUBSTRING('Hello, World!', 8, 5) AS result;
CONCAT์ ๋ ๊ฐ ์ด์์ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ๋ ํจ์์ ๋๋ค. SQL์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์ฌ๋ฌ DBMS์์ ์ง์๋ฉ๋๋ค. SELECT CONCAT('Hello', ' ', 'World'); Result : Hello World ๋๋ถ๋ถ์ ๊ฒฝ์ฐ CONCAT ํจ์๋ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํฐ ๋ฐ์ดํฐ ์ธํธ์์ ๋ง์ ๋ฌธ์์ด์ ์ฐ๊ฒฐํด์ผํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ํนํ ๋ฌธ์์ด์ ํฌ๊ธฐ๊ฐ ํฐ ๊ฒฝ์ฐ์ ๋๋ค. ์ด๋ฌํ ์ํฉ์์๋ ๋ค๋ฅธ ๋ฐฉ์์ ๊ณ ๋ คํ ํ์๊ฐ ์์ ์ ์์ต๋๋ค. SIDE EFFECT: CONCAT์ NULL ๊ฐ์ ํฌํจํ๋ ๋ฌธ์์ด๊ณผ ์ฐ๊ฒฐํ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ฅผ NULL๋ก ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด, CONCAT(NULL, 'test')๋ NULL์ ๋ฐํํฉ๋๋ค. ๋ฌธ์์ด ์ฐ๊ฒฐ ์ฐ์ฐ์ด ๋ง์์ง์๋ก ์ฑ๋ฅ์ด..
๐ case CASE ํํ์: CASE ํํ์์ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ๊ฑฐ๋ ์ฐ์ฐ์ ์ํํ๋๋ฐ ์ฌ์ฉ ๋ํ CASE ํํ์์ ์ฌ์ฉํ์ฌ ์๋ก์ด ์ปฌ๋ผ์ ์์ฑํ ์๋ ์์ SELECT name, score, CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' WHEN score >= 70 THEN 'C' ELSE 'F' END AS grade FROM students; students ํ ์ด๋ธ์ score ์ปฌ๋ผ์ ๋ฐ๋ผ ๊ฐ ํ์์ ์ฑ์ ๋ฑ๊ธ์ ๊ณ์ฐํ์ฌ grade๋ผ๋ ์๋ก์ด ์ปฌ๋ผ์ผ๋ก ํํ
๐ DISTINCT ์ค๋ณต๋ ๊ฒฐ๊ณผ๊ฐ ์ ๊ฑฐ๋๊ณ ๊ฐ๊ฐ์ ๊ณ ์ ํ ๊ฒฐ๊ณผ๋ง์ด ๋ฐํ ์๋ฅผ ๋ค์ด COUNT(DISTINCT user_id) ๋ผ๊ณ ํ๋ฉด ๊ณ ์ ํ ์ฌ์ฉ์ ์๋ฅผ ์ธก์ . ํ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๋ฒ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ ๊ฒฝ์ฐ์๋, ๊ทธ ์ฌ์ฉ์๋ ํ๋ฒ๋ง count ๋๋ค.