sql-operators
SQL 运算符
Section titled “SQL 运算符”什么是 SQL 运算符?
Section titled “什么是 SQL 运算符?”SQL 运算符是 WHERE 子句或 HAVING 子句中使用的特殊字符或关键字,用于执行操作。这些操作可以是算术计算、值之间的比较,或多个条件的逻辑组合。它们是过滤、连接和操作数据的基本构建块。
例如,在 select * from products where price > 100; 中,大于符号(>)是一个运算符,用于过滤价格高于 100 的产品。
SQL 运算符的类型
Section titled “SQL 运算符的类型”SQL 运算符可以分为三大类:
1. SQL 算术运算符
Section titled “1. SQL 算术运算符”这些运算符对数值数据执行数学计算。
| Operator | Description | Example |
|---|---|---|
| + | 加法 | SELECT price + 5.00; (将价格增加 5) |
| - | 减法 | SELECT quantity - 1; (减少数量) |
| * | 乘法 | SELECT price * quantity; (计算总成本) |
| / | 除法 | SELECT total_sales / 12; (计算月平均) |
| % | 模数(余数) | SELECT id % 2; (ID 为偶数返回 0,奇数返回 1) |
2. SQL 比较运算符
Section titled “2. SQL 比较运算符”这些运算符比较两个表达式并返回一个布尔值:TRUE、FALSE 或 UNKNOWN(如果其中一个操作数为 NULL)。它们是任何 WHERE 子句的核心。
| Operator | Description | Example |
|---|---|---|
| = | 等于 | WHERE status = 'shipped' |
| != | 不等于 | WHERE country <> 'USA' |
| > | 大于 | WHERE stock_level > 0 |
| < | 小于 | WHERE price < 50.00 |
| >= | 大于或等于 | WHERE score >= 90 |
| <= | 小于或等于 | WHERE discount <= 0.25 |
3. SQL 逻辑运算符
Section titled “3. SQL 逻辑运算符”这些运算符组合其他条件的结果,以创建更复杂的过滤器。它们还处理特殊情况,如范围、列表和模式匹配。
| Operator | Description | Example |
|---|---|---|
| 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) |
SQL 运算符优先级
Section titled “SQL 运算符优先级”运算符优先级决定了复杂表达式中运算符的评估顺序。优先级较高的运算符会首先被评估。你始终可以使用括号 () 来覆盖默认顺序并确保清晰性。
| Precedence Level | Operators |
|---|---|
| 1 (最高) | *, /, % |
| 2 | +, - |
| 3 | 所有比较运算符 (=, >, <, 等) |
| 4 | NOT |
| 5 | AND |
| 6 (最低) | OR |
考虑以下表达式:
select * from productswhere category = 'Audio' or category = 'Video' and price < 100;因为 AND 的优先级高于 OR,此查询被解释为:“查找类别为 ‘Video’ 并且价格低于 100 的产品,或者 查找类别为 ‘Audio’ 的产品(任何价格)。”这可能不是预期结果。
要获得预期结果(“查找价格低于 100 且类别为 ‘Audio’ 或 ‘Video’ 的产品”),你必须使用括号:
select * from productswhere (category = 'Audio' or category = 'Video') and price < 100;常见陷阱与最佳实践
Section titled “常见陷阱与最佳实践”- 始终使用括号: 在
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')通常很慢,因为它无法有效利用索引。如果可能,请调整你的查询结构,使通配符不出现在开头。