淺談mysql數據庫和oracle數據庫之group by 之mysql5.6與5.7group by

眾所周知,group by 子句是用來分組的,by后面跟上字段,表示以哪個字段之后,那么oracle和mysql的group by有何區別呢?接下來咱們就一起來探討一下。

共同點

寫法:select 字段1,字段2......

? ? ? ? ? ?from? 表

? ? ? ? ? ?where 條件

? ? ? ? ? group by? 字段

? ? ? ? ? having? ?條件;

注意:1.group by 必須配合聚合函數使用,聚合函數一般跟在select

? ? ? ? ? ?2.如果分組后還要進行篩選,也就是說group by 后還要加條件的話,切記不能用where,要使用having

技巧:1.遇到統計想函數

????????????2.形容詞前group?by

????????????3.函數中央是名詞

????????????4.列名select后添加

? ? ? ?聲明:技巧來自老男孩oldguo大神

不同點

oracle:所有出現在select后面的字段名(函數用的字段不用管),必須出現在group by語句后,沒有在select后面出現的字段名,是不允許在group by后面的。

舉例:求同一部門 同一崗位有幾個人? (scott下的emp表)

select deptno ,job ,count(*)

from emp

group by deptno,job? ?;

?這里是按照2個字段的組合分成一組,另外各位看到deptno和job分別出現在select后面和group by 后面這樣才是正確的

select deptno ,job ,count(*)

from emp

group by deptno ;

如果group by 之后只跟deptno 就錯了

mysql:select后面出現的字段 ,除函數用的字段外,無需全部出現在group by 之后。

舉例:統計中國各個省的平均人口數,顯示結果是大于平均人口數的城市信息? (world庫里的city表)

SELECTcity.District,city.`Name`,city.`Population`,AVG(city.Population)

FROM city

WHERE city.countrycode='chn'

GROUP BY city.District

HAVING city.Population >??AVG(city.Population);

這條語句group by后面只跟了city.district一個字段,但是select后面除了函數所在字段外還有city.District,city.`Name`,city.`Population`,,共三個字段啊,如果是在oralce數據庫上,絕對會報錯,但是大家注意,我這里說的是mysql,而且是mysql5.6版本,所以,請大家不要懷疑,這條SQL絕對能執行成功,但是必須得是在mysql5.6上才能執行成功。也就是說如果你使用的是mysql5.7版本的話,就需要注意了,默認情況下,我說的是默認,這條語句是絕對執行不成功的。為什么呢?因為5.6和5.7版本不同(廢話,哈哈)

如果在5.7上要順利執行以上語句,有兩種辦法

第一種:加函數,把group by后面沒有但是select后面有的字段(函數所在字段除外)用any_value括起來。比如上述語句中,group by后面沒有但是select后面有的字段(函數所在字段除外)是city.`Name`,city.`Population`,那么就得把這兩個字段括起來,如:any_value(city.`Population`) ,any_value(city.name) ,正確的寫法如下:

SELECT city.`District`,any_value(city.`Population`) ap ,any_value(city.name) an , AVG(Population) avgp

FROM city

WHERE city.`CountryCode`='chn'

GROUP BY city.`District`

HAVING????ap > avgp;

為什么要加別名呢?這就是另外一個需要注意的地方了,使用having時,如果說需要原表數據和統計后的值進行比較時,需要在調用列的時候加全表名或者別名。怎么樣,記住了嗎?

第二種:修改sql_mode參數

SELECTcity.District,city.`Name`,city.`Population`,AVG(city.Population)

FROM city

WHERE city.countrycode='chn'

GROUP BY city.District

HAVING city.Population >??AVG(city.Population);

這條語句直接在5.7上使用的話絕對會報錯,罪惡的源頭就是sql_mode=only_full_group_by這個參數,只需把這個參數關掉即可。

ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUPBY clause and contains nonaggregated column 'world.city.Name' which is notfunctionally dependent on columns in GROUP BY clause; this is incompatible with?sql_mode=only_full_group_by

做法:

第一步:查看參數

select @@sql_mode;

+-------------------------------------------------------------------------------------------------------------------------------------------+

| @@sql_mode? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?? ? |

+-------------------------------------------------------------------------------------------------------------------------------------------+

|ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION|

+-------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

第二步:修改參數 注意:只是臨時修改,相當于會話變量,只在當前會話中生效。

setsql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Query OK, 0 rows affected (0.00 sec)

第三步:執行SQL

mysql> SELECTcity.District,city.`Name`,city.`Population`,AVG(city.Population)

->

-> FROM city

->

-> WHERE city.countrycode='chn'

->

-> GROUP BY city.District

->

-> HAVING city.Population >?AVG(city.Population);

+----------------+---------------------+------------+----------------------+

| District? ? ? | Name? ? ? ?? ? ? ? | Population | AVG(city.Population) |

+----------------+---------------------+------------+----------------------+

| Anhui? ? ? ? ? | Hefei? ?? ? ? ? ? |? ? 1369100 |? ? ?? ? 321321.0000 |

| Fujian? ? ? ? | Fuzhou? ? ?? ? ? ? |? ? 1593800 |? ? ? ?? 297970.8333 |

| Gansu? ? ? ? ? | Lanzhou? ?? ? ? ? |? ? 1565800 |? ? ? ?? 351804.4286 |

| Guangdong? ? ? | Kanton [Guangzhou]?|? ? 4256300 |? ? ? ? ? 475513.1500 |

| Guangxi? ? ? ? | Nanning? ?? ? ? ? |? ? 1161800 |? ? ? ?? 325015.7778 |

| Guizhou? ? ? ? | Guiyang? ?? ? ? ? |? ? 1465200 |? ? ? ?? 418681.1667 |

| Hainan? ? ? ? | Haikou? ? ?? ? ? ? |? ? 454300 |? ? ? ?? 278560.0000 |

| Hebei? ? ? ? ? | Shijiazhuang?? ? ? |? ? 2041500 |? ? ? ? ?538212.7500 |

| Heilongjiang? | Harbin? ? ? ? ?? ? |? ? 4289800 |? ? ? ? ?553717.0000 |

| Henan? ? ? ? ? | Zhengzhou?? ? ? ? |? ? 2107200 |? ? ? ?? 383278.3333 |

| Hubei? ? ? ? ? | Wuhan? ?? ? ? ? ? |? ? 4344600 |? ? ?? ? 388526.5909 |

| Hunan? ? ? ? ? | Changsha?? ? ? ? ? |? ? 1809800 |? ? ?? ? 302181.9444 |

| Inner Mongolia | Baotou? ? ? ? ?? ? |? ? 980000 |? ? ? ? ? 317036.8462|

| Jiangsu? ? ? ? | Nanking [Nanjing]?|? ? 2870300 |? ? ? ? ? 388794.4000 |

| Jiangxi? ? ? ? | Nanchang? ?? ? ? ? |? ? 1691600 |? ? ? ?? 348323.4545 |

| Jilin? ? ? ? ? | Changchun?? ? ? ? |? ? 2812000 |? ? ? ?? 391341.2000 |

| Liaoning? ? ? | Shenyang? ? ?? ? ? |? ? 4265200 |? ? ? ? ?718055.9048 |

| Ningxia? ? ? ? | Yinchuan? ?? ? ? ? |? ? 544500 |? ? ? ?? 401181.0000 |

| Peking? ? ? ? | Peking? ? ?? ? ? ? |? ? 7472000 |? ? ? ?3784584.0000 |

| Shaanxi? ? ? ? | Xi′an? ? ?? ? ? ? |? ? 2761400 |? ? ? ?? 537186.6250 |

| Shandong? ? ? | Qingdao? ? ?? ? ? |? ? 2596000 |? ? ? ? ?378575.5000 |

| Shanxi? ? ? ? | Taiyuan? ?? ? ? ? |? ? 1968400 |? ? ? ?? 463322.1111 |

| Sichuan? ? ? ? | Chengdu? ?? ? ? ? |? ? 3361500 |? ? ? ?? 355088.9048 |

| Xinxiang? ? ? | Urumt?i [ürümqi]? ?|? ? 1310100 |? ? ? ? ? 289470.5000 |

| Yunnan? ? ? ? | Kunming? ?? ? ? ? |? ? 1829500 |? ? ? ?? 490203.2000 |

| Zhejiang? ? ? | Hangzhou? ? ?? ? ? |? ? 2190500 |? ? ? ? ?362961.5000 |

+----------------+---------------------+------------+----------------------+

26 rows in set (0.00 sec)

完美!!!

總結:1.oracle:所有出現在select后面的字段名(函數用的字段不用管),必須出現在group by語句后,沒有在select后面出現的字段名,是不允許在group by后面的。

2.使用having時,如果說需要原表數據和統計后的值進行比較時,需要在調用列的時候加全表名或者別名。

3.在select后的查詢里,必須是在group?by出現過的列,或者使用函數(any_value)將group by 后面沒有的列括起來的,否則會報錯。解決辦法一:加函數。二:改參數。

以上觀點僅代表一家之言,如有不足之處,歡迎大家批評指正。QQ:670340797? ?wechat:lhl9223

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內容

  • 查詢是數據的一個重要操作。用戶發送查詢請求,經編譯軟件變異成二進制文件供服務器查詢,后返回查詢結果集給用戶,查詢會...
    產品小正閱讀 1,411評論 0 2
  • 目標 聚合函數 分組函數 子查詢 多行子查詢 引出 ?請思考如下問題? –查詢所有員工的每個月工資總和,平均工資?...
    wqjcarnation閱讀 4,165評論 0 6
  • 1.簡介 數據存儲有哪些方式?電子表格,紙質文件,數據庫。 那么究竟什么是關系型數據庫? 目前對數據庫的分類主要是...
    喬震閱讀 1,754評論 0 2
  • 引出 ?請思考如下問題? –查詢所有員工的每個月工資總和,平均工資? –查詢工資最高和最低的工資是多少? –查詢公...
    C_cole閱讀 7,310評論 0 3
  • 1.鎖定目標 我以前進修后,想在附近找一家醫院。 先在網上搜索,發現一家大型民營醫院,一家鎮級公立醫院都不錯,網上...
    孫國飛揚閱讀 290評論 4 5