by 清泉
23. 十月 2008 19:00
GROUP BY子句:指定用来放置输出行的组,并且如果 SELECT 子句 <select list> 中包含聚合函数,则计算每组的汇总值。指定 GROUP BY 时,选择列表中任一非聚合表达式内的所有列都应包含在 GROUP BY 列表中,或者 GROUP BY 表达式必须与选择列表表达式完全匹配。
如用了统计函数比如sum count,则sql语句只输出一行:
如:select count(*) as num from userinfo 只统计一组的汇总值,只输出一行
但是加了group by 则是计算每组的汇总值,就是说没个行纪录都统计输出,但如纪录count(*)统计为0时则不输出,要强制需要在加all如group by all语句输出不满足条件的行,但这时where 语句不没用的,因为他不满足的纪录也输出来了。
两个表用来统计查询,这就要用到表的连接函数left outer join 或inner outer join 或 right outer join full outer join
inner join 是内连接返回所有匹配的行。
left right full是外连接:left是左外连接:意思是返回以左边表为基准的,右边表所有纪录全部返回(包括不匹配纪录)
right是右外连接:与left相反的意思,就是返回右表符合条件的纪录,左边的可以不匹配。
full是:返回所有不匹配的纪录
但是在这里请注意on 和where 区别:on使用搜寻独立表中的纪录然后在把合适的纪录在根据left和righth和full 来输出匹配行,而where 是把和输出的纪录在取条件。
下面是一个表使用统计查询的几中情况和用法:
1、简单的,统计 查询 只返回全部有值的纪录:
select a.user_id,a.user_nickname,a.province_id,count(b.q_id) as num from VIEW_UserInfo as a inner join quoted as b on a.user_id=b.q_usernameid where province_id=16 group by a.user_id,a.user_nickname,a.province_id
这里是返回统计不为哦 查询条件为province_id=16(VIEW_UserInfo 字段)的值
2、统计为0值也返回:
select a.user_id,a.user_nickname,a.province_id,count(b.q_id) as num from VIEW_UserInfo as a left join quoted as b on a.user_id=b.q_usernameid where province_id=16 group by a.user_id,a.user_nickname,a.province_id
这里是把inner 改成了left所以统计为0的也会返回
3、如果我想把num也做条件怎么办,这就要用到HAVING了,该条件是基于数据的分组和汇总结果
例如:select a.user_id,user_regTime,count(b.q_id) as num from VIEW_UserInfo as a left join quoted as b on a.user_id=b.q_usernameid and q_sortid=21 group by a.user_id,user_regTime having count(b.q_id)>0 order by num desc
这里需要注意的count(b.q_id)>0 这个字段不能用num代替。
后面的ordre by 可以直接用num来排序
FROM子查询语句
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应
使用下面语句格式加以限定:
SELECT username,citytable.cityid FROM usertable,citytable WHERE usertable.cityid=citytable.cityid
在FROM子句中可用以下两种格式为表或视图指定别名:
表名 as 别名
表名 别名例如上面语句可用表的别名格式表示为:
SELECT username,b.cityid FROM usertable a,citytable b WHERE a.cityid=b.cityidSELECT
不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。
例如:
SELECT a.au_fname+a.au_lname FROM authors a,titleauthor ta (SELECT title_id,title FROM titles WHERE ytd_sales>10000 ) AS t WHERE a.au_id=ta.au_id AND ta.title_id=t.title_id
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。
还有一种是直接做为条件的。
select*from userinfo where id in(select*from userfa)