Post

โœ๐Ÿป programmers Lv2. MySQL 7๋ฌธ์ œ(24.10.22)

โœ๐Ÿป programmers Lv2. MySQL 7๋ฌธ์ œ(24.10.22)

programmers Lv2. MySQL 7๋ฌธ์ œ(24.10.22)

57) ์กฐ๊ฑด์— ๋งž๋Š” ์‚ฌ์› ์ •๋ณด ์กฐํšŒํ•˜๊ธฐ

  • HR_DEPARTMENT, HR_EMPLOYEES, HR_GRADE ํ…Œ์ด๋ธ”์—์„œ 2022๋…„๋„ ํ•œํ•ด ํ‰๊ฐ€ ์ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์‚ฌ์› ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋ ค ํ•œ๋‹ค. 2022๋…„๋„ ํ‰๊ฐ€ ์ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์‚ฌ์›๋“ค์˜ ์ ์ˆ˜, ์‚ฌ๋ฒˆ, ์„ฑ๋ช…, ์ง์ฑ…, ์ด๋ฉ”์ผ์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑ. 2022๋…„๋„์˜ ํ‰๊ฐ€ ์ ์ˆ˜๋Š” ์ƒ,ํ•˜๋ฐ˜๊ธฐ ์ ์ˆ˜์˜ ํ•ฉ์„ ์˜๋ฏธํ•˜๊ณ , ํ‰๊ฐ€ ์ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ปฌ๋Ÿผ์˜ ์ด๋ฆ„์€ SCORE๋กœ.
1
2
3
4
5
6
7
8
SELECT SUM(SCORE) AS 'SCORE', B.EMP_NO, B.EMP_NAME, B.POSITION, B.EMAIL
FROM HR_DEPARTMENT A 
JOIN HR_EMPLOYEES B ON A.DEPT_ID = B.DEPT_ID
JOIN HR_GRADE C ON B.EMP_NO = C.EMP_NO
WHERE C.YEAR = 2022
GROUP BY B.EMP_NO
ORDER BY SCORE DESC
LIMIT 1;



58) ์ž๋™์ฐจ ํ‰๊ท  ๋Œ€์—ฌ ๊ธฐ๊ฐ„ ๊ตฌํ•˜๊ธฐ

  • ROUND๋Š” ๋ฐ˜์˜ฌ๋ฆผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

  • DATEDIFF๋Š” ๋‚ ์งœ๋ฅผ ์ด์šฉํ•ด ๋Œ€์—ฌ ๊ธฐ๊ฐ„์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

1
2
3
4
5
6
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 AVG(DATEDIFF(END_DATE, START_DATE)+1) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;
  • DATEDIFF(END_DATE, START_DATE)+1 ์—ฌ๊ธฐ์„œ +1์„ ํ•˜๋Š” ์ด์œ ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด 2024-10-01์ด ๋Œ€์—ฌ ์‹œ์ž‘์ผ, 2024-10-03์ด ๋Œ€์—ฌ ์ข…๋ฃŒ์ผ์ด๋ผ๊ณ  ํ•  ๋•Œ 3-1=2์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋Œ€์—ฌ์ผ์€ 3์ด ๋˜์–ด์•ผํ•˜๋ฏ€๋กœ +1์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.



59) ํŠน์ • ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์€ ์ด ์ˆ˜ ๊ตฌํ•˜๊ธฐ

1
2
3
4
SELECT COUNT(A.FISH_TYPE) AS 'FISH_COUNT'
FROM FISH_INFO A 
JOIN FISH_NAME_INFO B ON A.FISH_TYPE = B.FISH_TYPE
WHERE B.FISH_NAME LIKE 'BASS' OR B.FISH_NAME LIKE 'SNAPPER'
  • ์–ด๋ ค์šด ๋ถ€๋ถ„ ์—†์—ˆ์Œ.



60) ๋…ธ์„ ๋ณ„ ํ‰๊ท  ์—ญ ์‚ฌ์ด ๊ฑฐ๋ฆฌ ์กฐํšŒํ•˜๊ธฐ

1
2
3
4
5
6
7
8
9
10
11
12
13
// ํ‹€๋ฆฐ ์ฝ”๋“œ
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 TOTAL_DISTANCE DESC;      


// ๋งž์€ ์ฝ”๋“œ
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 ROUND(SUM(D_BETWEEN_DIST),1) DESC;                                                                        
  • CONCAT() : ๋ฌธ์ž์—ด ๋ถ™์ด๋Š” ๋ฉ”์„œ๋“œ

    • ์ €๋ฒˆ์— CONnect + CAT : ๊ณ ์–‘์ด๊ฐ€ ๊ท€์—ฝ๊ฒŒ ์—ฐ๊ฒฐ๋ผ์„œ ๋ฌธ์ž๋ฅผ ๋ถ™์ธ๋‹ค๋กœ ์™ธ์› ๋Š”๋ฐ ์ƒ๊ฐ์ด ์•ˆ ๋‚˜์„œ RIGHT๋ž‘ ํ˜ผ๋™ํ•จ.

    • RIGHT๋Š” ์˜ค๋ฅธ์ชฝ ๋ช‡ ๊ธ€์ž ์ถ”์ถœํ•  ๋•Œ ์“ฐ์ž„.

  • CONCAT()์„ ์ด์šฉํ•ด ๋ฌธ์ž๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ •๋ ฌ์ด ์•Œ๋งž๊ฒŒ ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ CONCAT()์„ ๋บ€ ์ƒํƒœ๋กœ ์ •๋ ฌ ํ•ด์•ผ๋œ๋‹ค.



61) ๋ถ„๊ธฐ๋ณ„ ๋ถ„ํ™”๋œ ๋Œ€์žฅ๊ท ์˜ ๊ฐœ์ฒด ์ˆ˜ ๊ตฌํ•˜๊ธฐ

1
2
3
4
5
SELECT CONCAT(QUARTER(DIFFERENTIATION_DATE),'Q') AS 'QUARTER',
    COUNT(*) AS 'ECOLI_COUNT'
FROM ECOLI_DATA 
GROUP BY QUARTER
ORDER BY QUARTER
  • QUARTER() ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์–ด์ง„ ๋‚ ์งœ๊ฐ€ ์†ํ•˜๋Š” ๋ถ„๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ถ„๊ธฐ๋Š” 1๋…„์„ ๋„ค ๊ฐœ์˜ ๊ตฌ๊ฐ„์œผ๋กœ ๋‚˜๋ˆˆ ๊ฒƒ์ด๋ฉฐ

  • 1๋ถ„๊ธฐ (Q1): 1์›” 1์ผ ~ 3์›” 31์ผ
  • 2๋ถ„๊ธฐ (Q2): 4์›” 1์ผ ~ 6์›” 30์ผ
  • 3๋ถ„๊ธฐ (Q3): 7์›” 1์ผ ~ 9์›” 30์ผ
  • 4๋ถ„๊ธฐ (Q4): 10์›” 1์ผ ~ 12์›” 31์ผ

  • ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.



62) ์—…๊ทธ๋ ˆ์ด๋“œ ๋œ ์•„์ดํ…œ ๊ตฌํ•˜๊ธฐ

1
2
3
4
5
6
7
8
9
10
11
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 
    B.PARENT_ITEM_ID IN
    (
        SELECT ITEM_ID
        FROM ITEM_INFO
        WHERE RARITY = 'RARE'
    )
ORDER BY A.ITEM_ID DESC;
  • ๋จผ์ € ๋ฌธ์ œ๊ฐ€ ์ดํ•ด๊ฐ€ ์•ˆ ๋ผ์„œ ํ•œ์ฐธ์„ ๊ณ ๋ฏผํ–ˆ๋‹ค.

  • ์•„์ดํ…œ์˜ ํฌ๊ท€๋„๊ฐ€ โ€˜RAREโ€™์ธ ์•„์ดํ…œ๋“ค์˜ ๋ชจ๋“  ๋‹ค์Œ ์—…๊ทธ๋ ˆ์ด๋“œ ์•„์ดํ…œ์˜ ์•„์ดํ…œ ID(ITEM_ID), ์•„์ดํ…œ ๋ช…(ITEM_NAME), ์•„์ดํ…œ์˜ ํฌ๊ท€๋„(RARITY)๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ธ๋ฐ

ITEM_IDPARENT_ITEM_ID
0NULL
10
20
31
41
ITEM_IDITEM_NAMERARITYPRICE
0ITEM_ARARE10000
1ITEM_BRARE9000
2ITEM_CLEGEND11000
3ITEM_DRARE10000
4ITEM_ERARE12000
  • ํ•ด๋‹น ํ‘œ๋Š” ITEM_TREE ํ…Œ์ด๋ธ”์˜ PARENT_ITEM_ID ํ•„๋“œ๊ฐ€ 0์ธ ๊ฒƒ์€ ITEM_ID๊ฐ€ 1, 2 ์ด๊ณ  ์ด๊ฒƒ์€ ITEM_A๊ฐ€ ITEM_B์™€ ITEM_C๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๊ณ  ITEM_B๊ฐ€ ITEM_D์™€ ITEM_E๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

  • ์ด๊ฒƒ์€ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜๊ธฐ ์ „์˜ ITEM_ID์˜ RARITY๊ฐ€ โ€˜RAREโ€™์–ด์•ผ ๋˜๊ณ  ์ฆ‰, ๋‹ค์‹œ ๋งํ•ด ๋ถ€๋ชจ ์•„์ดํ…œ์ด ํฌ๊ท€๋„๊ฐ€ โ€˜RAREโ€™์ธ ์•„์ดํ…œ์ด์–ด์•ผ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์—…๊ทธ๋ ˆ์ด๋“œ ์ „ RARITY๊ฐ€ โ€˜RAREโ€™์ธ ๊ฒƒ์„ ํ‘œ์‹œํ–ˆ๋‹ค.



63) ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐœ๋ฐœ์ž ์ฐพ๊ธฐ

1
2
3
4
5
6
7
8
9
10
11
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (
    SELECT CODE
    FROM SKILLCODES
    WHERE NAME LIKE 'Python') 
    OR SKILL_CODE & (
    SELECT CODE
    FROM SKILLCODES
    WHERE NAME LIKE 'C#')
ORDER BY ID ASC;
  • SKILL_CODE & ์—ฐ์‚ฐ์€ ๋น„ํŠธwise AND ์—ฐ์‚ฐ์ž๋กœ, ๋‘ ๊ฐ’์˜ ๋น„ํŠธ๊ฐ€ ๋ชจ๋‘ 1์ธ ๊ฒฝ์šฐ์—๋งŒ 1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ๊ณผ์—ฐ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ์€ ์–ธ์ œ์ผ๊นŒ?

    • ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์— ํ•„์š”ํ•œ ๊ฐ’์ด ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ์žˆ์„ ๋•Œ

      • ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’์„ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•  ๋•Œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
This post is licensed under CC BY 4.0 by the author.