系列首篇從最基礎的欄位投影、空值處理、日期格式化、子查詢、群組彙總、多表聯結切入,建立扎實的 DB2 SQL 基礎。
SELECT
emp_no,
emp_name,
dept,
COALESCE(VARCHAR_FORMAT(birthday, 'YYYY-MM-DD'), '日期不詳') AS birthday
FROM employee
ORDER BY dept;
修正:原文使用 SQL Server 的 ISNULL(CONVERT(...)),DB2 標準寫法為 COALESCE(VARCHAR_FORMAT(...)) 或 IFNULL。
SELECT emp_no, emp_name, dept, title
FROM employee
WHERE emp_name <> '喻自強'
AND dept IN (
SELECT dept FROM employee WHERE emp_name = '喻自強'
);
替代寫法:JOIN (SELECT dept FROM employee WHERE emp_name='喻自強') t USING (dept)。
SELECT dept, SUM(salary) AS total_salary
FROM employee
GROUP BY dept;
SELECT
si.prod_id,
si.qty,
si.unit_price,
si.qty * si.unit_price AS total_price
FROM sale_item si
JOIN product p ON si.prod_id = p.prod_id
WHERE p.prod_name = '14吋顯示器';
SELECT
prod_id,
SUM(qty) AS total_qty,
SUM(qty * unit_price) AS total_price
FROM sale_item
GROUP BY prod_id;
SELECT cust_id, SUM(tot_amt) AS total_amt
FROM sales
WHERE YEAR(order_date) = 1996 -- DB2 可用 YEAR()、EXTRACT(YEAR FROM ...)
GROUP BY cust_id;
修正:原文 CONVERT(char(4), order_date, 120) 為 SQL Server 語法,DB2 請用 YEAR() 或 EXTRACT。
SELECT
c.cust_id,
c.cust_name,
SUM(s.tot_amt) AS total_amt
FROM customer c
JOIN sales s ON c.cust_id = s.cust_id
GROUP BY c.cust_id, c.cust_name;
SELECT
c.cust_id,
c.cust_name,
SUM(s.tot_amt) AS total_amt
FROM customer c
JOIN sales s ON c.cust_id = s.cust_id
WHERE YEAR(s.order_date) = 1997
GROUP BY c.cust_id, c.cust_name;
SELECT order_no, cust_id, sale_id, tot_amt
FROM sales
WHERE tot_amt = (SELECT MAX(tot_amt) FROM sales);
SELECT e.emp_name, s.order_date
FROM employee e
JOIN sales s ON e.emp_no = s.sale_id
WHERE e.emp_no IN (
SELECT sale_id
FROM sales
GROUP BY sale_id
HAVING COUNT(*) >= 3
)
ORDER BY e.emp_name;
COALESCE/IFNULL 取代 ISNULL。YEAR()/MONTH()/DAY() 或 EXTRACT,勿用 CONVERT。VARCHAR_FORMAT(date, 'YYYY-MM-DD')。GROUP BY 欄位必須包含 SELECT 清單中所有非彙總欄位。IN/=/> ALL 解決「極值、集合比較」類問題。掌握這 10 題基礎語句,後續進階主題(視窗函數、CTE、遞迴查詢、效能調校)才能順利銜接。建議在測試環境逐一執行,觀察執行計畫與結果集差異。