標準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的記錄量被忽略了,這種情況就不一定是我們想要的結果了,在實際應用時需要特別注意。
MySQL對標準SQL的注釋擴充套件
之前一直不明白 mysql 注釋中的嘆號是什麼東西,直到看了下邊的 manual 文件中的內容。mysql 伺服器包含一些其他 sql dbms 中不具備的擴充套件。注意,如果使用了它們,將無法把 移植到其他 sql伺服器。在某些情況下,你可以編寫包含 mysql 擴充套件的 但仍保持其可移植性,方...
mysql 標準sql 久違的SQL標準
很久沒有什麼工作需要參考sql標準了,乃至於sql 2011的更新都一直沒有去關注過。sql標準一路走來,可以說是略顯老態了,參與的廠商比較少,關注的人也少了。絕大多數人提起sql標準,涉及的內容其實是sql89或sql92裡頭最基本或者說最核心的一部分。其實,自從 很久沒有什麼工作需要參考sql標...
1 7 1 MySQL對標準SQL的擴充套件
mysql server支援某些您可能在其他sql dbms中找不到的擴充套件。請注意,如果使用它們,您的 將無法移植到其他sql server。在某些情況下,可以使用以下形式的注釋編寫包含mysql擴充套件但仍可移植的 在這種情況下,mysql伺服器將像其他任何sql語句一樣解析並執行注釋中的 但...