DB/SQL
SQL - 20250515
Geisha
2025. 5. 15. 17:32
๐ Python ๊ฐ๋ฐ์ ์ฐพ๊ธฐ – ์ฟผ๋ฆฌ ๋ถ์
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE SKILL_1 = 'Python'
OR SKILL_2 = 'Python'
OR SKILL_3 = 'Python'
ORDER BY ID ASC;
โ WHERE SKILL_1 = ‘Python’ OR …
- ์ธ ๊ฐ์ ์คํฌ ์ปฌ๋ผ ์ค ํ๋๋ผ๋ ‘Python’์ธ ๊ฐ๋ฐ์๋ง ํํฐ๋ง
- OR ์กฐ๊ฑด์ผ๋ก ๋ค์ค ํ๋ ๋น๊ต
- ์คํค๋ง๊ฐ ์์ง ๋ถ๋ฆฌ๋์ด ์์ง ์์ ์ ๊ทํ๋์ง ์์ ๊ตฌ์กฐ์์ ์์ฃผ ์ฌ์ฉ
โ ORDER BY ID ASC
- ID ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
๐งพ ๊ฒ์๊ธ 3๊ฑด ์ด์ ์์ฑํ ์ฌ์ฉ์ ์ ๋ณด ์กฐํ – ์ฟผ๋ฆฌ ๋ถ์
SELECT UU.USER_ID,
UU.NICKNAME,
CONCAT(CITY, ' ', UU.STREET_ADDRESS1, ' ', IFNULL(UU.STREET_ADDRESS2, '')) AS '์ ์ฒด์ฃผ์',
CONCAT(SUBSTRING(TLNO, 1, 3), '-', SUBSTRING(TLNO, 4, 4), '-', SUBSTRING(TLNO, 8, 4)) AS '์ ํ๋ฒํธ'
FROM USED_GOODS_BOARD UB
LEFT JOIN USED_GOODS_USER UU
ON UB.WRITER_ID = UU.USER_ID
GROUP BY UU.USER_ID
HAVING COUNT(*) > 2
ORDER BY UU.USER_ID DESC;
โ LEFT JOIN ON
- ๊ฒ์๊ธ ํ ์ด๋ธ๊ณผ ์ฌ์ฉ์ ํ ์ด๋ธ์ WRITER_ID = USER_ID๋ก ์ฐ๊ฒฐ
- ์์ฑ์ ์ ๋ณด + ๊ฒ์๊ธ ์ ๋ณด ๊ฒฐํฉ
โ CONCAT + IFNULL
CONCAT(CITY, ' ', STREET_ADDRESS1, ' ', IFNULL(STREET_ADDRESS2, ''))
- ์ ์ฒด ์ฃผ์ ์ถ๋ ฅ์ฉ ๊ฐ๊ณต
- STREET_ADDRESS2๊ฐ NULL์ผ ๊ฒฝ์ฐ ๊ณต๋ฐฑ ์ฒ๋ฆฌ
โ CONCAT + SUBSTRING
CONCAT(SUBSTRING(TLNO, 1, 3), '-', SUBSTRING(TLNO, 4, 4), '-', SUBSTRING(TLNO, 8, 4))
- ์ ํ๋ฒํธ๋ฅผ 010-xxxx-xxxx ํ์์ผ๋ก ๋ณํ
โ GROUP BY + HAVING COUNT(*) > 2
- ์ฌ์ฉ์๋ณ๋ก ๊ทธ๋ฃนํํ ํ
- ๊ฒ์๊ธ์ด 3๊ฑด ์ด์์ธ ์ฌ์ฉ์๋ง ํํฐ๋ง
๐ฆ ๋์ฅ๊ท ํฌ๊ธฐ ๋ฑ๊ธ ๋ถ๋ฅ – ์ฟผ๋ฆฌ ๋ถ์
SELECT
ID,
CASE
WHEN SIZE_OF_COLONY <= 100 THEN 'LOW'
WHEN SIZE_OF_COLONY <= 1000 THEN 'MEDIUM'
ELSE 'HIGH'
END AS SIZE
FROM ECOLI_DATA
ORDER BY ID;
โ CASE WHEN … THEN … ELSE … END
- SIZE_OF_COLONY ๊ฐ์ ๋ฐ๋ผ ํฌ๊ธฐ ๋ฑ๊ธ ๋ถ๋ฅ
- 100 ์ดํ → 'LOW'
- 101 ~ 1000 → 'MEDIUM'
- ๊ทธ ์ธ → 'HIGH'
- ์กฐ๊ฑด ์์๋๋ก ํ๊ฐ๋๋ฉฐ, ์ฒซ ์ผ์น ์กฐ๊ฑด์ด ์ ์ฉ๋จ
โ AS SIZE
- CASE๋ฌธ์ ๊ฒฐ๊ณผ์ ๋ณ์นญ(SIZE) ์ง์
- ์ต์ข ์ถ๋ ฅ ์ปฌ๋ผ๋ช
๐ฃ ๋ฌผ๊ณ ๊ธฐ ํ๊ท ๊ธธ์ด ๊ตฌํ๊ธฐ – ์ฟผ๋ฆฌ ๋ถ์
SELECT ROUND(AVG(IFNULL(LENGTH, 10)), 2) AS AVERAGE_LENGTH
FROM FISH_INFO;
โ IFNULL(LENGTH, 10)
- LENGTH ๊ฐ์ด NULL์ด๋ฉด 10์ผ๋ก ๋์ฒด
- ํ๊ท ๊ณ์ฐ ์ ๋๋ฝ ๋ฐฉ์ง
โ AVG(…)
- ๋ชจ๋ LENGTH ๊ฐ์ ํ๊ท ๊ณ์ฐ
- ๋์ฒด๋ ๊ฐ(10)๋ ํฌํจํ์ฌ ํ๊ท ์ฐ์ถ
โ ROUND(…, 2)
- ํ๊ท ๊ฒฐ๊ณผ๋ฅผ ์์ ๋์งธ ์๋ฆฌ๊น์ง ๋ฐ์ฌ๋ฆผ
๐พ ์์ด์ง ๊ธฐ๋ก ์ฐพ๊ธฐ – ์ฟผ๋ฆฌ ๋ถ์
SELECT AO.ANIMAL_ID, AO.NAME
FROM ANIMAL_OUTS AO
LEFT JOIN ANIMAL_INS AI
ON AI.ANIMAL_ID = AO.ANIMAL_ID
WHERE ISNULL(AI.ANIMAL_ID);
โ LEFT JOIN ON
- ANIMAL_OUTS ๊ธฐ์ค์ผ๋ก ANIMAL_INS์ ์ฐ๊ฒฐ
- ๋ชจ๋ ์ถ์ ๊ธฐ๋ก์ ์ ์งํ๋ฉด์, ์ ์ ๊ธฐ๋ก์ด ์๋์ง ํ์ธ
โ WHERE ISNULL(AI.ANIMAL_ID)
- ์ ์ ๊ธฐ๋ก์ด ์กด์ฌํ์ง ์๋ ๋๋ฌผ๋ง ํํฐ๋ง
- JOIN ๊ฒฐ๊ณผ์์ AI.ANIMAL_ID๊ฐ NULL์ธ ๊ฒฝ์ฐ๋ง ์ถ์ถ
- → ์ ์ ์ ๋ณด๊ฐ ์๋ ์ํ์์ ์ถ์ ์ฒ๋ฆฌ๋ ๋๋ฌผ
๐ ์ค๊ณ ๊ฑฐ๋ ์ํ ํ๊ธ๋ก ํ์ – ์ฟผ๋ฆฌ ๋ถ์
SELECT BOARD_ID, WRITER_ID, TITLE, PRICE,
CASE
WHEN STATUS = 'DONE' THEN '๊ฑฐ๋์๋ฃ'
WHEN STATUS = 'SALE' THEN 'ํ๋งค์ค'
ELSE '์์ฝ์ค'
END AS 'STATUS'
FROM USED_GOODS_BOARD
WHERE CREATED_DATE = '2022-10-05'
ORDER BY BOARD_ID DESC;
โ CASE WHEN … THEN … ELSE … END
- ๊ฑฐ๋ ์ํ ์ฝ๋(STATUS)๋ฅผ ํ๊ธ๋ก ๋งคํ
- DONE → ๊ฑฐ๋์๋ฃ
- SALE → ํ๋งค์ค
- ๊ทธ ์ธ → ์์ฝ์ค
โ WHERE CREATED_DATE = ‘2022-10-05’
- ์์ฑ์ผ์ด 2022๋ 10์ 5์ผ์ธ ๊ฒ์๊ธ๋ง ํํฐ๋ง
โ ORDER BY BOARD_ID DESC
- BOARD_ID ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
๐ 2021๋ ์ ์กํ ๋ฌผ๊ณ ๊ธฐ ์ – ์ฟผ๋ฆฌ ๋ถ์
SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO
WHERE YEAR(TIME) = 2021;
โ YEAR(TIME) = 2021
- TIME ์ปฌ๋ผ์์ ์ฐ๋๋ง ์ถ์ถํ์ฌ
- 2021๋ ์ธ ๋ฐ์ดํฐ๋ง ํํฐ๋ง
โ COUNT(*)
- ์กฐ๊ฑด์ ๋ถํฉํ๋ ์ ์ฒด ํ ์ ๊ณ์ฐ
- → 2021๋ ์ ์กํ ๋ฌผ๊ณ ๊ธฐ ๊ฐ์
โฑ๏ธ ์ต๋๊ฐ ๊ตฌํ๊ธฐ – ์ฟผ๋ฆฌ ๋ถ์
SELECT MAX(DATETIME) AS '์๊ฐ'
FROM ANIMAL_INS;
โ MAX(DATETIME)
- DATETIME ์ปฌ๋ผ์์ ๊ฐ์ฅ ํฐ ๊ฐ(๊ฐ์ฅ ๋ฆ์ ์๊ฐ) ์ถ์ถ
- ์๊ฐ ๊ธฐ์ค ์ต๋๊ฐ ์กฐํ
โ AS ‘์๊ฐ’
- ๊ฒฐ๊ณผ ์ปฌ๋ผ๋ช ์ '์๊ฐ'์ผ๋ก ์ง์
- ์ถ๋ ฅ ์ ์ฌ์ฉ์ ์นํ์ ์ปฌ๋ผ๋ช ํํ
๐ฅ ์ทจ์๋์ง ์์ ์ง๋ฃ ์์ฝ ์กฐํํ๊ธฐ – ์ฟผ๋ฆฌ ๋ถ์
SELECT AP.APNT_NO,
PT.PT_NAME,
PT.PT_NO,
AP.MCDP_CD,
DR.DR_NAME,
AP.APNT_YMD
FROM APPOINTMENT AP
JOIN DOCTOR DR ON AP.MDDR_ID = DR.DR_ID
JOIN PATIENT PT ON AP.PT_NO = PT.PT_NO
WHERE AP.APNT_CNCL_YN = 'N'
AND DATE(AP.APNT_YMD) = '2022-04-13'
AND AP.MCDP_CD = 'CS'
ORDER BY AP.APNT_YMD;
โ JOIN … ON
- APPOINTMENT ↔ DOCTOR: ์์ฌ ์ด๋ฆ ์กฐํ์ฉ
- APPOINTMENT ↔ PATIENT: ํ์ ์ด๋ฆ๊ณผ ๋ฒํธ ์ฐ๊ฒฐ
โ WHERE AP.APNT_CNCL_YN = ‘N’
- ์ทจ์๋์ง ์์ ์์ฝ๋ง ์กฐํ
โ DATE(AP.APNT_YMD) = ‘2022-04-13’
- APNT_YMD๊ฐ DATETIME์ธ ๊ฒฝ์ฐ, ๋ ์ง๋ง ์๋ผ์ ๋น๊ต
- ์๊ฐ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ด๋ '2022-04-13 09:30:00' → 2022-04-13์ผ๋ก ๋น๊ต๋จ
โ AP.MCDP_CD = ‘CS’
- ์ง๋ฃ ๊ณผ๋ชฉ์ด 'CS' (ํ๋ถ์ธ๊ณผ)์ธ ๊ฒฝ์ฐ๋ง ํํฐ๋ง
โ ORDER BY AP.APNT_YMD
- ์์ฝ ์ผ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
๐งฉ ๊ด๋ จ ํจ์ ์ ๋ฆฌ (MySQL ๊ธฐ์ค)
๋ชฉ์ | ์ฌ์ฉ ์ | ์ค๋ช |
๋ ์ง ์ถ์ถ | DATE(datetime) | ์๊ฐ ์ ๊ฑฐ ํ ๋ ์ง๋ง ์ถ์ถ |
์ฐ๋ ์ถ์ถ | YEAR(datetime) | ์ฐ๋๋ง ์ถ์ถ |
๋ฌธ์์ด ๋น๊ต์ฉ ํฌ๋งท | 'YYYY-MM-DD' | ๋ ์ง ํํฐ๋ง์ ์ฌ์ฉ |
๐ง๐ผ ๊ฐ์ฅ ๋์ ํ๊ฐ์ ์๋ฅผ ๋ฐ์ ์ฌ์ ์กฐํ – ์ฟผ๋ฆฌ ๋ถ์
SELECT SUM(SCORE) AS SCORE,
HE.EMP_NO,
HE.EMP_NAME,
HE.POSITION,
HE.EMAIL
FROM HR_EMPLOYEES HE
JOIN HR_GRADE HG ON HG.EMP_NO = HE.EMP_NO
GROUP BY HG.EMP_NO
ORDER BY SCORE DESC
LIMIT 1;
โ JOIN … ON
- HR_EMPLOYEES์ HR_GRADE๋ฅผ ์ฌ๋ฒ(EMP_NO) ๊ธฐ์ค์ผ๋ก ์ฐ๊ฒฐ
- ์ฌ์ ์ ๋ณด + ํ๊ฐ ์ ์๋ฅผ ํจ๊ป ์กฐํ
โ SUM(SCORE)
- ์ฌ์๋ณ ์ด ํ๊ฐ ์ ์ ํฉ์ฐ
โ GROUP BY HG.EMP_NO
- ์ฌ๋ฒ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ
- ํ๊ฐ ์ ์๊ฐ ์ฌ๋ฌ ๊ฑด์ผ ๊ฒฝ์ฐ, ์ฌ์๋ณ๋ก ๋ฌถ์ด์ ์ง๊ณ
โ ORDER BY SCORE DESC
- ์ด์ ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
- ์ ์๊ฐ ๋์ ์ฌ์์ด ์๋ก ์ ๋ ฌ๋จ
โ LIMIT 1
- ์์ 1๋ช ๋ง ์กฐํ
- ๊ฐ์ฅ ๋์ ์ ์๋ฅผ ๋ฐ์ ์ฌ์ ์ถ์ถ
๐ฃ ํน์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ก์ ์ด ์ ๊ตฌํ๊ธฐ – ์ฟผ๋ฆฌ ๋ถ์
SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO FI
JOIN FISH_NAME_INFO FN
ON FI.FISH_TYPE = FN.FISH_TYPE
WHERE FN.FISH_NAME = 'BASS' OR FN.FISH_NAME = 'SNAPPER';
โ JOIN … ON
- ๋ฌผ๊ณ ๊ธฐ ์ ๋ณด(FISH_INFO)์ ์ด๋ฆ ์ ๋ณด(FISH_NAME_INFO)๋ฅผ
- FISH_TYPE ๊ธฐ์ค์ผ๋ก ์ฐ๊ฒฐ
โ WHERE … OR …
- FISH_NAME์ด 'BASS' ๋๋ 'SNAPPER'์ธ ๋ฌผ๊ณ ๊ธฐ๋ง ํํฐ๋ง
- ์กฐ๊ฑด์ ํด๋นํ๋ ๋ฌผ๊ณ ๊ธฐ ์๋ง ์ง๊ณ
๐ ์๋์ฐจ ๋์ฌ ๊ธฐ๋ก์์ ๋์ฌ์ค/๋์ฌ ๊ฐ๋ฅ ์ฌ๋ถ ๊ตฌ๋ถํ๊ธฐ – ์ฟผ๋ฆฌ ๋ถ์
SELECT DISTINCT CAR_ID,
CASE
WHEN CAR_ID IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE
) THEN '๋์ฌ์ค'
ELSE '๋์ฌ ๊ฐ๋ฅ'
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
ORDER BY CAR_ID DESC;
โ CASE WHEN … THEN … ELSE … END
- ์๋ธ์ฟผ๋ฆฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋์ฌ ์ํ๋ฅผ ๋ถ๋ฅ
- ์กฐ๊ฑด ๋ง์กฑ ์ → '๋์ฌ์ค'
- ์กฐ๊ฑด ๋ถ๋ง์กฑ ์ → '๋์ฌ ๊ฐ๋ฅ'
โ ์๋ธ์ฟผ๋ฆฌ + BETWEEN START_DATE AND END_DATE
'2022-10-16' BETWEEN START_DATE AND END_DATE
- 2022-10-16์ด ๋์ฌ ๊ธฐ๊ฐ ๋ด์ ํฌํจ๋๋์ง ํ์ธ
- ํฌํจ๋๋ค๋ฉด ํด๋น ์ฐจ๋์ ํ์ฌ ๋์ฌ์ค
โ DISTINCT CAR_ID
- ์ค๋ณต๋ ๋์ฌ ์ด๋ ฅ์ ์ ๊ฑฐํ๊ณ ์ฐจ๋๋ณ๋ก ํ ๋ฒ์ฉ๋ง ์กฐํ
โ ORDER BY CAR_ID DESC
- ์ฐจ๋ ID ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
๐ ์ฌ๊ตฌ๋งค๊ฐ ์ผ์ด๋ ์ํ๊ณผ ํ์ ๋ฆฌ์คํธ ๊ตฌํ๊ธฐ – ์ฟผ๋ฆฌ ๋ถ์
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC;
โ GROUP BY USER_ID, PRODUCT_ID
- ํ์-์ํ ์กฐํฉ๋ณ๋ก ๋ฌถ์ด์
- ๊ฐ์ ํ์์ด ๋์ผ ์ํ์ ์ฌ๋ฌ ๋ฒ ๊ตฌ๋งคํ๋์ง ํ์ธ
โ HAVING COUNT(*) >= 2
- ๊ทธ๋ฃน ๋ด ๊ตฌ๋งค ํ์๊ฐ 2ํ ์ด์์ธ ๊ฒฝ์ฐ๋ง ์ถ์ถ
- HAVING์ ์ง๊ณ ์กฐ๊ฑด ํํฐ๋ง์ ์ฌ์ฉ
โ ORDER BY USER_ID, PRODUCT_ID DESC
- USER_ID ์ค๋ฆ์ฐจ์
- ๊ฐ์ ์ฌ์ฉ์ ๋ด์์๋ PRODUCT_ID๋ฅผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
๐ ์๋์ฐจ ๋์ฌ ๊ธฐ๋ก์์ ์ฅ๊ธฐ/๋จ๊ธฐ ๋์ฌ ๊ตฌ๋ถํ๊ธฐ – ์ฟผ๋ฆฌ ๋ถ์
SELECT
HISTORY_ID,
CAR_ID,
DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE,
DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE,
CASE
WHEN DATEDIFF(END_DATE, START_DATE) >= 29 THEN '์ฅ๊ธฐ ๋์ฌ'
ELSE '๋จ๊ธฐ ๋์ฌ'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, '%Y-%m') = '2022-09'
ORDER BY HISTORY_ID DESC;
โ DATE_FORMAT(START_DATE, ‘%Y-%m’)
- START_DATE์์ ๋ -์ ๋จ์๋ง ์ถ์ถ
- '2022-09'๊ณผ ์ผ์นํ๋ ๋ ์ฝ๋๋ง ํํฐ๋ง
โ DATEDIFF(END_DATE, START_DATE)
- ๋์ฌ์ผ ์ ๊ณ์ฐ (์ข ๋ฃ์ผ - ์์์ผ)
- ๊ฒฐ๊ณผ๊ฐ 29์ผ ์ด์์ด๋ฉด → ‘์ฅ๊ธฐ ๋์ฌ’
โ CASE WHEN … THEN … ELSE … END
- DATEDIFF ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋์ฌ ์ ํ ๋ถ๋ฅ
- 29์ผ ์ด์ → '์ฅ๊ธฐ ๋์ฌ'
- ๊ทธ ์ธ → '๋จ๊ธฐ ๋์ฌ'
โ DATE_FORMAT(…, ‘%Y-%m-%d’)
- ๋ ์ง๋ฅผ YYYY-MM-DD ํ์์ผ๋ก ๊ฐ๊ณต ์ถ๋ ฅ
- ๋ณด๊ธฐ ์ข์ ์ถ๋ ฅ์ฉ ํฌ๋งท ์ฒ๋ฆฌ
๐ ์๋์ฐจ ํ๊ท ๋์ฌ ๊ธฐ๊ฐ ๊ตฌํ๊ธฐ – ์ฟผ๋ฆฌ ๋ถ์
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 ROUND(AVG(DATEDIFF(END_DATE, START_DATE) + 1), 1) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;
โ DATEDIFF(END_DATE, START_DATE) + 1
- ๋์ฌ ๊ธฐ๊ฐ ๊ณ์ฐ
- DATEDIFF๋ ์ข ๋ฃ์ผ๊ณผ ์์์ผ์ ์ฐจ์ด(์ผ์)๋ฅผ ๋ฐํ
- ๋น์ผ ํฌํจ์ ์ํด +1 ์ฒ๋ฆฌ
โ AVG(…), ROUND(…, 1)
- ์ฐจ๋๋ณ ํ๊ท ๋์ฌ ์ผ์ ๊ณ์ฐ
- ROUND(..., 1)๋ก ์์ ์ฒซ์งธ ์๋ฆฌ๊น์ง ๋ฐ์ฌ๋ฆผ
โ GROUP BY CAR_ID
- ์ฐจ๋๋ณ๋ก ๊ทธ๋ฃนํํ์ฌ ํ๊ท ๊ณ์ฐ
โ HAVING … >= 7
- ํ๊ท ๋์ฌ ๊ธฐ๊ฐ์ด 7์ผ ์ด์์ธ ์ฐจ๋๋ง ํํฐ๋ง
- HAVING์ ์ง๊ณ ํจ์ ํํฐ๋ง์ ์ฌ์ฉ
โ ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC
- ํ๊ท ๊ธฐ๊ฐ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
- ๋์ผ ํ๊ท ์ผ ๊ฒฝ์ฐ CAR_ID๋ก ๋ค์ ์ ๋ ฌ
๐๏ธ ์กฐํ์๊ฐ ๊ฐ์ฅ ๋ง์ ๊ฒ์๊ธ์ ์ฒจ๋ถํ์ผ ์กฐํํ๊ธฐ – ์ฟผ๋ฆฌ ๋ถ์
SELECT
CONCAT('/home/grep/src/', BOARD_ID, '/', FILE_ID, FILE_NAME, FILE_EXT) AS FILE_PATH
FROM USED_GOODS_FILE
WHERE BOARD_ID = (
SELECT BOARD_ID
FROM USED_GOODS_BOARD
ORDER BY VIEWS DESC
LIMIT 1
)
ORDER BY FILE_ID DESC;
โ ์๋ธ์ฟผ๋ฆฌ: ๊ฒ์ํ ์กฐํ์ ๊ธฐ์ค ์ ๋ ฌ
SELECT BOARD_ID
FROM USED_GOODS_BOARD
ORDER BY VIEWS DESC
LIMIT 1
- ๊ฐ์ฅ ์กฐํ์๊ฐ ๋์ ๊ฒ์๊ธ์ ID 1๊ฑด ์ถ์ถ
โ WHERE BOARD_ID = (…)
- USED_GOODS_FILE ํ ์ด๋ธ์์
- ํด๋น ๊ฒ์๊ธ(BOARD_ID)์ ์ฐ๊ฒฐ๋ ์ฒจ๋ถํ์ผ๋ง ํํฐ๋ง
โ CONCAT(…)
CONCAT('/home/grep/src/', BOARD_ID, '/', FILE_ID, FILE_NAME, FILE_EXT)
- ํ์ผ ๊ฒฝ๋ก ๊ฐ๊ณต
- ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก + ํ์ผ๋ช + ํ์ฅ์ ํํ๋ก ๋ฌธ์์ด ํฉ์นจ
โ ORDER BY FILE_ID DESC
- ํ์ผ ID ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
- ์ต๊ทผ ํ์ผ์ด ์์ ์ค๋๋ก ์ ๋ ฌ
๐ ์ ์ · ์นดํ ๊ณ ๋ฆฌ๋ณ 2022๋ 1์ ๋งค์ถ ์ง๊ณ – ์ฟผ๋ฆฌ ๋ถ์
SELECT AU.AUTHOR_ID,
AU.AUTHOR_NAME,
BK.CATEGORY,
SUM(BS.SALES * BK.PRICE) AS TOTAL_SALES
FROM BOOK_SALES BS
JOIN BOOK BK ON BS.BOOK_ID = BK.BOOK_ID
JOIN AUTHOR AU ON BK.AUTHOR_ID = AU.AUTHOR_ID
WHERE DATE_FORMAT(BS.SALES_DATE, '%Y-%m') = '2022-01'
GROUP BY AU.AUTHOR_ID, BK.CATEGORY
ORDER BY AU.AUTHOR_ID, BK.CATEGORY DESC;
โ JOIN … ON
- BOOK_SALES → BOOK: ๋์ ๊ฐ๊ฒฉ๊ณผ ์นดํ ๊ณ ๋ฆฌ ํ์ธ
- BOOK → AUTHOR: ์ ์ ์ด๋ฆ ์ฐ๊ฒฐ
โ SALES * PRICE
- ๋์ ํ๋งค ์๋ × ๋์ ๊ฐ๊ฒฉ = ๋งค์ถ์ก
- ๋ชจ๋ ํ๋งค ๊ธฐ๋ก์ ๋ํด ๊ณฑ์ ์ํ
โ SUM(…)
- ๋์ผ ์ ์, ๋์ผ ์นดํ ๊ณ ๋ฆฌ ๋ด ๋งค์ถ์ ์ดํฉ
โ DATE_FORMAT(SALES_DATE, ‘%Y-%m’) = ‘2022-01’
- SALES_DATE๋ฅผ 'YYYY-MM' ํ์์ผ๋ก ๋ณํ
- 2022๋ 1์ ํ๋งค ๊ธฐ๋ก๋ง ํํฐ๋ง
โ GROUP BY AUTHOR_ID, CATEGORY
- ์ ์ ID + ์นดํ ๊ณ ๋ฆฌ ๋จ์๋ก ๋งค์ถ ์ง๊ณ
โ ORDER BY AUTHOR_ID, CATEGORY DESC
- ์ ์ ID ์ค๋ฆ์ฐจ์ → ์นดํ ๊ณ ๋ฆฌ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ