EEALL@ONCE
๐ ์ฟผ๋ฆฌ ์คํฐ๋(1) - IFNULL / JOIN ์ ์กฐ๊ฑด / JOIN ํ ์กฐ๊ฑด ๋ณธ๋ฌธ
๐ ์ฟผ๋ฆฌ ์คํฐ๋(1) - IFNULL / JOIN ์ ์กฐ๊ฑด / JOIN ํ ์กฐ๊ฑด
์ฌ์ฃ์์ค 2023. 7. 27. 17:58๐ ํ ์ด๋ธ : payment (์๋ฉ/ํ ์ธ) / bill (์ฒญ๊ตฌ)
๐ง๋ฌธ์ ์ฌํญ:
์ฒญ๊ตฌ ํ ์ด๋ธ๊ณผ ์๋ฉ ํ ์ด๋ธ์ด ์๋๋ฐ, ์ฒญ๊ตฌ ํ ์ด๋ธ ํญ๋ชฉ์ ๋ํ ์๋ฉ์ด ๋์๋์ง๋ฅผ ์ฒดํฌํ๊ณ ์ถ๋ค.
๋ค๋ง ๋ชจ๋ ๋ฉ๋ถ ์ด์ธ์๋ ๋ถ๋ถ์ ์ผ๋ก ์ฐ๋์ฐ๋ ๋ฉ๋ถํ์ ๊ฐ๋ฅ์ฑ๋ ์๋ ์ํฉ
๋ํ ์๋ฉ ํ ์ด๋ธ์ ๊ณ ๊ฐ์ด ์๋ฉํ ๊ธ์ก๋ ์์ด์ง๋ง ํ์ฌ๊ฐ ํ ์ธํด์ฃผ๋ ๊ธ์ก๋ ์์ธ๋ค.
(์ฆ ์ฒญ๊ตฌ๊ธ-์๋ฉ๊ธ-ํ ์ธ๊ธ=0 ์ด ๋์ด์ผ ์๋ฉ์ด ๋๋ค.)
๐ก์๋ฃจ์ :
SELECT bill.bill_sn, bill.ban, bill.bill_item, bill.charge_money, SUM(IFNULL(pym.pym_amt, 0)),
SUM(IFNULL(sale.pym_amt, 0)),
(bill.charge_money - SUM(IFNULL(pym.pym_amt, 0)) - SUM(IFNULL(sale.pym_amt, 0) ) as left_money
FROM bill
LEFT JOIN payment AS pym ON
bill.bill_item = pym.pym_item
AND bill.ban = pym.ban
AND pym.code = 'PYM'
LEFT JOIN payment AS sale ON
bill.bill_item = sale.pym_item
AND bill.ban = sale.ban
AND sale.code = 'SALE'
GROUP BY bill.bill_sn, bill.ban, bill.bill_item, bill.charge_money;
1. ์กฐํ
`SELECT bill.bill_sn, bill.ban, bill.bill_item, bill.charge_money, SUM(IFNULL(pym.pym_amt, 0)), SUM(IFNULL(sale.pym_amt, 0)), (bill.charge_money - SUM(IFNULL(pym.pym_amt, 0)) - SUM(IFNULL(sale.pym_amt, 0)) as left_money`: ์กฐํํ๋ ค๋ ํ๋๋ฅผ ๋ช ์ํฉ๋๋ค.
๐ด GROUP BY
GROUP BY ํญ๋ชฉ์ผ๋ก ์ ์ง ์์ ํญ๋ชฉ์ ์ง๊ณ ํจ์์ ํจ๊ป๊ฐ ์๋๋ฉด ๋จ๋ ์ผ๋ก ์ธ ์ ์๋ค.
์๋ฅผ ๋ค์ด, bill_date ๊ฐ์ ๊ฒฝ์ฐ GROUP BY๋ก ๋ฌถ์ฌ์์ง ์๋ค. ๋ฐ๋ผ์ SELECT ๋ฌธ ๋ค์ ๋จ๋ ์ผ๋ก ์กฐํํ ์ ์๋ ์ปฌ๋ผ์ผ๋ก ์ธ ์ ์๋ค.
์ง๊ณํจ์ : max,count,sum,avg ๋ฑ๋ฑ...
๐ด IFNULL
`IFNULL`์ ์ฒซ ๋ฒ์งธ ์ธ์๊ฐ `NULL`์ธ์ง ์๋์ง๋ฅผ ๊ฒ์ฌํจ. ๋ง์ฝ ์ฒซ ๋ฒ์งธ ์ธ์๊ฐ `NULL`์ด๋ฉด, ๋ ๋ฒ์งธ ์ธ์๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฒซ ๋ฒ์งธ ์ธ์๋ฅผ ๋ฐํ.
SELECT IFNULL(name, 'No name') FROM users;
๋ง์ฝ `name` ๊ฐ์ด `NULL`์ด๋ผ๋ฉด, 'No name'์ด๋ผ๋ ๋ฌธ์์ด์ ๋์ ๋ฐํํจ
๐ด SUM ์ง๊ณํจ์
(bill.charge_money - SUM(IFNULL(pym.pym_amt, 0)) - SUM(IFNULL(sale.pym_amt, 0)) as left_money
GROUP BY๋ก ๋ฌถ์ด ๋๊ณ , ๊ฐ ๊ฐ์ ๊ทธ๋ฃน์์ ๊ณ ๊ฐ ๋ฉ๋ถ ๋ถ๋ถ๊ณผ ํ ์ธ ๋ถ๋ถ์ SUM์ ๊ตฌํด์ ํด๋น ์ฒญ๊ตฌ ํญ๋ชฉ์ ์ฒญ๊ตฌ ๊ธ์ก์์ ๋นผ์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฌ๊ธฐ์ ์์์ ์ค๋ช ํ IFNULL์ ์ฌ์ฉํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
SELECT SUM(pym_amt) FROM payment WHERE code = 'PYM' ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ๊ฒฐ๊ณผ๋ NULL์ด๋ค. ์๋ํ๋ฉด NULL์ '์ ์ ์๋ ๊ฐ'์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ซ์์ ๋ํ๊ฑฐ๋ ๋นผ๋ ๊ฒฐ๊ณผ๋ '์ ์ ์๋ ๊ฐ' ์ฆ, NULL์ด ๋๊ธฐ ๋๋ฌธ!!
IFNULL ํจ์๋ฅผ ์ฌ์ฉํ์ฌ NULL ๊ฐ์ '0'์ผ๋ก ๋์ฒดํ๋ฉด, SELECT SUM(IFNULL(pym_amt, 0)) FROM payment WHERE code = 'PYM' ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ 100์ด๋จ !
๋ง์ฐฌ๊ฐ์ง๋ก, ์ฐ๋ฆฌ๋ ์ง๊ธ LEFT JOIN์ ๋ ๋ฒ์ด๋ ํ ์ํ์์ผ๋ก! ๋ฌด์ง๋ง์งํ๊ฒ ๋ง์ null ๊ฐ์ด ๊ฐ ํด๋น ๋ฐ์ดํฐ์ ์์ ๊ฐ๋ฅ์ฑ์ด ๊ต์ฅํ ๋๋ค!!
๋ฐ๋ผ์, ๋๋ ์ฌ๊ธฐ์ IFNULL์ ์ฌ์ฉํด์ ์ด ๋ถ๋ถ์ ์์ธ๋ฅผ ์ฒ๋ฆฌํด์คฌ๋ค.
2. JOIN ์ ์กฐ๊ฑด / JOIN ํ ์กฐ๊ฑด
`LEFT JOIN payment AS pym ON bill.bill_item = pym.pym_item AND bill.ban = pym.ban AND pym.code = 'PYM'`:
`payment` ํ ์ด๋ธ์ `bill` ํ ์ด๋ธ์ ๊ฒฐํฉ
๊ฒฐํฉ ์กฐ๊ฑด์ `bill.bill_item`= `pym.pym_item`, `bill.ban`= `pym.ban` ๊ทธ๋ฆฌ๊ณ `pym.code`๊ฐ 'PYM'์ธ ๊ฒฝ์ฐ
๋ง์ฝ, pym.code = 'PYM'` ์ด ๋ถ๋ถ์ด ON ๋ค์๊ฐ ์๋๋ผ, WHERE ๋ก ์ด์ด์ง๊ฒ ๋๋ฉด,
GPT์์ ๋ฐ๋ฅด๋ฉด..
`WHERE` ์ ๊ณผ `JOIN` ์ ์์์ ์กฐ๊ฑด์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
1. `JOIN` ์ ์์ ์กฐ๊ฑด์ ์ฌ์ฉํ๋ฉด, ๊ทธ ์กฐ๊ฑด์ ๋ ํ
์ด๋ธ์ด ํฉ์ณ์ง๊ธฐ ์ ์ ์ ์ฉ๋ฉ๋๋ค. ์ฆ, ์ฌ๊ธฐ์ `pym.code = 'PYM'`์ `payment` ํ
์ด๋ธ์์ `code`๊ฐ 'PYM'์ธ ํ๋ง์ ์ ํํ์ฌ `bill` ํ
์ด๋ธ๊ณผ ๊ฒฐํฉํฉ๋๋ค. ๋ฐ๋ผ์ `pym`์ ๊ด๋ จ๋ `SUM(IFNULL(pym.pym_amt, 0))` ๊ณ์ฐ์ `code`๊ฐ 'PYM'์ธ ํ์๋ง ์ ์ฉ๋ฉ๋๋ค.
2. `WHERE` ์ ์์ ๊ฐ์ ์กฐ๊ฑด์ ์ฌ์ฉํ๋ฉด, ๊ทธ ์กฐ๊ฑด์ ๋ชจ๋ ํ
์ด๋ธ์ด ํฉ์ณ์ง ํ์ ์ ์ฉ๋ฉ๋๋ค. ์ฆ, `WHERE pym.code = 'PYM'` ์กฐ๊ฑด์ `bill` ํ
์ด๋ธ๊ณผ `payment` ํ
์ด๋ธ์ด ๊ฒฐํฉ๋ ํ์ ์ ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ 'SALE'์ ํด๋นํ๋ ํ๋ค๋ ํฌํจ๋์ด `payment` ํ
์ด๋ธ์ 'PYM'๊ณผ 'SALE' ๋ ๋ค ์์ ๋๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋๋ค.
์ฆ, ์ด ๋ ๊ฐ์ง ์กฐ๊ฑด์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ์ํ๋์ง์ ๋ฐ๋ผ ์ ์ ํ ์์น์ ์กฐ๊ฑด์ ๋ฐฐ์นํด์ผ ํฉ๋๋ค.
์์ :
SELECT bill.bill_sn, bill.ban, bill.bill_item, bill.charge_money, SUM(IFNULL(pym.pym_amt, 0)), SUM(IFNULL(sale.pym_amt, 0)),
(bill.charge_money - SUM(IFNULL(pym.pym_amt, 0)) - SUM(IFNULL(sale.pym_amt, 0)) ) as left_money
FROM bill
LEFT JOIN payment AS pym ON
bill.bill_item = pym.pym_item
AND bill.ban = pym.ban
AND pym.code = 'PYM'
LEFT JOIN payment AS sale ON
bill.bill_item = sale.pym_item
AND bill.ban = sale.ban
AND sale.code = 'SALE'
GROUP BY bill.bill_sn, bill.ban, bill.bill_item, bill.charge_money;
SELECT bill.bill_sn, bill.ban, bill.bill_item, bill.charge_money, SUM(IFNULL(pym.pym_amt, 0)), SUM(IFNULL(sale.pym_amt, 0)),
(bill.charge_money - SUM(IFNULL(pym.pym_amt, 0)) - SUM(IFNULL(sale.pym_amt, 0)) ) as left_money
FROM bill
LEFT JOIN payment AS pym ON
bill.bill_item = pym.pym_item
AND bill.ban = pym.ban
LEFT JOIN payment AS sale ON
bill.bill_item = sale.pym_item
AND bill.ban = sale.ban
AND sale.code = 'SALE'
WHERE pym.code = 'PYM'
GROUP BY bill.bill_sn, bill.ban, bill.bill_item, bill.charge_money;
๋ฐ๋ผ์, ๋จธ๋ฆฌ ์์์ ํ ์ด๋ธ ํ์ฑ์ ์ ํ๋ฉด์ ์กฐ๊ฑด๋ฌธ์ ๊ฑธ์ด์ค์ผํ๋ค.
์๋๋ฉด, ์ด์ํ ๊ฒฐ๊ณผ๊ฐ ๋์์ ๊ธด ์ฟผ๋ฆฌ ๋ค ์ฐ๊ณ ์ง์์ผํ ๊ฒฝ์ฐ๊ฐ ์๊ฒจ๋ฒ๋ฆฐ๋ค!