MySQL 表达式
在 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 乘以 3 变成 11,余数为 2。
逻辑运算符
使用逻辑运算符,我们执行布尔运算。 MySQL 理解以下逻辑运算符:AND
,OR
和NOT
和XOR
。 逻辑运算符返回TRUE
或FALSE
。 在 MySQL 中,1 为true
,0 为false
。
如果两个操作数均为true
,则AND
运算符的计算结果为true
。
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 |
+-----------------+----------------+----------------+---------------+
前三个操作求值为false
,最后一个求值为true
。
mysql> SELECT 3=3 AND 4=4;
+-------------+
| 3=3 AND 4=4 |
+-------------+
| 1 |
+-------------+
两个操作数都为true
,因此结果为true
(1)。
如果至少一个操作数为true
,则OR
运算符的计算结果为true
。
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 |
+----------------+---------------+---------------+--------------+
第一个操作求值为 false,其他操作求值为 true。
如果恰好其中一个操作数为 true,则XOR
运算符的计算结果为 true。
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 |
+-----------------+----------------+----------------+---------------+
其中两个操作为true
。
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
我们将数字 6 的每个位向右移动。 等于将 6 除以 2。结果为00011
或十进制 3。
mysql> SELECT 6 >> 1;
+--------+
| 6 >> 1 |
+--------+
| 3 |
+--------+
00110
<< 00001
= 01100
我们将数字 6 的每个位向左移动。 等于将数字 6 乘以 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 |
+-----------------------------------+
在这里,我们检查IN
运算符之后的字符串值'Tom'是否在名称列表中。 返回值是布尔值。
对于以下示例,我们概括了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
运算符之后列出的汽车。
WHERE
子句中使用LIKE
运算符在列中搜索指定的模式。
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 表达式。