CodeGym /課程 /SQL SELF /Top50 資料庫查詢語句

Top50 資料庫查詢語句

SQL SELF
等級 61 , 課堂 2
開放

當你把所有資料表都串起來之後,就是時候來寫幾個查詢語句啦。雖然說幾個,這只是給新手的。你現在已經是專業的了,所以你需要寫 50(!) 個查詢語句給你的資料庫。而且這還只是最重要的那些。

資料庫查詢語句

1. 取得展示櫃商品清單

這個查詢會回傳所有啟用中的商品,包含主要價格和圖片,用來在首頁和目錄顯示。這樣可以快速組成展示櫃,並保持商品資訊的即時性。

2. 用關鍵字搜尋商品

讓使用者可以用名稱或描述的關鍵字來找商品。這是 catalog 快速搜尋很重要的功能。

3. 用 ID 查詢商品卡片

回傳某個商品的詳細資訊,包括品牌和分類。這是顯示商品詳細頁必備的。

4. 商品所有變體清單

列出商品所有可用的變體(SKU):尺寸、顏色、庫存、價格。用來在商品頁選擇不同規格。

5. 商品圖片集

完整顯示商品卡片時,所有照片都很重要。這個查詢會回傳所有圖片,並標記主圖。

6. 商品平均評分和評論數

用來顯示商品評分和評論數,這對買家信任和商品聲譽很重要。

7. 商品詳細評論清單

商品卡片的評論區:評分、內容、作者和評論日期。幫助新買家決定要不要買。

8. 商品問答

查詢每個商品的問答,這對 FAQ 區塊很重要。

9. 商品分類階層

可以視覺化 catalog 結構,建立 filter 和 menu 的導覽樹。

10. 依分類與子分類查詢商品

幫你列出某個分類或其「子分類」下的所有商品(多層級)。

11. 品牌清單

用來做品牌 filter、品牌清單和 landing page。

12. 熱門標籤及商品數量

分析最常用的 tag,顯示熱門商品和建立 tag cloud。

13. 商品價格變動歷史

用來做分析和顯示價格動態(舊價/新價、促銷)。

14. 商品狀態變更歷史

可以追蹤商品生命週期、下架或回架的原因。

15. 證書與授權搜尋

對專業買家和 B2B 來說很重要(產品品質與合法性)。

16. 商品供應商資料

對管理、品質控管和供應商聯絡很重要。

17. 商品各倉庫庫存

控管和記錄各倉庫的即時庫存。對物流系統和避免「缺貨」很重要。

18. 庫存低於門檻的商品

自動補貨,避免因缺貨而損失銷售。

19. 商品倉庫移動紀錄(稽核)

追蹤某段期間內所有商品移動:進貨、出庫、調整,對盤點和防止損失很重要。

20. 倉庫間物流調撥

可以看到商品在物流中心間內部調撥的歷史和狀態。

21. 配送方式與費率

用來計算運費和在結帳時告知用戶。

22. 用戶訂單歷史

個人中心最重要的部分 — 所有下過的訂單、狀態和金額。

23. 訂單明細與項目

可以取得訂單的完整結構 — 內容、價格、數量 — 用來前端顯示或客服支援。

24. 依期間與狀態的訂單報表

銷售分析和報表,回傳某期間和指定狀態(例如「已完成」)的訂單。

25. 「被遺棄」的購物車

給行銷人員的分析:用戶沒結帳的購物車 — 潛在再行銷對象。

26. 銷售排行榜

「熱銷商品」區塊和行銷推薦的分析:哪些商品最常被買。

27. 按天銷售(用於圖表)

每日營收報表 — 分析業務動態和繪製圖表的基礎。

28. 退貨清單

顯示所有訂單的退貨,包含原因和狀態,有助於分析退貨原因。

29. 訂單取消清單

控管損失和取消原因:顯示取消記錄,誰取消、何時取消。

30. 等待出貨的訂單

給倉庫和物流 — 需要打包和出貨的訂單,包含配送細節。

31. 平均客單價

「Average Order Value」— 評估行銷和商品組合效率的關鍵指標。

32. 使用過促銷碼的訂單

分析促銷活動成效:哪些促銷碼被用過、用得多不多。

33. 依分類和品牌的折扣使用情況

可以評估哪些活動有效,監控各分類和品牌的折扣受歡迎程度。

34. 已用促銷碼及其用戶

控管促銷碼使用,發現異常和濫用。

35. 訂單付款歷史

給客服和會計:顯示所有付款交易、狀態和付款方式。

36. 有退款的訂單

分析退款、產生會計報表和防止詐騙。

37. 用戶錢包餘額與交易歷史

控管和顯示用戶的紅利或現金回饋,及其流動歷史。

38. 用戶客服申請

讓用戶看到自己的申請和處理狀態。

39. 客服申請 SLA 分析

分析各優先級的平均回應和解決時間,對 SLA 控管很重要。

40. 客服申請訊息

可以看到某申請的所有對話,對用戶和客服都很重要。

41. 依分類的常見問題(FAQ)

顯示客戶知識庫的常見問題,幫助減輕客服負擔。

42. 活動行銷與橫幅

用來在網站顯示最新的廣告活動。

43. 首頁精選商品

「精選」區塊:要在首頁強調的商品。

44. A/B 測試歷史

分析已做過的實驗,優化 UX 和行銷。

45. 某用戶商品瀏覽歷史

顯示「你看過」或用於個人化推薦。

46. 熱門用戶搜尋關鍵字

分析用戶需求,幫助優化搜尋和提示。

47. 流量來源分析

可以評估哪些廣告渠道帶來流量和轉換。

48. 依 cohort 的用戶留存

評估忠誠度和回購的關鍵指標。

49. 首頁新聞/文章

用來在部落格顯示新聞和文章,提高用戶參與度。

50. 活躍網站頁面與相關內容區塊

檢查網站內容完整性、CMS 運作和頁面資料顯示。

加上 index

查詢語句很重要,但只有在它們跑得快才有用。所以你還需要在資料庫加點 index。你應該在專案的主要資料表加上 40 個 index,來提升查詢效能和方便維護。

1. product.product(status) 的 index

幾乎所有商品查詢都會用 status 過濾(例如展示櫃、搜尋等)。index 會加速特定狀態商品的查詢,減少全表掃描。

2. product.variant(product_id, is_active) 的 index

商品變體(SKU)和展示櫃查詢會用商品關聯和變體啟用狀態過濾。這個複合 index 可以最佳化查詢某商品所有啟用變體。

3. product.image(product_id, is_main DESC) 的 index

取得商品主圖(或全部圖片)時會用商品過濾並依「主圖」排序。index 加速這類查詢,讓圖片集資料回傳更快。

4. product.product(name text_pattern_ops) 的 index

用 ILIKE '%...%' 關鍵字搜尋商品名稱時,這個 name text_pattern_ops 的專用 index 會大幅提升搜尋效率,特別是資料量大時。

5. product.product(description gin_trgm_ops) 的 index

同上,搜尋商品描述(ILIKE 或全文搜尋)。GIN index 加 trigram 可以加速文字欄位過濾。

6. product.product(category_id) 的 index

常常會依分類或子分類查詢商品(見分類 filter 查詢)。index 讓你能快速找到指定分類的所有商品。

7. product.category(parent_id) 的 index

建立分類階層和導覽樹時,常用 parent_id 查詢。index 會加速這些遞迴階層查詢。

8. product.review(product_id) 的 index

所有商品評論查詢都會用 product_id 過濾(不論平均評分還是評論清單)。index 會讓聚合和查詢評論快很多。

9. product.review(product_id, created_at DESC) 的 index

快速取得商品最新評論(ORDER BY createdat DESC),尤其搭配 productid 過濾時,複合 index 很有用。

10. product.question(product_id, created_at DESC) 的 index

熱門查詢:某商品的問答,依建立時間排序。index 同時覆蓋兩個條件,加速商品卡片 Q&A 區塊。

11. product.answer(question_id, created_at) 的 index

查詢商品問答時,需要依 question_id 快速存取,常常還要依日期排序。這個 index 可以最小化 Q&A 產生延遲。

12. product.price_history(variant_id, changed_at DESC) 的 index

價格變動歷史會依商品變體和最近變動查詢。這個 index 加速價格動態分析和「舊價/新價」查詢。

13. product.status_history(product_id, changed_at DESC) 的 index

查詢商品狀態變更歷史並依時間排序,對稽核和控管商品生命週期很重要。複合 index 會大幅加速這類查詢。

14. product.certificate(product_id) 的 index

依商品 id 查詢證書 — B2B 和認證展示櫃常見操作。index 會加速這類檢查。

15. product.license(product_id) 的 index

查詢商品授權,特別是依授權類型過濾時。

16. product.product_tag(tag_id) 的 index

常見查詢 — 取得某 tag 下所有商品(或反查)。index 讓商品和 tag 交集查詢(tag cloud 或 filter)很快。

17. product.product_tag(product_id) 的 index

可以快速查出某商品有哪些 tag,加速 tag 查詢。

18. logistics.inventory(product_id, warehouse_id) 的 index

即時查詢商品在某倉庫的庫存(或全部倉庫)— 對物流、stock level 檢查和即時展示櫃很關鍵。

19. logistics.inventory(variant_id) 的 index

記錄某商品變體(顏色/尺寸)庫存和橫向報表。

20. logistics.stock_level(product_id, warehouse_id) 的 index

快速檢查商品在倉庫的最低門檻(自動下單或低庫存警示)。這個 index 用來和 inventory 比較。

21. logistics.inventory_movement(product_id, changed_at DESC) 的 index

快速取得商品移動歷史(稽核)— 防止錯誤、分析損失和控管供應。

22. logistics.transfer(product_id, requested_at DESC) 的 index

分析倉庫間物流調撥,依商品過濾和申請日期排序。

23. logistics.shipping_rate(shipping_method_id, destination_zone) 的 index

計算運費時,常依配送方式 id 和目的地區選擇費率。index 會加速結帳時的運費計算。

24. "order".order(user_id, placed_at DESC) 的 index

所有用戶訂單歷史查詢都會依 user_id 過濾並依下單日期排序。複合 index 讓個人中心訂單歷史回傳很快。

25. "order".order(status, placed_at) 的 index

訂單報表和分析,還有依狀態查詢(例如「處理中」/「已完成」)。

26. "order".order_item(order_id) 的 index

依訂單 id 查詢所有訂單項目 — 訂單明細最常見操作。

27. "order".order_item(product_id) 的 index

銷售分析和商品統計需要依商品 id 快速查詢訂單項目。

28. "order".return(order_id) 的 index

退貨和訂單關聯,用於客服和退貨分析。index 會加速依訂單號查詢退貨。

29. "order".cancellation(order_id) 的 index

同退貨 — 加速查詢訂單取消,方便分析和客服。

30. "order".cart(user_id, updated_at DESC) 的 index

查詢用戶最近的購物車(例如「遺棄」購物車),用 user_id 和最後更新時間排序的 index 很方便。

31. payment.payment_transaction(order_id) 的 index

大部分付款歷史查詢都會依訂單過濾。index 讓訂單交易查詢即時。

32. payment.refund(transaction_id) 的 index

可以有效查詢某交易的退款,方便客服、報表和防詐。

33. payment.wallet(user_id) 的 index

快速查詢用戶錢包,檢查餘額和交易歷史。

34. payment.wallet_transaction(wallet_id, created_at DESC) 的 index

查詢用戶錢包交易並依日期排序(例如顯示交易歷史)。

35. support.support_ticket(user_id, created_at DESC) 的 index

查詢某用戶的客服申請歷史(個人中心/客服)。複合 index 最佳化這類查詢。

36. support.ticket_message(ticket_id, sent_at) 的 index

查詢某 ticket 所有訊息時,依 ticket 和時間排序的 index 會加速訊息排序。

37. support.ticket_sla_tracking(ticket_id) 的 index

SLA 分析和控管每個 ticket,依 ticket_id 查詢 SLA 資料很快。

38. marketing.promo_usage(user_id, used_at DESC) 的 index

分析用戶促銷碼活動(分析和防濫用),需要依 user_id 和時間排序快速查詢。

39. analytics.product_view(user_id, viewed_at DESC) 的 index

儲存和分析用戶商品瀏覽歷史(個人化、推薦)需要依 user_id 和瀏覽時間排序快速查詢。

40. analytics.search_query_log(query_text) 的 index

熱門查詢和使用頻率 — 搜尋分析的關鍵工具。index 會加速依查詢文字聚合和統計。

備註

用 ILIKE 做文字搜尋時,建議用 pg_trgm 擴充的 GIN index,這對子字串和模糊搜尋很有效。大表做日期聚合或排序時,建議日期 DESC index — 這會加速最新資料查詢。

實際 index 設定要根據執行計畫和負載統計調整,但上面列的 index 已經涵蓋我們 marketplace 主要的生產查詢場景。

加上 function

還沒累吧?那我們再寫幾個 function 來簡化現有和未來查詢的撰寫。這樣可以加速關鍵查詢的實作,減少應用程式重複 code,並把 business logic 集中在資料庫端。

1. 支援 tag 和品牌的關鍵字商品搜尋

為什麼需要:

只用名稱和描述搜尋太有限了。常常還要依 tag 和品牌找商品。這個通用 function 集中進階搜尋邏輯,減少重複 code,也方便和前端整合。

2. 依 ID 取得完整商品卡片(所有卡片資料)

為什麼需要:

前端常常一次就要所有商品資訊:主要欄位、品牌、分類、圖片、tag、屬性、平均評分和評論數。function 一次組好完整商品卡片,減少 DB 查詢次數。

3. 取得分類階層(含巢狀)

為什麼需要:

展示櫃、filter 和 breadcrumbs 都要分類樹(或路徑)。不用在 client 端做遞迴查詢,function 一次回傳完整階層。

4. 計算分類的平均、最低/最高價格

為什麼需要:

catalog filter 和分析時,方便取得分類下商品的價格範圍和平均。function 省去重複子查詢。

5. 檢查並自動計算所有倉庫商品庫存

為什麼需要:

可以即時知道商品(和每個變體)的總庫存,對展示櫃、倉庫和物流都很有用。集中計算,避免 business logic 重複。

6. 取得用戶訂單歷史(含明細)

為什麼需要:

function 回傳用戶所有訂單,包含訂單項目、金額、狀態,讓前端一次就能組好個人中心。

7. 取得用戶作為賣家/買家的平均評分

為什麼需要:

顯示用戶在平台上的信任和聲譽很重要,要知道他作為賣家或買家的平均評分。function 做聚合計算。

8. 用戶使用促銷碼(含所有條件的驗證器)

為什麼需要:

所有促銷碼驗證和扣除的 business logic(啟用、限制、日期等)都集中在一個 function。這樣應用程式邏輯更簡單,也避免條件重複出錯。

9. 通用用戶事件 log function

為什麼需要:

做全程分析和稽核時,集中 log event 可以減少重複 code,也降低遺漏用戶行為資料的風險。

10. 取得紅利錢包餘額和累積獎勵總額的 function

為什麼需要:

一次就能取得用戶目前餘額和累積獎勵總額。這對 dashboard 顯示很方便,也減少 SQL 查詢數量。

11. 通用訂單狀態變更 function(含 log)

為什麼需要:

變更訂單狀態時,自動寫入狀態歷史 log,減少在不同應用程式區塊出錯的機會。

12. 取得客服對話所有訊息(ticket + 所有訊息)

為什麼需要:

function 回傳 ticket 的所有對話,包含申請細節和每則訊息。這讓前端組 ticket 歷史更容易。

13. 依 email 或電話檢查用戶是否存在

為什麼需要:

註冊和重設密碼時用,避免前後端重複邏輯。

備註

這組 function 覆蓋了主要 business 場景,提升資料處理便利性,優化邏輯,加速前端和整合開發。希望你會喜歡 :)

包含解決方案的檔案

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION