[转载]查询之order by,group by和having的使用(三)

六、例子

1> select * from bank_info
2> go
 bankno acctround
 ------ ---------
 123456 1        
 123456 2        


 

(2 rows affected)
1> select * from bank_info where acctround='1' group by bankno order by bankno
2> go
 bankno acctround
 ------ ---------
 123456 1        
 123456 2        


 

(2 rows affected)
1> select * from bank_info where acctround='1' order by bankno
2> go
 bankno acctround
 ------ ---------
 123456 1        


 

(1 row affected)
1> select * from bank_info
2> go
 bankno acctround
 ------ ---------
 123456 1        
 123456 2        

(2 rows affected)
1> select * from bank_info where acctround='1' group by bankno,acctround order by bankno
2> go
 bankno acctround
 ------ ---------
 123456 1        


(1 row affected)

group by bankno,acctround
的意思是找出bankno,acctround两列完全相同的不同行作为一组.那上面的数据就分成两组了,因为acctround不同,而结果需要acctround='1'的组.所以只有一行结果.如果是group by bankno,那么两行会合成一行.它并没有先通过where分析出只有一行符合结果集,group就只有一行结果了.这里的问题是wheregroup谁先谁后分析的问题?在这个问题的上下文中,本来的group by bankno就没有任何意义.其实是这样的:

或者是:

select bankno,sum(money) from bankdiff group by bankno;

又或者是:

select bankno,acctround,sum(money) from bankdiff where acctround='1' group by bankno,acctround;

不可能指定acctround又不把它放在groub by中的.

1> select * from bank_info group by bankno
2> go
 bankno acctround
 ------ ---------
 123456 1        
 123456 2

可见这个group by没有意义.因为它有select *,而acctround不一样,就不能只显示一行出来.把select *改成select bankno就只有一行结果了.

原文地址:https://www.cnblogs.com/liuzhuqing/p/7480911.html