Skip to content

yoondaeng/SQL

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

38 Commits
ย 
ย 

Repository files navigation

group by

  • ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ํ–‰๋ผ๋ฆฌ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ญ‰์ณ์คŒ
  • ๋ณดํ†ต ์ง‘๊ณ„ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ
    • COUNT() : ํ–‰์˜ ๊ฐœ์ˆ˜
    • AVG() : ํ–‰ ์•ˆ์— ์žˆ๋Š” ๊ฐ’์˜ ํ‰
    • MIN() : ํ–‰ ์•ˆ์— ์žˆ๋Š” ๊ฐ’์˜ ์ตœ์†Ÿ
    • MAX() : ํ–‰ ์•ˆ์— ์žˆ๋Š” ๊ฐ’์˜ ์ตœ๋Œ“๊ฐ’
    • SUM() : ํ–‰ ์•ˆ์— ์žˆ๋Š” ๊ฐ’์˜ ํ•ฉ
SELECT 
    i.REST_ID, 
    i.REST_NAME, 
    i.FOOD_TYPE, 
    i.FAVORITES, 
    i.ADDRESS, 
    round(avg(r.REVIEW_SCORE), 2) as SCORE
from REST_INFO i
join REST_REVIEW r on i.REST_ID = r.REST_ID
where i.ADDRESS like '์„œ์šธ%'
group by 1
order by 6 desc, 4 desc;
  • ์ฃผ์˜์ 
    • SELECT ์ ˆ์— avg(r.REVIEW_SCORE)๋ผ๋Š” ์ง‘๊ณ„ ํ•จ์ˆ˜ ์กด์žฌ
    • ๊ทธ๋ฃนํ™”๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, ๋ชจ๋“  ํ–‰์ด ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ์ทจ๊ธ‰
    • ๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ํ–‰๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ด ์•„๋‹ˆ๋ฉด group by ์ถ”๊ฐ€ํ•  ๊ฒƒ

having

  • where์€ ์ง‘๊ณ„ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ having ์„ ์‚ฌ์šฉ
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;
  • having์ด ๊ผญ group by์™€ ํ•จ๊ป˜ ์จ์•ผํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜
  • ๊ฐœ๋ณ„ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ์ง‘๊ณ„๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— group by-having์ ˆ ํ•„์š”
  • group by ์—†์ด having๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ด„
SELECT 
    u.USER_ID, 
    u.NICKNAME, 
    concat(u.CITY, ' ', u.STREET_ADDRESS1, ' ', u.STREET_ADDRESS2) as ์ „์ฒด์ฃผ์†Œ,
    concat(left(TLNO, 3), '-', mid(TLNO, 4, 4), '-', right(TLNO, 4)) as ์ „ํ™”๋ฒˆํ˜ธ
from USED_GOODS_BOARD b
join USED_GOODS_USER u on b.WRITER_ID = u.USER_ID
group by u.USER_ID, u.NICKNAME, u.CITY, u.STREET_ADDRESS1, u.STREET_ADDRESS2, u.TLNO
having count(b.WRITER_ID) >= 3
order by 1 desc
  • MySQL์—์„œ +๋Š” ์ˆซ์ž ๋ง์…ˆ์— ์‚ฌ์šฉ
  • ๋ฌธ์ž์—ด์„ + ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด MySQL์€ ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ , ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ 0์œผ๋กœ ์ฒ˜๋ฆฌ
  • ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์„ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ CONCAT ํ•จ์ˆ˜ ์‚ฌ์šฉ

    ์˜ˆ์‹œ

    left(TLNO, 3) + '-' + mid(TLNO, 4, 4) + '-' + right(TLNO, 4) # X
    CONCAT(left(TLNO, 3), '-', mid(TLNO, 4, 4), '-', right(TLNO, 4)) # O

๋‚ ์งœ ์กฐ๊ฑด์€ HAVING ๋Œ€์‹  WHERE์ ˆ์„ ์‚ฌ์šฉ

HAVING์€ ๊ทธ๋ฃนํ™” ํ›„์˜ ์กฐ๊ฑด์— ์‚ฌ์šฉ WHERE๋Š” ๊ทธ๋ฃนํ™” ์ „์˜ ๊ธฐ๋ณธ ํ•„ํ„ฐ๋ง์— ์‚ฌ์šฉ

SELECT 
    MCDP_CD as ์ง„๋ฃŒ๊ณผ์ฝ”๋“œ, 
    count(*) as 5์›”์˜ˆ์•ฝ๊ฑด์ˆ˜
from APPOINTMENT
where month(APNT_YMD) = 5
group by MCDP_CD
order by 2, 1

round(์ˆซ์ž, ์ž๋ฆฟ์ˆ˜)

  • ๊ฒฐ๊ณผ๊ฐ’์„ ์ง€์ •ํ•œ ์ž๋ฆฟ์ˆ˜๊นŒ์ง€ ๋ฐ˜์˜ฌ๋ฆผํ•ด์คŒ

  • ํ‰๊ท ์„ ์†Œ์ˆ˜์  ๋‘๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผ

    • round(avg(), 1)
    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 AVERAGE_DURATION >= 7
    order by AVERAGE_DURATION desc, CAR_ID desc

truncate(number, decimals)

  • ์ž๋ฆฌ์ˆ˜ ๋ฒ„๋ฆฌ๋Š” ํ•จ์ˆ˜
SELECT truncate(PRICE, -4) as PRICE_GROUP, count(*) as PRODUCTS
from PRODUCT
group by 1
order by 1

โœจDate โ†’ Str ํ˜• ๋ณ€ํ™˜


DATE_FORMAT(๋‚ ์งœ, ์ถœ๋ ฅ ํ˜•์‹)

SELECT DATE_FORMAT('2019-09-16 20:23:12', '%Y-%m-%d')

DATEDIFF(๋‚ ์งœ1, ๋‚ ์งœ2)

  • ๋‘ ๋‚ ์งœ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๊ตฌํ•จ
  • ๋‘ ๋‚ ์งœ๊ฐ„์˜ ์ฐจ์ด + 1 ์„ ํ•ด์•ผ ์ด ๋Œ€์—ฌ๊ธฐ๊ฐ„
    • ์‹œ์ž‘์ผ์ด 5์›” 7์ผ, ์ข…๋ฃŒ์ผ์ด 5์›” 10์ผ์ด๋ผ๋ฉด, ๋Œ€์—ฌ๊ธฐ๊ฐ„์€ 4์ผ
    • datediff(END_DATE, START_DATE) + 1

TIMEDIFF(์‹œ๊ฐ„1, ์‹œ๊ฐ„2)

  • ๋‘ ์‹œ๊ฐ„ ๊ฐ„์˜ ์ฐจ์ด

in / not in

  • in

    • in์˜ ๋ชฉ๋ก ๊ฐ’์ธ ๊ฒƒ์„ ๋ฐ˜ํ™˜
    SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE 
    from ANIMAL_INS
    where NAME 
    in ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
    order by ANIMAL_ID
  • not in

    • in์˜ ๋ชฉ๋ก ๊ฐ’์ด ์•„๋‹Œ ๊ฒƒ์„ ๋ฐ˜ํ™˜
    SELECT * FROM Customers
    WHERE Country NOT IN ('Germany', 'France', 'UK');

    ๋…์ผ, ํ”„๋ž‘์Šค, ์˜๊ตญ ์ถœ์‹ ์ด ์•„๋‹Œ ๋ชจ๋“  ๊ณ ๊ฐ์„ ๋ฐ˜ํ™˜

case ๊ตฌ๋ฌธ

  • ์นผ๋Ÿผ์— ์กฐ๊ฑด๋ถ€์—ฌ

    • ์กฐ๊ฑด์ด true์ด๋ฉด ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    • else ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด Null ๋ฐ˜ํ™˜
    • case ๊ตฌ๋ฌธ ํ˜•์‹
    CASE
        WHEN condition1 THEN result1
        WHEN condition2 THEN result2
        WHEN conditionN THEN resultN
        ELSE result
    END;
  • ๊ฑฐ๋ž˜์ƒํƒœ๊ฐ€ SALE ์ด๋ฉด ํŒ๋งค์ค‘, RESERVED์ด๋ฉด ์˜ˆ์•ฝ์ค‘, DONE์ด๋ฉด ๊ฑฐ๋ž˜์™„๋ฃŒ ๋ถ„๋ฅ˜ํ•˜์—ฌ ์ถœ๋ ฅ

SELECT BOARD_ID, WRITER_ID, TITLE, PRICE, 
case STATUS 
    when 'SALE' then 'ํŒ๋งค์ค‘'
    when 'RESERVED' then '์˜ˆ์•ฝ์ค‘'
    else '๊ฑฐ๋ž˜์™„๋ฃŒ' end as STATUS 
from USED_GOODS_BOARD
where CREATED_DATE='2022-10-05'
order by BOARD_ID desc

LEFT

  • LEFT(๋ฌธ์ž์—ด, 2)
    • ๋ฌธ์ž์—ด์˜ ์™ผ์ชฝ์—์„œ 2๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ์ถ”์ถœ
SELECT left(PRODUCT_CODE, 2) as CATEGORY, count(PRODUCT_ID) as PRODUCTS
from PRODUCT
group by CATEGORY # ์ƒํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ ์ฝ”๋“œ๋ณ„ ์ƒํ’ˆ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ
order by CATEGORY

limit

  • ์ฒ˜์Œ n๊ฐœ ๋ฐ˜ํ™˜
  • ๊ฐ€์žฅ ํฐ ๋ฌผ๊ณ ๊ธฐ 10๋งˆ๋ฆฌ์˜ ID์™€ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL ๋ฌธ
select ID, LENGTH
from FISH_INFO
where LENGTH is not null
order by LENGTH desc, ID
limit 10

DISTINCT

  • ํ…Œ์ด๋ธ” ์—ด์—์„œ ๊ณ ์œ ํ•œ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜
SELECT DISTINCT Country FROM Customers;
  • ์ด๋ฆ„์ด NULL์ธ ๊ฒฝ์šฐ๋Š” ์ง‘๊ณ„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์€ ํ•˜๋‚˜๋กœ ์นจ
  • DISTINCT ์ž์ฒด๊ฐ€ null์„ ๋ฌด์‹œํ•˜๋ฏ€๋กœ WHERE NAME IS NOT NULL ์กฐ๊ฑด ํ•„์š”์—†์Œ
SELECT count(distinct NAME) as count
from ANIMAL_INS

ํ™œ์šฉ๋ฒ•

  • COUNT()
    • ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ํ•จ์ˆ˜
  • COUNT(DISTINCT [COL๋ช…])
    • DISTINCT๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ด ํ•ด๋‹น COL์˜ ๋ฐ์ดํ„ฐ ์ข…๋ฅ˜ ๊ฐœ์ˆ˜ ํŒŒ์•…
    • join์„ ํ•˜๋Š” ๊ฒฝ์šฐ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ์— DISTINCT ์‚ฌ์šฉ
SELECT 
    year(o.SALES_DATE) as YEAR, 
    month(o.SALES_DATE) as MONTH, 
    u.GENDER, 
    count(distinct u.USER_ID) as USERS
from USER_INFO u
join ONLINE_SALE o on u.USER_ID = o.USER_ID
where u.GENDER is not null
group by year(o.SALES_DATE), month(o.SALES_DATE), u.GENDER
# ๋…„, ์›”, ์„ฑ๋ณ„ ๋ณ„๋กœ ์ง‘๊ณ„
order by YEAR, MONTH, GENDER
# order by 1, 2, 3 ์œผ๋กœ ํ•ด๋„ ๋ฌด๋ฐฉ

join

  • (INNER) JOIN
    • ๋‘ ํ…Œ์ด๋ธ” ๋ชจ๋‘์—์„œ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์ด ์žˆ๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜
  • LEFT (OUTER) JOIN
    • ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ, ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜
  • RIGHT (OUTER) JOIN
    • ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜
  • FULL (OUTER) JOIN
    • ์™ผ์ชฝ ๋˜๋Š” ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ” ์ค‘ ํ•˜๋‚˜์— ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜

์˜ˆ์‹œ

  • 2022๋…„ 10์›”์— ์ž‘์„ฑ๋œ ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ, ๊ฒŒ์‹œ๊ธ€ ID, ๋Œ“๊ธ€ ID, ๋Œ“๊ธ€ ์ž‘์„ฑ์ž ID, ๋Œ“๊ธ€ ๋‚ด์šฉ, ๋Œ“๊ธ€ ์ž‘์„ฑ์ผ์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ
  • ๊ฒฐ๊ณผ๋Š” ๋Œ“๊ธ€ ์ž‘์„ฑ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
  • ๋Œ“๊ธ€ ์ž‘์„ฑ์ผ์ด ๊ฐ™๋‹ค๋ฉด ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
  • 2022๋…„ 10์›”์— ์ž‘์„ฑ๋œ ๊ฒŒ์‹œ๊ธ€์ด๋ฏ€๋กœ board b๋ฅผ ๊ธฐ์ค€์œผ๋กœ where์ ˆ ์ž‘์„ฑ
SELECT b.TITLE, b.BOARD_ID, r.REPLY_ID, r.WRITER_ID, r.CONTENTS, date_format(r.CREATED_DATE, '%Y-%m-%d') as CREATED_DATE
from USED_GOODS_BOARD b 
join USED_GOODS_REPLY r on b.BOARD_ID = r.BOARD_ID 
where b.CREATED_DATE like "2022-10%"
order by r.CREATED_DATE, b.TITLE

union all

  • ๋‘ ๊ฐœ ์ด์ƒ์˜ select๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉํ•  ๋•Œ ์‚ฌ์šฉ
  • ๊ตฌ์กฐ๊ฐ€ ์œ ์‚ฌํ•œ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ๊ฒฐํ•ฉ
  • union์€ ์ค‘๋ณต์„ ์ œ๊ฑฐ union all์€ ์ค‘๋ณต ์ œ๊ฑฐ ์—†์ด ๋ชจ๋“  ๊ฒฐ๊ณผ ํฌํ•จ
SELECT 
    date_format(SALES_DATE, '%Y-%m-%d') as SALES_DATE, 
    PRODUCT_ID, 
    USER_ID,
    SALES_AMOUNT
from (
    select
        SALES_DATE,
        PRODUCT_ID, 
        USER_ID,
        SALES_AMOUNT
    from ONLINE_SALE
    where year(SALES_DATE) = 2022 and month(SALES_DATE) = 3
    
    union all
    
    select
        SALES_DATE,
        PRODUCT_ID, 
        NULL as USER_ID,
        SALES_AMOUNT
    from OFFLINE_SALE
    where year(SALES_DATE) = 2022 and month(SALES_DATE) = 3
) as combined
order by 1, 2, 3
  1. ONLINE_SALE๊ณผ OFFLINE_SALE ํ…Œ์ด๋ธ”์—์„œ 2022๋…„ 3์›” ๋ฐ์ดํ„ฐ๋งŒ ์„ ํƒ
  2. OFFLINE_SALE์˜ USER_ID๋Š” NULL๋กœ ์„ค์ •
  3. ๋‘ ๊ฒฐ๊ณผ๋ฅผ UNION ALL๋กœ ๊ฒฐํ•ฉ
  4. ๋‚ ์งœ, ์ƒํ’ˆ ID, ์‚ฌ์šฉ์ž ID ์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ

if

SELECT IF(500<1000, "YES", "NO");

IF(condition, value_if_true, value_if_false)

if๋ฌธ์˜ ์กฐ๊ฑด์ด True๋ฉด ๋‘๋ฒˆ์งธ๊ฐ’, False๋ฉด ์„ธ๋ฒˆ์งธ๊ฐ’

select 
    count(*) as FISH_COUNT, 
    max(LENGTH) as MAX_LENGTH, 
    FISH_TYPE
from FISH_INFO
group by 3
having avg(if(ifnull(LENGTH, 0) < 10, 10, LENGTH)) >= 33
order by 3
  • if()์•ˆ์— ifnull ํ™œ์šฉ
  • ์กฐ๊ฑด: 10cm ์ดํ•˜์˜ ๋ฌผ๊ณ ๊ธฐ๋“ค์€ 10cm๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ํ‰๊ท  ๊ธธ์ด ๊ตฌํ•˜๊ธฐ
  • 10cm ์ดํ•˜์ธ ๊ฒฝ์šฐ
    • length๊ฐ€ null์ผ ๋•Œ
  • length๊ฐ€ null์ด๋ฉด 0์œผ๋กœ ๋ณด๊ณ  10cm ์ดํ•˜์ด๋ฏ€๋กœ 10cm๋กœ ์ทจ๊ธ‰ํ•˜๊ณ  ํ‰๊ท  ๊ตฌํ•˜๊ธฐ

ifnull

  • ํŠน์ • ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด null์ธ์ง€ ํ™•์ธํ•˜๊ณ  null์ธ ๊ฒฝ์šฐ ๋Œ€์ฒด ๊ฐ’์„ ๋ฐ˜ํ™˜

์˜ˆ์‹œ

  • ๋ƒ‰๋™์‹œ์„ค ์—ฌ๋ถ€๊ฐ€ null์ธ ๊ฒฝ์šฐ, N์œผ๋กœ ์ถœ๋ ฅ
SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, ifnull(FREEZER_YN, 'N')
from FOOD_WAREHOUSE
where ADDRESS like '๊ฒฝ๊ธฐ๋„%'
order by WAREHOUSE_ID

concat

  • ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•œ ์ˆœ์„œ๋Œ€๋กœ ํ•ฉ์น˜๋Š” ํ•จ์ˆ˜

์˜ˆ์‹œ

  • FISH_INFO ํ…Œ์ด๋ธ”์—์„œ ์žก์€ ๋ฌผ๊ณ ๊ธฐ ์ค‘ ๊ฐ€์žฅ ํฐ ๋ฌผ๊ณ ๊ธฐ์˜ ๊ธธ์ด๋ฅผ 'cm' ๋ฅผ ๋ถ™์—ฌ ์ถœ๋ ฅํ•˜๋Š” SQL ๋ฌธ
select distinct CONCAT(LENGTH, 'cm') as MAX_LENGTH
from FISH_INFO
where LENGTH = (select max(LENGTH) from FISH_INFO)

์„œ๋ธŒ์ฟผ๋ฆฌ

  • SQL ์ฟผ๋ฆฌ ์•ˆ์— ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ
  • ์ฃผ๋กœ () ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์„œ ํ‘œํ˜„

์˜ˆ์‹œ

  • ์Œ์‹์ข…๋ฅ˜๋ณ„๋กœ ์ฆ๊ฒจ์ฐพ๊ธฐ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์‹๋‹น์˜ ์Œ์‹ ์ข…๋ฅ˜, ID, ์‹๋‹น ์ด๋ฆ„, ์ฆ๊ฒจ์ฐพ๊ธฐ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ
  • ์Œ์‹ ์ข…๋ฅ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
SELECT 
    FOOD_TYPE, 
    REST_ID, 
    REST_NAME, 
    FAVORITES
from REST_INFO r1
where FAVORITES = (
    select max(FAVORITES)
    from REST_INFO r2
    where r2.FOOD_TYPE = r1.FOOD_TYPE
)
order by FOOD_TYPE desc
  1. ์„œ๋ธŒ์ฟผ๋ฆฌ: (SELECT MAX(FAVORITES) FROM REST_INFO r2 WHERE r2.FOOD_TYPE = r1.FOOD_TYPE)

    • ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์Œ์‹ ์ข…๋ฅ˜๋ณ„๋กœ ์ตœ๋Œ€ ์ฆ๊ฒจ์ฐพ๊ธฐ ์ˆ˜ ์ฐพ๊ธฐ
  2. ๋ฉ”์ธ ์ฟผ๋ฆฌ

    • ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ์ฐพ์€ ์ตœ๋Œ€๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ ์„ ํƒ
SELECT ID, NAME, HOST_ID
from PLACES
where HOST_ID in (
    select HOST_ID
    from PLACES
    group by HOST_ID
    having count(*) >= 2
)
order by ID
  1. ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ๊ณต๊ฐ„์„ 2๊ฐœ ๋“ฑ๋กํ•œ ์œ ์ € HOST_ID ์ฐพ๊ธฐ
    • group by HOST_ID ํ˜ธ์ŠคํŠธID๋กœ ๊ทธ๋ฃนํ™”
    • having count(*) >= 2 ๋“ฑ๋กํ•œ ๊ณต๊ฐ„์ด 2๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ
  2. ๋ฉ”์ธ ์ฟผ๋ฆฌ
    • WHERE HOST_ID IN (...) ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ์ฐพ์€ ํ—ค๋น„ ์œ ์ € ๋ชฉ๋ก์— ์žˆ๋Š” ๋ ˆ์ฝ”๋“œ ๋ฐ˜ํ™˜

SELECT CATEGORY, PRICE as MAX_PRICE, PRODUCT_NAME
from FOOD_PRODUCT
where PRICE in 
(
    select max(PRICE) from FOOD_PRODUCT group by CATEGORY)
    and 
    CATEGORY in ('๊ณผ์ž', '๊ตญ', '๊น€์น˜', '์‹์šฉ์œ ')
    
order by 2 desc
  1. ์„œ๋ธŒ์ฟผ๋ฆฌ
    • '๊ณผ์ž', '๊ตญ', '๊น€์น˜', '์‹์šฉ์œ ' ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„๋กœ ๊ฐ€์žฅ ๋น„์‹ผ ๊ฐ€๊ฒฉ
  2. ๋ฉ”์ธ์ฟผ๋ฆฌ
    • ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ์ฐพ์€ ์นดํ…Œ๊ณ ๋ฆฌ, ์ตœ๋Œ€ ๊ฐ€๊ฒฉ, ์ƒํ’ˆ ์ด๋ฆ„ ๋ฐ˜ํ™˜

Common Table Experssion(CTE)

  • with ๊ตฌ๋ฌธ์€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉ

  • recursive์˜ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์žฌ๊ท€, ๋น„์žฌ๊ท€ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    WITH

    WITH CTE AS (
    SELECT 0 AS NUM
    UNION ALL
    SELECT 0 FROM SOME_TABLE # SOME_TABLE์˜ ํ–‰ ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋œ๋‹ค.
    )

    WITH RECURSIVE

    WITH RECURSIVE CTE AS (
    SELECT 0 AS NUM
    UNION ALL
    SELECT NUM+1 FROM CTE
    WEHRE NUM < 10 # ๋ฐ˜๋ณต์„ ๋ฉˆ์ถ”๋Š” ์กฐ๊ฑด
    )
with recursive hours as (
    select 0 as h
    union all
    select h+1 from hours
    where h < 23
)

SELECT a.h as HOUR, count(b.ANIMAL_ID) as COUNT
from hours as a 
left join ANIMAL_OUTS as b on a.h = hour(b.DATETIME)
group by 1
order by 1
  • recursive ์ด์šฉํ•ด์„œ ๊ฐ€์ƒ ํ…Œ์ด๋ธ” ํ˜•์„ฑํ•˜๊ธฐ
    • ์žฌ๊ท€๋ฅผ ์ด์šฉํ•ด์„œ 0 ~ 23 ๊นŒ์ง€ +1 ์”ฉ ํ•ด์„œ ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ์„ ํ˜•์„ฑ
  • ๊ฐ€์ƒ ํ…Œ์ด๋ธ” hours
    • animal_outs ํ…Œ์ด๋ธ”๊ณผ left join
    • ์ด๋ ‡๊ฒŒ ํ•ด์•ผ 0 ~ 23 ๊นŒ์ง€ ์‹œ๊ฐ„์ด ๋ชจ๋‘ ๋ฐ˜ํ™˜
  • count(*) ๊ฐ€ ์•„๋‹Œ count(animal_outs.animal_id) ์ธ ์ด์œ 
    • ์‹ค์ œ ๋ฐ์ดํ„ฐ์ธ animal_outs์˜ ์ˆ˜๋ฅผ ์ง‘๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ „์ฒด ์ง‘๊ณ„๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ์ž„์‹œ ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ๋„ ์ง‘๊ณ„๊ฐ€ ๋˜๊ธฐ๋•Œ๋ฌธ์— 0์ด ์•„๋‹Œ 1์ด ๋‚˜์˜ค๊ฒŒ ๋จ.

Create Table As Select (CTAS)

๊ธฐ์กด ํ…Œ์ด๋ธ”์ด๋‚˜ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋ฌธ

CREATE TABLE ์ƒˆ_ํ…Œ์ด๋ธ”๋ช… AS
SELECT ...
FROM ๊ธฐ์กด_ํ…Œ์ด๋ธ”
WHERE ์กฐ๊ฑด;
59413)  

โœ… ์ปฌ๋Ÿผ ๊ตฌ์กฐ SELECT์— ์ง€์ •๋œ ์ปฌ๋Ÿผ ๊ตฌ์กฐ๋กœ ์ƒˆ ํ…Œ์ด๋ธ” ์ƒ์„ฑ

โœ… ๋ฐ์ดํ„ฐ SELECT ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒˆ ํ…Œ์ด๋ธ”์— ์‚ฝ์ž…๋จ

โŒ ์ œ์•ฝ์กฐ๊ฑด PK, FK, NOT NULL ๋“ฑ์˜ ์ œ์•ฝ์กฐ๊ฑด์€ ๋ณต์‚ฌ๋˜์ง€ ์•Š์Œ

โœ… ์„ฑ๋Šฅ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ ๋ถ„์„ํ•˜๊ฑฐ๋‚˜ ๋ฐฑ์—…ํ•  ๋•Œ ํšจ์œจ์ 

About

๐Ÿฃ ์ฝ”๋ฆฐ์ด์˜ SQL ์ •๋ณต๊ธฐ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published