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