๋ชฉ๋กData๐ (24)
EEALL@ONCE
1. UNIQUE ์กฐ๊ฑด๊ณผ NULL ํ์ฉ: - UNIQUE ์กฐ๊ฑด์ ํด๋น ์ด์ ๊ฐ์ด ๋ชจ๋ ๊ณ ์ ํ๋ค๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ NULL ๊ฐ์ ์ฌ๋ฌ ๊ฐ ํ์ฉ๋ฉ๋๋ค. - ์ฆ, UNIQUE ์ ์ฝ์ NULL ๊ฐ ์ฌ๋ฌ ๊ฐ๋ฅผ ํ์ฉํ์ง๋ง, NULL์ด ์๋ ๊ฐ์ ๊ณ ์ ํด์ผ ํฉ๋๋ค. 2. PRIMARY KEY์ INDEX ํค ์ฐจ์ด: - PRIMARY KEY๋ ํ ์ด๋ธ์ ๊ฐ ํ์ ๊ณ ์ ํ๊ฒ ์๋ณํ๋ ์ฃผ์ ์๋ณ์์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก PRIMARY KEY๋ ํด๋น ์ด์ UNIQUE ์ ์ฝ์ ๊ฐ์ง๋ฉฐ, NULL ๊ฐ์ ํ์ฉํ์ง ์์ต๋๋ค. - INDEX๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. UNIQUE INDEX๋ ํด๋น ์ด์ ๊ฐ์ด ๋ชจ๋ ๊ณ ์ ํ๋ค๋ ์ ์ฝ์ ๊ฐ์ง๋ฉฐ, NULL ๊ฐ์ ์ฌ๋ฌ ๊ฐ ํ์ฉํ ์ ์์ต๋๋ค. ๊ฐ๋จํ ์์ ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค...
SQL ์ฟผ๋ฆฌ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ์ต๋๋ค. "Every derived table must have its own alias"๋ผ๋ ์ค๋ฅ๋ ์๋ธ์ฟผ๋ฆฌ(derived table)์ ๋ณ์นญ(alias)๋ฅผ ์ง์ ํด์ผ ํ๋ค๋ ์๋ฏธ์ ๋๋ค.
ํด๋น ์์ ๋ง์ง๋ง ์ผ ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌ : LAST_DAY SELECT * FROM tb_rmny WHERE pay_day BETWEEN '2023-05-01' AND LAST_DAY('2023-05-01');
`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
`bill_acc_id`๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ์ฌ `aply_amt` ๊ฐ์ ๋ชจ๋ ๋ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ `total_deposit` ์ปฌ๋ผ์ ์ ๋ฐ์ดํธํ๋ ค๋ ๊ฒ์ผ๋ก ์ดํดํ์์ต๋๋ค. ์๋์ SQL ์ฟผ๋ฆฌ๋ ๊ทธ ์์ ์ ์ํํ๋ ์์์ ๋๋ค. 1. ๋จผ์ , `bill_acc_id`๋ฅผ ๊ธฐ์ค์ผ๋ก `aply_amt` ๊ฐ์ ๋ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. 2. ๊ทธ ๋ค์, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก `tb_rmny` ํ ์ด๋ธ์ `total_deposit` ์ปฌ๋ผ์ ์ ๋ฐ์ดํธํฉ๋๋ค. UPDATE tb_rmny SET total_deposit = ( SELECT SUM(aply_amt) FROM tb_rmny AS subquery WHERE subquery.bill_acc_id = tb_rmny.bill_acc_id ) ์ด ์ฟผ๋ฆฌ๋ `tb_rmny` ํ ์ด๋ธ..
`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`๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ฌ์ ์ผ ์์ ๊ด๊ณ์์ด ..
`COALESCE` ํจ์๋ SQL์์ ์ฌ์ฉ๋๋ฉฐ, ์ธ์ ๋ชฉ๋ก ์ค์์ ์ฒซ ๋ฒ์งธ NULL์ด ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค. ๋ง์ฝ ๋ชจ๋ ์ธ์๊ฐ NULL์ด๋ผ๋ฉด, `COALESCE` ์ญ์ NULL์ ๋ฐํํฉ๋๋ค. ์ด ํจ์๋ ์ฃผ๋ก NULL ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋์ฒดํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ์ฟผ๋ฆฌ์์: COALESCE(SUM(...), 0) ๋ง์ฝ `SUM(...)`์ ๊ฒฐ๊ณผ๊ฐ NULL์ด๋ผ๋ฉด, `COALESCE`๋ 0์ ๋ฐํํฉ๋๋ค. ๋ง์ฝ `SUM(...)`์ ๊ฒฐ๊ณผ๊ฐ NULL์ด ์๋๋ผ๋ฉด ๊ทธ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๋ ํน์ ์ง๊ณ ํจ์์ ๊ฒฐ๊ณผ๊ฐ NULL์ผ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํ๊ณ ์ถ์ ๋ ์ ์ฉํ ํจํด์ ๋๋ค.