运算符
本教程共 50 篇 · 第 17 篇 · 更新于 2026-07-31
17. 运算符
本节目标:学完本章你能说清 SQLite 里四类运算符——比较、逻辑(AND/OR/NOT)、算术、位运算——分别干什么用,并理解运算符优先级和括号的作用。
运算符是什么
运算符(Operator)就是 SQL 里那些”对值做运算的特殊符号或保留字”,比如 +、>、AND。它们几乎出现在每条 SQL 的**表达式(Expression)**里。上一章 WHERE 里写的 age > 30,> 就是比较运算符;age >= 25 AND age <= 40,>=、<= 是比较运算符,AND 是逻辑运算符。
SQLite 里运算符主要分四大类,本章一次讲清:比较、逻辑、算术、位运算。先记住一个底层事实——
NoteSQLite 没有独立的布尔(Boolean)类型。逻辑运算的结果用 1 表示真(TRUE)、0 表示假(FALSE),遇到”未知”则是 NULL。所以
1 + 1 > 1这种判断,内部算出来是1(真)。这点和其他语言里true/false关键字不一样,别搞混。
一、比较运算符(Comparison Operators)
用来判断两个值的大小关系,返回 1(真)或 0(假)。上一章已经见过,这里列全:
| 运算符 | 含义 |
|---|---|
= | 等于 |
== | 等于(和 = 同义) |
<> 或 != | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
SELECT 10 = 10; -- 返回 1(真)
SELECT 10 > 20; -- 返回 0(假)
SELECT 'a' < 'b'; -- 文本也能比大小,按字典序,返回 1
适用场景:WHERE 过滤的主力,比如 WHERE amount >= 100、WHERE name = '张三'。再次提醒:比较时尽量同类型对同类型,避免依赖隐式转换。
一个坑:比较里没有”介于”的单符号,age BETWEEN 25 AND 40 其实是语法糖,等价于 age >= 25 AND age <= 40。BETWEEN 在 SQLite 里算”逻辑运算符”一族,左右都包含。
二、逻辑运算符(Logical Operators)
逻辑运算符用来组合多个条件,得到整体的真假。核心三个是 AND、OR、NOT。
AND:并且
条件A AND 条件B:A 和 B 都为真,结果才为真。任一为假,整体为假。
-- 年龄 >= 25 并且 工资相关条件成立
SELECT name, age FROM users WHERE age >= 25 AND age <= 40;
OR:或者
条件A OR 条件B:A 或 B 任一个为真,结果就为真。只有全假才假。
-- 年龄小于 25 或者 大于 40
SELECT name, age FROM users WHERE age < 25 OR age > 40;
NOT:取反
NOT 条件:把真假颠倒。真变假、假变真。常和 IN、LIKE、NULL 搭配:NOT IN、NOT LIKE、IS NOT NULL。
-- 找出年龄不在 (25, 27) 列表里的人
SELECT name, age FROM users WHERE age NOT IN (25, 27);
其他常用的逻辑类运算符
SQLite 还有不少”逻辑类”成员,虽名字不都带 AND/OR,但本质都是返回真假的条件构造器:
IN (值列表):值是否在列表里,如age IN (25, 27)BETWEEN a AND b:值是否落在闭区间内LIKE/GLOB:模糊匹配(通配符%/_与*,GLOB大小写敏感),详细留待第 23 章IS NULL/IS NOT NULL:空值判断(上一章刚讲)EXISTS:子查询是否返回了行
TipAND 的优先级高于 OR。也就是说
A OR B AND C会被当成A OR (B AND C)。如果你想表达”(A 或 B) 并且 C”,必须加括号:(A OR B) AND C。优先级不确定时,一律用括号把意图写死,既防错又易读。
三、算术运算符(Arithmetic Operators)
对数字做四则运算,结果还是数字:
| 运算符 | 含义 | 示例(a=10, b=20) |
|---|---|---|
+ | 加 | a + b → 30 |
- | 减 | a - b → -10 |
* | 乘 | a * b → 200 |
/ | 除 | b / a → 2 |
% | 取模(求余数) | 12 % 5 → 2 |
命令行里直接算:
sqlite> SELECT 10 + 20;
30
sqlite> SELECT 12 % 5;
2
适用场景:给查询结果做计算。比如订单表想顺手算”金额打九折”:
SELECT id, amount, amount * 0.9 AS 折扣后 FROM orders;
Warning整数除法会截断小数!在 SQLite 里,
5 / 2的结果是2而不是2.5——两个整数相除,结果仍取整(向零截断)。想要小数,至少让一边是 REAL:5.0 / 2或CAST(5 AS REAL) / 2才会得到2.5。这个坑在算金额、均价时尤其要命,务必注意。另外,算术运算里只要任一操作数是 NULL,结果整体就是 NULL——NULL + 10得到 NULL 而非 10,做汇总计算时别被它偷走数据。
四、位运算符(Bitwise Operators)
位运算符直接对整数的二进制位做操作,属于偏底层、日常较少用但要知道存在的类别。假设 A = 60(二进制 00111100)、B = 13(二进制 00001101):
| 运算符 | 含义 | 示例 |
|---|---|---|
& | 按位与:两位都为 1 才得 1 | A & B → 12(00001100) |
| ` | ` | 按位或:任一位为 1 即得 1 |
~ | 按位取反(一元):0 变 1、1 变 0 | ~A → -61 |
<< | 左移:整体左移若干位 | A << 2 → 240 |
>> | 右移:整体右移若干位 | A >> 2 → 15 |
sqlite> SELECT 60 | 13;
61
sqlite> SELECT 60 & 13;
12
何时用:位运算典型场景是”用整数的不同二进制位当开关”——比如一个整数字段用第 1 位表示”是否管理员”、第 2 位表示”是否VIP”,用 & 就能单独读取某一位的开关状态。普通业务查询很少碰,但当你需要紧凑地编码多个布尔标志时,它是利器。
顺带一提:字符串连接运算符 ||
除了上面四类,SQLite 还有一个高频运算符 ||(两个竖线),用来拼接字符串,把左右两边连成一段新文本:
SELECT name || ' 的年龄是 ' || age AS 简介 FROM users;
sqlite> SELECT name || ' 的年龄是 ' || age FROM users;
张三 的年龄是 28
它常用来拼出”人能直接读”的展示字段。注意:如果参与拼接的任一端是 NULL,结果整体也会变成 NULL——这再次说明 NULL 的”传染”特性,处理展示文本时别踩坑。
比较遇上 NULL:结果也是”未知”
回到比较运算符,有个和上一章呼应的要点:只要比较的任一边是 NULL,整个表达式的结果就是 NULL(未知),既不是真也不是假。所以 NULL > 10、NULL = NULL 都不会返回 1。想在条件里”抓住 NULL”,不能用比较运算符,只能用 IS NULL / IS NOT NULL(第 16 章已详述)。逻辑运算符同理:NOT NULL 仍是 NULL,不会突然变成真或假。
运算符优先级速记
当一条表达式里混用多类运算符,SQLite 按固定优先级求值。大致从”先算”到”后算”:
~(一元按位取反)、*///%(算术乘除取模)+/-(算术加减)<</>>(移位)&(按位与)|(按位或)- 比较运算符(
=、<、>等) NOTANDOR
核心记住三条就够用:算术比比较先算;比较比逻辑先算;AND 比 OR 先算。其余拿不准,加括号——括号永远最高优先级,且让读代码的人一眼看懂你的意图。
Tip表达式越复杂,越要写括号。一个常见 bug:
WHERE age > 18 OR vip = 1 AND active = 1实际是age > 18 OR (vip = 1 AND active = 1),很可能不是你想要的。写成WHERE (age > 18 OR vip = 1) AND active = 1才是”活跃用户中,成年或 VIP 的”。宁可多打几个括号,也别赌优先级记忆。
类比小结
把运算符想成厨房里的工具:比较运算符是”秤”,称两个值谁大谁小;逻辑运算符是”筛子的组合机关”,AND 是”必须过两道筛”、OR 是”过任意一道就行”、NOT 是”反着筛”;算术运算符是”菜刀”,切切算算加减乘除;位运算符是”精密镊子”,只对二进制位这种微观零件下手。它们都作用在”表达式”上,而表达式的结果又喂给 WHERE 去筛行。最后一句保命口诀:优先级拿不准,括号走天下;整数相除会 trunc,要小数先变 REAL。