SQL 查詢是資料庫操作核心。本文從 DML/DDL/DCL 分類開始,系統講解 SELECT 列控制、WHERE 行過濾、運算子、模糊查詢、排序語法,附 9 題經典練習題與解析。
-- 指定欄位 SELECT empno, ename, job, sal FROM emp; -- 去重 SELECT DISTINCT job FROM emp; -- 四則運算與常數輸出 SELECT empno, ename, (sal*15 + 300) income FROM emp; -- 字串串接 SELECT empno || ename FROM emp;
執行順序:FROM → WHERE → SELECT → ORDER BY
別名限制:SELECT 定義別名不可在 WHERE 使用
SELECT * FROM emp WHERE sal > 1500; SELECT * FROM emp WHERE ename = 'SMITH'; SELECT empno, ename, job FROM emp WHERE job <> 'SALESMAN';
SELECT * FROM emp WHERE sal > 1500 AND sal < 3000; SELECT * FROM emp WHERE sal > 2000 OR job = 'CLERK'; SELECT * FROM emp WHERE NOT sal >= 2000;
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 2000; SELECT * FROM emp WHERE hiredate BETWEEN '01-1月-1981' AND '31-12月-1981';
SELECT * FROM emp WHERE comm IS NOT NULL;
SELECT * FROM emp WHERE empno IN (7369, 7566, 7788, 9999);
陷阱:
NOT IN子查詢結果含 NULL 時,整體不回傳任何列
-- 以 A 開頭 SELECT * FROM emp WHERE ename LIKE 'A%'; -- 第二字元為 A SELECT * FROM emp WHERE ename LIKE '_A%'; -- 任意位置含 A SELECT * FROM emp WHERE ename LIKE '%A%';
-- 降序 SELECT * FROM emp ORDER BY sal DESC; -- 別名排序 SELECT empno, ename, sal*12 income FROM emp ORDER BY income; -- 多欄位:薪資降序、入職升序、職位 SELECT * FROM emp WHERE ename LIKE '%A%' ORDER BY sal DESC, hiredate ASC, job;
SELECT * FROM emp WHERE deptno=30;SELECT ename,empno,deptno FROM emp WHERE job='CLERK';SELECT * FROM emp WHERE comm > sal*0.6;SELECT * FROM emp WHERE (deptno=10 AND job='MANAGER') OR (deptno=20 AND job='CLERK');... OR (job NOT IN ('MANAGER','CLERK') AND sal>=2000);SELECT DISTINCT job FROM emp WHERE comm IS NOT NULL;SELECT * FROM emp WHERE comm IS NULL OR comm < 100;SELECT * FROM emp WHERE ename NOT LIKE '%R%';SELECT * FROM emp WHERE ename LIKE '%A%' ORDER BY sal DESC, hiredate ASC, job;WHERE 過濾列(行),SELECT 投影欄位(列)NULL 代表未知,比較需用 IS NULL/IS NOT NULLLIKE 配合 %(多字元)、_(單字元)ORDER BY 最後執行,可使用 SELECT 別名熟練這些基礎語法,是進階 SQL 優化與複雜報表開發的基石。