groupby到底是什么

今天給大家介紹一下group by到底是什么。文章的內(nèi)容小編覺得不錯,現(xiàn)在給大家分享一下,覺得有需要的朋友可以了解一下,希望對大家有所幫助,下面跟著小編的思路一起來閱讀吧。

成都創(chuàng)新互聯(lián)公司專注于中大型企業(yè)的成都網(wǎng)站建設(shè)、做網(wǎng)站和網(wǎng)站改版、網(wǎng)站營銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計客戶上1000+,服務(wù)滿意度達97%。幫助廣大客戶順利對接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運用,我們將一直專注成都品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開發(fā),在前進的路上,與客戶一起成長!

        本來今天是要接著整理日志系統(tǒng)的優(yōu)化的,但是自己對梳理一些名詞理解有些欠缺,思來想去還是想討論下group  by語法問題,這個問題我以前舉例說明過,腦海里就一致這么認(rèn)為:在SELECT 列表中所有未包含在組函數(shù)中的列都應(yīng)該是包含在 GROUP BY 子句中的。

group by到底是什么

驗證:


-- ------------------------------ Table structure for mytbl2-- ----------------------------DROP TABLE IF EXISTS `mytbl2`;CREATE TABLE `mytbl2`  (  `id` int(11) NULL DEFAULT NULL,  `NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `age` int(11) NULL DEFAULT NULL,  `dept` int(11) NULL DEFAULT NULL) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ------------------------------ Records of mytbl2-- ----------------------------INSERT INTO `mytbl2` VALUES (1, 'zhangsan', 33, 101);INSERT INTO `mytbl2` VALUES (2, 'li4', 34, 101);INSERT INTO `mytbl2` VALUES (3, 'w5', 34, 102);INSERT INTO `mytbl2` VALUES (4, 'zhao6', 34, 102);INSERT INTO `mytbl2` VALUES (5, 't7', 36, 102);

目的:查詢表中年齡最大的員工部門,名字

select `NAME`,dept,MAX(age)from mytbl2 GROUP BY dept;

group by到底是什么

此條sql看上去語義正確,但邏輯卻錯誤,結(jié)果與預(yù)想不一致

分析:先找出表中最大年齡,作為臨時表,再聯(lián)查

SELECT *FROM mytbl2 m INNER JOIN (select dept,MAX(age) as maxagefrom mytbl2 GROUP BY dept)ab on ab.dept=m.dept and m.age=ab.maxage;

group by到底是什么

當(dāng)然本表因為特殊表,存在單標(biāo)自關(guān)聯(lián)

1.語法為什么不會報錯?

在高版本sql中,本語法是不會報錯的

2.但是到底group by語法是怎樣的?

查詢官網(wǎng):

https://dev.MySQL.com/doc/refman/8.0/en/group-by-handling.html

一開始我考慮是不是版本問題,但實際5.7和8.0是針對此項毫無分別的

group by到底是什么

It is also possible to have more than one nonaggregate column in the SELECT list when employing ONLY_FULL_GROUP_BY. In this case, every such column must be limited to a single value in the WHERE clause, and all such limiting conditions must be joined by logical AND, as shown here:

在改變sql_mode的情況下,在WHERE子句中,每一個這樣的列必須限制為一個值,并且所有這樣的限制條件必須由邏輯and連接

正常的sql語句還是select與group by后的字段一致,或者后面跟隨函數(shù)操作。官網(wǎng)知識提到了sql版本高了語法不會報錯,在改變sql_mode的情況下,此語法錯誤,官網(wǎng)第一句話

SQL-92 and earlier does not permit queries for which the select list, HAVING condition, or ORDER BY list refer to nonaggregated columns that are not named in the GROUP BYclause. For example, this query is illegal in standard SQL-92 because the nonaggregated name column in the select list does not appear in the GROUP BY:

示例:

SELECT o.custid, c.name, MAX(o.payment)  FROM orders AS o, customers AS c  WHERE o.custid = c.custid  GROUP BY o.custid;

group by 的是custid,但是select字段除函數(shù)操作外多了個name,this query is illegal,但只強調(diào)SQL-92版本,我以為是版本問題,但是SQL8.0與5.7一模一樣啊,并沒有找到高版本怎么解決這個問題

group by到底是什么

說起來這個sql_mode吧,我以前的例子提到過改變sql_mode,再執(zhí)行語法是報錯的

設(shè)定sql模式 set sql_mode='ONLY_FULL_GROUP_BY';

group by到底是什么

group by到底是什么

但其實這樣還是不能證明這個問題,因為改動了sql_mode,

群里也討論了

group by到底是什么

group by到底是什么

直到現(xiàn)在我還是不能理解此語法問題,只能說特殊場景會出現(xiàn)數(shù)據(jù)結(jié)果不準(zhǔn)確問題,網(wǎng)上說,mysql進行了優(yōu)化,沒有g(shù)roup by的字段會隨機返回一條,如果語義無錯,就只能是邏輯錯誤了,所以難道我一開始舉的例子并不正確?

以上就是group by到底是什么的全部內(nèi)容了,更多與group by到底是什么相關(guān)的內(nèi)容可以搜索創(chuàng)新互聯(lián)之前的文章或者瀏覽下面的文章進行學(xué)習(xí)哈!相信小編會給大家增添更多知識,希望大家能夠支持一下創(chuàng)新互聯(lián)!

網(wǎng)頁名稱:groupby到底是什么
本文路徑:http://bm7419.com/article38/jdgjpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站收錄、網(wǎng)站改版軟件開發(fā)、、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名