A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在讲SQL的数据分组的视频中老师明显有个地方讲的有问题,从10分19秒开始这段时间里说的有问题,或者说是不严谨?因为在sql中select中没有出现的聚合函数或者字段其实可以在group by中出现,也就是说having中可以出现select中没有的字段或者函数,只要你的group by 语句中有就行了。而老师貌似没有提到这一点(可能我看的不认真,老师说了我没听到?)。。。。
所以老师说having不能代替where我觉着如果你刻意去用having的话,某种程度上可以代替where

比如我的表有这样的结构:
  1. CREATE TABLE [dbo].[Student](
  2.         [StudentID] [int] IDENTITY(1,1) NOT NULL,
  3.         [StudentName] [varchar](50) NOT NULL,
  4.         [Password] [varchar](20) NOT NULL,
  5.         [StudentSex] [varchar](2) NOT NULL,
  6.         [StudentAge] [int] NOT NULL,
  7.         [Telephone] [varchar](20) NULL,
  8.         [Other] [nvarchar](50) NULL,
复制代码
当我想找出studentage>10的studentname时一般写法是:
select studentname from student where studentage>10
如果我想用having来写的话可以这样写:
select studentname from student group by studentname,studentage having studentage>10
这种程度上的where的功能用having是可以代替的。 注:当having后面需要多条件时用and连接即可。

我这人比较喜欢较真儿,所以听到老师说的这么绝对的时候我就会有所怀疑,然后去琢磨,并没有对老师的不敬哈{:soso_e113:}
同时还欢迎广大同学对我各种拍砖啊~~俗话说,实践出真知嘛。在没有举例说明问题的时候我觉着不能盲目的相信一切啊。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

5 个回复

倒序浏览
太有才了!
回复 使用道具 举报
许庭洲 发表于 2012-8-1 15:22
太有才了!

据说这种用法不合规矩。。。。我只是钻牛角尖写出来这么个东西:lol
回复 使用道具 举报
没有出现在Group by子句中的列是不能放到select语句后的,并没有说在select中没有出现的聚合函数或者字段就不可以在group by中出现,这是完全可以的;另外在having语句中出现的字段或函数得和放在select中的一样,意思其实是说在having语句中出现的字段或函数得是那些可以放在select中的字段或函数,但并不是一定要在select中出现;还有就是having是对分组后信息的过滤,而where过滤后再对过滤后的信息进行分组,二者作用不同,所以having不能完全代替where。
回复 使用道具 举报
王朋 发表于 2012-8-1 16:26
没有出现在Group by子句中的列是不能放到select语句后的,并没有说在select中没有出现的聚合函数或者字段就 ...

我又仔细看了下视频,确实是我听得不认真:lol

我这里也只是刻意用having来实现部分的where的功能。SQL句子的灵活性很强,我只是这么写了下,也没别的意思。
回复 使用道具 举报
另外,oracle中having可以放在group by前,也可以放在group by 后。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马