运算符
SQL 运算符用于在查询中做计算、比较和逻辑判断——和数学里的运算符类似,但多了 NULL 安全的考量。
算术运算符:+ - * / %(MOD 取余)
比较运算符:= <>/!= > < >= <= <=>(NULL 安全等于)
逻辑运算符:AND OR NOT XOR
其他运算符:BETWEEN ... AND ... IN (...) LIKE REGEXP IS NULL IS NOT NULL EXISTS
复合运算符
复合运算符将运算和赋值合二为一:
| 运算符 | 含义 | 示例 |
|---|---|---|
+= | 加等于 | SET salary += 1000 |
-= | 减等于 | SET salary -= 500 |
*= | 乘等于 | SET salary *= 1.1 |
/= | 除等于 | SET salary /= 2 |
%= | 模等于 | SET salary %= 100 |
复合运算符主要在 SQL Server 中使用,MySQL 不支持这种语法。
位运算符
位运算符直接操作二进制位:
| 运算符 | 含义 | 示例 |
|---|---|---|
& | 按位与 | flags & 1 |
| ` | ` | 按位或 |
^ | 按位异或 | flags ^ 4 |
~ | 按位取反 | ~flags |
<< | 左移 | 1 << 3 |
>> | 右移 | 8 >> 2 |
ALL、ANY 和 SOME
ALL、ANY、SOME 用于子查询比较:
-- 工资大于所有技术部员工(比最高的还高)
SELECT emp_name FROM employees
WHERE basic_salary > ALL (SELECT basic_salary FROM employees WHERE dept_code = 2);
-- 工资大于任意一个技术部员工(比最低的还高)
SELECT emp_name FROM employees
WHERE basic_salary > ANY (SELECT basic_salary FROM employees WHERE dept_code = 2);
-- SOME 是 ANY 的同义词
SELECT emp_name FROM employees
WHERE basic_salary > SOME (SELECT basic_salary FROM employees WHERE dept_code = 2);
EXISTS
EXISTS 用于检查子查询是否返回结果:
-- 查有奖金记录的员工
SELECT emp_name FROM employees e
WHERE EXISTS (SELECT 1 FROM bonus_records b WHERE b.emp_id = e.emp_id);
以飞翔科技为例。运算符组合使用:
-- 算术 + 比较:查实发工资超过 20000 的员工
SELECT emp_name,
basic_salary + IFNULL(performance_bonus, 0) - IFNULL(social_security, 0) - IFNULL(personal_tax, 0) AS 实发
FROM employees
WHERE basic_salary + IFNULL(performance_bonus, 0) - IFNULL(social_security, 0) - IFNULL(personal_tax, 0) > 20000;
-- 逻辑组合:技术部且工资 > 8000 或管理部且工资 > 15000
SELECT emp_name, dept_code, basic_salary
FROM employees
WHERE (dept_code = 2 AND basic_salary > 8000)
OR (dept_code = 1 AND basic_salary > 15000);
-- 取余:查工号为偶数的员工
SELECT emp_id, emp_name FROM employees
WHERE emp_id % 2 = 0;
注意 NULL 参与运算的特殊性:任何算术运算遇到 NULL 结果都是 NULL,任何比较运算遇到 NULL 结果都是 UNKNOWN。这就是为什么需要 IFNULL、COALESCE 和 <=> 这些专门处理 NULL 的工具。