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 次檢視

啟動你的職業生涯

透過完成課程獲得認證

開始
廣告