MySQL 與 MSSQL 中 GROUP BY 對比
MySQL 與 MSSQL 中 GROUP BY 對比
來源: 作者: 熱度:25877
--
-- Table structure for table ta
--
CREATE TABLE ta (
id varchar(10) default NULL,
sl int default NULL,
PRIMARY KEY (id)
);
--
-- Dumping data for table ta
--
INSERT INTO ta VALUES ('a',2);
INSERT INTO ta VALUES ('b',4);
INSERT INTO ta VALUES ('c',6);
--
-- Table structure for table tb
--
CREATE TABLE tb (
id varchar(10) default NULL,
sl int default NULL,
INDEX IX_tb_id(id)
);
--
-- Dumping data for table tb
--
INSERT INTO tb VALUES ('a',1);
INSERT INTO tb VALUES ('a',1);
INSERT INTO tb VALUES ('b',3);
INSERT INTO tb VALUES ('c',5);
--
-- 求 tb 中按 ID 合計 sl 後再與 ta 比較,得出 sl 不同的所有結果
--
--
-- MS SQL 句法
--
SELECT ta.id, ta.sl, tb.SumNum FROM dbo.ta
LEFT JOIN
(
SELECT id, SUM(sl) SumNum FROM dbo.tb GROUP BY id
) tb ON ta.id = tb.id
WHERE ta.sl != tb.SumNum;
--
-- MySQL 句法
--
SELECT ta.id, ta.sl, SUM(tb.sl) SumNum FROM ta
LEFT JOIN tb ON ta.id = tb.id
GROUP BY ta.id
HAVING ta.sl != SumNum;
這是因爲 MySQL 對 標準 GROUP BY 句法做了擴展
在標準 SQL 中,如果一個 SELECT 查詢語句指定了 GROUP BY ,
那在 SELECT 子句的選擇列表中所有在非聚合表達式內的列都應包含在 GROUP BY 子句列表中。
例:
假設有下表
+------+------+------+------+
| 學號 | 姓名 | 學科 | 成績 |
+------+------+------+------+
在標準SQL中
SELECT 學號, SUM(成績), COUNT(*) FROM 學生成績表 GROUP BY 學號 句法正確
SELECT 學號, 姓名, SUM(成績), COUNT(*) FROM 學生成績表 GROUP BY 學號 句法錯誤
而在 MySQL 中,第二個語句也將會正確執行,
它也將可能得到正確的結果,當然也可能會得到不正確的結果:-)
呵呵,因爲學號與姓名一一對應的
可以理解下面的第一個SELECT將得到我們希望的結果,而第二個將得不到我們所期望的有意義結果,
但在 MySQL 中,它的確是正確的SQL句法。
SELECT 學號, 姓名, SUM(成績), COUNT(*) FROM 學生成績表
SELECT 學號, 學科, SUM(成績), COUNT(*) FROM 學生成績表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.