ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿ’ก โ€ป ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต์˜ ํ•„์š”์„ฑ

๋‹ค๋ฃฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์šฉ๋„๋กœ ์ƒ์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

  • ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์—” ์ฝ”๋“œ ๊ฐ’๋งŒ ์ €์žฅํ•˜๊ณ , ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—์„œ ์ฝ”๋“œ๊ฐ’์˜ ์˜๋ฏธ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ์žˆ์Œ! ์ด ๊ฒฝ์šฐ ๋ฆฌํฌํŠธ ์ž‘์„ฑ ์‹œ ์–ด๋ ค์›€์„ ๊ฒช์„ ์ˆ˜ ์žˆ๋‹ค! → ๋ฐ์ดํ„ฐ ๋ถ„์„์— ์ ํ•ฉํ•œ ํ˜•ํƒœ๋กœ ๋ฏธ๋ฆฌ ๊ฐ€๊ณตํ•˜๊ธฐ

์—ฐ์‚ฐํ•  ๋•Œ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋งŒ๋“ค๊ณ  ์˜ค๋ฅ˜๋ฅผ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ์šฐ

  • ๋กœ๊ทธ ๋ฐ์ดํ„ฐ์™€ ์—…๋ฌด ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์ด ์ผ์น˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ!
  • ์–ด๋–ค ๊ฐ’๊ณผ NULL ๊ฐ’์„ ์—ฐ์‚ฐํ•  ๋•Œ , NULL ์ด ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ ์žˆ์Œ! ์ด ๊ฒฝ์šฐ ์›๋ž˜ ์–ด๋–ค ๊ฐ’์˜ ์ •๋ณด๊ฐ€ ๋‚ ์•„๊ฐ€๋ฏ€๋กœ, ๋ฏธ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด NULL์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ! 

1. ์ฝ”๋“œ ๊ฐ’์„ ๋ ˆ์ด๋ธ”๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ

์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ : register_device ( 1 : ๋ฐ์Šคํฌํ†ฑ, 2: ์Šค๋งˆํŠธํฐ, 3: ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜)

์ง‘๊ณ„ํ•  ๋•Œ, ์ฝ”๋“œ ๊ฐ’์„ ๋ฏธ๋ฆฌ ๋ ˆ์ด๋ธ”๋กœ ๋ณ€๊ฒฝ → CASE ๋ฌธ ์ด์šฉ

CASE WHEN <์กฐ๊ฑด์‹> THEN <์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ์˜ ๊ฐ’> END

SELECT user_id, 
CASE
	WHEN register_device = 1 THEN '๋ฐ์Šคํฌํ†ฑ'
	WHEN register_device = 2 THEN '์Šค๋งˆํŠธํฐ'
	WHEN register_device = 3 THEN '์• ํ”Œ๋ฆฌ์ผ€์ด์…˜'
		ELSE ''
END AS device_name
FROM mst_users;

*๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์— CASE๋ฌธ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๊ธฐ์–ต!

2. URL์—์„œ ์š”์†Œ ์ถ”์ถœํ•˜๊ธฐ

์ ‘๊ทผ ๋กœ๊ทธ ํ…Œ์ด๋ธ” - ์ตœ์†Œํ•œ์˜ ์š”๊ฑด์œผ๋กœ ๋ ˆํผ๋Ÿฌ์™€ url์„ ์ €์žฅํ•ด๋‘” ๊ฒƒ!

 

๋ ˆํผ๋Ÿฌ๋กœ ์–ด๋–ค ์›น ํŽ˜์ด์ง€๋ฅผ ๊ฑฐ์ณ ๋„˜์–ด์™”๋Š”์ง€ ํŒ๋ณ„ํ•˜๊ธฐ

ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์ง‘๊ณ„ํ•˜๋ฉด ๋ฐ€๋„๊ฐ€ ๋„ˆ๋ฌด ์ž‘์•„ ๋ณต์žก → ํ˜ธ์ŠคํŠธ ๋‹จ์œ„๋กœ ์ง‘๊ณ„

  • ์ด๋•Œ, ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์˜ ํŒจํ„ด ์ถ”์ถœํ•ด์•ผ ํ•จ! 
SELECT 
stamp, substring(referrer from 'https?://([^/]*)') AS referrer_host FROM access_log;

URL์—์„œ ๊ฒฝ๋กœ์™€ ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’ ์ถ”์ถœํ•˜๊ธฐ

  • path ๋ณ€์ˆ˜๋กœ ํ˜ธ์ŠคํŠธ ๋‹จ์œ„ ๋‹ค์Œ ์ฃผ์†Œ ์ถ”์ถœ

-id ๋ณ€์ˆ˜๋กœ ‘?id = 001’ ๋ถ€๋ถ„์—์„œ ์ˆซ์ž๋งŒ ์ถ”์ถœ

SELECT 
stamp, url, substring(url from '//[^/]+([^?#]+)') as path, 
substring(url from 'id=([^&]*)') AS id
FROM access_log;

3. ๋ฌธ์ž์—ด์„ ๋ฐฐ์—ด๋กœ ๋ถ„ํ•ดํ•˜๊ธฐ

  • ๋ฌธ์ž์—ด ์ž๋ฃŒํ˜•์€ ๋ฒ”์šฉ์ ์ด๋ฏ€๋กœ, ๋” ์„ธ๋ถ€์ ์œผ๋กœ ๋ถ„ํ•ดํ•ด์•ผ ํ•จ!
    • ex) ์˜์–ด ๋ฌธ์žฅ์„ ๊ณต๋ฐฑ์œผ๋กœ ๋ถ„ํ• ํ•ด์„œ ํ•˜๋‚˜ํ•˜๋‚˜์˜ ๋‹จ์–ด๋กœ ๊ตฌ๋ถ„, ์‰ผํ‘œ๋กœ ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜๋ผ ํ•˜๋‚˜ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ถ”์ถœ
  • ๋กœ๊ทธ ์ƒ˜ํ”Œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŽ˜์ด์ง€ ๊ณ„์ธต ๋‚˜๋ˆ„๊ธฐ → URL๊ฒฝ๋กœ๋ฅผ ์Šฌ๋ž˜์‹œ๋กœ ๋ถ„ํ• 
  • split_part ๋ฅผ ์ด์šฉํ•ด n๋ฒˆ์งธ ์š”์†Œ ์ถ”์ถœํ•˜๊ธฐ!
# ๊ฒฝ๋กœ๋ฅผ ์Šฌ๋ž˜์‹œ๋กœ ์ž˜๋ผ ๋ฐฐ์—ด๋กœ ๋ถ„ํ• ํ•˜๊ธฐ
# ๊ฒฝ๋กœ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์Šฌ๋ž˜์‹œ๋กœ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ 2๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ๋งˆ์ง€๋ง‰ ๊ณ„์ธต
SELECT 
stamp, url, split_part(substring(url from '//[^/]+([^?#]+)'),'/',2) as path1, 
split_part(substring(url from '//[^/]+([^?#]+)'),'/',3) as path2
FROM access_log;

4. ๋‚ ์งœ์™€ ํƒ€์ž„์Šคํƒฌํ”„ ๋‹ค๋ฃจ๊ธฐ

ํ˜„์žฌ ๋‚ ์งœ์™€ ํƒ€์ž„์Šคํƒฌํ”„ ์ถ”์ถœํ•˜๊ธฐ

  • PostgreSQL์—์„œ๋Š” CURRENT_TIMESTAMP์˜ ๋ฆฌํ„ด ๊ฐ’์œผ๋กœ ํƒ€์ž„์กด์ด ์ ์šฉ๋œ ํƒ€์ž„์Šคํƒฌํ”„ ์ž๋ฃŒํ˜•์ด ๋‚˜์˜ด!
  • ๋ฆฌํ„ด๊ฐ’์˜ ์ž๋ฃŒํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด์„œ๋Š” LOCALTIMESTAMP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค!
SELECT
CURRENT_DATE AS dt, CURRENT_TIMESTAMP AS stamp, LOCALTIMESTAMP as lcstamp;
# ํƒ€์ž„์กด์„ ์ ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฉด LOCALTIME STAMP ์‚ฌ์šฉ

์ง€์ •ํ•œ ๊ฐ’์˜ ๋‚ ์งœ/์‹œ๊ฐ ๋ฐ์ดํ„ฐ ์ถ”์ถœํ•˜๊ธฐ

  • ํ˜„์žฌ ์‹œ๊ฐ์ด ์•„๋‹Œ ๋ฌธ์ž์—ด๋กœ ์ง€์ •ํ•œ ๋‚ ์งœ์™€ ์‹œ๊ฐ์„ ๊ธฐ๋ฐ˜์„ ๋‚ ์งœ ์ž๋ฃŒํ˜•๊ณผ ํƒ€์ž„ ์Šคํƒฌํ”„ ์ž๋ฃŒํ˜• ๋ฐ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ
  • CAST(value AS type) ํ•จ์ˆ˜ ์‚ฌ์šฉ!
# ๋ฌธ์ž์—ด์„ ๋‚ ์งœ / ํƒ€์ž„์Šคํƒฌํ”„๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ
# CAST(value AS type)
SELECT 
	CAST('2016-01-30' AS date) AS dt, CAST('2016-01-30 12:00:00' AS timestamp) AS stamp;

  • type value์‚ฌ์šฉ
SELECT 
	date '2016-01-30' AS dt, timestamp '2016-01-30 12:00:00' AS stamp;

  • value::type ์‚ฌ์šฉ
SELECT 
	'2016-01-30'::date AS dt, '2016-01-30 12:00:00'::timestamp AS stamp;

๋‚ ์งœ/์‹œ๊ฐ์—์„œ ํŠน์ • ํ•„๋“œ ์ถ”์ถœํ•˜๊ธฐ

  • timestamp ์ž๋ฃŒํ˜•์—์„œ ํŠน์ • ํ•„๋“œ๊ฐ’ (๋…„/์›”) ์ถ”์ถœํ•˜๊ธฐ! → EXTRACT ํ•จ์ˆ˜ ์‚ฌ์šฉ
SELECT 
	stamp
,EXTRACT(YEAR FROM stamp) AS year
,EXTRACT(MONTH FROM stamp) AS month
,EXTRACT(DAY FROM stamp) AS day
,EXTRACT(HOUR FROM stamp) AS hour
FROM (SELECT CAST('2016-01-30 12:00:00' AS timestamp) AS stamp) AS t;

โ“ AS t ํ•ด์ฃผ๋Š” ์ด์œ : PostgreSQL ์—์„œ๋Š” FROM ์ ˆ ์„œ๋ธŒ์ฟผ๋ฆฌ์— alias ๋ฅผ ํ•„ํžˆ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

FROM ์ ˆ ๋‚ด์˜ subquery ์—๋Š” ๋ฐ˜๋“œ์‹œ alias ๋ฅผ ๊ฐ€์ ธ์•ผ๋งŒ ํ•จ!

AS t ์•ˆํ•ด์ฃผ๋ฉด ์ด๋Ÿฐ ์˜ค๋ฅ˜ ๋‚˜์˜ด!

  • timestamp๋ฅผ ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•ด์„œ ๋ฌธ์ž์—ด ์กฐ์ž‘์œผ๋กœ ํ•„๋“œ ์ถ”์ถœ →SUBSTRING ํ•จ์ˆ˜ ์‚ฌ์šฉ
SELECT 
	stamp
,substring(stamp, 1, 4) AS year # 1๋ถ€ํ„ฐ 4๊ฐœ
,substring(stamp, 6, 2) AS month
,substring(stamp, 9, 2) AS day
,substring(stamp, 12, 2) AS hour
, substring(stamp, 1,7) AS year_month # ์—ฐ๊ณผ ์›” ํ•จ๊ป˜ ์ถ”์ถœ
FROM (SELECT CAST('2016-01-30 12:00:00' AS text) AS stamp) AS t;
# ๋ฌธ์ž์—ด ์ž๋ฃŒํ˜•์œผ๋กœ text ์‚ฌ์šฉ!

5. ๊ฒฐ์†๊ฐ’์„ ๋””ํดํŠธ ๊ฐ’์œผ๋กœ ๋Œ€์น˜ํ•˜๊ธฐ

  • NULL์ด ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, NULL๊ณผ ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ → NULL / NULL๊ณผ ์ˆซ์ž ์‚ฌ์น™์—ฐ์‚ฐ → NULL

์—ฌ๊ธฐ์„œ ๋นˆ ๊ฐ’์ด NULL !

๊ตฌ๋งค์•ก์—์„œ ํ• ์ธ ์ฟ ํฐ ๊ฐ’์„ ์ œ์™ธํ•œ ๋งค์ถœ ๊ธˆ์•ก ๊ตฌํ•˜๊ธฐ

SELECT 
	purchase_id, amount, coupon, amount - coupon as discount_amount1,
	amount - COALESCE(coupon, 0) AS discount_amount2
FROM purchase_log_with_coupon;

discount_amount1์€ price์—์„œ coupon์„ ๊ทธ๋Œ€๋กœ ๋บ€ ๊ฐ’( NULL๊ฐ’ ์œ ์ง€), discount_amount2๋Š” price์—์„œ coupon์„ ๋บ„ ๋•Œ NULL ๊ฐ’์€ 0์œผ๋กœ ๊ฐ„์ฃผํ•œ ๊ฒƒ

โ“ COALESCE(column1, column2,...) : ์ฒซ๋ฒˆ์งธ ์ธ์ž๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํ™•์ธํ•˜๋Š”๋ฐ, ์ฒ˜์Œ์œผ๋กœ NULL์ด ์•„๋‹Œ ๊ฐ’์„ ๋งŒ๋‚˜๋ฉด ๊ทธ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜ → coupon์ด NULL๊ฐ’์ด๋ฉด 0์„ ์ถœ๋ ฅํ•˜๋„๋ก!

๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2024/07   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ