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 学生成绩表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值