MySQL資料庫對GROUP BY子句的功能擴充套件(2)

junsansi發表於2011-04-21

前面談了MySQL中處理GROUP BY子句時隱藏列的一些特點,今天繼續探討這一話題,引申談一談別名在GROUP BY子句中的應用。

我們在SELECT執行查詢時經常會應用到別名,主要是對查詢列名的重定義,在ANSI標準SQL規則中,對於定義的別名引用還是比較多的,不過MySQL資料庫對於別名的引用也有一些增加,最顯著的一點,就是允許在GROUP BY/ORDER BY子句中引用定義的別名。

舉個例子,有表如下:
mysql> select * from j1;
+------+------+
| id   | vl   |
+------+------+
|    1 | a    |
|    1 | b    |
|    2 | c    |
|    3 | d    |
+------+------+
4 rows in set (0.00 sec)

我們想查詢id分組排序後數量大於1的記錄,標準SQL寫法應該是:
mysql> select id,count(0) as ct from j1 group by id having count(0)>1;
+------+----------+
| id   |       ct |
+------+----------+
|    1 |        2 |
+------+----------+
1 row in set (0.00 sec)
如例中所示,雖然SELECT中已對count(0)做了別名,但標準SQL中當GROUP BY子句中需要過濾這一條件時,必須將該列的完整形式重寫一遍,而不支援直接引用別名的方式呼叫。

MySQL資料庫對HAVING子句的引用功能進行了些許擴充套件,這在一定情況下可以簡化having的寫法,例如,上述語句可以改寫成:
mysql> select id,count(0) ct from j1 group by id having ct>1;
+------+----+
| id   | ct |
+------+----+
|    1 |  2 |
+------+----+
1 row in set (0.00 sec)

提示:如果啟動mysql服務時指定了sql_mode值為ONLY_FULL_GROUP_BY,就不支援這種寫法了。

定義的別名也同樣適用於ORDER BY子句,如例:
mysql> select id,count(0) ct from j1 group by id order by ct;
+------+----+
| id   | ct |
+------+----+
|    2 |  1 |
|    3 |  1 |
|    1 |  2 |
+------+----+
3 rows in set (0.00 sec)

以及GROUP BY子句,如例:
mysql> insert into j1 values (10,'a10');
Query OK, 1 row affected (0.00 sec)

mysql> insert into j1 values (11,'a11');
Query OK, 1 row affected (0.00 sec)

mysql> insert into j1 values (12,'a12');
Query OK, 1 row affected (0.00 sec)

mysql> insert into j1 values (13,'b10');
Query OK, 1 row affected (0.00 sec)

mysql> insert into j1 values (14,'b11');
Query OK, 1 row affected (0.00 sec)

mysql> select substr(vl,1,2) as c,count(0) from j1 where id>9 group by c;
+------+----------+
| c    | count(0) |
+------+----------+
| a1   |        3 |
| b1   |        2 |
+------+----------+
2 rows in set (0.00 sec)

這種方式的優點在於可以簡化SQL語句的寫法,比如說當分組條件比如複雜時,不需要重複寫多次,只要在SELECT中定義好別名,然後其它地方引用時指定別名即可。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-693094/,如需轉載,請註明出處,否則將追究法律責任。

相關文章