MySQL資料庫對GROUP BY子句的功能擴充套件(1)
標準SQL語法中,對SELECT語句執行GROUP BY操作的話,SELECT選擇的列必須出現在GROUP BY子句中,也就是說先要明確根據什麼分組,然後才能選擇分沒分組。不過MySQL資料庫不完全是這樣,只要MySQL資料庫不是執行在ANSI模式下(什麼是執行模式,簡單講就是指支援的SQL語法,執行模式是在啟動mysql服務時以--sql-mode設定,預設應為空,ANSI是一套通行的標準SQL語法體系),就可以簡化GROUP BY操作時的選擇列。
出現在GROUP BY子句,但沒有出現在SELECT的選擇列中,這我們可以理解對吧,不過如果是SELECT選擇了列,但該列卻並沒有出現在GROUP BY子句中,這樣的SQL能執行嗎?MySQL中是可以的,舉個例子:
mysql> create table j1 (id int,vl varchar(20));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into j1 values (1,'a');
Query OK, 1 row affected (0.00 sec)
mysql> insert into j1 values (1,'b');
Query OK, 1 row affected (0.00 sec)
mysql> insert into j1 values (2,'c');
Query OK, 1 row affected (0.00 sec)
mysql> insert into j1 values (3,'d');
Query OK, 1 row affected (0.00 sec)
我們要按id分組,查詢不同組的數量及其vl值,在mysql中會怎麼寫呢,看好了:
mysql> select vl,count(0) from j1 group by id;
+------+----------+
| vl | count(0) |
+------+----------+
| a | 2 |
| c | 1 |
| d | 1 |
+------+----------+
3 rows in set (0.00 sec)
標準SQL中,要查詢vl列則vl必須在GROUP BY子句中,而MySQL資料庫中,vl可被忽略,這種寫法按照官方文件中的說法是為了提高效能,避免不必要的排序和分組。
但是,要注意了,在這種設定下,一定要明確自己想要的結果到底是什麼,以及實際執行的SQL語句返回結果,是否符合自己的預期。
MySQL在執行這類查詢語句時,它會預設理解為,沒寫到GROUP BY子句的列,其列值是唯一的,如果GROUP BY省略的列值其實並不唯一,那麼最好不要使用這項功能,仍以前面的示例來說明,id為1的記錄實際有兩條,分別對應vl in('a','b'),但實際查詢的結果集則只有a對應的數量,vl=b的記錄量被忽略了,這種情況就不一定是我們想要的結果了,在實際應用時需要特別注意。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-692946/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL資料庫對GROUP BY子句的功能擴充套件(2)MySql資料庫套件
- C 擴充套件庫 – mysql API套件MySqlAPI
- MySQL中InnoDB引擎對索引的擴充套件MySql索引套件
- 擴充套件你的KUBECTL功能套件
- 報表開發之擴充套件GROUP BY套件
- PHP的SPL擴充套件庫(一)資料結構PHP套件資料結構
- GBASE觀察:擴充套件分析型資料庫套件資料庫
- MySQL InnoDB的索引擴充套件MySql索引套件
- 大資料——Scala擴充套件大資料套件
- 資料塊、資料擴充套件、段套件
- PostgreSQL資料庫擴充套件語言程式設計之plpgsql-1SQL資料庫套件程式設計
- 使用nub恢復資料庫的知識擴充套件資料庫套件
- 可動態擴充套件的資料庫模型設計套件資料庫模型
- Java基礎擴充套件1.資料輸入Java套件
- C++對C語言的擴充套件(1)--引用C++C語言套件
- DLR 的擴充套件庫 Dynamitey套件MIT
- SQL Server資料庫檔案不滿足擴充套件條件時不再自動擴充套件SQLServer資料庫套件
- 資料檢索擴充套件包套件
- 擴充套件資料檔案大小套件
- java資料型別擴充套件Java資料型別套件
- 讓前端也能填充資料庫的 Reach Seeder 擴充套件前端資料庫套件
- 可擴充套件的資料庫系統,請求批評套件資料庫
- SpringCloudGateway資料庫儲存路由資訊的擴充套件方案SpringGCCloudGateway資料庫路由套件
- PostgreSQL在雲端:部署、管理和擴充套件你的資料庫SQL套件資料庫
- 在 GitLab 我們是如何擴充套件資料庫的Gitlab套件資料庫
- ASP.NET Core擴充套件庫之Http通用擴充套件ASP.NET套件HTTP
- 聊聊如何基於eureka後設資料擴充套件namespace功能套件namespace
- [譯] 論資料流的擴充套件性套件
- ehcarts擴充套件優秀的資料表套件
- php mysqli擴充套件庫的使用PHPMySql套件
- 資料庫擴充套件表設計過程記錄資料庫套件
- php mysql擴充套件安裝PHPMySql套件
- MySql 擴充套件儲存引擎MySql套件儲存引擎
- PHP 擴充套件 Mysql 與 MysqliPHP套件MySql
- MySQL - 擴充套件性 1 概述:人多未必力量大MySql套件
- INFORMIX表的預設初始擴充套件、下一個擴充套件資料塊以及一個表允許的最大擴充套件數。ORM套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- Google 為 Chrome 加入新的資料壓縮擴充套件功能 —— 你信任它?GoChrome套件