溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

group by到底是什么

發布時間:2022-01-17 09:17:29 來源:億速云 閱讀:229 作者:柒染 欄目:大數據

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

        本來今天是要接著整理日志系統的優化的,但是自己對梳理一些名詞理解有些欠缺,思來想去還是想討論下group  by語法問題,這個問題我以前舉例說明過,腦海里就一致這么認為:在SELECT 列表中所有未包含在組函數中的列都應該是包含在 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看上去語義正確,但邏輯卻錯誤,結果與預想不一致

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

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到底是什么

當然本表因為特殊表,存在單標自關聯

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

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

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

查詢官網:

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后的字段一致,或者后面跟隨函數操作。官網知識提到了sql版本高了語法不會報錯,在改變sql_mode的情況下,此語法錯誤,官網第一句話

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字段除函數操作外多了個name,this query is illegal,但只強調SQL-92版本,我以為是版本問題,但是SQL8.0與5.7一模一樣啊,并沒有找到高版本怎么解決這個問題

group by到底是什么

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

設定sql模式 set sql_mode='ONLY_FULL_GROUP_BY';

group by到底是什么

group by到底是什么

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

群里也討論了

group by到底是什么

group by到底是什么

直到現在我還是不能理解此語法問題,只能說特殊場景會出現數據結果不準確問題,網上說,mysql進行了優化,沒有group by的字段會隨機返回一條,如果語義無錯,就只能是邏輯錯誤了,所以難道我一開始舉的例子并不正確?

以上就是group by到底是什么的全部內容了,更多與group by到底是什么相關的內容可以搜索億速云之前的文章或者瀏覽下面的文章進行學習哈!相信小編會給大家增添更多知識,希望大家能夠支持一下億速云!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女