mysql中group by 兼容問題

首先建立數據庫hncu,創建stud表格。
添加數據:sql

create table stud(
sno varchar(30) not null primary key,
sname varchar(30) not null,
age int,
saddress varchar(30)
);
INSERT INTO stud VALUES('1001','Tom',22,'湖南益陽');
INSERT INTO stud VALUES('1002','Jack',23,'益陽');
INSERT INTO stud VALUES('1003','李白',22,'益陽');
INSERT INTO stud VALUES('1004','王五',24,'中國北京');
INSERT INTO stud VALUES('1005','張三',22,'益陽');
INSERT INTO stud VALUES('1006','張四',23,'益陽');
INSERT INTO stud VALUES('1007','李四',22,'湖南益陽');
INSERT INTO stud VALUES('1008','劉備',24,'北京');
  •  

執行語句以下:數據庫

SELECT * FROM stud GROUP BY saddress;
  •  

顯示了以下錯誤:函數

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'hncu.stud.sno' which is not functionally dependent
 on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
  •  

再執行此句:this

SELECT saddress as 平均年齡 FROM stud GROUP BY saddress;
  •  

-沒有問題
.net

而後咱們用MySQL,再執行前面那句錯誤的代碼:
也就是:code

SELECT * FROM stud GROUP BY saddress;
  •  

咱們看結果:
get

順利的經過了,可是,你發現沒有,前面的smo,sname,age,這3列的數據不對啊,沒錯,MySQL強行顯示第一次查找到的saddress不一樣的行了!!!其實這個結果是不對,可是MySQL應該是兼容了這個錯誤!
而DOS倒是嚴格按照SQL的語法來的。it

SQL的grop by 語法爲,
select 選取分組中的列+聚合函數 from 表名稱 group by 分組的列
從語法格式來看,是先有分組,再肯定檢索的列,檢索的列只能在參加分組的列中選。io

因此問題中的,group by 後的 a,b,c是先肯定的。select後的a,b,c纔是能夠變的。即table

如下語句都是正確的:

select a,b,c from table_name group by a,b,c,d;
select a,b from table_name group by a,b,c;
select a,max(a) from table_name group by a,b,c;
  •  

如下語句則是錯誤的:

select a,b,c from table_name group by a,b;
select a,b,c from table_name group by a;
  •  

而由於MySQL的強大,它兼容了這個錯誤!!!
可是在DOS是不能的。因此出現了DOS下報錯,而在MySQL中可以查找的狀況(其實這個查找的結果是不對的)。

總結起來一句話就是,檢索裏的東西必定要出如今group by裏先,select的東西要先出如今group by裏

相關文章
相關標籤/搜索