๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, SQL/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค SQL๋ฌธ LV. 2 (1)

 

*Oracle ๊ธฐ์ค€, ์ •๋‹ต๋ฅ  ๋†’์€ ์ˆœ์œผ๋กœ 23๋ฌธ์ œ ์ค‘ ์ƒ์œ„ 12๋ฌธ์ œ๋งŒ

 

 

1. ๋™๋ฌผ ์ˆ˜ ๊ตฌํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/59406 )

๋™๋ฌผ ๋ณดํ˜ธ์†Œ์— ๋™๋ฌผ์ด ๋ช‡ ๋งˆ๋ฆฌ ๋“ค์–ด์™”๋Š”์ง€ ์กฐํšŒํ•˜๋Š” SQL ๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT COUNT(*)
FROM ANIMAL_INS;

 

2. ์ตœ์†Ÿ๊ฐ’ ๊ตฌํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/59038 )

๋™๋ฌผ ๋ณดํ˜ธ์†Œ์— ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด์˜จ ๋™๋ฌผ์€ ์–ธ์ œ ๋“ค์–ด์™”๋Š”์ง€ ์กฐํšŒํ•˜๋Š” SQL ๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT MIN(DATETIME)
FROM ANIMAL_INS;

 

3. ์ค‘๋ณต ์ œ๊ฑฐํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/59408 )

๋™๋ฌผ ๋ณดํ˜ธ์†Œ์— ๋“ค์–ด์˜จ ๋™๋ฌผ์˜ ์ด๋ฆ„์€ ๋ช‡ ๊ฐœ์ธ์ง€ ์กฐํšŒํ•˜๋Š” SQL ๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ์ด๋ฆ„์ด NULL์ธ ๊ฒฝ์šฐ๋Š” ์ง‘๊ณ„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์€ ํ•˜๋‚˜๋กœ ์นฉ๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ
SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS;

- DISTINCT๋กœ ์ค‘๋ณต ์ œ๊ฑฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

4. ๋™๋ช… ๋™๋ฌผ ์ˆ˜ ์ฐพ๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/59041 )

๋™๋ฌผ ๋ณดํ˜ธ์†Œ์— ๋“ค์–ด์˜จ ๋™๋ฌผ ์ด๋ฆ„ ์ค‘ ๋‘ ๋ฒˆ ์ด์ƒ ์“ฐ์ธ ์ด๋ฆ„๊ณผ ํ•ด๋‹น ์ด๋ฆ„์ด ์“ฐ์ธ ํšŸ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ์ด๋ฆ„์ด ์—†๋Š” ๋™๋ฌผ์€ ์ง‘๊ณ„์—์„œ ์ œ์™ธํ•˜๋ฉฐ, ๊ฒฐ๊ณผ๋Š” ์ด๋ฆ„ ์ˆœ์œผ๋กœ ์กฐํšŒํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) > 1
ORDER BY NAME ASC;

- HAVING์ ˆ์—์„œ COUNT(ANIMAL_ID)๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์˜ค๋‹ต์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค. (์ •๋‹ต๊ณผ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค.) 

- ๋ฌธ์ œ์—์„œ ์ด๋ฆ„์ด ์—†๋Š” ๋™๋ฌผ์€ ์ง‘๊ณ„์—์„œ ์ œ์™ธํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, COUNT(ANIMAL_ID)๋Š” NAME์˜ NULL ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

5. ์ด๋ฆ„์— el์ด ๋“ค์–ด๊ฐ€๋Š” ๋™๋ฌผ ์ฐพ๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/59047 )

๋™๋ฌผ ๋ณดํ˜ธ์†Œ์— ๋“ค์–ด์˜จ ๋™๋ฌผ ์ด๋ฆ„ ์ค‘, ์ด๋ฆ„์— "EL"์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฐœ์˜ ์•„์ด๋””์™€ ์ด๋ฆ„์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ์ด๋ฆ„ ์ˆœ์œผ๋กœ ์กฐํšŒํ•ด์ฃผ์„ธ์š”. ๋‹จ, ์ด๋ฆ„์˜ ๋Œ€์†Œ๋ฌธ์ž๋Š” ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE '%EL%' AND ANIMAL_TYPE='Dog'
ORDER BY NAME ASC;

 

6. NULL ์ฒ˜๋ฆฌํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/59410 )

๋™๋ฌผ์˜ ์ƒ๋ฌผ ์ข…, ์ด๋ฆ„, ์„ฑ๋ณ„ ๋ฐ ์ค‘์„ฑํ™” ์—ฌ๋ถ€๋ฅผ ์•„์ด๋”” ์ˆœ์œผ๋กœ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์€ NULL์ด๋ผ๋Š” ๊ธฐํ˜ธ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฆ„์ด ์—†๋Š” ๋™๋ฌผ์˜ ์ด๋ฆ„์€ "No name"์œผ๋กœ ํ‘œ์‹œํ•ด ์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT ANIMAL_TYPE, NVL(NAME, 'No name') AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC;

- MYSQL์˜ ๊ฒฝ์šฐ๋Š” NVLํ•จ์ˆ˜ ๋ง๊ณ  IFNULL ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

7. DATETIME์—์„œ DATE๋กœ ํ˜• ๋ณ€ํ™˜ ( https://school.programmers.co.kr/learn/courses/30/lessons/59414 )

ANIMAL_INS ํ…Œ์ด๋ธ”์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด, ๊ฐ ๋™๋ฌผ์˜ ์•„์ด๋””์™€ ์ด๋ฆ„, ๋“ค์–ด์˜จ ๋‚ ์งœ1๋ฅผ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ์•„์ด๋”” ์ˆœ์œผ๋กœ ์กฐํšŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ
SELECT ANIMAL_ID, NAME, 
TO_CHAR(DATETIME, 'YYYY-MM-DD') AS "๋‚ ์งœ"
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC;

- AS ๋’ค์— ๋Œ€์ฒดํ•  ์ปฌ๋Ÿผ๋ช…์„ ๋ฌถ์„ ๋•Œ๋Š” " "๋ฅผ ์“ฐ๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ฉด ์Œ๋”ฐ์˜ดํ‘œ๋ฅผ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜, ๋˜๋Š” ์•„์˜ˆ AS์™€ ์Œ๋”ฐ์˜ดํ‘œ๋ฅผ ์ƒ๋žตํ•  ๊ฒƒ.

 

8. ๊ฐ€๊ฒฉ์ด ์ œ์ผ ๋น„์‹ผ ์‹ํ’ˆ์˜ ์ •๋ณด ์ถœ๋ ฅํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/131115 )

FOOD_PRODUCT ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€๊ฒฉ์ด ์ œ์ผ ๋น„์‹ผ ์‹ํ’ˆ์˜ ์‹ํ’ˆ ID, ์‹ํ’ˆ ์ด๋ฆ„, ์‹ํ’ˆ ์ฝ”๋“œ, ์‹ํ’ˆ๋ถ„๋ฅ˜, ์‹ํ’ˆ ๊ฐ€๊ฒฉ์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT *
FROM FOOD_PRODUCT
WHERE PRICE = (
    SELECT MAX(PRICE)
    FROM FOOD_PRODUCT
);

 

9. ์ค‘์„ฑํ™” ์—ฌ๋ถ€ ํŒŒ์•…ํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/59409 )

์ค‘์„ฑํ™”๋œ ๋™๋ฌผ์€ SEX_UPON_INTAKE ์ปฌ๋Ÿผ์— 'Neutered' ๋˜๋Š” 'Spayed'๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๋™๋ฌผ์˜ ์•„์ด๋””์™€ ์ด๋ฆ„, ์ค‘์„ฑํ™” ์—ฌ๋ถ€๋ฅผ ์•„์ด๋”” ์ˆœ์œผ๋กœ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ์ค‘์„ฑํ™”๊ฐ€ ๋˜์–ด์žˆ๋‹ค๋ฉด 'O', ์•„๋‹ˆ๋ผ๋ฉด 'X'๋ผ๊ณ  ํ‘œ์‹œํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT ANIMAL_ID, NAME, 
	CASE
    	WHEN SEX_UPON_INTAKE LIKE 'Neutered%' 
            OR SEX_UPON_INTAKE LIKE 'Spayed%'
        	THEN 'O'
        ELSE 'X'
    END AS ์ค‘์„ฑํ™”
FROM ANIMAL_INS
ORDER BY 1 ASC;

- ORDER BY 1์€ ํ…Œ์ด๋ธ”์˜ 1๋ฒˆ์งธ ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

10. ๊ณ ์–‘์ด์™€ ๊ฐœ๋Š” ๋ช‡ ๋งˆ๋ฆฌ ์žˆ์„๊นŒ ( https://school.programmers.co.kr/learn/courses/30/lessons/59040 )

๋™๋ฌผ ๋ณดํ˜ธ์†Œ์— ๋“ค์–ด์˜จ ๋™๋ฌผ ์ค‘ ๊ณ ์–‘์ด์™€ ๊ฐœ๊ฐ€ ๊ฐ๊ฐ ๋ช‡ ๋งˆ๋ฆฌ์ธ์ง€ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๊ณ ์–‘์ด๋ฅผ ๊ฐœ๋ณด๋‹ค ๋จผ์ € ์กฐํšŒํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS COUNT
FROM ANIMAL_INS
-- WHERE ANIMAL_TYPE IN ('Cat', 'Dog')
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE ASC;

- WHERE ์ ˆ์€ ํ•ด๋‹น ๋ฌธ์ œ์—์„œ๋Š” ์•ˆ๋„ฃ์–ด๋„ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ € ๋ณดํ˜ธ์†Œ ๋ฐ์ดํ„ฐ์—๋Š” ๊ณ ์–‘์ด๋ž‘ ๊ฐœ๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค..

 

11. ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„ ์ƒํ’ˆ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/131529 )

PRODUCT ํ…Œ์ด๋ธ”์—์„œ ์ƒํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ ์ฝ”๋“œ(PRODUCT_CODE ์•ž 2์ž๋ฆฌ) ๋ณ„ ์ƒํ’ˆ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ๊ฒฐ๊ณผ๋Š” ์ƒํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ ์ฝ”๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT SUBSTR(PRODUCT_CODE, 1, 2) AS CATEGORY, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY SUBSTR(PRODUCT_CODE, 1, 2)
ORDER BY CATEGORY ASC;

- MYSQL์—์„œ๋Š” LEFT()ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

12. ์ž…์–‘ ์‹œ๊ฐ ๊ตฌํ•˜๊ธฐ(1) ( https://school.programmers.co.kr/learn/courses/30/lessons/59412 )

๋ณดํ˜ธ์†Œ์—์„œ๋Š” ๋ช‡ ์‹œ์— ์ž…์–‘์ด ๊ฐ€์žฅ ํ™œ๋ฐœํ•˜๊ฒŒ ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ์•„๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. 09:00๋ถ€ํ„ฐ 19:59๊นŒ์ง€, ๊ฐ ์‹œ๊ฐ„๋Œ€๋ณ„๋กœ ์ž…์–‘์ด ๋ช‡ ๊ฑด์ด๋‚˜ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ์‹œ๊ฐ„๋Œ€ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ
SELECT TO_NUMBER(TO_CHAR(DATETIME, 'HH24')) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME, 'HH24')
HAVING TO_CHAR(DATETIME, 'HH24') BETWEEN '09' AND '19'
ORDER BY HOUR;

- ์ด๊ฒŒ ์™œ ์ •๋‹ต๋ฅ  88%์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค...

- SELECT๋ฌธ์—์„œ TO_NUMBER()๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด 9์‹œ๋Š” '09'๋กœ ๋œจ๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด ์˜ค๋‹ต์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค.

- ๋•Œ๋ฌธ์— TO_NUMBER()๋กœ ํ•œ๋ฒˆ ๊ฐ์‹ธ๋˜์ง€, ์•„๋‹ˆ๋ฉด ์ด ๊ฒฝ์šฐ์—๋Š” 9์‹œ ์™ธ์— ๋‚˜๋จธ์ง€ ํ•„๋“œ๋Š” ๊ดœ์ฐฎ์œผ๋ฏ€๋กœ CASE WHEN THEN ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด 9์‹œ ๋ถ€๋ถ„๋งŒ ์ฒ˜๋ฆฌํ•ด ์ค„์ˆ˜๋„ ์žˆ๋‹ค.

- MYSQL์€ FORMAT์˜ ์ด์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ์ž‘์—…๋“ค์„ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

- HAVING์ ˆ์˜ ๋‚ด์šฉ์€ ๊ทธ๋Œ€๋กœ WHERE์ ˆ์—์„œ ์จ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.