group by 意义

上课上到这么晚才回,momo!
不过貌似database还是学到一些东西,Group by和having的用法,NULL值的处理(用out join),以及decode函数的用法(终于上课提到了)!写复杂sql就靠他们了!上完课在实验室做了几个题目,赶紧赶车,结果。。。居然下大雨,momo!造孽呀!engineering building 到 bus stop 。。。momo!
感情好像又乱了,,,乱。。。接着乱吧。。。嗨~~~  矛盾~~~
明天接着作业,622做完来,后天得Group meeting了。。。
一天感觉收获不大,惭愧。。。

关于groupby

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就只有一行结果了.这里的问题是where和group谁先谁后分析的问题?在这个问题的上下文中,本来的group by bankno就没有任何意义.其实是这样的:

或者是:

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

又或者是:

select bankno,acctround,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就只有一行结果了.

总结:使用group by必需明确你分组的意义,是否有必要这一个列或几个列来确定一个有意义的组,而需要显示的结果行的列是否和group by子句中的列名相冲突.一般不在group by子句中的列名都不会直接在select中显示出来.因为它们要分成一组来或者做些运算再显示.如sum(money)等.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s