ํฌ์ŠคํŠธ

21.12.14 SQL ๊ณต๋ถ€

21.12.14 SQL ๊ณต๋ถ€

๐Ÿ’ก NULL ์ฒ˜๋ฆฌํ•˜๊ธฐ


โˆ™ IFNULL

ํ•ด๋‹น ํ•„๋“œ์˜ ๊ฐ’์ด NULL์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ, ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜.

1
2
SELECT IFNULL(COL1,'๋ฐ”๊ฟ€ ๋ณ€์ˆ˜๋ช…') AS COL1
FROM TABLE


โˆ™ CASE

TRUE/FALSE๋ฅผ ํŒ๋‹จํ•˜์—ฌ ์กฐ๊ฑด์— ๋งž๊ฒŒ ๊ฐ’์„ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ

  • ex1
    1
    2
    3
    4
    5
    6
    
    SELECT ANIMAL_TYPE,
      CASE 
          WHEN NAME IS NULL THEN "No name"
              ELSE NAME
      END AS NAME, SEX_UPON_INTAKE
    FROM ANIMAL_INS
    
  • ex2
    1
    2
    3
    4
    5
    6
    7
    
     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 ANIMAL_ID ASC
    


โˆ™ COALESCE

์ž…๋ ฅ ๋ฐ›์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์ž ์ค‘ NULL์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜

1
2
SELECT ANIMAL_TYPE, COALESCE(NAME, "No name") AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS


๐Ÿ’ก JOIN


โˆ™ LEFT JOIN

LEFT JOIN์€ ์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ, ๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์„ ์กฐํ•ฉํ•˜๋Š” ๊ฒƒ.

1
2
3
4
SELECT *
FROM ์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”
LEFT JOIN ๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”
ON ์กฐ๊ฑด

ON ์ ˆ์—์„œ๋Š” WHERE ์ ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— WHERE t2.id IS NULL ์ด๋ผ๊ณ  ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด,

์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ๋ณด์ด๋Š” ๊ต์ง‘ํ•ฉ ๋ถ€๋ถ„์€ ์ œ์™ธ๋œ๋‹ค.


โˆ™ INNER JOIN

๋ฒค๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ๊ต์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ์š”๊ฑฐํŠธ์™€ ์šฐ์œ ๋ฅผ ๋ชจ๋‘ ๊ณ ๋ฅธ CART_ID๋ฅผ ์ฐพ๋Š” ์ฟผ๋ฆฌ๋ฌธ.

1
2
3
4
SELECT DISTINCT A.CART_ID
FROM (SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'YOGURT') A
INNER JOIN (SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'MILK') B
ON A.CART_ID = B.CART_ID

์œ„ ์ฟผ๋ฆฌ๋ฌธ๊ณผ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
SELECT DISTINCT CART_ID
FROM CART_PRODUCTS 
WHERE NAME = "MILK" 
AND CART_ID IN (
    SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME = "YOGURT"
)


๐Ÿ’ก IN


โˆ™ IN

ํŠน์ • ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋˜์˜ค ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

1
2
3
SELECT *
FROM TABLE_NAME
WHERE COL1 IN ('A','B','C')


๐Ÿ’ก DATE๊ด€๋ จ


โˆ™ DATEDIIFF

DATEDIFF(DATE1, DATE2)๋Š” Day์˜ ์ฐจ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค.

1
2
3
4
5
SELECT INS.ANIMAL_ID, INS.NAME
FROM ANIMAL_INS AS INS
INNER JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
ORDER BY DATEDIFF(OUTS.DATETIME,INS.DATETIME) DESC LIMIT 2

์ถ”๊ฐ€์ ์œผ๋กœ TIMESTAMPDIFF(๋‹จ์œ„, DATE1, DATE2)๋Š” ๋‹จ์œ„๋ณ„๋กœ ์ฐจ์ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.



๐Ÿ“š References

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.