Tools/- SQL

[SQL] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์˜ˆ์ œ | ๊ทธ๋ฃน๋ณ„ ์ตœ๋Œ€๊ฐ’ ๋ ˆ์ฝ”๋“œ ์ถœ๋ ฅ, ๊ทธ๋ฃน๋ณ„ ๋ ˆ์ฝ”๋“œ count | ์„œ๋ธŒ์ฟผ๋ฆฌ์™€ ์กฐ์ธ์˜ ์ฐจ์ด

์Šค์œ„๋ฏผ 2024. 3. 15. 21:43

โœ๏ธ ๋ฌผ๊ณ ๊ธฐ ์ข…๋ฅ˜ ๋ณ„ ๋Œ€์–ด ์ฐพ๊ธฐ

: fish_type ๋ณ„๋กœ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ๊ฐ€์ง€๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฒ€์ƒ‰

 

1) ์„œ๋ธŒ์ฟผ๋ฆฌ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

SELECT ID, 
    (SELECT FISH_NAME FROM FISH_NAME_INFO WHERE FISH_TYPE = a.FISH_TYPE) AS FISH_NAME, -- ๋‘๋ฒˆ์งธ ํ…Œ์ด๋ธ” ์„œ๋ธŒ์ฟผ๋ฆฌ 
    LENGTH
FROM FISH_INFO a
WHERE LENGTH IN (SELECT MAX(LENGTH) FROM FISH_INFO GROUP BY FISH_TYPE) -- self ํ…Œ์ด๋ธ” ์„œ๋ธŒ์ฟผ๋ฆฌ
ORDER BY ID

 

where ์ ˆ์—์„œ fish_type ๋ณ„๋กœ max(length)์„ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ์ถ”์ถœํ•˜์—ฌ

์—ฐ์‚ฐ์ž in์œผ๋กœ ์ตœ๋Œ€๊ฐ’์„ ์ถฉ์กฑํ•˜๋Š” length์„ ๊ฒ€์ƒ‰ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

 

2) ์กฐ์ธ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

SELECT a.ID, c.FISH_NAME, a.LENGTH
FROM FISH_INFO a
    INNER JOIN (SELECT FISH_TYPE, MAX(LENGTH) AS LENGTH
                FROM FISH_INFO
                GROUP BY FISH_TYPE) b -- self join
    ON a.FISH_TYPE = b.FISH_TYPE AND a.LENGTH = b.LENGTH -- on์œผ๋กœ ์กฐ๊ฑด ์ฃผ๊ธฐ
    
    JOIN FISH_NAME_INFO c ON a.FISH_TYPE = c.FISH_TYPE -- ๋‘๋ฒˆ์งธ ํ…Œ์ด๋ธ” ์กฐ์ธ
ORDER BY a.ID

 

fish type ๋ณ„ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ถ”์ถœํ•œ ํ…Œ์ด๋ธ”(๊ฒ€์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’)์„ ๋‚ด๋ถ€์กฐ์ธํ•˜์—ฌ

self join table์„ ์กฐ๊ฑด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.


 

 

โœ๏ธ ์กฐ๊ฑด์— ๋งž๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒํ•˜๊ธฐ

: used_goods_board ํ…Œ์ด๋ธ”์—์„œ ๋ ˆ์ฝ”๋“œ๋ฅผ 3๊ฐœ ์ด์ƒ ๋“ฑ๋กํ•œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์กฐํšŒ

 

1) Where์ ˆ์— ์„œ๋ธŒ์ฟผ๋ฆฌ ์‚ฌ์šฉ

SELECT USER_ID, NICKNAME,
    CONCAT(CITY, " ", STREET_ADDRESS1, " ", STREET_ADDRESS2) AS ์ „์ฒด์ฃผ์†Œ,
    CONCAT(SUBSTRING(TLNO, 1, 3), "-", SUBSTRING(TLNO, 4, 4), "-", SUBSTRING(TLNO, 8, 4)) AS ์ „ํ™”๋ฒˆํ˜ธ
FROM USED_GOODS_USER
WHERE USER_ID IN (SELECT WRITER_ID 
                 FROM USED_GOODS_BOARD 
                 GROUP BY WRITER_ID 
                 HAVING COUNT(*) >=3)
ORDER BY USER_ID DESC;

 

substring(์ปฌ๋Ÿผ, ์‹œ์ž‘ ์œ„์น˜, ๊ฐœ์ˆ˜)

: ๋ฌธ์ž์—ด์„ ์Šฌ๋ผ์ด์‹ฑํ•˜๋Š” ๋ฌธ๋ฒ•. ์ฐธ๊ณ ๋กœ ์‹œ์ž‘์œ„์น˜๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค

 

writer_id ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜์˜€์„ ๋•Œ

having์œผ๋กœ ๋ ˆ์ฝ”๋“œ ๊ฐœ์ˆ˜๊ฐ€ 3์ด์ƒ์ธ writer_id๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ

 

2) Join ์‚ฌ์šฉ

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

 

๋‘ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜์—ฌ

3๊ฐœ ์ด์ƒ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋“ฑ๋ก๋˜์–ด์žˆ๋Š” user_id ๊ฒ€์ƒ‰

 


 

๐Ÿ“Œ Join๊ณผ Subquery์˜ ์ฐจ์ด

 

์กฐ์ธ์€ ๋‘ ํ…Œ์ด๋ธ” ์ด์ƒ์„ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ํ•ฉ์น˜๊ณ 

์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋ฉ”์ธ ์ฟผ๋ฆฌ ๋‚ด์—์„œ ํ•œ๋ฒˆ์˜ ๊ฒ€์ƒ‰์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์ถ”์ถœํ•œ๋‹ค

 

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ, ์„œ๋ธŒ์ฟผ๋ฆฌ๋ณด๋‹ค๋Š” ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์ด ์„ฑ๋Šฅ์ด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค.

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฐ™์€ ๊ฒฝ์šฐ, ๋ฉ”์ธํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ ์ˆ˜ ๋งŒํผ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค.

 

๋˜ํ•œ ๋ฐ์ดํ„ฐ์–‘๊ณผ ์ธ๋ฑ์Šค์˜ ์œ ๋ฎค์— ๋”ฐ๋ผ ์ƒํ™ฉ์ด ๋‹ฌ๋ผ์ง„๋‹ค.

ํŠนํžˆ, ์ธ๋ฑ์Šค๊ฐ€ ์—†๋‹ค๋ฉด full scan์„ ํ•ด์•ผ ํ•  ๊ฒƒ์ด๊ณ  ์‹œ๊ฐ„์ด ๋” ์†Œ์š”๋  ๊ฒƒ์ด๋‹ค.