整理自實際項目中最高頻的 54 條 DB2/SQL 語句,涵蓋查詢、連接、聚合、子查詢、條件邏輯、分頁、數據修改等核心場景。每條附帶業務意圖註釋,可直接作為開發參考或面試複習。
SELECT emp_no, emp_name, dept, ISNULL(CONVERT(CHAR(10), birthday, 120), '日期不詳') AS birthday FROM employee ORDER BY deptIN 過濾自我。SELECT dept, SUM(salary) FROM employee GROUP BY deptSELECT 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寸顯示器'SELECT prod_id, SUM(qty) AS totqty, SUM(qty*unit_price) AS totprice FROM sale_item GROUP BY prod_idSELECT cust_id, SUM(tot_amt) FROM sales WHERE CONVERT(CHAR(4), order_date, 120)='1996' GROUP BY cust_idWHERE tot_amt = (SELECT MAX(tot_amt) FROM sales)HAVING COUNT(*) >= 3 子查詢。SELECT cust_name FROM customer a WHERE NOT EXISTS (SELECT * FROM sales b WHERE a.cust_id=b.cust_id)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 DESCCASE a.sex WHEN 'm' THEN '男' WHEN 'f' THEN '女' ELSE '未' ENDCOUNT(DISTINCT prod_id) >= 3。NOT EXISTS 實現「無缺失」邏輯。WHERE emp_name LIKE '劉%'WHERE salary BETWEEN 4000 AND 6000WHERE addr LIKE '上海市%'UPDATE employee SET addr='北京市' WHERE addr LIKE '上海市%'(注意原文 SET addr LIKE 為誤寫)。WHERE sex='F' AND dept IN ('業務','會計')ORDER BY SUM(qty*unit_price) DESCCOUNT(DISTINCT prod_id)UPDATE employee SET salary=salary*1.03 WHERE dept='業務'WHERE salary = (SELECT MIN(salary) FROM employee)WHERE tot_amt > ALL (SELECT tot_amt FROM sales WHERE sale_id='E0013' AND order_date='1996/10/15')SELECT AVG(unit_price) FROM sale_item WHERE prod_id='P0001'WHERE sale_id IN (SELECT sale_id FROM employee WHERE sex='F')ON a.emp_no!=b.emp_no AND a.date_hired=b.date_hiredWHERE salary > (SELECT AVG(salary) FROM employee)HAVING SUM(tot_amt) > 10000 ORDER BY SUM(tot_amt) DESCWHERE sale_id=emp_no AND sex='M' AND tot_amt>2000WHERE tot_amt = (SELECT MAX(tot_amt) FROM sales)GROUP BY cust_id ORDER BY SUM(tot_amt) DESCSUM(qty*unit_price)/SUM(qty)。HAVING COUNT(*) > 3WHERE addr='上海市'GROUP BY sale_id, MONTH(order_date) ORDER BY sale_id, MONTH(order_date) DESCHAVING SUM(tot_amt) > (SELECT SUM(tot_amt) FROM sales WHERE cust_id='C0002')HAVING SUM(tot_amt) = (SELECT MAX(totamt) FROM (SELECT sale_id, SUM(tot_amt) AS totamt FROM sales GROUP BY sale_id) c)GROUP BY dept ORDER BY AVG(salary)EXISTS/NOT EXISTS 而非 IN/NOT IN(含 NULL 時語義不同)。HAVING,非 WHERE。ALL/ANY 子查詢適合「超過所有/任一」業務語義。YEAR(order_date)=1996 或範圍查詢,避免隱式轉換導致索引失效。這 54 條語句覆蓋了 OLTP 開發 90% 的核心場景。建議收藏並在實戰中對號入座,逐步內化為肌肉記憶。