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 和布尔比较

ISIS NOT 可用于布尔值的比较,配合 TRUEFALSEUNKNOWNNULL 的同义词)。

示例:

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 NULLIS NOT NULL 检查 NULL 值,而非 =
  • <=> 是 NULL 安全的等于运算符,适用于需要将 NULL 视为普通值的场景。
  • 布尔比较支持 TRUEFALSEUNKNOWN
  • 排序规则影响文本比较的行为,应根据需要选择合适的 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
  • 范围包括 BETWEENAND 之后的两个值。

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 返回 1TRUE)如果两个操作数均为 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 返回 TRUE1)如果至少一个操作数为 TRUE;否则返回 FALSE0)。如果两个操作数均为 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

总结

  • BETWEENIN 提供了范围和列表的匹配功能。
  • 逻辑运算符(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 区分大小写

  1. 当列被声明为 BINARY 时,LIKE 比较区分大小写:
    SELECT 'test' LIKE BINARY 'TEST'; -- 返回 0
    
  2. 使用 BINARY 子句强制区分大小写:
    SELECT 'test' LIKE BINARY 'test'; -- 返回 1
    

5.3 通配符

  1. _:匹配任意一个字符(只能是一个字符)。

    SELECT * FROM articles WHERE title LIKE '_e_lo'; -- 匹配 "hello"
    
  2. %:匹配任意数量的字符(包括零个字符)。

    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 支持基本的加、减、乘、除、整除和取模操作。
  • 类型转换: 可以通过加 00.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'

RLIKEREGEXP 的同义词。


位运算符

位非(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 给一个或多个变量赋值。

Last modified: Friday, 17 January 2025, 7:26 PM