语句骨架与书写规范
SQL 不区分关键字大小写,但为了可读性,通常关键字大写、对象名小写。语句的执行顺序和你书写的顺序并不一致,这一点在学聚合函数时非常关键。
- 书写顺序:SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
- 实际执行顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
- 因为 SELECT 在 WHERE 之后执行,所以 WHERE 里不能使用 SELECT 中定义的列别名
SELECT employee_id, -- 员工编号
last_name, -- 姓
first_name, -- 名
hire_date, -- 入职日期
salary -- 工资
FROM employees
ORDER BY hire_date DESC;在你的专用沙箱里执行打开演练场
别名、去重与表达式
-- 别名有三种写法
SELECT last_name AS name, salary "月薪", salary * 12 AS "年薪"
FROM employees;
-- 字符串拼接使用 ||,不是 +
SELECT last_name || ' 的年薪是 ' || (salary * 12) AS info
FROM employees
WHERE employee_id <= 105;在你的专用沙箱里执行打开演练场
-- 错误理解:以为只对 job_id 去重
SELECT DISTINCT job_id, department_id FROM employees;
-- 上句等价于对 (job_id, department_id) 组合去重
SELECT job_id, department_id
FROM employees
GROUP BY job_id, department_id;在你的专用沙箱里执行打开演练场
NULL 是个陷阱
NULL 表示「未知」,不是 0 也不是空字符串。任何与 NULL 的算术运算结果都是 NULL,与 NULL 的比较结果也不是 TRUE/FALSE 而是 UNKNOWN。这是初学者最容易写出错误查询的地方。
- NULL + 1 结果是 NULL,不是 1
- 判断 NULL 必须用 IS NULL / IS NOT NULL,不能用 = NULL
- NULL 参与排序时,Oracle 默认 NULL 最大(升序排在最后)
- 聚合函数(SUM/AVG/COUNT(列))会忽略 NULL,但 COUNT(*) 不会
SELECT employee_id,
salary,
commission_pct,
-- NVL:两参数,为空则取第二个
NVL(commission_pct, 0) AS nvl_demo,
-- NVL2:非空取第二个,为空取第三个
NVL2(commission_pct, '有提成', '无提成') AS nvl2_demo,
-- COALESCE:从左到右取第一个非空值,参数可变
COALESCE(commission_pct, 0.1, 0) AS coalesce_demo,
-- 正确计算总收入:NULL 会污染整个表达式
salary + salary * NVL(commission_pct, 0) AS income
FROM employees
WHERE employee_id IN (100, 145, 149);在你的专用沙箱里执行打开演练场