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)
广告