本文整理 35 個 DB2 實務常見 SQL 範例,涵蓋條件查詢、分組統計、多表連接、子查詢、外部連接、CASE 表達式、日期轉換、資料更新等核心場景,供開發人員快速參考與改寫。
SELECT emp_no, emp_name, dept, COALESCE(CHAR(birthday, ISO), '日期不詳') AS birthday FROM employee ORDER BY dept;SELECT emp_name, dept, title FROM employee WHERE emp_name <> '喻自強' AND dept IN (SELECT dept FROM employee WHERE emp_name = '喻自強');SELECT dept, SUM(salary) FROM employee GROUP BY dept;SELECT a.prod_id, a.qty, a.unit_price, a.qty*a.unit_price AS tot_price FROM sale_item a JOIN product b ON a.prod_id=b.prod_id WHERE b.prod_name='14吋顯示器';SELECT prod_id, SUM(qty) AS tot_qty, SUM(qty*unit_price) AS tot_amt FROM sale_item GROUP BY prod_id;SELECT cust_id, SUM(tot_amt) FROM sales WHERE YEAR(order_date)=1996 GROUP BY cust_id;SELECT a.cust_id, a.cust_name, SUM(b.tot_amt) FROM customer a JOIN sales b ON a.cust_id=b.cust_id GROUP BY a.cust_id, a.cust_name;SELECT a.cust_id, a.cust_name, SUM(b.tot_amt) FROM customer a JOIN sales b ON a.cust_id=b.cust_id WHERE YEAR(b.order_date)=1997 GROUP BY a.cust_id, a.cust_name;SELECT order_no, cust_id, sale_id, tot_amt FROM sales WHERE tot_amt = (SELECT MAX(tot_amt) FROM sales);SELECT emp_name, order_date FROM employee a JOIN sales b ON a.emp_no=b.sale_id WHERE a.emp_no IN (SELECT sale_id FROM sales GROUP BY sale_id HAVING COUNT(*) >= 3) ORDER BY emp_name;SELECT cust_name FROM customer a WHERE NOT EXISTS (SELECT 1 FROM sales b WHERE a.cust_id=b.cust_id);SELECT a.cust_id, a.cust_name, DATE(b.order_date) AS order_date, b.tot_amt FROM customer a LEFT JOIN sales b ON a.cust_id=b.cust_id ORDER BY a.cust_id, b.tot_amt DESC;SELECT a.emp_name, CASE a.sex WHEN 'M' THEN '男' WHEN 'F' THEN '女' ELSE '未知' END AS sex, DATE(c.order_date) AS order_date, c.qty, c.qty*c.unit_price AS amt FROM employee a JOIN sales b ON a.emp_no=b.sale_id JOIN sale_item c ON b.order_no=c.order_no JOIN product d ON c.prod_id=d.prod_id WHERE d.prod_name='16M DRAM';SELECT a.emp_no, a.emp_name, CASE a.sex WHEN 'M' THEN '男' WHEN 'F' THEN '女' ELSE '未知' END AS sex, d.prod_name, DATE(c.order_date) AS order_date, c.qty, c.qty*c.unit_price AS amt FROM employee a LEFT JOIN sales b ON a.emp_no=b.sale_id JOIN sale_item c ON b.order_no=c.order_no JOIN product d ON c.prod_id=d.prod_id;SELECT a.cust_name, d.cust_sum FROM customer a JOIN (SELECT cust_id, cust_sum FROM (SELECT cust_id, SUM(tot_amt) AS cust_sum FROM sales GROUP BY cust_id) b WHERE b.cust_sum = (SELECT MAX(cust_sum) FROM (SELECT cust_id, SUM(tot_amt) AS cust_sum FROM sales GROUP BY cust_id) c)) d ON a.cust_id=d.cust_id;SELECT a.emp_no, a.emp_name, d.sale_sum FROM employee a JOIN (SELECT sale_id, sale_sum FROM (SELECT sale_id, SUM(tot_amt) AS sale_sum FROM sales GROUP BY sale_id) b WHERE b.sale_sum < 1000) d ON a.emp_no=d.sale_id;SELECT a.cust_id, a.cust_name, b.prod_id, b.prod_name, c.qty, c.qty*c.unit_price FROM customer a JOIN sales c ON a.cust_id=c.cust_id JOIN sale_item c ON c.order_no=sale_item.order_no JOIN product b ON sale_item.prod_id=b.prod_id WHERE a.cust_id IN (SELECT cust_id FROM (SELECT cust_id, COUNT(DISTINCT prod_id) AS cnt FROM sales JOIN sale_item ON sales.order_no=sale_item.order_no GROUP BY cust_id HAVING COUNT(DISTINCT prod_id) >= 3) t);SELECT a.cust_id, a.cust_name, d.prod_id, d.prod_name, d.qty, d.qty*d.unit_price FROM customer a JOIN sales c ON a.cust_id=c.cust_id JOIN sale_item d ON c.order_no=d.order_no JOIN product b ON d.prod_id=b.prod_id WHERE NOT EXISTS (SELECT 1 FROM customer x JOIN sales e ON x.cust_id=e.cust_id JOIN sale_item f ON e.order_no=f.order_no WHERE x.cust_name='世界技術開發公司' AND NOT EXISTS (SELECT 1 FROM sale_item g JOIN sales h ON g.order_no=h.order_no WHERE g.prod_id=f.prod_id AND h.cust_id=a.cust_id));SELECT emp_no, emp_name, dept, salary FROM employee WHERE emp_name LIKE '劉%';SELECT DISTINCT cust_id FROM sales WHERE tot_amt > 2000;SELECT COUNT(*) FROM employee WHERE salary BETWEEN 4000 AND 6000;SELECT dept, AVG(salary) FROM employee WHERE addr LIKE '上海市%' GROUP BY dept;UPDATE employee SET addr = REPLACE(addr, '上海市', '北京市') WHERE addr LIKE '上海市%';SELECT emp_no, emp_name, dept FROM employee WHERE sex='F' AND dept IN ('業務','會計');SELECT prod_id, SUM(qty*unit_price) FROM sale_item GROUP BY prod_id ORDER BY 2 DESC;SELECT cust_id, cust_name, addr FROM customer WHERE cust_id BETWEEN 'C0001' AND 'C0004';SELECT COUNT(DISTINCT prod_id) FROM sale_item;UPDATE employee SET salary = salary * 1.03 WHERE dept = '業務';SELECT * FROM employee WHERE salary = (SELECT MIN(salary) FROM employee);SELECT a.cust_name, b.tot_amt, DATE(b.order_date) AS order_date, a.tel_no FROM customer a JOIN sales b ON a.cust_id=b.cust_id WHERE a.cust_name = '客戶丙';SELECT * FROM sales WHERE tot_amt > ALL (SELECT tot_amt FROM sales WHERE sale_id='E0013' AND order_date='1996-10-15') ORDER BY tot_amt;SELECT AVG(unit_price) FROM sale_item WHERE prod_id='P0001';SELECT sale_id, tot_amt FROM sales WHERE sale_id IN (SELECT emp_no FROM employee WHERE sex='F');SELECT a.emp_no, a.emp_name, a.date_hired FROM employee a JOIN employee b ON a.emp_no<>b.emp_no AND a.date_hired=b.date_hired ORDER BY a.date_hired;SELECT emp_no, emp_name FROM employee WHERE emp_no IN (SELECT sale_id FROM sales GROUP BY sale_id HAVING SUM(tot_amt) > 232000);DATE(col)、YEAR(col)、CHAR(col, ISO) (YYYY-MM-DD)。COALESCE、IFNULL (相容)、NVL (相容)。|| 或 CONCAT。CASE 表達式支援簡單/搜尋兩種形式。這 35 個範例涵蓋了 OLTP 開發 80% 以上的常見查詢模式。建議收藏並在實際專案中依據資料模型調整表/欄位名稱直接套用。