MySQL数据库
MySQL 运算符详解
1. 运算符简介
MySQL 支持一些标准的 SQL 运算符以及一些非标准运算符。它们可用于编写涉及常量、变量、字段值和/或其他表达式的逻辑表达式。
2. 比较运算符
2.1 等于(Equality)
使用 =
运算符检查两个值是否相等:
SELECT True = True; -- 返回 1
SELECT True = False; -- 返回 0
2.2 不等于(Inequality)
使用 <>
或 !=
检查两个值是否不同:
SELECT True <> False; -- 返回 1
SELECT True != True; -- 返回 0
<>
和!=
的含义相同。- 当
=
返回 0 时,<>
返回 1,反之亦然。
3. IS 和 NULL 安全比较
3.1 检查 NULL
使用 IS
检查值是否为 NULL
:
SELECT (NULL IS NULL); -- 返回 1
SELECT (1 IS NULL); -- 返回 0
检查值是否非 NULL:
SELECT (True IS NOT NULL); -- 返回 1
3.2 NULL 安全等于运算符 <=>
<=>
是一个 NULL 安全的等于运算符,它将 NULL 视为普通值。- 如果两个值均为 NULL,则返回 1;如果只有一个值为 NULL,则返回 0。
示例:
SELECT NULL <=> NULL; -- 返回 1
SELECT True <=> True; -- 返回 1
SELECT col1 <=> col2 FROM myTable; -- 比较表中两列
无 NULL 安全的不等运算符,但可以使用以下方式模拟:
SELECT NOT (col1 <=> col2) FROM myTable;
4. IS 和布尔比较
IS
和 IS NOT
可用于布尔值的比较,配合 TRUE
、FALSE
和 UNKNOWN
(NULL
的同义词)。
示例:
SELECT 1 IS TRUE; -- 返回 1
SELECT 1 IS NOT TRUE; -- 返回 0
SELECT 1 IS FALSE; -- 返回 0
SELECT (NULL IS NOT FALSE); -- 返回 1:未知值不等于假
SELECT (NULL IS UNKNOWN); -- 返回 1
SELECT (NULL IS NOT UNKNOWN); -- 返回 0
5. 大小比较运算符
5.1 检查大于
示例:
SELECT 100 > 0; -- 返回 1
SELECT 4 > 5; -- 返回 0
5.2 检查小于
示例:
SELECT 1 < 2; -- 返回 1
SELECT 2 < 2; -- 返回 0
5.3 比较文本
- 文本比较基于字母表顺序:
SELECT 'a' < 'b'; -- 返回 1
- 排序规则(
COLLATION
)决定了具体的比较规则。- 某些排序规则区分大小写。
- 其他排序规则不区分大小写。
5.4 检查大于或等于
以下查询等效:
SELECT `a` >= `b` FROM `myTable`;
SELECT NOT (`a` < `b`) FROM `myTable`;
5.5 检查小于或等于
示例:
SELECT `a` <= `b` FROM `myTable`;
总结
=
和<>
是最常用的比较运算符,分别检查相等和不等。- 使用
IS NULL
或IS NOT NULL
检查 NULL 值,而非=
。 <=>
是 NULL 安全的等于运算符,适用于需要将 NULL 视为普通值的场景。- 布尔比较支持
TRUE
、FALSE
和UNKNOWN
。 - 排序规则影响文本比较的行为,应根据需要选择合适的
COLLATION
。
MySQL 运算符:BETWEEN、IN 和逻辑运算符详解
1. BETWEEN 运算符
1.1 用法
BETWEEN ... AND ...
用于检查一个值是否在指定范围内(包括边界值)。
示例:
SELECT 2 BETWEEN 10 AND 100; -- 返回 0
SELECT 10 BETWEEN 10 AND 100; -- 返回 1
SELECT 20 BETWEEN 10 AND 100; -- 返回 1
- 范围包括
BETWEEN
和AND
之后的两个值。
1.2 NOT BETWEEN
NOT BETWEEN
用于检查值是否不在指定范围内。
示例:
SELECT 8 NOT BETWEEN 5 AND 10; -- 返回 0
2. IN 运算符
2.1 用法
IN
用于检查值是否在一个值列表中。
示例:
SELECT 5 IN (5, 6, 7); -- 返回 1
SELECT 1 IN (5, 6, 7); -- 返回 0
- 如果列表中既包含数字又包含字符串,结果可能无法预测。建议统一类型并为字符串加引号:
SELECT 4 IN ('a', 'z', '5');
2.2 NOT IN
NOT IN
用于检查值是否不在列表中。
示例:
SELECT 1 NOT IN (1, 2, 3); -- 返回 0
3. 逻辑运算符
3.1 MySQL 布尔逻辑
- MySQL 中没有真正的
BOOLEAN
数据类型。 FALSE
等价于0
;在布尔上下文中,空字符串也被视为FALSE
。TRUE
等价于1
;在布尔上下文中,所有非 NULL 且非 FALSE 的值都被视为TRUE
。UNKNOWN
等价于NULL
。
4. 逻辑操作符
4.1 NOT 运算符
NOT
是唯一的单操作数运算符,用于取反。
- 如果操作数为
TRUE
,返回0
。 - 如果操作数为
FALSE
,返回1
。 - 如果操作数为
NULL
,返回NULL
。
示例:
SELECT NOT 1; -- 返回 0
SELECT NOT FALSE; -- 返回 1
SELECT NOT NULL; -- 返回 NULL
SELECT NOT UNKNOWN; -- 返回 NULL
!
是 NOT
的同义词:
SELECT !1; -- 返回 0
4.2 AND 运算符
AND
返回 1
(TRUE
)如果两个操作数均为 TRUE
;否则返回 0
。如果任意一个操作数为 NULL
,返回 NULL
。
示例:
SELECT 1 AND 1; -- 返回 1
SELECT 1 AND ''; -- 返回 0
SELECT '' AND NULL; -- 返回 NULL
&&
是 AND
的同义词:
SELECT 1 && 1; -- 返回 1
4.3 OR 运算符
OR
返回 TRUE
(1
)如果至少一个操作数为 TRUE
;否则返回 FALSE
(0
)。如果两个操作数均为 NULL
,返回 NULL
。
示例:
SELECT TRUE OR FALSE; -- 返回 1
SELECT 1 OR 1; -- 返回 1
SELECT FALSE OR FALSE; -- 返回 0
SELECT NULL OR TRUE; -- 返回 NULL
||
是 OR
的同义词:
SELECT 1 || 0; -- 返回 1
4.4 XOR 运算符
XOR
(异或)返回 1
,如果仅有一个操作数为 TRUE
;如果两个操作数均为 TRUE
或均为 FALSE
,返回 0
;如果任意一个操作数为 NULL
,返回 NULL
。
示例:
SELECT 1 XOR 0; -- 返回 1
SELECT FALSE XOR TRUE; -- 返回 1
SELECT 1 XOR TRUE; -- 返回 0
SELECT 0 XOR FALSE; -- 返回 0
SELECT NULL XOR 1; -- 返回 NULL
总结
BETWEEN
和IN
提供了范围和列表的匹配功能。- 逻辑运算符(NOT、AND、OR、XOR) 在条件控制中非常重要。
- 注意
NULL
在逻辑运算中的特殊处理,例如NOT NULL
返回NULL
。
MySQL 运算符详解:同义词、算术运算符、文本操作符与 LIKE
1. 运算符同义词
AND
的同义词:&&
OR
的同义词:||
NOT
的同义词:!
注意: NOT
的优先级通常与其同义词不同。有关详细信息,请参阅 运算符优先级。
2. 算术运算符
2.1 加法
SELECT +1; -- 返回 1
SELECT 1 + 1; -- 返回 2
2.2 减法
SELECT -1; -- 返回 -1
SELECT -+1; -- 返回 -1
SELECT --1; -- 返回 1
SELECT 10 - 5; -- 返回 5
2.3 乘法
SELECT 2 * 3; -- 返回 6
2.4 除法
- 返回
FLOAT
类型:
SELECT 10 / 2; -- 返回 5.0000
SELECT 1 / 0; -- 返回 NULL
2.5 整数除法
- 使用
DIV
进行整数除法(无余数,结果为整数)。
示例:SELECT 10 DIV 3; -- 返回 3
2.6 取模
- 使用
%
或MOD
获取余数。
示例:SELECT 10 MOD 3; -- 返回 1
3. 数据类型转换
3.1 整数转浮点
通过加 0.0
将整数转换为浮点数:
SELECT 1 + 0.0; -- 返回 1.0
3.2 字符串转整数
通过加 0
将字符串转换为整数:
SELECT '1' + 0; -- 返回 1
SELECT '' + ''; -- 返回 0
4. 文本操作符
4.1 字符串连接
MySQL 中没有使用 +
进行字符串连接的操作符。
- 注意:
+
用于算术运算,不能连接字符串。 - 可以使用
CONCAT()
函数实现字符串连接:SELECT CONCAT('hello', ' world'); -- 返回 "hello world"
5. LIKE 操作符
5.1 基本用法
LIKE
用于检查字符串是否匹配指定模式。
示例:
SELECT * FROM articles WHERE title LIKE 'hello world';
5.2 区分大小写
- 当列被声明为
BINARY
时,LIKE
比较区分大小写:SELECT 'test' LIKE BINARY 'TEST'; -- 返回 0
- 使用
BINARY
子句强制区分大小写:SELECT 'test' LIKE BINARY 'test'; -- 返回 1
5.3 通配符
-
_
:匹配任意一个字符(只能是一个字符)。SELECT * FROM articles WHERE title LIKE '_e_lo'; -- 匹配 "hello"
-
%
:匹配任意数量的字符(包括零个字符)。SELECT * FROM articles WHERE title LIKE 'hello%'; -- 匹配以 "hello" 开头的标题
5.4 使用转义字符
如果要搜索包含通配符的内容,需要对通配符进行转义:
SELECT * FROM articles WHERE title LIKE '\_%'; -- 匹配以 "_" 开头的标题
SELECT * FROM articles WHERE title LIKE '\%%'; -- 匹配以 "%" 开头的标题
自定义转义字符:
SELECT * FROM articles WHERE title LIKE '/_%' ESCAPE '/';
5.5 注意事项
- 使用
=
时,尾部空格会被忽略:SELECT 'word' = 'word '; -- 返回 1
- 使用
LIKE
时,尾部空格会被考虑:SELECT 'word' LIKE 'word '; -- 返回 0
总结
- 算术运算符: MySQL 支持基本的加、减、乘、除、整除和取模操作。
- 类型转换: 可以通过加
0
或0.0
将数据类型转换为整数或浮点数。 - 字符串匹配: 使用
LIKE
操作符支持模式匹配,通配符包括_
(匹配单个字符)和%
(匹配任意字符)。对于特殊字符需要使用转义符处理。 - 注意大小写:
LIKE
的大小写敏感性取决于列的COLLATION
或是否使用BINARY
。
LIKE 同样适用于数字。
SELECT 123 LIKE '%2%' -- 返回 1
如果要检查一个模式是否不匹配,可以使用 NOT LIKE
:
SELECT 'a' NOT LIKE 'b' -- 返回 1
SOUNDS LIKE
您可以使用 SOUNDS LIKE
检查两个文本值的发音是否相同。SOUNDS LIKE
使用基于英语规则的 SOUNDEX 算法,它非常近似(但简单且快速)。
简写形式:
SELECT `word1` SOUNDS LIKE `word2` FROM `wordList`
长写形式:
SELECT SOUNDEX(`word1`) = SOUNDEX(`word2`) FROM `wordList`
SOUNDS LIKE
是 MySQL 特有的 SQL 扩展功能,MySQL 4.1 开始支持。
正则表达式
可以使用 REGEXP
检查字符串是否匹配正则表达式模式。
SELECT 'string' REGEXP 'pattern'
RLIKE
是 REGEXP
的同义词。
位运算符
位非(Bit-NOT):
SELECT ~0 -- 返回 18446744073709551615
SELECT ~1 -- 返回 18446744073709551614
位与(Bit-AND):
SELECT 1 & 1 -- 返回 1
SELECT 1 & 3 -- 返回 1
SELECT 2 & 3 -- 返回 2
位或(Bit-OR):
SELECT 1 | 0 -- 返回 1
SELECT 3 | 0 -- 返回 3
SELECT 4 | 2 -- 返回 6
位异或(Bit-XOR):
SELECT 1 ^ 0 -- 返回 1
SELECT 1 ^ 1 -- 返回 0
SELECT 3 ^ 1 -- 返回 2
左移(Left shift):
SELECT 1 << 2 -- 返回 4
右移(Right shift):
SELECT 1 >> 2 -- 返回 0
条件
IF
IF ... THEN ... ELSE ... END IF;
仅在存储过程内可用。在存储过程外,可以使用 IF(condition, ifTrue, ifFalse)
。
示例:
SELECT IF(-1 < 0, 0, 1); -- 返回 0
多个条件示例(类似 switch
):
IF n > m THEN SET s = '>';
ELSEIF n = m THEN SET s = '=';
ELSE SET s = '<';
END IF;
CASE
SELECT CASE WHEN condition THEN ifTrue ELSE ifFalse END;
示例:
SELECT CASE WHEN '-1 < 0' THEN 0 ELSE 1 END; -- 返回 0
多个条件的示例:
CASE v
WHEN 2 THEN SELECT v;
WHEN 3 THEN SELECT 0;
ELSE
BEGIN
END;
END CASE;
单个查询中的示例:
SELECT CASE v
WHEN 1 THEN 'a'
WHEN 2 THEN 'b'
WHEN 3 THEN 'c'
WHEN 4 THEN 'd'
ELSE 0
END AS value
优先级
操作符优先级表:
INTERVAL
BINARY
,COLLATE
!
-
(一元负号),~
(一元位反转)^
*
,/
,DIV
,%
,MOD
-
,+
<<
,>>
&
|
=
,<=>
,>=
,>
,<=
,<
,<>
,!=
,IS
,LIKE
,REGEXP
,IN
BETWEEN
,CASE
,WHEN
,THEN
,ELSE
NOT
&&
,AND
XOR
||
,OR
:=
修饰符:
PIPES_AS_CONCAT
:启用时,||
的优先级高于^
,但低于-
和~
。HIGH_NOT_PRECEDENCE
:启用时,NOT
与!
的优先级相同。
使用括号
可以使用括号强制 MySQL 先评估子表达式:
SELECT (1 + 1) * 5 -- 返回 10
即使不影响优先级,也可以使用括号增加可读性:
SELECT 1 + (2 * 5) -- 等价于 1 + 2 * 5
赋值操作符
使用 =
将值赋给列:
UPDATE `myTable` SET `uselessField`=0
将值赋给变量时需使用 :=
,因为 =
可能会引起歧义(赋值还是比较)。
SELECT @myvar := 1
也可以使用 SELECT INTO
给一个或多个变量赋值。