首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 開發必備:54 條高頻 SQL 實戰速查手冊

     編輯:DB2 教學

前言

整理自實際項目中最高頻的 54 條 DB2/SQL 語句,涵蓋查詢、連接、聚合、子查詢、條件邏輯、分頁、數據修改等核心場景。每條附帶業務意圖註釋,可直接作為開發參考或面試複習。

基礎查詢與條件

  1. 空值處理與格式化:SELECT emp_no, emp_name, dept, ISNULL(CONVERT(CHAR(10), birthday, 120), '日期不詳') AS birthday FROM employee ORDER BY dept
  2. 同部門同事查詢:子查詢 + IN 過濾自我。
  3. 部門薪資匯總:SELECT dept, SUM(salary) FROM employee GROUP BY dept
  4. 多表聯查銷售明細:SELECT a.prod_id, qty, unit_price, unit_price*qty AS totprice FROM sale_item a, product b WHERE a.prod_id=b.prod_id AND prod_name='14寸顯示器'
  5. 產品銷售匯總:SELECT prod_id, SUM(qty) AS totqty, SUM(qty*unit_price) AS totprice FROM sale_item GROUP BY prod_id
  6. 按年份統計客戶訂單額:SELECT cust_id, SUM(tot_amt) FROM sales WHERE CONVERT(CHAR(4), order_date, 120)='1996' GROUP BY cust_id
  7. 有銷售記錄的客戶匯總:內連接 + GROUP BY。
  8. 特定年份客戶匯總:同上加年份過濾。
  9. 最大單筆訂單:WHERE tot_amt = (SELECT MAX(tot_amt) FROM sales)
  10. 至少 3 筆訂單的業務員:HAVING COUNT(*) >= 3 子查詢。
  11. 無訂單客戶(NOT EXISTS):SELECT cust_name FROM customer a WHERE NOT EXISTS (SELECT * FROM sales b WHERE a.cust_id=b.cust_id)
  12. 左外連接保留無訂單客戶:SELECT a.cust_id, cust_name, CONVERT(CHAR(10), order_date, 120), tot_amt FROM customer a LEFT OUTER JOIN sales b ON a.cust_id=b.cust_id ORDER BY a.cust_id, tot_amt DESC

複雜業務邏輯

  1. 多表聯查帶 CASE 性別轉換:CASE a.sex WHEN 'm' THEN '男' WHEN 'f' THEN '女' ELSE '未' END
  2. 全員銷售明細(左連接保留無銷售員工)。
  3. 最大銷售額客戶(多層子查詢)。
  4. 銷售額 < 1000 的業務員:子查詢過濾聚合結果。
  5. 購買 ≥ 3 種商品的客戶明細:COUNT(DISTINCT prod_id) >= 3。
  6. 關係除法:至少包含某客戶所有商品的訂單:雙重 NOT EXISTS 實現「無缺失」邏輯。
  7. 模糊查詢姓劉員工:WHERE emp_name LIKE '劉%'
  8. 訂單額 > 2000 的客戶。
  9. 薪資區間統計:WHERE salary BETWEEN 4000 AND 6000
  10. 上海員工部門平均薪資:WHERE addr LIKE '上海市%'
  11. 批量更新地址:UPDATE employee SET addr='北京市' WHERE addr LIKE '上海市%'(注意原文 SET addr LIKE 為誤寫)。
  12. 部門與性別複合過濾:WHERE sex='F' AND dept IN ('業務','會計')
  13. 銷售額降序輸出產品匯總:ORDER BY SUM(qty*unit_price) DESC
  14. BETWEEN 範圍查詢客戶編號。
  15. 去重計數產品種類:COUNT(DISTINCT prod_id)
  16. 業務部薪資上調 3%:UPDATE employee SET salary=salary*1.03 WHERE dept='業務'
  17. 最低薪資員工:WHERE salary = (SELECT MIN(salary) FROM employee)
  18. JOIN 查詢指定客戶訂單。
  19. ALL 子查詢:超過某業務員某日所有訂單額的訂單:WHERE tot_amt > ALL (SELECT tot_amt FROM sales WHERE sale_id='E0013' AND order_date='1996/10/15')
  20. 單品平均售價:SELECT AVG(unit_price) FROM sale_item WHERE prod_id='P0001'
  21. 女業務員訂單:WHERE sale_id IN (SELECT sale_id FROM employee WHERE sex='F')
  22. 同入職日期員工:自連接 ON a.emp_no!=b.emp_no AND a.date_hired=b.date_hired
  23. 業績 > 232000 員工(原文邏輯可能反向,應用 HAVING SUM>...)。
  24. UNION 合併兩組平均薪資:全體女員工 vs 上海女員工。
  25. 高於平均薪資員工:WHERE salary > (SELECT AVG(salary) FROM employee)
  26. 業績 > 10000 且降序:HAVING SUM(tot_amt) > 10000 ORDER BY SUM(tot_amt) DESC
  27. 男業務員大額訂單:WHERE sale_id=emp_no AND sex='M' AND tot_amt>2000
  28. 最大訂單額訂單:WHERE tot_amt = (SELECT MAX(tot_amt) FROM sales)
  29. 單筆訂單 > 4000 的客戶信息。
  30. 客戶總訂購額降序:GROUP BY cust_id ORDER BY SUM(tot_amt) DESC
  31. 客戶-產品購買均價:SUM(qty*unit_price)/SUM(qty)。
  32. 訂單包含 > 3 種商品:HAVING COUNT(*) > 3
  33. 關係除法經典:包含訂單 3 所有商品的訂單。
  34. 另一日期的 ALL 子查詢變體。
  35. 無業務員工(NOT EXISTS)。
  36. 上海客戶訂單明細:WHERE addr='上海市'
  37. 業務員月度業績:GROUP BY sale_id, MONTH(order_date) ORDER BY sale_id, MONTH(order_date) DESC
  38. 產品銷售總量總額:連接 product 表輸出名稱。
  39. 總額超過 C0002 客戶的客戶:HAVING SUM(tot_amt) > (SELECT SUM(tot_amt) FROM sales WHERE cust_id='C0002')
  40. 業績冠軍業務員:雙層聚合 HAVING SUM(tot_amt) = (SELECT MAX(totamt) FROM (SELECT sale_id, SUM(tot_amt) AS totamt FROM sales GROUP BY sale_id) c)
  41. 客戶-產品完整明細:四表連接。
  42. 部門平均薪資升序:GROUP BY dept ORDER BY AVG(salary)

使用建議

  • 子查詢優先考慮 EXISTS/NOT EXISTS 而非 IN/NOT IN(含 NULL 時語義不同)。
  • 聚合過濾必用 HAVING,非 WHERE。
  • ALL/ANY 子查詢適合「超過所有/任一」業務語義。
  • 關係除法(第 18、45 條)是集合運算核心模式,熟練掌握。
  • 日期過濾推薦 YEAR(order_date)=1996 或範圍查詢,避免隱式轉換導致索引失效。

結語

這 54 條語句覆蓋了 OLTP 開發 90% 的核心場景。建議收藏並在實戰中對號入座,逐步內化為肌肉記憶。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved