今天給大家介紹一下group by到底是什么。文章的內(nèi)容小編覺得不錯(cuò),現(xiàn)在給大家分享一下,覺得有需要的朋友可以了解一下,希望對(duì)大家有所幫助,下面跟著小編的思路一起來閱讀吧。
成都創(chuàng)新互聯(lián)公司專注于中大型企業(yè)的成都網(wǎng)站建設(shè)、做網(wǎng)站和網(wǎng)站改版、網(wǎng)站營(yíng)銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計(jì)客戶上1000+,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對(duì)接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注成都品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開發(fā),在前進(jìn)的路上,與客戶一起成長(zhǎng)!
本來今天是要接著整理日志系統(tǒng)的優(yōu)化的,但是自己對(duì)梳理一些名詞理解有些欠缺,思來想去還是想討論下group by語法問題,這個(gè)問題我以前舉例說明過,腦海里就一致這么認(rèn)為:在SELECT 列表中所有未包含在組函數(shù)中的列都應(yīng)該是包含在 GROUP BY 子句中的。
驗(yàn)證:
-- ----------------------------
-- 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;
此條sql看上去語義正確,但邏輯卻錯(cuò)誤,結(jié)果與預(yù)想不一致
分析:先找出表中最大年齡,作為臨時(shí)表,再聯(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;
當(dāng)然本表因?yàn)樘厥獗?,存在單?biāo)自關(guān)聯(lián)
1.語法為什么不會(huì)報(bào)錯(cuò)?
在高版本sql中,本語法是不會(huì)報(bào)錯(cuò)的
2.但是到底group by語法是怎樣的?
查詢官網(wǎng):
https://dev.MySQL.com/doc/refman/8.0/en/group-by-handling.html
一開始我考慮是不是版本問題,但實(shí)際5.7和8.0是針對(duì)此項(xiàng)毫無分別的
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子句中,每一個(gè)這樣的列必須限制為一個(gè)值,并且所有這樣的限制條件必須由邏輯and連接
正常的sql語句還是select與group by后的字段一致,或者后面跟隨函數(shù)操作。官網(wǎng)知識(shí)提到了sql版本高了語法不會(huì)報(bào)錯(cuò),在改變sql_mode的情況下,此語法錯(cuò)誤,官網(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 BY
clause. 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ù)操作外多了個(gè)name,this query is illegal,但只強(qiáng)調(diào)SQL-92版本,我以為是版本問題,但是SQL8.0與5.7一模一樣啊,并沒有找到高版本怎么解決這個(gè)問題
說起來這個(gè)sql_mode吧,我以前的例子提到過改變sql_mode,再執(zhí)行語法是報(bào)錯(cuò)的
設(shè)定sql模式 set sql_mode='ONLY_FULL_GROUP_BY';
但其實(shí)這樣還是不能證明這個(gè)問題,因?yàn)楦膭?dòng)了sql_mode,
群里也討論了
直到現(xiàn)在我還是不能理解此語法問題,只能說特殊場(chǎng)景會(huì)出現(xiàn)數(shù)據(jù)結(jié)果不準(zhǔn)確問題,網(wǎng)上說,mysql進(jìn)行了優(yōu)化,沒有g(shù)roup by的字段會(huì)隨機(jī)返回一條,如果語義無錯(cuò),就只能是邏輯錯(cuò)誤了,所以難道我一開始舉的例子并不正確?
以上就是group by到底是什么的全部?jī)?nèi)容了,更多與group by到底是什么相關(guān)的內(nèi)容可以搜索創(chuàng)新互聯(lián)之前的文章或者瀏覽下面的文章進(jìn)行學(xué)習(xí)哈!相信小編會(huì)給大家增添更多知識(shí),希望大家能夠支持一下創(chuàng)新互聯(lián)!
網(wǎng)頁名稱:groupby到底是什么
本文路徑:http://www.rwnh.cn/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)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)