[๋ชฉ์ฐจ]
1. ๊ฒฝ๊ธฐ๋์ ์์นํ ์ํ์ฐฝ๊ณ ๋ชฉ๋ก ์ถ๋ ฅํ๊ธฐ
2. ์ด๋ฆ์ด ์๋ ๋๋ฌผ์ ์์ด๋ / ์ด๋ฆ์ด ์๋ ๋๋ฌผ์ ์์ด๋
3. NULL ์ฒ๋ฆฌํ๊ธฐ
4. ๋์ด ์ ๋ณด๊ฐ ์๋ ํ์ ์ ๊ตฌํ๊ธฐ
5. ROOT ์์ดํ ๊ตฌํ๊ธฐ
6. ์ก์ ๋ฌผ๊ณ ๊ธฐ์ ํ๊ท ๊ธธ์ด ๊ตฌํ๊ธฐ
7. โญ์ ๊ทธ๋ ์ด๋ ํ ์ ์๋ ์์ดํ ๊ตฌํ๊ธฐ
1. ๊ฒฝ๊ธฐ๋์ ์์นํ ์ํ์ฐฝ๊ณ ๋ชฉ๋ก ์ถ๋ ฅํ๊ธฐ
SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, (IFNULL(FREEZER_YN,'N')) AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE '๊ฒฝ๊ธฐ๋%'
ORDER BY WAREHOUSE_ID;
2. ์ด๋ฆ์ด ์๋ ๋๋ฌผ์ ์์ด๋ & ์ด๋ฆ์ด ์๋ ๋๋ฌผ์ ์์ด๋
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID;
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID;
3. NULL ์ฒ๋ฆฌํ๊ธฐ
SELECT
ANIMAL_TYPE,
IFNULL(NAME, 'No name') AS NAME,
SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
4. ๋์ด ์ ๋ณด๊ฐ ์๋ ํ์ ์ ๊ตฌํ๊ธฐ
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE AGE IS NULL;
5. ROOT ์์ดํ ๊ตฌํ๊ธฐ
SELECT A.ITEM_ID, A.ITEM_NAME
FROM ITEM_INFO A JOIN ITEM_TREE B ON A.ITEM_ID = B.ITEM_ID
WHERE B.PARENT_ITEM_ID IS NULL
ORDER BY A.ITEM_ID;
6. ์ก์ ๋ฌผ๊ณ ๊ธฐ์ ํ๊ท ๊ธธ์ด ๊ตฌํ๊ธฐ
SELECT ROUND(
AVG(
CASE
WHEN LENGTH IS NULL THEN 10 -- NULL ๊ฐ์ธ ๊ฒฝ์ฐ 10์ผ๋ก ์ฒ๋ฆฌ
WHEN LENGTH <= 10 THEN 10 -- 10 ์ดํ์ผ ๊ฒฝ์ฐ 10์ผ๋ก ์ฒ๋ฆฌ
ELSE LENGTH -- ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ์๋ LENGTH ์ฌ์ฉ
END
), 2) AS AVERAGE_LENGTH
FROM FISH_INFO
๋ณด๊ธฐ ์ข๊ฒ ์ฝ๋ ์ ๋ฆฌ๋ฅผ ์ข ํ๋ค.
์ด ๋ฌธ์ ๋ ์๊ฐ์ด ์ข ํ์ํ๋ค.
์ฒ์์๋ ๊ณ์ ํ๋ ค์ ์ค๋ฅ๊ฐ ๋ฌ๋ค.
WHEN LENGTH IS NULL THEN 10 -- NULL ๊ฐ์ธ ๊ฒฝ์ฐ 10์ผ๋ก ์ฒ๋ฆฌ
์ด ๋ฌธ์ฅ์ ๋นผ๋จน์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฌธ์ ๋ฅผ ์ ๋ณด๋ฉด 10cm ์ดํ์ ๋ฌผ๊ณ ๊ธฐ๋ค์ ๊ธธ์ด๋ฅผ NULL๋ก ํ์ํ๋ค๊ณ ํ๊ธฐ ๋๋ฌธ์
LENGTH๊ฐ NULL์ด๋ผ๊ณ ํด๋ ๊ฒฐ๊ตญ์ ๊ธธ์ด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ AVG ๊ณ์ฐ์์ NULL๊ฐ์ด ์ ์ธ๋์ด์๋ ์ ๋๋ค. NULL๋ ์กํ ๋ฐ์ดํฐ๋ ๊ฒฐ๊ตญ 10์ผ๋ก ์นํ์ ํด์ ํ๊ท ๊ณ์ฐ์ ์ํํ๋๋ฐ ํฌํจ์ด ๋ ์ ์๋๋ก ํด ์ฃผ์ด์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ ์์ธํ ์๊ฐํด๋ณด๋ฉด
๊ทธ๋ผ ๊ตณ์ด LENGTH <= 10 THEN 10์ ํด ์ค ํ์๊ฐ ์์์?
์ด์ฐจํผ LENGTH <= 10 ๋ NULL์ด๋๊น NULL ์ฒ๋ฆฌ๋ง ํด ์ฃผ๋ฉด ๋๋ ๊ฐ๋จํ ๋ฌธ์ ์ด๋ค.
๊ทธ๋ผ ์ฝ๋๊ฐ ์ ๋ง ์งง์์ง๋ค.
์๋ ์ฝ๋๋ ์ ๋ต์ด๋ค.
SELECT ROUND(AVG(IFNULL(LENGTH, 10)),2) AS AVERAGE_LENGTH FROM FISH_INFO
7. โญ์ ๊ทธ๋ ์ด๋ ํ ์ ์๋ ์์ดํ ๊ตฌํ๊ธฐ
SELECT A.ITEM_ID, A.ITEM_NAME, A.RARITY
FROM ITEM_INFO A LEFT JOIN ITEM_TREE B ON A.ITEM_ID = B.PARENT_ITEM_ID
WHERE B.PARENT_ITEM_ID IS NULL
ORDER BY A.ITEM_ID DESC;
LEFT ์กฐ์ธ์ ํด ์ค์ ITEM_INFO ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ค ๋์ค๊ฒ ํ ์ํ์์
ITEM_INFO์ ITEM_ID์ ITEM_TREE์ PARENT_ITEM_ID๋ฅผ ์กฐ์ธํด์
PARENT_ITEM_ID๊ฐ ๋ ๊ฐ์ธ ํ์ ์กฐํํ๋ฉด ๋๋ค.
์๋๋ฉด NOT EXISTS๋ฅผ ์จ ์ฃผ๋ฉด ๋๋ค.
EXIST์ S ๋ถ๋๊ฑฐ ์ฃผ์ํ์
SELECT A.ITEM_ID, A.ITEM_NAME, A.RARITY
FROM ITEM_INFO A
JOIN ITEM_TREE B ON A.ITEM_ID = B.ITEM_ID
WHERE NOT EXISTS (
SELECT 1
FROM ITEM_TREE B2
WHERE B2.PARENT_ITEM_ID = A.ITEM_ID
)
ORDER BY A.ITEM_ID DESC;
ํ์ง๋ง ์์ฒ๋ผ ์ฌ๋ฐ๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์ง๊ธฐ๊น์ง ์ฝ๊ฐ์ ์ํ์ฐฉ์ค๊ฐ ์์๋ค.
์ด๋ค ๋ถ๋ถ์ด ๋ฌธ์ ๋์๋์ง ๋จ๊ฒจ ๋ณธ๋ค.
์ฒ์์ ์ง ์ฟผ๋ฆฌ
SELECT A.ITEM_ID, A.ITEM_NAME, A.RARITY
FROM ITEM_INFO A JOIN ITEM_TREE B ON A.ITEM_ID = B.ITEM_ID
WHERE A.ITEM_ID NOT IN (B.PARENT_ITEM_ID)
ORDER BY A.ITEM_ID DESC;
์ฒ์์๋ ๊ทธ๋ฅ ITEM_ID ๊ธฐ์ค์ผ๋ก ์กฐ์ธ์ ํ๊ณ
ITEM_INFO์ ์์ด๋๊ฐ ITEM_TREE์์ PARENT_ITEM_ID ์ปฌ๋ผ์๋ง ์์ผ๋ฉด ๋๋๊ฑฐ ์๋๊ฐ?
๋ผ๊ณ ์๊ฐ ํ๋๋ฐ ์๋ก ์๊ฒ๋ ์ฌ์ค์ NOT IN์ ๋ค์ ์ค๋ ์ปฌ๋ผ์ NULL ๊ฐ์ด ์์ผ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ ๋๋ก ๊ฑธ๋ฌ๋ด์ง ๋ชปํ๋ค๋ ๊ฒ์ด๋ค.
๋ง์ฝ B.PARENT_ITEM_ID์ NULL์ด ํฌํจ๋์ด ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? A.ITEM_ID๊ฐ NULL์ด ํฌํจ๋ ๋ฆฌ์คํธ์์ NOT IN ์กฐ๊ฑด์ ํ๊ฐํ ๋, SQL์ A.ITEM_ID์ NULL์ ๋น๊ตํ๋ ๊ฒ์ด ๋ถํ์คํ๋ฏ๋ก ๊ฒฐ๊ณผ๊ฐ ์์๊ณผ ๋ค๋ฅผ ์ ์๋ค๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด, A.ITEM_ID = 100์ผ ๋ NOT IN์์ NULL ๊ฐ์ด ํฌํจ๋๋ฉด, `100 NOT IN (NULL)`์ ๋น๊ต๊ฐ ๋ถ๊ฐ๋ฅํ ๋ถํ์คํ ์ํ๋ผ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋๋ AND B.PARENT_ITEM_ID IS NOT NULL ์กฐ๊ฑด์ ์ถ๊ฐ ํด ์ฃผ์๋ค.
SELECT A.ITEM_ID, A.ITEM_NAME, A.RARITY
FROM ITEM_INFO A
JOIN ITEM_TREE B ON A.ITEM_ID = B.ITEM_ID
WHERE A.ITEM_ID NOT IN (B.PARENT_ITEM_ID) AND B.PARENT_ITEM_ID IS NOT NULL
ORDER BY A.ITEM_ID DESC;
์ด๊ฒ๋ ์ ๋ต์ฒ๋ฆฌ๊ฐ ๋์ง ์๋๋ค.
์์ํ ์ด๋ธ์ ๋ณด๋ฉด์ ์ ์๊ฐํด๋ณด๋... ์ด๊ฑธ ์ถ๊ฐํด ์ฃผ๊ณ ๋ง๊ณ ํ ๊ฒ ์๋์๋ค.
NOT IN๊ณผ NULL ์ฒ๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ '์๋'๋ ์์์ผ๋
์ฌ์ ํ NOT IN์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ NULL ๊ฐ์ด ํฌํจ๋ ์ปฌ๋ผ๊ณผ์ ๋น๊ต์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
B.PARENT_ITEM_ID IS NOT NULL ์กฐ๊ฑด์ ์ถ๊ฐํ ๊ฒ์ด ๋ฌธ์ ๊ฐ ์๋๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก NOT IN ์์ฒด์ ํน์ฑ ๋๋ฌธ์ด๋ค.