TIL - 6

ํƒœ๊ทธ
DB
๋‚ ์งœ
Mar 30, 2022
์†์„ฑ

SELECT ์‚ดํŽด๋ณด๊ธฐ

SELECT ์‚ฌ์šฉํ•˜๊ธฐ ์ „์—

  • SHOW DATABASES;
  • USE prod; โ€“ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„
  • SHOW TABLES;

SELECT (1)

  • ํ…Œ์ด๋ธ”์—์„œ ๋ ˆ์ฝ”๋“œ๋“ค์„ ์ฝ์–ด์˜ค๋Š”๋ฐ ์‚ฌ์šฉ
  • WHERE๋ฅผ ์‚ฌ์šฉํ•ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ
SELECT ํ•„๋“œ์ด๋ฆ„1, ํ•„๋“œ์ด๋ฆ„2, ..., FROM ํ…Œ์ด๋ธ”์ด๋ฆ„ WHERE ์„ ํƒ์กฐ๊ฑด GROUP BY ํ•„๋“œ์ด๋ฆ„1, ํ•„๋“œ์ด๋ฆ„2 ORDER BY ํ•„๋“œ์ด๋ฆ„ [ASC|DESC] -- ํ•„๋“œ์ด๋ฆ„ ๋Œ€์‹ ์— ์ˆซ์ž ์‚ฌ์šฉ ๊ฐ€๋Šฅ LIMIT N;

SELECT (2)

SELECT * -- *์€ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ง€์นญ FROM prod.session; -- ์•ž์„œ USE prod; ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด session๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

SELECT (3)

SELECT id, user_id, channel_id FROM session; SELECT * FROM session LIMIT 10;

SELECT (4)

SELECT DISTINCT channel_id -- ์œ ์ผํ•œ ์ฑ„๋„ ID๋ฅผ ์•Œ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ FROM session; SELECT channel_id, COUNT(1) -- ์ฑ„๋„ ID๋ณ„ ์นด์šดํŠธ๋ฅผ ํ•˜๋ ค๋ฉด ๊ทธ๋ฃน ๋ฐ”์ด / ์นด์šดํŠธ ํ•จ์ˆ˜ FROM session GROUP BY 1;

SELECT (5)

SELECT COUNT(1) -- ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ์ˆ˜ ์นด์šดํŠธ COUNT(*) ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ FROM prod.session; SELECT * -- ์ฑ„๋„ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ํ‘œ์‹œ FROM channel select count(1) from channel where channel_id = 5; -- channel์ด facebook ์ธ ๊ฒฝ์šฐ

CASE WHEN

  • ํ•„๋“œ ๊ฐ’์˜ ๋ณ€ํ™˜์„ ์œ„ํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • CASE WHEN ์กฐ๊ฑด THEN ์ฐธ์ผ๋•Œ ๊ฐ’ ELSE ๊ฑฐ์ง“์ผ๋•Œ ๊ฐ’ END ํ•„๋“œ์ด๋ฆ„
  • ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
CASE WHEN ์กฐ๊ฑด1 THEN ๊ฐ’1 WHEN ์กฐ๊ฑด2 THEN ๊ฐ’2 ELSE ๊ฐ’3 END ํ•„๋“œ์ด๋ฆ„ SELECT channel_id, CASE WHEN channel_id in(1,5,6) THEN 'Social-Media' WHEN channel_id in(2,4) THEN 'Search-Engine' ELSE 'Something-Else' END channel_type FROM session

NULL ์ด๋ž€?

  • ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ์ˆ˜ 0ํ˜น์€ ""๊ณผ๋Š” ๋‹ค๋ฆ„
  • ํ•„๋“œ ์ง€์ •์‹œ ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ NULL๋กœ ์ง€์ • ๊ฐ€๋Šฅ
    • ํ…Œ์ด๋ธ” ์ •์˜์‹œ ๋””ํดํŠธ ๊ฐ’์œผ๋กœ๋„ ์ง€์ • ๊ฐ€๋Šฅ
  • ์–ด๋–ค ํ•„๋“œ์˜ ๊ฐ’์ด NULL์ธ์ง€ ์•„๋‹Œ์ง€ ๋น„๊ต๋Š” ํŠน์ˆ˜ํ•œ ๋ฌธ๋ฒ•์„ ํ•„์š”๋กœํ•จ
    • field 1 is NULL ํ˜น์€ field 1 is not null
  • NULL์ด ์‚ฌ์น™์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋Š”?
    • select 0 + null, 0 - null, 0 * null, 0/null

Where

  • IN
    • where channel_id id (3,4)
      • where channel_id = r or channel_id =4
    • not in๊ณผ ํ•จ๊ป˜ ์“ฐ์ž„
  • LIKE
    • LIKE : ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ณ„ ์—†์ด ๋ฌธ์ž์—ด ๋งค์นญ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์คŒ
      • where channel LIKE โ€˜G%โ€™ -> โ€™G*โ€™
      • where channel LIKE โ€˜%o%โ€™ -> โ€˜oโ€™
      • NOT LIKE์™€ ํ•จ๊ป˜ ์“ฐ์ž„
  • BETWEEN
    • ๋‚ ์งœ ๋ฒ”์œ„์— ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์œ„์˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋“ค์€ CASE WHEN์‚ฌ์ด์—์„œ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
SELECT COUNT(1) FROM prod.session WHERE channel_id IN (4,5); SELECT DISTINCT channel FROM prod.channel WHERE channel LIKE '%o%'; SELECT DISTINCT channel FROM prod.channel WHERE channel NOT LIKE '%o%';

String ํ•จ์ˆ˜

  • LEFT(str,N)
  • REPLACE(str, exp1, exp2)
  • UPPER(str)
  • LOWER(str)
  • LENGTH(str)
  • LPAD,RPAD
  • SUBSTRING
  • CONCAT

ORDER BY

  • ๋””ํดํŠธ ์ˆœ์„œ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ(์ž‘์€ ๊ฐ’์ด ๋จผ์ € ๋‚˜์˜ด)
    • ORDER BY 1 ASC
  • ๋‚ด๋ฆผ์ฐจ์ˆœ์„ ์›ํ•˜๋ฉด DESC
    • ORDER BY 1 DESC
  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •๋ ฌํ•˜๋ ค๋ฉด
    • ORDER BY 1 DESC, 2, 3
  • NULL ๊ฐ’ ์ˆœ์„œ๋Š”?
    • ์˜ค๋ฆ„์ฐจ์ˆœ์ผ ๊ฒฝ์šฐ ์ฒ˜์Œ์— ์œ„์น˜
    • ๋‚ด๋ฆผ์ฐจ์ˆœ์ผ ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰์— ์œ„์น˜
select value from prod.count_test order by value desc; select value from prod.count_test order by value asc;

ํƒ€์ž… ๋ณ€ํ™˜ (1)

  • DATE Conversion
    • NOW
    • ํƒ€์ž„์กด ๊ด€๋ จ ๋ณ€ํ™˜
      • CONVERT_TZ(now(),โ€˜GMTโ€™,โ€˜Asia/Seoulโ€™)
    • DATE, WEEK, MONTH, ,YEAR, HOUR, MINUTE, SECOND, QUARTER, MONTHNAME
    • DATEDIFF
    • DATE_ADD
    • โ€ฆ
  • STR_TO_DATE, DATE_FORMAT

ํƒ€์ž… ์บ์ŠคํŒ…

  • 1/2 ๊ฒฐ๊ณผ๋Š”?
    • 0์ด๋œ๋‹ค. ์ •์ˆ˜๊ฐ„์˜ ์—ฐ์‚ฐ์€ ์ •์ˆ˜๊ฐ€ ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
      • ๋ถ„์ž๋‚˜ ๋ถ„๋ชจ์ค‘์˜ ํ•˜๋‚˜๋ฅผ float์œผ๋กœ ์บ์ŠคํŒ…ํ•ด์•ผ 0.5๊ฐ€ ๋‚˜์˜จ๋‹ค.
      • ์ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•จ
    • case ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
      • cast(category as float)
      • convert(expression, float)
select cast('100.0' as float), convert('100.0', float);

GROUP BY

  • select ์‹คํ–‰ ์‹œ ๊ฒฐ๊ณผ๋ฅผ ํŠน์ • ๊ทธ๋ฃน๋ณ„๋กœ ๋ฌถ๋Š” ๋ฐฉ๋ฒ•

GROUP BY & Aggregate ํ•จ์ˆ˜ (1)

  • ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ•‘ํ•˜์—ฌ ๊ทธ๋ฃน๋ณ„๋กœ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๊ณ„์‚ฐ
  • ๋‘๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
    • ๋จผ์ € ๊ทธ๋ฃนํ•‘์„ ํ•  ํ•„๋“œ๋ฅผ ๊ฒฐ์ •(ํ•˜๋‚˜ ์ด์ƒ์˜ ํ•„๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.)
      • GROUP BY๋กœ ์ง€์ •(ํ•„๋“œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ•„๋“œ ์ผ๋ จ๋ฒˆํ˜ธ ์‚ฌ์šฉ)
    • ๋‹ค์Œ ๊ทธ๋ฃน๋ณ„๋กœ ๊ณ„์‚ฐํ•  ๋‚ด์šฉ์„ ๊ฒฐ์ •
      • ์—ฌ๊ธฐ์„œ Aggregateํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
      • COUNT, SUM, AVG, MIN, MAX, GROUP _CONCAT, โ€ฆ
        • ๋ณดํ†ต ํ•„๋“œ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ (alias)

GROUP BY & Aggregate ํ•จ์ˆ˜ (2)

  • ์›”๋ณ„ ์„ธ์…˜์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” SQL
    • prod.session ์‚ฌ์šฉ (id, create ํ•„๋“œ)
select LEFT(create, 7) AS mon, COUNT(1) AS session_count from prod.session GROUP BY 1 -- GROUP BY mon, GROUP BY LEFT(create, 7) ORDER BY 1;

ํ•™์Šต์˜ˆ์ œ

SHOW DATABASES; USE prod; SHOW TABLES; SELECT * FROM prod.session; SELECT id, user_id, channel_id from prod.session; select * from prod.session limit 10; -- ์œ ์ผํ•œ ์ฑ„๋„ ID๋ฅผ ์•Œ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ select distinct channel_id from prod.session; -- ์ฑ„๋„ id๋ณ„ ์นด์šดํŠธ๋ฅผ ํ•˜๋ ค๋ฉด? select channel_id, count(1) from prod.session group by 1; -- ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ์ˆ˜ ์นด์šดํŠธ select count(1) from prod.session; -- ์ฑ„๋„ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ์ˆ˜์นด์šดํŠธ select * from prod.channel; -- ์ฑ„๋„์ด ํŽ˜์ด์Šค๋ถ์ธ ๊ฒฝ์šฐ๋งŒ ๋ ˆ์ฝ”๋“œ ์ˆ˜ ์นด์šดํŠธ select count(1) from prod.session where channel_id=5; -- where channel_id in (5) -- CASE WHEN select channel_id, CASE WHEN channel_id in (1,5,6) THEN 'social-media' WHEN channel_id in (2,4) THEN 'search-engine' ELSE 'somthing-else' END channel_type from prod.session; select distinct channel_id, CASE WHEN channel_id in (1,5,6) THEN 'social-media' WHEN channel_id in (2,4) THEN 'search-engine' ELSE 'somthing-else' END channel_type from prod.session; -- count ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ select * from prod.count_test; select count(1) from prod.count_test; select count(0) from prod.count_test; select count(null) from prod.count_test; select count(value) from prod.count_test; select count(distinct value) from prod.count_test; -- where ์กฐ๊ฑด select count(1) from prod.session where channel_id in (4,5); select distinctchannel from prod.channel where channel LIKE '%G%';