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 学生成绩表