ZetCode

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 表达式。