首页 / SQLite 入门教程 / 运算符

SQLite 入门教程

运算符

本教程共 50 篇 · 第 17 篇 · 更新于 2026-07-31

sqlite运算符operators逻辑运算算术运算位运算

17. 运算符

本节目标:学完本章你能说清 SQLite 里四类运算符——比较、逻辑(AND/OR/NOT)、算术、位运算——分别干什么用,并理解运算符优先级和括号的作用。

运算符是什么

运算符(Operator)就是 SQL 里那些”对值做运算的特殊符号或保留字”,比如 +>AND。它们几乎出现在每条 SQL 的**表达式(Expression)**里。上一章 WHERE 里写的 age > 30> 就是比较运算符;age >= 25 AND age <= 40>=<= 是比较运算符,AND 是逻辑运算符。

SQLite 里运算符主要分四大类,本章一次讲清:比较、逻辑、算术、位运算。先记住一个底层事实——

Note

SQLite 没有独立的布尔(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 >= 100WHERE name = '张三'。再次提醒:比较时尽量同类型对同类型,避免依赖隐式转换。

一个坑:比较里没有”介于”的单符号,age BETWEEN 25 AND 40 其实是语法糖,等价于 age >= 25 AND age <= 40BETWEEN 在 SQLite 里算”逻辑运算符”一族,左右都包含。

二、逻辑运算符(Logical Operators)

逻辑运算符用来组合多个条件,得到整体的真假。核心三个是 AND、OR、NOT。

AND:并且

条件A AND 条件BA 和 B 都为真,结果才为真。任一为假,整体为假。

-- 年龄 >= 25 并且 工资相关条件成立
SELECT name, age FROM users WHERE age >= 25 AND age <= 40;

OR:或者

条件A OR 条件BA 或 B 任一个为真,结果就为真。只有全假才假。

-- 年龄小于 25 或者 大于 40
SELECT name, age FROM users WHERE age < 25 OR age > 40;

NOT:取反

NOT 条件:把真假颠倒。真变假、假变真。常和 INLIKENULL 搭配:NOT INNOT LIKEIS 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:子查询是否返回了行
Tip

AND 的优先级高于 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 / 2CAST(5 AS REAL) / 2 才会得到 2.5。这个坑在算金额、均价时尤其要命,务必注意。另外,算术运算里只要任一操作数是 NULL,结果整体就是 NULL——NULL + 10 得到 NULL 而非 10,做汇总计算时别被它偷走数据。

四、位运算符(Bitwise Operators)

位运算符直接对整数的二进制位做操作,属于偏底层、日常较少用但要知道存在的类别。假设 A = 60(二进制 00111100)、B = 13(二进制 00001101):

运算符含义示例
&按位与:两位都为 1 才得 1A & 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 > 10NULL = NULL 都不会返回 1。想在条件里”抓住 NULL”,不能用比较运算符,只能用 IS NULL / IS NOT NULL(第 16 章已详述)。逻辑运算符同理:NOT NULL 仍是 NULL,不会突然变成真或假。

运算符优先级速记

当一条表达式里混用多类运算符,SQLite 按固定优先级求值。大致从”先算”到”后算”:

  1. ~(一元按位取反)、*///%(算术乘除取模)
  2. +/-(算术加减)
  3. <</>>(移位)
  4. &(按位与)
  5. |(按位或)
  6. 比较运算符(=<> 等)
  7. NOT
  8. AND
  9. OR

核心记住三条就够用:算术比比较先算;比较比逻辑先算;ANDOR 先算。其余拿不准,加括号——括号永远最高优先级,且让读代码的人一眼看懂你的意图。

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。