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 學生成績表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章