Post

๐Ÿ’โ€โ™‚๏ธ SQL - SELECT 33 ๋ฌธํ•ญ

๐Ÿ’โ€โ™‚๏ธ SQL - SELECT 33 ๋ฌธํ•ญ

SELECT

1. ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ์ค‘๊ณ ๊ฑฐ๋ž˜ ๋Œ“๊ธ€ ์กฐํšŒํ•˜๊ธฐ(Level 1)

1
2
3
4
5
6
7
8
9
10
SELECT UGB.title AS title,
       UGB.board_id AS board_id,
       UGR.reply_id AS reply_id,
       UGR.writer_id AS writer_id,
       UGR.contents AS contents,
       DATE_FORMAT(UGR.created_date, '%Y-%m-%d') AS created_date
FROM USED_GOODS_BOARD UGB JOIN USED_GOODS_REPLY UGR
ON UGB.board_id = UGR.board_id
WHERE DATE_FORMAT(UGB.created_date, '%Y-%m') = '2022-10'
ORDER BY UGR.created_date, UGB.title;
  • https://school.programmers.co.kr/learn/courses/30/lessons/164673
  • ๊ธฐ์–ตํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  1. DATE_FORMAT() ํ•จ์ˆ˜ ์‚ฌ์šฉ๋ฒ•
  2. ์‹ค๋ฌด์—์„œ๋Š” = ์กฐ๊ฑด๋ณด๋‹ค๋Š” ๋ฒ”์œ„ ์กฐ๊ฑด์œผ๋กœ ์กฐํšŒํ•ด์•ผ ํ•จ
    • UGB.created_date์— ์ธ๋ฑ์Šค ์žˆ์„ ๊ฒฝ์šฐ ๋ฒ”์œ„ ์Šค์บ”์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ”์œ„ ์กฐ๊ฑด์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ›จ์”ฌ ํšจ์œจ์ ์ž„

2. ๊ณผ์ผ๋กœ ๋งŒ๋“  ์•„์ด์Šคํฌ๋ฆผ ๊ณ ๋ฅด๊ธฐ(Level 1)

1
2
3
4
5
6
SELECT FH.flavor AS flavor
FROM FIRST_HALF FH JOIN ICECREAM_INFO II
ON FH.flavor = II.flavor
WHERE FH.total_order > 3000
AND II.ingredient_type = 'fruit_based'
ORDER BY FH.total_order DESC;
  • https://school.programmers.co.kr/learn/courses/30/lessons/133025
  • ๊ธฐ์–ตํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  1. flavor ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์กฐ์ธ ์„ฑ๋Šฅ์ด ์ข‹์•„์ง„๋‹ค.
    • ๋ฌธ์ œ์—์„œ ํ•ด๋‹น ์—ด์€ FH์˜ ๊ธฐ๋ณธ ํ‚ค์ด๋ฏ€๋กœ II.flavor์— ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  2. ๊ฐ’ ๋ถ„ํฌ์— ๋”ฐ๋ผ FH.total_order, II.ingredient_type ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ๋ฉด ํšจ์œจ์ ์ด๋‹ค.
  3. FH.total_order์˜ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค์— ์˜ํ•ด ์ •๋ ฌ ๋น„์šฉ์ด ๊ฐœ์„  ์—ฌ๋ถ€๋Š” ์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

3. ํ‰๋ถ€์™ธ๊ณผ ๋˜๋Š” ์ผ๋ฐ˜์™ธ๊ณผ ์˜์‚ฌ ๋ชฉ๋ก ์ถœ๋ ฅํ•˜๊ธฐ(Level 1)

1
2
3
4
5
6
7
SELECT dr_name,
       dr_id,
       mcdp_cd,
       DATE_FORMAT(hire_ymd, '%Y-%m-%d') AS hire_ymd
FROM DOCTOR
WHERE mcdp_cd = 'CS' OR mcdp_cd = 'GS'
ORDER BY hire_ymd DESC, dr_name ASC;
  • https://school.programmers.co.kr/learn/courses/30/lessons/132203
  • ๊ธฐ์–ตํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  1. OR ์—ฐ์‚ฐ์ž๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ž˜ ๋ชป ํƒ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ
    • IN ('CS', 'GS')์™€ ๊ฐ™์ด ๊ฐœ์„  ๊ฐ€๋Šฅ
  2. ์ •๋ ฌ ์—ฐ์‚ฐ ๋น„์šฉ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด (hire_ymd, dr_name) ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Œ
    • ๋‹จ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๊ฑฐ๋‚˜, ์žฆ์€ ์ฟผ๋ฆฌ ๋“ฑ ์ •๋ ฌ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์ผ ๋•Œ๋งŒ ํ•ด๋‹น๋จ

4. 12์„ธ ์ดํ•˜์ธ ์—ฌ์ž ํ™˜์ž ๋ชฉ๋ก ์ถœ๋ ฅํ•˜๊ธฐ(Level 1)

1
2
3
4
5
6
7
8
9
SELECT pt_name,
       pt_no,
       gend_cd,
       age,
       IFNULL(tlno, 'NONE') AS tlno
FROM PATIENT
WHERE age <= 12 
AND gend_cd = 'W'
ORDER BY age DESC, pt_name ASC;
  • https://school.programmers.co.kr/learn/courses/30/lessons/132201
  • ๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ”์ด๋ผ๋ฉด gend_cd, age ๊ธฐ์ค€์œผ๋กœ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.

5. ์ธ๊ธฐ์žˆ๋Š” ์•„์ด์Šคํฌ๋ฆผ(Level 1)

1
2
3
SELECT flavor
FROM FIRST_HALF
ORDER BY total_order DESC, shipment_id ASC;
  • https://school.programmers.co.kr/learn/courses/30/lessons/133024

6. ์กฐ๊ฑด์— ๋งž๋Š” ๋„์„œ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅํ•˜๊ธฐ(Level 1)

1
2
3
4
5
6
SELECT book_id, 
       DATE_FORMAT(published_date, '%Y-%m-%d') AS published_date
FROM BOOK
WHERE YEAR(published_date) = '2021'
AND category = '์ธ๋ฌธ'
ORDER BY published_date;
  • https://school.programmers.co.kr/learn/courses/30/lessons/144853

7. ํ‰๊ท  ์ผ์ผ ๋Œ€์—ฌ ์š”๊ธˆ ๊ตฌํ•˜๊ธฐ(Level 1)

1
2
3
4
SELECT ROUND(AVG(daily_fee), 0) AS average_fee
FROM CAR_RENTAL_COMPANY_CAR
WHERE car_type = 'SUV'
GROUP BY car_type;
  • https://school.programmers.co.kr/learn/courses/30/lessons/151136
  • ๊ธฐ์–ตํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  1. round() ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์—๋Š” ๋Œ€์ƒ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ณ , ๋‘ ๋ฒˆ์งธ ์ธ์ž์—๋Š” ๋ฐ˜์˜ฌ๋ฆผํ•  ์ž๋ฆฟ์ˆ˜์— ๋Œ€ํ•œ ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค.
  2. GROUP BY ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ํŠน์ • ์—ด์˜ ๊ฐ’๋“ค์„ ์ง‘๊ณ„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

8. 3์›”์— ํƒœ์–ด๋‚œ ์—ฌ์„ฑ ํšŒ์› ๋ชฉ๋ก ์ถœ๋ ฅํ•˜๊ธฐ(Level 2)

1
2
3
4
5
6
7
8
9
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) = '03'
AND gender = 'W'
AND tlno IS NOT NULL
ORDER BY member_id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/131120
  • ๊ธฐ์–ตํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  1. MONTH() ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด ์ธ๋ฑ์Šค๋ฅผ ํƒ€์ง€ ๋ชปํ•˜๊ณ , ๋ฒ”์œ„ ์กฐ๊ฑด ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
  2. gender ์กฐ๊ฑด๊ณผ ๊ฐ™์ด ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋‚ฎ์€ ๊ฐ’(M, W ๋‘ ๊ฐœ๋ฟ)์ด๋ฉด ๋‹จ๋… ์ธ๋ฑ์Šค ํšจ์šฉ์ด ๊ฑฐ์˜ ์—†๊ณ , ๋‹ค๋ฅธ ์ปฌ๋Ÿผ๊ณผ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. IS NOT NULL ์กฐ๊ฑด์€ ๋ณดํ†ต ์ธ๋ฑ์Šค ํšจ์œจ์„ฑ์ด ๋‚ฎ๋‹ค.
  4. ORDER BY ์ ˆ์— ๊ธฐ๋ณธ ํ‚ค๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค๋ฉด ์ •๋ ฌ ๋น„์šฉ์ด ๊ฑฐ์˜ ์—†๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์ธ๋ฑ์Šค ์„ค๊ณ„๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.

9. ๊ฐ•์›๋„์— ์œ„์น˜ํ•œ ์ƒ์‚ฐ๊ณต์žฅ ๋ชฉ๋ก ์ถœ๋ ฅํ•˜๊ธฐ(Level 1)

1
2
3
4
5
6
SELECT factory_id,
       factory_name,
       address
FROM FOOD_FACTORY
WHERE ADDRESS LIKE '๊ฐ•์›๋„%'
ORDER BY factory_id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/131112
  • ๊ธฐ์–ตํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  1. %๊ฐ€ ๋’ค์—๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์ธ๋ฑ์Šค ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. ์ •๋ ฌ์„ ๊ณ ๋ คํ•˜์—ฌ (address, factory_id) ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ด์ƒ์ ์ด๋‹ค.

10. ์„œ์šธ์— ์œ„์น˜ํ•œ ์‹๋‹น ๋ชฉ๋ก ์ถœ๋ ฅํ•˜๊ธฐ(Level 4)

1
2
3
4
5
6
7
8
9
10
11
SELECT RI.rest_id AS rest_id,
       RI.rest_name AS rest_name,
       RI.food_type AS food_type,
       RI.favorites AS favorites,
       RI.address AS address,
       ROUND(AVG(RR.review_score), 2) AS score
FROM REST_INFO RI JOIN REST_REVIEW RR
ON RI.rest_id = RR.rest_id
WHERE address LIKE '์„œ์šธ%'
GROUP BY RI.rest_id
ORDER BY score DESC, favorites DESC;
  • https://school.programmers.co.kr/learn/courses/30/lessons/131118
  • ์˜๋ฌธ์ด ๋“ค์—ˆ๋˜ ๋ถ€๋ถ„์€ LEFT JOIN์„ ์ฒ˜๋ฆฌํ•ด์•ผ ๋ฆฌ๋ทฐ๊ฐ€ ์—†๋Š” ์‹๋‹น ๋ชฉ๋ก๋„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์„ํ…๋ฐ ์™œ ํ•ด๋‹น ์ฒ˜๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”์ง€ ๊ถ๊ธˆํ–ˆ๊ณ , ๋ฌธ์ œ์—๋„ ์ด ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด ์•„์‰ฌ์› ๋‹ค.
  • ๊ธฐ์–ตํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  1. address์—ด์—์„œ ์„œ์šธ์— ์œ„์น˜ํ•˜๋Š” ๊ฒฝ์šฐ "์„œ์šธํŠน๋ณ„์‹œ%" ๋˜๋Š” "์„œ์šธ์‹œ%" ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ๋ฐ์ดํ„ฐ๊ฐ€ ํ‘œ์ค€ํ™”๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
  2. ๋งŒ์•ฝ ๋ฆฌ๋ทฐ๊ฐ€ ์—†๋Š” ์‹๋‹น ๋˜ํ•œ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด, ํ‰๊ท  ๊ณ„์‚ฐ ์‹œ NULL์ผ ๋•Œ์˜ ์ฒ˜๋ฆฌ๋„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

11. ์žฌ๊ตฌ๋งค๊ฐ€ ์ผ์–ด๋‚œ ์ƒํ’ˆ๊ณผ ํšŒ์› ๋ฆฌ์ŠคํŠธ ๊ตฌํ•˜๊ธฐ(Level 2)

1
2
3
4
5
6
SELECT user_id,
       product_id
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) > 1
ORDER BY user_id ASC, product_id DESC;
  • https://school.programmers.co.kr/learn/courses/30/lessons/131536
  • HAVING ํ‚ค์›Œ๋“œ๋Š” GROUP BY์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

12. ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ์กฐํšŒํ•˜๊ธฐ(Level 1)

1
2
3
SELECT *
FROM ANIMAL_INS
ORDER BY animal_id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/59034

13. ์—ญ์ˆœ ์ •๋ ฌํ•˜๊ธฐ(Level 1)

1
2
3
4
SELECT name, 
       datetime
FROM ANIMAL_INS
ORDER BY animal_id DESC;
  • https://school.programmers.co.kr/learn/courses/30/lessons/59035

14. ์˜คํ”„๋ผ์ธ/์˜จ๋ผ์ธ ํŒ๋งค ๋ฐ์ดํ„ฐ ํ†ตํ•ฉํ•˜๊ธฐ(Level 4)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT *
FROM (
    SELECT DATE_FORMAT(sales_date, '%Y-%m-%d') AS sales_date,
           product_id,
           NULL AS user_id,
           sales_amount
    FROM OFFLINE_SALE
    WHERE DATE_FORMAT(sales_date, '%Y-%m') = '2022-03'
    
    UNION
    
    SELECT DATE_FORMAT(sales_date, '%Y-%m-%d') AS sales_date,
           product_id,
           user_id,
           sales_amount
    FROM ONLINE_SALE
    WHERE DATE_FORMAT(sales_date, '%Y-%m') = '2022-03'
) A
ORDER BY A.sales_date, A.product_id, A.user_id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/131537
  • ์„œ๋ธŒ ์ฟผ๋ฆฌ ์‹œ ์ตœ์ข… ๊ฒฐ๊ณผ์— ์ •๋ ฌ์„ ํ•˜๋ ค๋ฉด Alias๋ฅผ ์จ์•ผ ํ•œ๋‹ค.

15. ์•„ํ”ˆ ๋™๋ฌผ ์ฐพ๊ธฐ(Level 1)

1
2
3
4
5
SELECT animal_id,
       name
FROM ANIMAL_INS
WHERE intake_condition = 'Sick'
ORDER BY animal_id;

https://school.programmers.co.kr/learn/courses/30/lessons/59036

16. ์–ด๋ฆฐ ๋™๋ฌผ ์ฐพ๊ธฐ(Level 1)

1
2
3
4
5
SELECT animal_id,
       name
FROM ANIMAL_INS
WHERE intake_condition != 'Aged'
ORDER BY animal_id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/59037
  • ์˜๋ฌธ์ด ๋“œ๋Š” ๋ถ€๋ถ„์€ ๋‚˜์ด๊ฐ€ ๋“ค๊ณ  ์•„ํ”ˆ ๋™๋ฌผ์˜ ๊ฒฝ์šฐ intake_condition ๊ฐ’์ด 'Aged', 'Sick' ๋‘ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์„ํ…๋ฐ ์—ด์„ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.

17. ๋™๋ฌผ์˜ ์•„์ด๋””์™€ ์ด๋ฆ„(Level 1)

1
2
3
4
SELECT animal_id, 
       name
FROM ANIMAL_INS
ORDER BY animal_id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/59403

18. ์—ฌ๋Ÿฌ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ(Level 1)

1
2
3
4
5
SELECT animal_id,
       name,
       datetime
FROM ANIMAL_INS
ORDER BY name ASC, datetime DESC;
  • https://school.programmers.co.kr/learn/courses/30/lessons/59404

19. ์ƒ์œ„ n๊ฐœ ๋ ˆ์ฝ”๋“œ(Level 1)

1
2
3
4
SELECT name
FROM ANIMAL_INS
ORDER BY datetime
LIMIT 1;
  • https://school.programmers.co.kr/learn/courses/30/lessons/59405
  • LIMIT ํ‚ค์›Œ๋“œ๋ฅผ ๊ธฐ์–ตํ•˜์ž.

20. ์กฐ๊ฑด์— ๋งž๋Š” ํšŒ์›์ˆ˜ ๊ตฌํ•˜๊ธฐ(Level 1)

1
2
3
4
SELECT COUNT(*) AS users
FROM USER_INFO 
WHERE YEAR(joined) = '2021' 
AND age >= 20 AND age <= 29;
  • https://school.programmers.co.kr/learn/courses/30/lessons/131535

21. ์—…๊ทธ๋ ˆ์ด๋“œ ๋œ ์•„์ดํ…œ ๊ตฌํ•˜๊ธฐ(Level 2)

1
2
3
4
5
6
7
8
SELECT CI.item_id,
       CI.item_name,
       CI.rarity
FROM ITEM_INFO PI 
JOIN ITEM_TREE IT ON PI.item_id = IT.parent_item_id
JOIN ITEM_INFO CI ON IT.item_id = CI.item_id
WHERE PI.rarity = 'RARE'
ORDER BY item_id DESC;
  • https://school.programmers.co.kr/learn/courses/30/lessons/273711
  • ๋ฌธ์ œ ์ œ๋Œ€๋กœ ์•ˆ ์ฝ๊ณ  ๋ถ€๋ชจ๊ฐ€ ์—…๊ทธ๋ ˆ์ด๋“œ ๋œ ์•„์ดํ…œ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๊ทธ๋ž˜์„œ ๋ฌธ์ œ ํ‘ธ๋Š”๋ฐ ์–ด๋ ค์› ์Œ
  • ๊ธฐ์–ตํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  1. ์กฐ์ธ ์กฐ๊ฑด์— ์“ฐ์ด๋Š” ์—ด์˜ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ๊ณ ๋ ค ๊ฐ€๋Šฅ
  2. ์ž์ฃผ ์กฐํšŒํ•  ๊ฒฝ์šฐ WHERE ์กฐ๊ฑด์— ์“ฐ์ด๋Š” ์—ด ์ธ๋ฑ์Šค ๊ณ ๋ ค ๊ฐ€๋Šฅ

22. Python ๊ฐœ๋ฐœ์ž ์ฐพ๊ธฐ(Level 1)

1
2
3
4
5
6
7
SELECT id,
       email,
       first_name,
       last_name
FROM DEVELOPER_INFOS
WHERE 'Python' IN (skill_1, skill_2, skill_3)
ORDER BY id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/276013
  • IN ํ‚ค์›Œ๋“œ ๋ณต์ˆ˜ ์—ด์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‚ฌ์‹ค ๊ธฐ์–ตํ•˜๊ธฐ

23. ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐœ๋ฐœ์ž ์ฐพ๊ธฐ(Level 2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- ์‹คํŒจํ•œ ์ฝ”๋“œ
SELECT D.id,
       D.email,
       D.first_name,
       D.last_name
FROM DEVELOPERS D
JOIN SKILLCODES S
ON (D.skill_code & S.code) != 0
WHERE S.name IN ('Python', 'C#')
ORDER BY D.id;

-- ํ†ต๊ณผํ•œ ์ฝ”๋“œ 1
SELECT D.id, 
       D.email, 
       D.first_name, 
       D.last_name
FROM DEVELOPERS D
WHERE EXISTS ( 
    SELECT 1
    FROM SKILLCODES S
    WHERE S.name IN ('Python','C#')
    AND (D.skill_code & S.code) != 0
)
ORDER BY D.id;

-- ํ†ต๊ณผํ•œ ์ฝ”๋“œ 2
SELECT DISTINCT D.id,
                D.email,
                D.first_name,
                D.last_name
FROM DEVELOPERS D JOIN SKILLCODES S
ON (D.skill_code & S.code) != 0
WHERE S.name IN ('Python', 'C#')
ORDER BY D.id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/276034
  • ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์ด๋Ÿฐ ์‹์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•œ ๊ฒƒ์ธ์ง€๋Š” ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค.
  • ์‹คํŒจํ•œ ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ Python๊ณผ C#์„ ๋™์‹œ์— ๊ฐ–๊ณ  ์žˆ์„ ๊ฒฝ์šฐ ์ค‘๋ณต๋œ ํ–‰์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.
  • ๊ธฐ์–ตํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  1. ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ๊ด€๋ฆฌ
  2. EXISTS ํ‚ค์›Œ๋“œ ํ™œ์šฉ๋ฒ•
  3. JOIN ์‹œ ์ค‘๋ณต ํ–‰ ๋ฐœ์ƒ ์—ฌ๋ถ€ ํŒ๋‹จ ํ•„์š”

24. ์ž”์ฑ™์ด ์žก์€ ์ˆ˜ ๊ตฌํ•˜๊ธฐ(Level 1)

1
2
3
SELECT COUNT(*) AS fish_count
FROM FISH_INFO
WHERE length IS NULL;
  • https://school.programmers.co.kr/learn/courses/30/lessons/293258

25. ๊ฐ€์žฅ ํฐ ๋ฌผ๊ณ ๊ธฐ 10๋งˆ๋ฆฌ ๊ตฌํ•˜๊ธฐ(Level 1)

1
2
3
4
5
SELECT id,
       length
FROM FISH_INFO
ORDER BY length DESC, id ASC
LIMIT 10;
  • https://school.programmers.co.kr/learn/courses/30/lessons/298517

26. ํŠน์ • ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์€ ์ด ์ˆ˜ ๊ตฌํ•˜๊ธฐ(Level 2)

1
2
3
4
SELECT COUNT(*) AS fish_count
FROM FISH_INFO FI JOIN FISH_NAME_INFO FNI
ON FI.fish_type = FNI.fish_type
WHERE FNI.fish_name IN ('BASS', 'SNAPPER');
  • https://school.programmers.co.kr/learn/courses/30/lessons/298518

27. ๋Œ€์žฅ๊ท ๋“ค์˜ ์ž์‹์˜ ์ˆ˜ ๊ตฌํ•˜๊ธฐ(Level 3)

1
2
3
4
5
6
SELECT PED.id,
       COUNT(CED.parent_id) AS child_count
FROM ECOLI_DATA PED LEFT JOIN ECOLI_DATA CED
ON PED.id = CED.parent_id
GROUP BY PED.id
ORDER BY PED.id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/299305
  • COUNT๋ฅผ ํฌํ•จํ•œ ์ง‘๊ณ„ ํ•จ์ˆ˜๋Š” NULL์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค.

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

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'
		ELSE 'HIGH'
	END AS size
FROM ECOLI_DATA
ORDER BY id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/299307

29. ํŠน์ • ํ˜•์งˆ์„ ๊ฐ€์ง€๋Š” ๋Œ€์žฅ๊ท  ์ฐพ๊ธฐ(Level 1)

1
2
3
4
SELECT COUNT(*) AS count
FROM ECOLI_DATA
WHERE (genotype & 2) = 0
AND ((genotype & 1) != 0 OR (genotype & 4) != 0);
  • https://school.programmers.co.kr/learn/courses/30/lessons/301646

30. ๋ถ€๋ชจ์˜ ํ˜•์งˆ์„ ๋ชจ๋‘ ๊ฐ€์ง€๋Š” ๋Œ€์žฅ๊ท  ์ฐพ๊ธฐ(Level 2)

1
2
3
4
5
6
7
SELECT C.id,
       C.genotype,
       P.genotype AS parent_genotype
FROM ECOLI_DATA C JOIN ECOLI_DATA P 
ON C.parent_id = P.id
WHERE (C.genotype & P.genotype) = P.genotype
ORDER BY C.id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/301647

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- NTILE() ํ•จ์ˆ˜ ์‚ฌ์šฉ
SELECT
    id,
    CASE quartile
        WHEN 1 THEN 'CRITICAL'
        WHEN 2 THEN 'HIGH'
        WHEN 3 THEN 'MEDIUM'
        WHEN 4 THEN 'LOW'
    END AS colony_name
FROM (
    SELECT id,
           NTILE(4) OVER (ORDER BY SIZE_OF_COLONY DESC) AS quartile
    FROM ECOLI_DATA
) A
ORDER BY id;

-- WITH ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
WITH ranked AS (
    SELECT
        id,
        ROW_NUMBER() OVER (ORDER BY SIZE_OF_COLONY DESC) AS rn,
        COUNT(*) OVER () AS total_cnt
    FROM ECOLI_DATA
)
SELECT
    id,
    CASE
        WHEN rn <= total_cnt * 0.25 THEN 'CRITICAL'
        WHEN rn <= total_cnt * 0.50 THEN 'HIGH'
        WHEN rn <= total_cnt * 0.75 THEN 'MEDIUM'
        ELSE 'LOW'
    END AS colony_name
FROM ranked
ORDER BY id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/301649
  • NTILE()์€ ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ 4์˜ ๋ฐฐ์ˆ˜์ผ ๋• ๊น”๋”ํžˆ 25%์”ฉ, ๊ทธ ์™ธ์—๋Š” ๊ท ๋“ฑํ•˜๊ฒŒ ์ชผ๊ฐ ๋‹ค.
  • ๋งŒ์•ฝ 25%์”ฉ ๊ท ๋“ฑํ•˜๊ฒŒ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋น„์œจ์„ ๋‹ฌ๋ฆฌ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด WITH ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ WITH ํ‚ค์›Œ๋“œ๋Š” ์ž„์‹œ ๋ทฐ(์ผ๋ฐ˜ CTE)๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฌธ๋ฒ•์ด๋‹ค.

32. ํŠน์ • ์„ธ๋Œ€์˜ ๋Œ€์žฅ๊ท  ์ฐพ๊ธฐ(Level 4)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WITH RECURSIVE ecoli_tree AS (
    SELECT id, 
           parent_id, 
           1 AS depth
    FROM ECOLI_DATA
    WHERE parent_id IS NULL
    
    UNION ALL
    
    SELECT e.id, 
           e.parent_id, 
           et.depth + 1
    FROM ECOLI_DATA e JOIN ecoli_tree et 
    ON e.parent_id = et.id
)
SELECT id
FROM ecoli_tree T
WHERE T.depth = 3
ORDER BY id;
  • https://school.programmers.co.kr/learn/courses/30/lessons/301650
  • WITH RECURSIVE๋Š” ์žฌ๊ท€ CTE๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ UNION ALL์„ ํ†ตํ•ด ๋ฃจํŠธ์™€ ์ž์‹ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๋ฅผ ํ•ฉ์นœ๋‹ค.

33. ๋ฉธ์ข…์œ„๊ธฐ์˜ ๋Œ€์žฅ๊ท  ์ฐพ๊ธฐ(Level 5)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
WITH RECURSIVE ecoli_tree AS (
    SELECT 
        id,
        parent_id,
        1 AS generation
    FROM ECOLI_DATA
    WHERE parent_id IS NULL
    
    UNION ALL
    
    SELECT 
        ED.id,
        ED.parent_id,
        ET.generation + 1
    FROM ECOLI_DATA ED JOIN ecoli_tree ET
    ON ED.parent_id = ET.id
)
SELECT 
    COUNT(*) AS count,
    generation
FROM ecoli_tree T
WHERE NOT EXISTS (
    SELECT 1
    FROM ECOLI_DATA C
    WHERE C.parent_id = T.id
)
GROUP BY generation
ORDER BY generation;
  • https://school.programmers.co.kr/learn/courses/30/lessons/301651
  • WHERE NOT EXISTS ์ ˆ์—์„œ๋Š” ์™ธ๋ถ€ ์ฟผ๋ฆฌ T์˜ ๊ฐ ํ–‰๋งˆ๋‹ค ๋‚ด๋ถ€ ํ…Œ์ด๋ธ” C ์ „์ฒด๋ฅผ ์Šค์บ”ํ•˜๊ณ , ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.
  • parent_id ์—ด์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด, C.parent_id = T.id ์กฐ๊ฑด์„ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ „์ฒด ์Šค์บ”์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ๋น„์šฉ์ด ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.