Skip to content

sql-operators

SQL 运算符是 WHERE 子句或 HAVING 子句中使用的特殊字符或关键字,用于执行操作。这些操作可以是算术计算、值之间的比较,或多个条件的逻辑组合。它们是过滤、连接和操作数据的基本构建块。

例如,在 select * from products where price > 100; 中,大于符号(>)是一个运算符,用于过滤价格高于 100 的产品。

SQL 运算符可以分为三大类:

这些运算符对数值数据执行数学计算。

OperatorDescriptionExample
+加法SELECT price + 5.00; (将价格增加 5)
-减法SELECT quantity - 1; (减少数量)
*乘法SELECT price * quantity; (计算总成本)
/除法SELECT total_sales / 12; (计算月平均)
%模数(余数)SELECT id % 2; (ID 为偶数返回 0,奇数返回 1)

这些运算符比较两个表达式并返回一个布尔值:TRUE、FALSE 或 UNKNOWN(如果其中一个操作数为 NULL)。它们是任何 WHERE 子句的核心。

OperatorDescriptionExample
=等于WHERE status = 'shipped'
!=不等于WHERE country <> 'USA'
>大于WHERE stock_level > 0
<小于WHERE price < 50.00
>=大于或等于WHERE score >= 90
<=小于或等于WHERE discount <= 0.25

这些运算符组合其他条件的结果,以创建更复杂的过滤器。它们还处理特殊情况,如范围、列表和模式匹配。

OperatorDescriptionExample
AND如果所有条件都为 TRUE,则返回 TRUE。WHERE price > 50 AND category = 'Electronics'
OR如果任何条件为 TRUE,则返回 TRUE。WHERE status = 'shipped' OR status = 'delivered'
NOT反转条件的结果。WHERE NOT country = 'Canada'
IN如果一个值与列表中的任何值匹配,则返回 TRUE。WHERE category IN ('Books', 'Movies', 'Music')
BETWEEN如果一个值在指定范围内(包含两端),则返回 TRUE。WHERE order_date BETWEEN '2023-01-01' AND '2023-03-31'
LIKE使用通配符(% 表示任意字符序列,_ 表示单个字符)对字符串执行模式匹配。WHERE email LIKE '%@gmail.com'
IS NULL如果值为 NULL,则返回 TRUE。WHERE shipping_address IS NULL
IS NOT NULL如果值不为 NULL,则返回 TRUE。WHERE completed_at IS NOT NULL
ANY / SOME将一个值与列表或子查询中的每个值进行比较,如果任何比较为 TRUE,则返回 TRUE。(不常用)WHERE price > ANY (SELECT min_price FROM competitor_prices)
ALL将一个值与列表或子查询中的所有值进行比较,如果所有比较都为 TRUE,则返回 TRUE。(不常用)WHERE price > ALL (SELECT max_price FROM budget_products)
EXISTS如果子查询返回一行或多行,则返回 TRUE。WHERE EXISTS (SELECT 1 FROM orders WHERE orders.customer_id = customers.id)

运算符优先级决定了复杂表达式中运算符的评估顺序。优先级较高的运算符会首先被评估。你始终可以使用括号 () 来覆盖默认顺序并确保清晰性。

Precedence LevelOperators
1 (最高)*, /, %
2+, -
3所有比较运算符 (=, >, <, 等)
4NOT
5AND
6 (最低)OR

考虑以下表达式:

select * from products
where category = 'Audio' or category = 'Video' and price < 100;

因为 AND 的优先级高于 OR,此查询被解释为:“查找类别为 ‘Video’ 并且价格低于 100 的产品,或者 查找类别为 ‘Audio’ 的产品(任何价格)。”这可能不是预期结果。

要获得预期结果(“查找价格低于 100 且类别为 ‘Audio’ 或 ‘Video’ 的产品”),你必须使用括号:

select * from products
where (category = 'Audio' or category = 'Video') and price < 100;
  • 始终使用括号: 在 WHERE 子句中混合使用 AND 和 OR 时,请始终使用括号来明确你的逻辑,避免优先级错误。
  • NULL 的特殊性: NULL 不等于 NULL。你不能使用 WHERE my_column = NULL。你必须始终使用 WHERE my_column IS NULL 或 WHERE my_column IS NOT NULL。
  • IN 与多个 OR: 对于检查值列表,WHERE category IN ('A', 'B', 'C') 比 WHERE category = 'A' OR category = 'B' OR category = 'C' 更简洁,并且通常性能更好。
  • LIKE 通配符性能: 以通配符开头的 LIKE 查询(例如,LIKE '%text')通常很慢,因为它无法有效利用索引。如果可能,请调整你的查询结构,使通配符不出现在开头。