MySQL 是否会在 SELECT 语句和 HAVING/GROUP BY 语句之间消除公共子表达式?如何测试它?


要进行测试,请使用 sleep() 函数。

案例 1

语法如下:

SELECT yourColumnName+sleep(yourIntegerValue)
FROM yourTableName
GROUP BY yourColumnName+sleep(yourIntegerValue);;

案例 2 − 你可以使用另一种语法,如下所示:

SELECT yourColumnName+sleep(yourIntegerValue) As anyAliasName
FROM yourTableName
GROUP BY yourAliasName;

为了理解上述语法,让我们创建一个表。创建表的查询如下:

mysql> create table sleepDemo
   -> (
   -> value int
   -> );
Query OK, 0 rows affected (1.25 sec)

使用 insert 命令在表中插入一些记录。查询如下:

mysql> insert into sleepDemo values(40);
Query OK, 1 row affected (0.18 sec)
mysql> insert into sleepDemo values(60);
Query OK, 1 row affected (0.19 sec)
mysql> insert into sleepDemo values(60);
Query OK, 1 row affected (0.10 sec)

使用 select 语句显示表中的所有记录。查询如下:

mysql> select *from sleepDemo;

以下是输出:

+-------+
| value |
+-------+
| 40    |
| 60    |
| 60    |
+-------+
3 rows in set (0.00 sec)

以下是消除 SELECT 和 HAVING/GROUP BY 子句之间公共子表达式的查询。

案例 1 − 查询如下:

mysql> SELECT value+sleep(3)
   -> FROM sleepDemo
   -> GROUP BY value+sleep(3);

输出如下:

+----------------+
| value+sleep(3) |
+----------------+
| 40             |
| 60             |
+----------------+
2 rows in set (9.00 sec)

上述查询每个值需要 9 秒(40 需 3 秒,60 需 3 秒,60 需 3 秒)。

案例 2 − 查询如下:

mysql> SELECT value+sleep(3) As v
   -> FROM sleepDemo
   -> GROUP BY v;

输出如下:

+------+
| v    |
+------+
| 40   |
| 60   |
+------+
2 rows in set (9.00 sec)

更新于:2019年7月30日

58 次查看

启动你的职业生涯

通过完成课程获得认证

开始
广告