Post

โœ๐Ÿป programmers Lv3. MySQL ์™„๋ฃŒ(24.12.20)

66) ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋ณดํ˜ธํ•œ ๋™๋ฌผ(1)

1
2
3
4
5
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A 
LEFT JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.DATETIME IS NULL
ORDER BY A.DATETIME LIMIT 3;

LEFT JOIN์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” INNER JOIN์€ ๋‘ ํ…Œ์ด๋ธ” ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ANIMAL_INS์—๋งŒ ์žˆ๋Š” ๋™๋ฌผ์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.

์—ฌ๊ธฐ์„œ ANIMAL_OUTS๋Š” ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผ๋œ๋‹ค.

LEFT JOIN์€ ANIMAL_INS์— ์žˆ๋Š” ๋ชจ๋“  ๋™๋ฌผ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ANIMAL_OUTS์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ NULL์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.


67) ์กฐ๊ฑด๋ณ„๋กœ ๋ถ„๋ฅ˜ํ•˜์—ฌ ์ฃผ๋ฌธ์ƒํƒœ ์ถœ๋ ฅํ•˜๊ธฐ

1
2
3
4
5
6
7
8
SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE, '%Y-%m-%d') AS OUT_DATE, 
    CASE
        WHEN OUT_DATE <= '2022-05-01' THEN '์ถœ๊ณ ์™„๋ฃŒ'
        WHEN OUT_DATE > '2022-05-01' THEN '์ถœ๊ณ ๋Œ€๊ธฐ'
        ELSE '์ถœ๊ณ ๋ฏธ์ •'
    END '์ถœ๊ณ ์—ฌ๋ถ€'
FROM FOOD_ORDER
ORDER BY ORDER_ID ASC;

๋‚ ์งœ ํ˜•์‹์€ DATE_FORMAT์œผ๋กœ ๋ฐ”๊ฟ”์„œ ์ถœ๋ ฅ

์กฐ๊ฑด๋ฌธ CASE WHEN ELSE END ๊ธฐ์–ตํ•˜๊ธฐ


68) ์žˆ์—ˆ๋Š”๋ฐ์š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค

1
2
3
4
5
SELECT A.ANIMAL_ID, B.NAME 
FROM ANIMAL_INS A 
JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME > B.DATETIME
ORDER BY A.DATETIME;


69) ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋ณดํ˜ธํ•œ ๋™๋ฌผ(2)

1
2
3
4
5
SELECT A.ANIMAL_ID, B.NAME
FROM ANIMAL_INS A 
JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY DATEDIFF(B.DATETIME, A.DATETIME) DESC
LIMIT 2;

ORDER BY DATEDIFF(B.DATETIME, A.DATETIME) DESC ๋Š” B.DATETIME๊ณผ A.DATETIME์˜ ์ผ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ๋‚ ์งœ ์ฐจ์ด๊ฐ€ ํฐ ์ˆ˜๋ถ€ํ„ฐ ์ •๋ ฌ


70) ๋Œ€์—ฌ ๊ธฐ๋ก์ด ์กด์žฌํ•˜๋Š” ์ž๋™์ฐจ ๋ฆฌ์ŠคํŠธ ๊ตฌํ•˜๊ธฐ

1
2
3
4
5
6
SELECT DISTINCT A.CAR_ID 
FROM CAR_RENTAL_COMPANY_CAR A 
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B ON A.CAR_ID = B.CAR_ID
WHERE A.CAR_TYPE LIKE '์„ธ๋‹จ' AND 
MONTH(B.START_DATE) = '10'
ORDER BY A.CAR_ID DESC;

์ค‘๋ณต์ด ์—†์–ด์•ผ ๋˜๋ฉด : DISTINCT


71) ์กฐ๊ฑด์— ๋งž๋Š” ์‚ฌ์šฉ์ž์™€ ์ด ๊ฑฐ๋ž˜๊ธˆ์•ก ์กฐํšŒํ•˜๊ธฐ

1
2
3
4
5
6
7
8
SELECT B.USER_ID, B.NICKNAME, SUM(A.PRICE) AS 'TOTAL_SALES'
FROM USED_GOODS_BOARD A
JOIN USED_GOODS_USER B
ON A.WRITER_ID = B.USER_ID
WHERE A.STATUS = 'DONE'
GROUP BY B.USER_ID
HAVING TOTAL_SALES >= 700000
ORDER BY TOTAL_SALES;

๋จผ์ € ์ง‘๊ณ„ํ•จ์ˆ˜๋Š” SELECT๋ฌธ์—์„œ ์“ธ ์ˆ˜ ์—†๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๊ทธ๋ฃนํ™”๋œ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

TOTAL_SALES >= 700000 ํ•ด๋‹น ์กฐ๊ฑด์€ HAVING์ ˆ์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

WHERE ์ ˆ์€ ๊ทธ๋ฃนํ™” ์ด์ „์˜ ๋ฐ์ดํ„ฐ์— ์กฐ๊ฑด์„ ์ ์šฉํ•˜๊ณ , HAVING์€ ๊ทธ๋ฃนํ™”๋œ ํ›„์— ์กฐ๊ฑด์„ ์ ์šฉํ•˜๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.


72) ์ฆ๊ฒจ์ฐพ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์‹๋‹น ์ •๋ณด ์ถœ๋ ฅํ•˜๊ธฐ

1
2
3
4
5
6
7
8
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN(
    SELECT FOOD_TYPE, MAX(FAVORITES)
    FROM REST_INFO
    GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC;

์—ฌ๊ธฐ์„œ ์ฒ˜์Œ์—๋Š”

1
2
3
4
SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC;

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ’€์—ˆ์—ˆ๋Š”๋ฐ ์ด๊ฒŒ ์„ฑ๋ฆฝ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” SELECT๋ฌธ์—์„œ ๋‹จ์ˆœํžˆ MAX(FAVORITES)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์Œ์‹ ์ข…๋ฅ˜๋ณ„ ๊ฐ€์žฅ ๋งŽ์€ ์ฆ๊ฒจ์ฐพ๊ธฐ ์ˆ˜๋งŒ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๊ณ  ๊ฐ€์žฅ ๋งŽ์€ ์ฆ๊ฒจ์ฐพ๊ธฐ ์ˆ˜์˜ ์‹๋‹น ์ •๋ณด๋ฅผ ๊ตฌํ•ด์ฃผ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Œ์‹ ์ข…๋ฅ˜๋ณ„ ๊ฐ€์žฅ ํฐ ์ฆ๊ฒจ์ฐพ๊ธฐ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  GROUP BY๋ฅผ ํ†ตํ•ด ์Œ์‹ ์ข…๋ฅ˜๋ณ„๋กœ ์ข‹์•„์š” ์ˆ˜๊ฐ€ ์œ„ ์„œ๋ธŒ ์ฟผ๋ฆฌ์—์„œ ๊ตฌํ•œ ๊ฐ€์žฅ ํฐ ๊ฐ’์˜ ์ฆ๊ฒจ์ฐพ๊ธฐ ์ˆ˜์™€ ์ผ์น˜ํ•˜๋Š” ํ–‰์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


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

1
2
3
4
5
6
SELECT B.USER_ID, B.NICKNAME, CONCAT(B.CITY, ' ', B.STREET_ADDRESS1,' ', B.STREET_ADDRESS2) AS '์ „์ฒด์ฃผ์†Œ', CONCAT(SUBSTR(B.TLNO, 1,3), '-', SUBSTR(B.TLNO,4,4), '-',(SUBSTR(B.TLNO,8,4))) AS '์ „ํ™”๋ฒˆํ˜ธ'
FROM USED_GOODS_BOARD A
JOIN USED_GOODS_USER B ON A.WRITER_ID = B.USER_ID
GROUP BY A.WRITER_ID
HAVING COUNT(A.WRITER_ID) >= 3
ORDER BY B.USER_ID DESC;

CONCAT : ์—ฌ๋Ÿฌ ๋ฌธ์ž์—ด์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น  ๋•Œ ์‚ฌ์šฉ

  • CONnect (์—ฐ๊ฒฐ) + cat = ๊ณ ์–‘์ด๊ฐ€ ๊ท€์—ฝ๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๊ฑฐ ์ƒ๊ฐ ๐Ÿ˜ธ

SUBSTR(A, 1, 4) : A ๋ฌธ์ž์—ด์„ 1๋ฒˆ ์ž๋ฆฌ๋ถ€ํ„ฐ 4๊ธ€์ž ์ž๋ฆ„


74) ๋ถ€์„œ๋ณ„ ํ‰๊ท  ์—ฐ๋ด‰ ์กฐํšŒํ•˜๊ธฐ

1
2
3
4
5
SELECT A.DEPT_ID, A.DEPT_NAME_EN, ROUND(AVG(SAL), 0)  AS 'AVG_SAL'
FROM HR_DEPARTMENT A 
JOIN HR_EMPLOYEES B ON A.DEPT_ID = B.DEPT_ID
GROUP BY A.DEPT_ID
ORDER BY AVG_SAL DESC
  • ์†Œ์ˆ˜์  ์ฒซ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผ : ROUND(AVG(SAL), 0) -> ์ฒซ์งธ ์ž๋ฆฌ๋ฉด 1์ด ์•„๋‹ˆ๋ผ 0์ž„.


75) ๋Œ€์žฅ๊ท ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜ํ•˜๊ธฐ 1

1
2
3
4
5
6
7
8
SELECT ID, 
CASE
    WHEN SIZE_OF_COLONY <= 100 THEN 'LOW'
    WHEN SIZE_OF_COLONY <= 1000 THEN 'MEDIUM'
    WHEN SIZE_OF_COLONY > 1000 THEN 'HIGH'
    END
AS 'SIZE'
FROM ECOLI_DATA
  • CASE WHEN ์กฐ๊ฑด THEN โ€˜๋ฐ˜ํ™˜ ๊ฐ’โ€™ END


76) ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก์—์„œ ๋Œ€์—ฌ์ค‘ / ๋Œ€์—ฌ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ๊ตฌ๋ถ„ํ•˜๊ธฐ

1
2
3
4
5
6
7
8
9
SELECT CAR_ID, 
    MAX(CASE
       WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN '๋Œ€์—ฌ์ค‘'
       ELSE '๋Œ€์—ฌ ๊ฐ€๋Šฅ'
       END)
AS 'AVAILABILITY'
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
  • MAX ํ•จ์ˆ˜๋ฅผ ํ•˜๋Š” ์ด์œ ๋Š” CAR_ID๊ฐ€ ๊ฐ™์€ ์ฐจ์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๋ฒˆ ๋Œ€์—ฌํ•œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์ตœ์‹  ๋‚ ์งœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


77) ์กฐํšŒ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ค‘๊ณ ๊ฑฐ๋ž˜ ๊ฒŒ์‹œํŒ์˜ ์ฒจ๋ถ€ํŒŒ์ผ ์กฐํšŒํ•˜๊ธฐ

1
2
3
4
5
SELECT CONCAT('/home/grep/src/', A.BOARD_ID, '/', B.FILE_ID	,B.FILE_NAME,B.FILE_EXT) AS 'FILE_PATH'
FROM USED_GOODS_BOARD A
JOIN USED_GOODS_FILE B ON A.BOARD_ID = B.BOARD_ID
WHERE VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD )
ORDER BY B.FILE_ID DESC;
  1. USED_GOODS_BOARD์™€ USED_GOODS_FILE ํ…Œ์ด๋ธ”์ด๋ฏ€๋กœ JOIN์œผ๋กœ ๋ฌถ๊ธฐ

  2. ์กฐํšŒ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์ค‘๊ณ ๊ฑฐ๋ž˜ ๊ฒŒ์‹œ๊ธ€ ๊ตฌํ•˜๊ธฐ

  3. ์ฒจ๋ถ€ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” FILE ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ

  4. ํŒŒ์ผ๊ฒฝ๋กœ CONCAT ์ด์šฉํ•ด์„œ ์—ฐ๊ฒฐํ•˜๊ธฐ

์„œ๋ธŒ์ฟผ๋ฆฌ(Subquery)๋Š” ํ•˜๋‚˜์˜ SQL ์ฟผ๋ฆฌ ๋‚ด๋ถ€์—์„œ ํ•˜์œ„ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ํŠน์ • ์กฐ๊ฑด์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฃผ ์ฟผ๋ฆฌ(Main Query)๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.


78) ํ—ค๋น„ ์œ ์ €๊ฐ€ ์†Œ์œ ํ•œ ์žฅ์†Œ

1
2
3
4
SELECT ID, NAME, HOST_ID
FROM PLACES 
WHERE HOST_ID IN (SELECT HOST_ID FROM PLACES GROUP BY HOST_ID HAVING COUNT(HOST_ID) >=2)
ORDER BY ID;
  • ๋‘˜ ์ด์ƒ์ธ ํ—ค๋น„์œ ์ €๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•จ. ์„œ๋ธŒ ์ฟผ๋ฆฌ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์ž‘์„ฑ
1
2
3
4
5
SELECT *
FROM PLACES 
GROUP BY HOST_ID
HAVING COUNT(*) >= 2
ORDER BY ID

์ด์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์•ˆ ๋˜๋Š” ์ด์œ ๋Š” HOST_ID๊ฐ€ 2๊ฑด ์ด์ƒ์ธ ํ—ค๋น„ ์œ ์ €๋“ค์˜ ์ „์ฒด ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•œ๋‹ค.

์ด์˜ ๊ฒฐ๊ณผ๋Š” ํ—ค๋น„ ์œ ์ €์˜ ๊ฐ’์˜ HOST_ID์˜ ํ–‰์ด ํ•œ๊ฐœ์”ฉ๋งŒ ์ถœ๋ ฅ๋จ.


79) ๋Œ€์—ฌ ํšŸ์ˆ˜๊ฐ€ ๋งŽ์€ ์ž๋™์ฐจ๋“ค์˜ ์›”๋ณ„ ๋Œ€์—ฌ ํšŸ์ˆ˜ ๊ตฌํ•˜๊ธฐ

๋Œ€์—ฌ ์‹œ์ž‘์ผ์„ ๊ธฐ์ค€์œผ๋กœ 2022๋…„ 8์›”๋ถ€ํ„ฐ 2022๋…„ 10์›”๊นŒ์ง€ ์ด ๋Œ€์—ฌ ํšŸ์ˆ˜๊ฐ€ 5ํšŒ ์ด์ƒ์ธ ์ž๋™์ฐจ๋“ค์— ๋Œ€ํ•ด์„œ ํ•ด๋‹น ๊ธฐ๊ฐ„ ๋™์•ˆ์˜ ์›”๋ณ„ ์ž๋™์ฐจ ID ๋ณ„ ์ด ๋Œ€์—ฌ ํšŸ์ˆ˜(์ปฌ๋Ÿผ๋ช…: RECORDS) ๋ฆฌ์ŠคํŠธ : ์„œ๋ธŒ ์ฟผ๋ฆฌ ์‚ฌ์šฉ, ์ž๋™์ฐจ ID ๋ณ„์ด๋ฏ€๋กœ SELECT CAR_ID, ๊ฐ™์€ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ” ์ด๋ฏ€๋กœ FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY, ๋Œ€์—ฌ ์‹œ์ž‘์ผ์„ ๊ธฐ์ค€์œผ๋กœ 2022๋…„ 8์›”๋ถ€ํ„ฐ 2022๋…„ 10์›”๊นŒ์ง€์ด๋ฏ€๋กœ WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31', ๋Œ€์—ฌํšŸ์ˆ˜ 5ํšŒ ์ด์ƒ -> HAVING COUNT(CAR_ID) >= 5

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT MONTH(START_DATE) AS 'MONTH', CAR_ID, COUNT(*) AS 'RECORDS'
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY  
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
AND CAR_ID IN ( 
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY  
    WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
    GROUP BY CAR_ID
    HAVING COUNT(CAR_ID) >= 5
)
GROUP BY MONTH, CAR_ID
HAVING RECORDS > 0
ORDER BY MONTH, CAR_ID DESC;


80) ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌผ๊ณ ๊ธฐ๋ณ„ ์ˆ˜์™€ ์ตœ๋Œ€ ๊ธธ์ด ๊ตฌํ•˜๊ธฐ

1) ํ‰๊ท  ๊ธธ์ด๊ฐ€ 33cm ์ด์ƒ์ด ๋ฌผ๊ณ ๊ธฐ๋“ค์„ ์ข…๋ฅ˜๋ณ„๋กœ ๋ถ„๋ฅ˜ ํ•˜๋ฏ€๋กœ AVG(LENGTH) >= 33, ๋‹จ 10cm ์ดํ•˜์˜ ๋ฌผ๊ณ ๊ธฐ๋“ค์€ 10cm๋กœ ์ทจ๊ธ‰ -> AVG(IFNULL(LENGTH,10)) >= 33

1
2
3
4
5
SELECT COUNT(FISH_TYPE) AS 'FISH_COUNT', MAX(IFNULL(LENGTH, 10)) AS 'MAX_LENGTH', FISH_TYPE
FROM FISH_INFO
GROUP BY FISH_TYPE
HAVING AVG(IFNULL(LENGTH,10)) >= 33 
ORDER BY FISH_TYPE


81) ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ์ˆ˜ ์—†๋Š” ์•„์ดํ…œ ๊ตฌํ•˜๊ธฐ

1
2
3
4
5
6
7
8
9
10
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;

# E,D,C๋Š” ๋‹ค๋ฅธ ์•„์ดํ…œ์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
# ITEM ID = 0์€ ๋ถ€๋ชจ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ฐ€์žฅ ์ƒ์œ„ ๋ ˆ๋ฒจ ์•„์ดํ…œ
# ITEM ID = 1, 2๋Š” ๋ถ€๋ชจ๊ฐ€ 0 ์ด๋ฏ€๋กœ ITEM_A์˜ ์ž์‹
# ITEM_ID = 3, 4๋Š” ๋ถ€๋ชจ๊ฐ€ 1 ์ด๋ฏ€๋กœ ITEMP_B์˜ ์ž์‹

1

์ฆ‰, WHERE B.PARENT_ITEM_ID IS NULL ์ด ๋ง์€ ITEM_C, D, E๋Š” ๋‹ค๋ฅธ ์•„์ดํ…œ์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.


82) ๋Œ€์žฅ๊ท ๋“ค์˜ ์ž์‹์˜ ์ˆ˜ ๊ตฌํ•˜๊ธฐ

1
2
3
4
5
SELECT A.ID, COUNT(B.ID) AS 'CHILD_COUNT'
FROM ECOLI_DATA A
LEFT JOIN ECOLI_DATA B ON A.ID = B.PARENT_ID
GROUP BY A.ID
ORDER BY A.ID;

ON A.ID = B.PARENT_ID:

  • ์ด ์กฐ๊ฑด์€ A.ID์™€ B.PARENT_ID๊ฐ€ ์ผ์น˜ํ•˜๋Š” ํ–‰์„ ์ฐพ์•„์„œ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ.
IDPARENT_IDSIZE_OF_COLONYDIFFERENTIATION_DATEGENOTYPE
1NULL102019/01/015
2NULL22019/01/013
311002020/01/014
42172020/01/014
52102020/01/016
641012021/01/0122

์›๋ž˜ ์˜ˆ์‹œํ‘œ์ด๊ณ  A.ID์™€ B.PARENT_ID๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด

A.IDB.ID (์ž์‹)CHILD_COUNT
131
24, 52
3NULL0
461
5NULL0
6NULL0

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋œ๋‹ค.


83) ๋ฌผ๊ณ ๊ธฐ ์ข…๋ฅ˜ ๋ณ„ ๋Œ€์–ด ์ฐพ๊ธฐ

1
2
3
4
5
6
7
8
9
SELECT A.ID, B.FISH_NAME, A.LENGTH
FROM FISH_INFO A 
JOIN FISH_NAME_INFO B ON A.FISH_TYPE = B.FISH_TYPE
WHERE A.LENGTH IN(
    SELECT MAX(LENGTH)
    FROM FISH_INFO
    WHERE FISH_TYPE = A.FISH_TYPE
)
ORDER BY A.ID;

์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” FISH_INFO ํ…Œ์ด๋ธ”์—์„œ FISH_TYPE์ด A.FISH_TYPE๊ณผ ๋™์ผํ•œ ๋ฌผ๊ณ ๊ธฐ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ํฐ LENGTH ๊ฐ’์„ ์ฐพ์Œ.


84) ๋Œ€์žฅ๊ท ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜ํ•˜๊ธฐ 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT A.ID, 
CASE
    WHEN A.PER <= 0.25 THEN 'CRITICAL'
    WHEN A.PER <= 0.5 THEN 'HIGH'
    WHEN A.PER <= 0.75 THEN 'MEDIUM'
    ELSE 'LOW'
    END
AS 'COLONY_NAME'
FROM (
    SELECT ID,
    PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) AS 'PER'
    FROM ECOLI_DATA
) AS A
ORDER BY ID;

  • PERCENT_RANK() ํ•จ์ˆ˜๋Š” ๊ฐ ํ–‰์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ์ปฌ๋Ÿผ(์—ฌ๊ธฐ์„œ๋Š” SIZE_OF_COLONY)์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฑ๋ถ„์œ„ ๋žญํฌ๋ฅผ ๊ณ„์‚ฐ.

  • ORDER BY SIZE_OF_COLONY DESC๋Š” SIZE_OF_COLONY ๊ฐ’์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ํฐ ๊ฐ’์ผ์ˆ˜๋ก ๋†’์€ ๋ฐฑ๋ถ„์œ„ ๋žญํฌ๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด, SIZE_OF_COLONY ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ํ–‰์€ PER ๊ฐ’์ด 1์— ๊ฐ€๊นŒ์šด ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ, ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์€ 0์— ๊ฐ€๊นŒ์šด ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

  • ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๊ฐ ID์™€ ๊ทธ์— ๋Œ€์‘ํ•˜๋Š” ๋ฐฑ๋ถ„์œ„ ๋žญํฌ(PER) ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

This post is licensed under CC BY 4.0 by the author.