注册 登录
编程论坛 SQL Server论坛

自学SQL 求前辈指点我的难题

hellenism 发布于 2009-11-02 23:39, 723 次点击
由于刚接触SQL 很多问题不懂 请各位指点

我的理解:
当SQL语句执行之后,系统生成一张表(你怎么连接的就怎么生成),然后由SELECT语句选择要显示的字段。Group by是对SQL语句生成的表进行操作的,而Having语句是对SELECT语句筛选显示出来的结果做操作的。

如果这样理解对的话

SELECT S.姓名
FROM S,SC
WHERE S.学号=SC.学号
GROUP BY S.姓名



SELECT S.姓名
FROM S,SC
WHERE S.学号=SC.学号
GROUP BY S.姓名
HAVING COUNT(S.学号)>=2

的结果为什么是相同的呢?
第二个查询语句里SELECT筛选出来的结果里只有"姓名"那么HAVING如何能COUNT(学号)呢?学号并不在显示的结果里面啊?
3 回复
#2
happynight2009-11-04 14:17
从没钻这么深过
帮助中是这样说的"指定组或聚合的搜索条件。HAVING 通常与 GROUP BY 子句一起使用。如果不使用 GROUP BY 子句,HAVING 的行为与 WHERE 子句一样。" 那是否就可以理解为 HAVING 实际上在某种程度上就是WHERE语句 只是他又可以被用在聚合后的结果中来过滤 那这样的话 HAVING 中含有SELECT中不存在的字段也是能理解的
不过很好奇你这个例子是你自己想的 还是在书上看来的
#3
msgj2009-11-05 21:24
    聚合函数,例如SUM, COUNT, MAX, AVG等和其它函数的根本区别就是它们一般作用在多条记录上。
    SELECT SUM(population) FROM abc
    这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果。通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值,也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值。HAVING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前.而 HAVING子句在聚合后对组记录进行筛选。
    例如,显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。
    SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region HAVING SUM(area)>1000000
    在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。相反,HAVING子句可以让我们筛选成组后的各组数据。第二个查询语句里SELECT筛选出来的结果里只有"姓名"那么 HAVING COUNT(S.学号)>=2 就没有起作用。
#4
师妃暄2009-11-09 11:52
其实很简单
因为楼主你在用Group By的时候没有和聚合函数配合使用
就没效果
1