MySQL 表达式
最后修改于 2023 年 1 月 10 日
在本 MySQL 教程中,我们将介绍表达式。
编程语言中的表达式是值、变量、运算符和函数的组合,根据特定编程语言的特定优先级和关联规则进行解释(评估),它计算然后产生(返回,在有状态环境中)另一个值。该表达式被认为求值为该值。
字面值
字面值是某种常量。字面值可以是字符串、数字、十六进制值、布尔值和 NULL。
mysql> SELECT 3, 'Wolf', 34.5, 0x34, 0+b'10111'; +---+------+------+------+------------+ | 3 | Wolf | 34.5 | 0x34 | 0+b'10111' | +---+------+------+------+------------+ | 3 | Wolf | 34.5 | 4 | 23 | +---+------+------+------+------------+
这里我们返回五个字面量。即一个整数、一个字符串、一个浮点数、一个十六进制数和一个二进制值。十六进制值以 `0x` 开头,这是编程语言中的标准。二进制值以 `b` 字符开头,并用单引号括起来。为了显示可打印的值,我们在二进制符号中添加一个零。
mysql> SELECT NULL, \N; +------+------+ | NULL | NULL | +------+------+ | NULL | NULL | +------+------+
这是 `NULL` 值。它是一个值的缺失。 `NULL` 的同义词是 `\N`。
mysql> SELECT TRUE, FALSE; +------+-------+ | TRUE | FALSE | +------+-------+ | 1 | 0 | +------+-------+
MySQL 也识别布尔值 `TRUE`、`FALSE` 值。它们可以用任何字母大小写书写。
mysql> SELECT '2011-01-11', '23:33:01', '98/11/31/ 14:22:20'; +------------+----------+--------------------+ | 2011-01-11 | 23:33:01 | 98/11/31/ 14:22:20 | +------------+----------+--------------------+ | 2011-01-11 | 23:33:01 | 98/11/31/ 14:22:20 | +------------+----------+--------------------+
MySQL 数据库支持各种日期和时间字面量。
变量
变量是与值关联的符号名称。该值可能会随时间而改变。 MySQL 中的变量以 ` @` 字符开头。
mysql> SET @name = 'Jane'; mysql> SELECT @name; +-------+ | @name | +-------+ | Jane | +-------+
我们设置一个变量,然后显示它的内容。
运算符
_运算符_用于构建表达式。SQL 运算符与数学运算符非常相似。运算符有两种:二元运算符和一元运算符。二元运算符使用两个操作数,一元运算符使用一个操作数。一个运算符可以有一个或两个操作数。_操作数_是运算符的输入(参数)之一。
我们有几种类型的运算符
- 算术运算符
- 布尔运算符
- 关系运算符
- 位运算符
- 其他运算符
一元运算符
我们将展示一些一元运算符。
mysql> SELECT +3, 3; +---+---+ | 3 | 3 | +---+---+ | 3 | 3 | +---+---+
`+` 是一个无操作。它什么也不做。
mysql> SELECT -(3-44); +---------+ | -(3-44) | +---------+ | 41 | +---------+
一元运算符 `-` 将正值变为负值,反之亦然。
mysql> SELECT NOT (3>9); +-----------+ | NOT (3>9) | +-----------+ | 1 | +-----------+
`NOT` 运算符否定一个值。 `3>9` 比较的结果是 false,否定运算符将其否定为 true。
算术运算符
常见的算术运算符有:乘法、除法、整数除法、加法、减法和模数。
mysql> SELECT 3 + 4 - 5; +-----------+ | 3 + 4 - 5 | +-----------+ | 2 | +-----------+
加法和减法运算符。
mysql> SELECT 3*3/9; +--------+ | 3*3/9 | +--------+ | 1.0000 | +--------+
这些是我们从数学中知道的乘法和除法运算符。
mysql> SELECT 9/2, 9 DIV 2; +--------+---------+ | 9/2 | 9 DIV 2 | +--------+---------+ | 4.5000 | 4 | +--------+---------+
上面的 SQL 语句显示了除法和整数除法运算符之间的区别。第一个返回一个浮点数,第二个返回一个整数。
mysql> SELECT 11 % 3; +--------+ | 11 % 3 | +--------+ | 2 | +--------+
` %` 运算符称为模数运算符。它找到一个数除以另一个数的余数。`11 % 3`,11 模 3 等于 2,因为 3 进入 11 三次,余数为 2。
逻辑运算符
使用逻辑运算符,我们执行布尔运算。 MySQL 理解这些逻辑运算符:`AND`、`OR` 和 `NOT` 和 `XOR`。逻辑运算符返回 `TRUE` 或 `FALSE`。在 MySQL 中,1 为真,0 为假。
如果两个操作数都为真,则 `AND` 运算符的计算结果为真。
mysql> SELECT FALSE AND FALSE, FALSE AND TRUE, -> TRUE AND FALSE, TRUE AND TRUE; +-----------------+----------------+----------------+---------------+ | FALSE AND FALSE | FALSE AND TRUE | TRUE AND FALSE | TRUE AND TRUE | +-----------------+----------------+----------------+---------------+ | 0 | 0 | 0 | 1 | +-----------------+----------------+----------------+---------------+
前三个运算的计算结果为假,最后一个运算的计算结果为真。
mysql> SELECT 3=3 AND 4=4; +-------------+ | 3=3 AND 4=4 | +-------------+ | 1 | +-------------+
两个操作数都为真,所以结果为真 (1)。
如果至少一个操作数为真,则 `OR` 运算符的计算结果为真。
mysql> SELECT FALSE OR FALSE, FALSE OR TRUE, -> TRUE OR FALSE, TRUE OR TRUE; +----------------+---------------+---------------+--------------+ | FALSE OR FALSE | FALSE OR TRUE | TRUE OR FALSE | TRUE OR TRUE | +----------------+---------------+---------------+--------------+ | 0 | 1 | 1 | 1 | +----------------+---------------+---------------+--------------+
第一个运算的计算结果为假,其他运算的计算结果为真。
如果恰好一个操作数为真,则 `XOR` 运算符的计算结果为真。
mysql> SELECT FALSE XOR FALSE, FALSE XOR TRUE, -> TRUE XOR FALSE, TRUE XOR TRUE; +-----------------+----------------+----------------+---------------+ | FALSE XOR FALSE | FALSE XOR TRUE | TRUE XOR FALSE | TRUE XOR TRUE | +-----------------+----------------+----------------+---------------+ | 0 | 1 | 1 | 0 | +-----------------+----------------+----------------+---------------+
两个操作的结果为真。
`NOT` 运算符是否定运算符。它使真变为假,假变为真。
mysql> SELECT NOT TRUE, NOT FALSE; +----------+-----------+ | NOT TRUE | NOT FALSE | +----------+-----------+ | 0 | 1 | +----------+-----------+ mysql> SELECT NOT (3=3); +-----------+ | NOT (3=3) | +-----------+ | 0 | +-----------+
关系运算符
关系运算符用于比较值。这些运算符始终产生布尔值。
mysql> SELECT 3*3=9, 9=9; +-------+-----+ | 3*3=9 | 9=9 | +-------+-----+ | 1 | 1 | +-------+-----+
= 是相等运算符。
mysql> SELECT 3 < 4, 3 <> 5, 4 <= 4, 5 != 5; +-------+--------+--------+--------+ | 3 < 4 | 3 <> 5 | 4 <= 4 | 5 != 5 | +-------+--------+--------+--------+ | 1 | 1 | 1 | 0 | +-------+--------+--------+--------+
从数学中已知关系运算符的用法。
位运算符
十进制数对人类来说是自然的。二进制数是计算机固有的。二进制、八进制、十进制或十六进制符号只是相同数字的表示法。位运算符处理二进制数的位。我们有二进制逻辑运算符和移位运算符。
按位与运算符对两个数字执行逐位比较。只有当操作数中对应的位都为 1 时,结果的该位才为 1。
00110 & 00011 = 00010
第一个数字是 6 的二进制表示法,第二个是 3,结果是 2。
mysql> SELECT 6 & 3, 3 & 6; +-------+-------+ | 6 & 3 | 3 & 6 | +-------+-------+ | 2 | 2 | +-------+-------+
按位或运算符对两个数字执行逐位比较。当操作数中对应的位任一为 1 时,结果的该位为 1。
00110 | 00011 = 00111
结果是 00110
或十进制的 7。
mysql> SELECT 6 | 3, 3 | 6; +-------+-------+ | 6 | 3 | 3 | 6 | +-------+-------+ | 7 | 7 | +-------+-------+
_位移位运算符_将位向右或向左移动。
number << n : multiply number 2 to the nth power number >> n : divide number by 2 to the nth power
这些运算符也称为算术移位。
00110 >> 00001 = 00011
我们将数字六的每个位向右移动。它等于将六除以 2。结果是 `00011` 或十进制 3。
mysql> SELECT 6 >> 1; +--------+ | 6 >> 1 | +--------+ | 3 | +--------+
00110 << 00001 = 01100
我们将数字六的每个位向左移动。它等于将数字六乘以 2。结果是 `01100` 或十进制 12。
mysql> SELECT 6 << 1; +--------+ | 6 << 1 | +--------+ | 12 | +--------+
其他运算符
还有一些其他运算符。这些包括 `IS`、`IN`、`LIKE`、`REGEXP`、`BETWEEN`。
`IS` 运算符测试操作数是否为布尔值。
mysql> SET @running = FALSE; mysql> SELECT @running IS FALSE; +-------------------+ | @running IS FALSE | +-------------------+ | 1 | +-------------------+
我们将一个变量设置为布尔值 false。我们使用 `IS` 运算符检查变量是否为 `FALSE`。
我们可以在两种情况下使用 `IN` 运算符。
mysql> SELECT 'Tom' IN ('Tom', 'Frank', 'Jane'); +-----------------------------------+ | 'Tom' IN ('Tom', 'Frank', 'Jane') | +-----------------------------------+ | 1 | +-----------------------------------+
这里我们检查字符串值 'Tom' 是否在名称列表中,跟随 `IN` 运算符。返回值为布尔值。
对于以下示例,它概括了我们在 `Cars` 表中的内容。
mysql> SELECT * FROM Cars; +----+------------+--------+ | Id | Name | Cost | +----+------------+--------+ | 1 | Audi | 52642 | | 2 | Mercedes | 57127 | | 3 | Skoda | 9000 | | 4 | Volvo | 29000 | | 5 | Bentley | 350000 | | 6 | Citroen | 21000 | | 7 | Hummer | 41400 | | 8 | Volkswagen | 21600 | +----+------------+--------+
在第二种情况下,`IN` 运算符允许您在 `WHERE` 子句中指定多个值。
mysql> SELECT * FROM Cars Where Name IN ('Audi', 'Hummer'); +----+--------+-------+ | Id | Name | Cost | +----+--------+-------+ | 1 | Audi | 52642 | | 7 | Hummer | 41400 | +----+--------+-------+
从 `Cars` 表中,我们选择 `IN` 运算符之后列出的汽车。
`LIKE` 运算符用于 `WHERE` 子句中,以搜索列中的指定模式。
mysql> SELECT * FROM Cars WHERE Name LIKE 'Vol%'; +----+------------+-------+ | Id | Name | Cost | +----+------------+-------+ | 4 | Volvo | 29000 | | 8 | Volkswagen | 21600 | +----+------------+-------+
这里我们选择以“Vol”开头的汽车。
mysql> SELECT * FROM Cars WHERE Name LIKE '____'; +----+------+-------+ | Id | Name | Cost | +----+------+-------+ | 1 | Audi | 52642 | +----+------+-------+
这里我们选择一个恰好有四个字符的车名。有四个下划线。
`LIKE` 运算符仅提供简单的模式匹配。 `REGEXP` 运算符更强大。它提供使用正则表达式的模式匹配。 `RLIKE` 是 `REGEXP` 的同义词。
mysql> SELECT * FROM Cars WHERE Name REGEXP 'e.$'; +----+------------+--------+ | Id | Name | Cost | +----+------------+--------+ | 2 | Mercedes | 57127 | | 5 | Bentley | 350000 | | 6 | Citroen | 21000 | | 7 | Hummer | 41400 | | 8 | Volkswagen | 21600 | +----+------------+--------+
这里我们有汽车,其倒数第二个字符是 'e'。
mysql> SELECT * FROM Cars WHERE Name REGEXP '^.e.*e.$'; +----+----------+--------+ | Id | Name | Cost | +----+----------+--------+ | 2 | Mercedes | 57127 | | 5 | Bentley | 350000 | +----+----------+--------+
我们选择汽车,其第二个字符和倒数第二个字符是 'e'。
`BETWEEN` 运算符等效于一对比较。`a BETWEEN b AND c` 等效于 `a>=b AND a<=c`。
mysql> SELECT * FROM Cars WHERE Cost BETWEEN 20000 AND 55000; +----+------------+-------+ | Id | Name | Cost | +----+------------+-------+ | 1 | Audi | 52642 | | 4 | Volvo | 29000 | | 6 | Citroen | 21000 | | 7 | Hummer | 41400 | | 8 | Volkswagen | 21600 | +----+------------+-------+
在此 SQL 语句中,我们选择了价格在 20000 到 55000 之间的汽车。
优先级
运算符优先级告诉我们哪些运算符首先被求值。优先级级别对于避免表达式中的歧义是必需的。
以下表达式的结果是 28 还是 40?
3 + 5 * 5
就像在数学中一样,乘法运算符的优先级高于加法运算符。所以结果是 28。
(3 + 5) * 5
要更改评估顺序,我们可以使用方括号。方括号内的表达式始终首先被评估。
mysql> SELECT 3+5*5, (3+5)*5; +-------+---------+ | 3+5*5 | (3+5)*5 | +-------+---------+ | 28 | 40 | +-------+---------+
第一个表达式的计算结果为 28,因为乘法运算符的优先级高于加法运算符。在第二个例子中,我们使用方括号来改变优先级顺序。所以第二个表达式的计算结果是 40。
结合性
有时优先级不足以确定表达式的结果。还有另一个规则称为_关联性_。运算符的关联性决定了具有_相同_优先级级别的运算符的评估顺序。
9 / 3 * 3
这个表达式的结果是 9 还是 1?乘法、除法和模运算符是从左到右结合的。所以表达式的求值方式是:(9 / 3) * 3
结果是 9。
mysql> SELECT 9 / 3 * 3; +-----------+ | 9 / 3 * 3 | +-----------+ | 9.0000 | +-----------+
关联规则是从左到右。
mysql> SELECT 0 AND 0 OR 1; +--------------+ | 0 AND 0 OR 1 | +--------------+ | 1 |
关联规则又一次是从左到右。如果它是从右到左,结果将是 0。
算术、布尔、关系和位运算符都是从左到右关联的。
在本 MySQL 教程中,我们介绍了 MySQL 表达式。