๐ MySQL ๋ฌธ๋ฒ ์ด์ ๋ฆฌ ๋ฐ๋ก๊ฐ๊ธฐ
[MySQL] ๊ธฐ๋ณธ SQL ๋ฌธ๋ฒ ์ด์ ๋ฆฌ & ๋ชจ์
โ๏ธ ์ฃผ์ - SELECT ์ ์์ ์์ฑํ ๋ณ์นญ์ Where ์ ์์ ์ฌ์ฉํ ์ ์์- Partition๊ณผ ๊ฐ์ ์๋์ฐ ํจ์๋ Where ์ ์์ ์ฌ์ฉํ ์ ์์ - ์๋ธ์ฟผ๋ฆฌ ๋ง๋ค๊ณ , ๋ณ์นญ ์ ์ฌ์ฉํด๋ ๋ง๋ค์ด์ผ ํจ ๐ NULL ์ฒ
thswldud.tistory.com
์ต์ ์์ผ๋ก ์ ๋ ฌํ ๋ฌธ์ ์์์ ๋๋ค
๋ฌธ์ ํ์ด ๊ธฐ๊ฐ : 24๋ 12์ 20์ผ ~ 23์ผ
์ต์๊ฐ ๊ตฌํ๊ธฐ
SELECT MIN(DATETIME) AS ์๊ฐ
FROM ANIMAL_INS
๊ณ ์์ด์ ๊ฐ๋ ๋ช ๋ง๋ฆฌ ์์๊น
SELECT
ANIMAL_TYPE
, COUNT(*) AS count
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
๋๋ช ๋๋ฌผ ์ ์ฐพ๊ธฐ
SELECT
NAME
, COUNT (NAME) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT >= 2
ORDER BY NAME
- COUNT(NAME) = COUNT(*) ์ด์ง๋ง, NAME์ด๋ผ๊ณ ํน์ ์ง์ผ๋ฉด, null ๊ฐ์ ์ ์ธํ๊ณ count๋ฅผ ํ๋ค
๋ฃจ์์ ์๋ผ ์ฐพ๊ธฐ
SELECT
ANIMAL_ID
, NAME
, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID
์ด๋ฆ์ el์ด ๋ค์ด๊ฐ๋ ๋๋ฌผ ์ฐพ๊ธฐ
SELECT
ANIMAL_ID
, NAME
FROM ANIMAL_INS
WHERE NAME LIKE '%el%'
AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME
๋๋ฌผ ์ ๊ตฌํ๊ธฐ
SELECT COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_INS
์ค๋ณต ์ ๊ฑฐํ๊ธฐ
SELECT COUNT(DISTINCT(NAME))
FROM ANIMAL_INS
์ค์ฑํ ์ฌ๋ถ ํ์ ํ๊ธฐ
SELECT
ANIMAL_ID
, NAME
, IF(SEX_UPON_INTAKE LIKE 'Neutered%'
OR SEX_UPON_INTAKE LIKE 'Spayed%', 'O', 'X') AS ์ค์ฑํ
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
NULL ์ฒ๋ฆฌํ๊ธฐ
SELECT
ANIMAL_TYPE
, IFNULL(NAME, 'No name') AS NAME,
, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
์ ์ ์๊ฐ ๊ตฌํ๊ธฐ(1)
SELECT
HOUR(DATETIME) AS HOUR
, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 9 AND 19
GROUP BY HOUR
ORDER BY HOUR
DATETIME์์ DATE๋ก ํ ๋ณํ
SELECT
ANIMAL_ID
, NAME
, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS ๋ ์ง
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
๊ฐ๊ฒฉ์ด ์ ์ผ ๋น์ผ ์ํ์ ์ ๋ณด ์ถ๋ ฅํ๊ธฐ
SELECT *
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE)
FROM FOOD_PRODUCT)
3์์ ํ์ด๋ ์ฌ์ฑ ํ์ ๋ชฉ๋ก ์ถ๋ ฅํ๊ธฐ
SELECT
MEMBER_ID
, MEMBER_NAME
, GENDER
, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = 3
AND GENDER = 'W'
AND TLNO IS NOT NULL
ORDER BY MEMBER_ID
์นดํ ๊ณ ๋ฆฌ ๋ณ ์ํ ๊ฐ์ ๊ตฌํ๊ธฐ
SELECT
SUBSTR(PRODUCT_CODE, 1, 2) AS CATEGORY
, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY
ORDER BY CATEGORY
๊ฐ๊ฒฉ๋ ๋ณ ์ํ ๊ฐ์ ๊ตฌํ๊ธฐ
SELECT
TRUNCATE(PRICE, -4) AS PRICE_GROUP
, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
TRONCATE(์ซ์, ๋ฒ๋ฆด ์๋ฆฟ์)
: ์ซ์๋ฅผ ๋ฒ๋ฆด ์๋ฆฟ์ ์๋๋ก ๋ฒ๋ฆผ
- SELECT TRUNCATE(12345.1234567 ,1) >> 12345.1
- SELECT TRUNCATE(12345.1234567 ,4) >> 12345.1234
- SELECT TRUNCATE(12345.1234567 ,-1) >> 12340
- SELECT TRUNCATE(12345.1234567 ,-2) >> 12300
์ํ ๋ณ ์คํ๋ผ์ธ ๋งค์ถ ๊ตฌํ๊ธฐ
SELECT
PRODUCT_CODE
, SUM(PRICE * SALES_AMOUNT) AS SALES
FROM PRODUCT AS P
JOIN OFFLINE_SALE AS O
ON P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY P.PRODUCT_CODE
ORDER BY SALES DESC, PRODUCT_CODE
์ฌ๊ตฌ๋งค๊ฐ ์ผ์ด๋ ์ํ๊ณผ ํ์ ๋ฆฌ์คํธ ๊ตฌํ๊ธฐ
SELECT
USER_ID
, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) > 1
ORDER BY USER_ID, PRODUCT_ID DESC
์ง๋ฃ๊ณผ๋ณ ์ด ์์ฝ ํ์ ์ถ๋ ฅํ๊ธฐ
SELECT
MCDP_CD AS ์ง๋ฃ๊ณผ์ฝ๋
, COUNT(*) AS 5์์์ฝ๊ฑด์
FROM APPOINTMENT
WHERE APNT_YMD LIKE '2022-05%'
GROUP BY MCDP_CD
ORDER BY 5์์์ฝ๊ฑด์, ์ง๋ฃ๊ณผ์ฝ๋
์ฑ๋ถ์ผ๋ก ๊ตฌ๋ถํ ์์ด์คํฌ๋ฆผ ์ด ์ฃผ๋ฌธ๋
SELECT
INGREDIENT_TYPE
, SUM(TOTAL_ORDER) AS TOTAL_ORDER
FROM
FIRST_HALF AS F
JOIN ICECREAM_INFO AS I
ON F.FLAVOR = I.FLAVOR
GROUP BY
INGREDIENT_TYPE
ORDER BY
TOTAL_ORDER
์กฐ๊ฑด์ ๋ง๋ ๋์์ ์ ์ ๋ฆฌ์คํธ ์ถ๋ ฅํ๊ธฐ
SELECT
B.BOOK_ID
, A.AUTHOR_NAME
, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK AS B
JOIN AUTHOR AS A
ON B.AUTHOR_ID = A.AUTHOR_ID
WHERE B.CATEGORY = '๊ฒฝ์ '
ORDER BY PUBLISHED_DATE
์๋์ฐจ ์ข ๋ฅ ๋ณ ํน์ ์ต์ ์ด ํฌํจ๋ ์๋์ฐจ ์ ๊ตฌํ๊ธฐ
SELECT
CAR_TYPE
, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS REGEXP '์ด์ ์ํธ|๊ฐ์ฃฝ์ํธ|ํตํ์ํธ'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE
REGEXP
- ์ ๊ท ํํ์์ ํ์ฉํ์ฌ ๋ฌธ์์ด ํจํด์ ๊ฒ์ํ๋ ๋ฐ ํ์ฉ
- ๊ธฐ๋ณธ ์ฐ์ฐ์๋ณด๋ค ๋ณต์กํ ๋ฌธ์์ด ์กฐ๊ฑด ๊ฐ๋ฅ
์์ฃผ ์ฌ์ฉํ๋ ์ ๊ท ํํ์ ํจํด
๊ธฐํธ | ์ค๋ช | ์์ | |
. | ์์์ ํ ๋ฌธ์์ ์ผ์น | 'a.b' | acb, a_b |
^ | ๋ฌธ์์ด์ ์์์ ์๋ฏธ | '^hello' | hello world, hello hi |
$ | ๋ฌธ์์ด์ ๋์ ์๋ฏธ | 'world$' | hello word, hi word |
* | ์์ ๋ฌธ์๊ฐ 0๋ฒ ์ด์ ๋ฐ๋ณต๋จ | 'ab*c' | ac, abc, abbc, abbbc |
+ | ์์ ๋ฌธ์๊ฐ 1๋ฒ ์ด์ ๋ฐ๋ณต๋จ | 'ab+c' | abc, abbc, ac (x) |
? | ์์ ๋ฌธ์๊ฐ 0๋ฒ ๋๋ 1๋ฒ ๋ํ๋จ | 'colou?r' | color, colour |
[abc] | 'a', 'b', 'c' ์ค ํ๋์ ์ผ์น | '[abc]' | apple, banna, cherry |
[a-z] | ์๋ฌธ์ ์ํ๋ฒณ ์ค ํ๋์ ์ผ์น | ||
[A-Z] | ๋๋ฌธ์ ์ํ๋ฒณ ์ค ํ๋์ ์ผ์น | ||
[0-9] | ์ซ์ ์ค ํ๋์ ์ผ์น | ||
| | OR ์ฐ์ฐ์ ์ญํ | 'cat|dog' | i have a cat, dog is good |
์๋์ฐจ ํ๊ท ๋์ฌ ๊ธฐ๊ฐ ๊ตฌํ๊ธฐ
SELECT
CAR_ID
, ROUND(AVG(DATEDIFF(END_DATE, START_DATE) +1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVERAGE_DURATION >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC
์กฐ๊ฑด์ ๋ถํฉํ๋ ์ค๊ณ ๊ฑฐ๋ ์ํ ์กฐํํ๊ธฐ
SELECT
BOARD_ID
, WRITER_ID
, TITLE
, PRICE
, CASE STATUS
WHEN 'SALE' THEN 'ํ๋งค์ค'
WHEN 'RESERVED' THEN '์์ฝ์ค'
WHEN 'DONE' THEN '๊ฑฐ๋์๋ฃ'
END STATUS
FROM USED_GOODS_BOARD
WHERE CREATED_DATE = DATE('2022-10-05')
ORDER BY BOARD_ID DESC
์กฐ๊ฑด์ ๋ง๋ ์์ดํ ๋ค์ ๊ฐ๊ฒฉ์ ์ดํฉ ๊ตฌํ๊ธฐ
SELECT SUM(PRICE) AS TOTAL_PRICE
FROM ITEM_INFO
WHERE RARITY = 'LEGEND'
ROOT ์์ดํ ๊ตฌํ๊ธฐ
SELECT
I.ITEM_ID
, I.ITEM_NAME
FROM ITEM_INFO AS I
JOIN ITEM_TREE AS T
ON I.ITEM_ID = T.ITEM_ID
WHERE PARENT_ITEM_ID IS NULL
ORDER BY ITEM_ID
์ ๊ทธ๋ ์ด๋ ๋ ์์ดํ ๊ตฌํ๊ธฐ
SELECT
ITEM_ID
, ITEM_NAME
, RARITY
FROM ITEM_INFO
WHERE ITEM_ID IN (SELECT T.ITEM_ID
FROM ITEM_INFO AS I
JOIN ITEM_TREE AS T
ON I.ITEM_ID = T.PARENT_ITEM_ID
WHERE RARITY = 'RARE')
ORDER BY ITEM_ID DESC
์กฐ๊ฑด์ ๋ง๋ ๊ฐ๋ฐ์ ์ฐพ๊ธฐ
ํ์ด 1. ๊ฐ์ฅ ์ ์์ ์ธ ํ์ด ๋๋
SELECT
ID
, EMAIL
, FIRST_NAME
, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (
SELECT SUM(CODE)
FROM SKILLCODES
WHERE NAME IN ('Python', 'C#'))
ORDER BY ID
ํ์ด 2.
SELECT
DISTINCT(ID)
, EMAIL
, FIRST_NAME
, LAST_NAME
FROM SKILLCODES AS S
JOIN DEVELOPERS AS D
ON S.CODE & D.SKILL_CODE
WHERE NAME = 'Python' OR NAME = 'C#'
ORDER BY ID
DISTINCT ํจ์ ์ค๋ช
- ์ค๋ณต๋๋ ๊ฐ์ ์ ๊ฑฐํ๊ณ ์กฐํํ๋ ๋ฐ ํ์ฉ๋จ
๋นํธ ์ฐ์ฐ์
- ์ผ๋ฐ์ ์ผ๋ก ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋นํธ ๋จ์๋ก ์กฐ์ํ๋ ๋ฐ ์ฌ์ฉ
๋นํธ ์ฐ์ฐ์(bitwise operator), ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ๋ก ์ดํดํด ๋ณด์.
๐๋นํธ ์ฐ์ฐ์๋? SQL ๊ธฐ์ด ๋ฌธ๋ฒ๋ง ๋ฐฐ์ด ์ํ์์ ํ๋ก๊ทธ๋๋จธ์ค SQL ๊ณ ๋์ Kit๋ฅผ ํ๋ ์ค ์ฒ์ ๋ณด๋ ์ฐ์ฐ์๋ฅผ ๋ฐ๊ฒฌํ๋ค. ํ์ &(AND)๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ธฐํธ์ธ๋ฐ, SQL์์๋ AND ์ฐ์ฐ์ ์ฌ์ฉ๋๊ณ , '๋นํธ ์ฐ
velog.io
์กฐ๊ฑด์ ๋ง๋ ์ฌ์ ์ ๋ณด ์กฐํํ๊ธฐ
SELECT
SUM(SCORE) AS SCORE
, E.EMP_NO
, EMP_NAME
, POSITION
, EMAIL
FROM HR_EMPLOYEES AS E
JOIN HR_GRADE AS G
ON E.EMP_NO = G.EMP_NO
GROUP BY G.EMP_NO
ORDER BY SCORE DESC
LIMIT 1
์ฐ๋ ๋ณ ํ๊ท ๋ฏธ์ธ๋จผ์ง ๋๋ ์กฐํํ๊ธฐ
SELECT
YEAR(YM) AS YEAR
, ROUND(AVG(PM_VAL1), 2) AS PM10
, ROUND(AVG(PM_VAL2), 2) AS 'PM2.5'
FROM AIR_POLLUTION
WHERE LOCATION2 = '์์'
GROUP BY YEAR
ORDER BY YEAR
ํน์ ๋ฌธ์๋ก ์ธํ ์ค๋ฅ ๋ฐ์!
- pm2.5 -> 'pm2.5' : ํน์ ๋ฌธ์๋ฅผ ํฌํจํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํ๋ก ๊ฐ์ธ์ฃผ๊ธฐ
๋ ธ์ ๋ณ ํ๊ท ์ญ ์ฌ์ด ๊ฑฐ๋ฆฌ ์กฐํํ๊ธฐ
SELECT
ROUTE
, CONCAT(ROUND(SUM(D_BETWEEN_DIST), 1), 'km') AS TOTAL_DISTANCE
, CONCAT(ROUND(AVG(D_BETWEEN_DIST), 2), 'km') AS AVERAGE_DISTANCE
FROM SUBWAY_DISTANCE
GROUP BY ROUTE
ORDER BY ROUTE DESC
CONCAT ํจ์
- ์ฌ๋ฌ ๋ฌธ์์ด์ ํ๋๋ก ํฉ์น๊ธฐ ์ํด ์ฌ์ฉ
๋ฌผ๊ณ ๊ธฐ ์ข ๋ฅ ๋ณ ์ก์ ์ ๊ตฌํ๊ธฐ
SELECT
COUNT(*) AS FISH_COUNT
, FISH_NAME
FROM FISH_INFO AS F
JOIN FISH_NAME_INFO AS N
ON F.FISH_TYPE = N.FISH_TYPE
GROUP BY FISH_NAME
ORDER BY FISH_COUNT DESC
์๋ณ ์ก์ ๋ฌผ๊ณ ๊ธฐ ์ ๊ตฌํ๊ธฐ
SELECT
COUNT(*) AS FISH_COUNT
, MONTH(TIME) AS MONTH
FROM FISH_INFO
GROUP BY MONTH
ORDER BY MONTH
ํน์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ก์ ์ด ์ ๊ตฌํ๊ธฐ
SELECT
COUNT(*) AS FISH_COUNT
FROM FISH_INFO AS F
JOIN FISH_NAME_INFO AS N
ON F.FISH_TYPE = N.FISH_TYPE
WHERE FISH_NAME IN ('BASS', 'SNAPPER')
๋ถ๊ธฐ๋ณ ๋ถํ๋ ๋์ฅ๊ท ์ ๊ฐ์ฒด ์ ๊ตฌํ๊ธฐ
SELECT
CONCAT(QUARTER(DIFFERENTIATION_DATE), 'Q') AS QUARTER
, COUNT(*) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER
- QUARTER : ๋ถ๊ธฐ (1,2,3,4)๋ก ์ถ๋ ฅ
์ฐ๋๋ณ ๋์ฅ๊ท ํฌ๊ธฐ์ ํธ์ฐจ ๊ตฌํ๊ธฐ
ํ์ด 1. JOIN ํ์ฉ
SELECT
YEAR(E.DIFFERENTIATION_DATE) AS YEAR
, (MAX_SIZE - SIZE_OF_COLONY) AS YEAR_DEV
, ID
FROM ECOLI_DATA AS E
JOIN (
SELECT
YEAR(DIFFERENTIATION_DATE) AS YEAR
, MAX(SIZE_OF_COLONY) AS MAX_SIZE
FROM ECOLI_DATA
GROUP BY YEAR
) AS M
ON M.YEAR = YEAR(E.DIFFERENTIATION_DATE)
ORDER BY YEAR, YEAR_DEV
ํ์ด 2. PARTITION ํ์ฉ
SELECT
YEAR(DIFFERENTIATION_DATE) AS YEAR
, (MAX_SIZE - SIZE_OF_COLONY) AS YEAR_DEV
, ID
FROM (
SELECT
*
, MAX(SIZE_OF_COLONY) OVER (PARTITION BY YEAR(DIFFERENTIATION_DATE)) AS MAX_SIZE
FROM ECOLI_DATA
) AS M
ORDER BY YEAR, YEAR_DEV
๋ฐ์ ์ค๋ฅ ํด๊ฒฐ - FROM ์ ์ ๋ณ์นญ : SQL ERROR (1248)
- FROM ์ ์ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ๋ณ์นญ์ ํ์์
- ์ด์ : SQL ์์ง์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํด ์ด๋ฆ์ ์๊ตฌํจ = ๋ชจ๋ ํ์ ํ ์ด๋ธ์๋ ๊ณ ์ ํ ๋ณ์นญ์ด ์์ด์ผ ํจ
> ๋ฐ๋ผ์ ํ์ด 2์์ From ์ ์์ ์๋กญ๊ฒ ๋ง๋ค์ด์ง ํ ์ด๋ธ์ ๋ณ์นญ์ ๋ฐ๋ก ์ฌ์ฉํ์ง ์๋๋ผ๋ ์ฌ์ฉํด์ผ ํจ
๋ถ๋ชจ์ ํ์ง์ ๋ชจ๋ ๊ฐ์ง๋ ๋์ฅ๊ท ์ฐพ๊ธฐ
SELECT
B.ID
, B.GENOTYPE
, A.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA AS A -- ๋ถ๋ชจ
JOIN ECOLI_DATA AS B -- ์์
ON A.ID = B.PARENT_ID
-- ๋ถ๋ชจ์ ๋์ GENOTYPE์ ๊ณ์ฐํ์ ๋ ๋ถ๋ชจ์ GENOTYPE๋ฅผ ๋ชจ๋ ๊ฐ์ง
WHERE A.GENOTYPE & B.GENOTYPE = A.GENOTYPE
ORDER BY ID
Lv. 3 ๋ฐ๋ก๊ฐ๊ธฐ
[ํ๋ก๊ทธ๋๋จธ์ค] MySQL Lv.3 ๋ฌธ์ ํ์ด ์ ๋ต ๋ชจ์ (feat. ์ฝ๋ฉํ ์คํธ)
๋ฌธ์ ํ์ด ๊ธฐ๊ฐ : 24๋ 12์ 24์ผ ~ 26์ผ ์ต์ ์์ผ๋ก ์ ๋ ฌํ ๋ฌธ์ ์์์ ๋๋ค ์์ด์ง ๊ธฐ๋ก ์ฐพ๊ธฐSELECT O.ANIMAL_ID , O.NAMEFROM ANIMAL_OUTS AS O LEFT JOIN ANIMAL_INS AS I ON O.ANIMAL_ID = I.ANIMAL_IDWHERE I.ANIMAL_ID IS NULLORDER
thswldud.tistory.com
[MySQL] ๊ธฐ๋ณธ SQL ๋ฌธ๋ฒ ์ด์ ๋ฆฌ & ๋ชจ์
โ๏ธ ์ฃผ์ - SELECT ์ ์์ ์์ฑํ ๋ณ์นญ์ Where ์ ์์ ์ฌ์ฉํ ์ ์์- Partition๊ณผ ๊ฐ์ ์๋์ฐ ํจ์๋ Where ์ ์์ ์ฌ์ฉํ ์ ์์ - ์๋ธ์ฟผ๋ฆฌ ๋ง๋ค๊ณ , ๋ณ์นญ ์ ์ฌ์ฉํด๋ ๋ง๋ค์ด์ผ ํจ ๐ NULL ์ฒ
thswldud.tistory.com