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
优先级
操作符优先级表:
INTERVALBINARY,COLLATE!-(一元负号),~(一元位反转)^*,/,DIV,%,MOD-,+<<,>>&|=,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,INBETWEEN,CASE,WHEN,THEN,ELSENOT&&,ANDXOR||,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 给一个或多个变量赋值。