SQL原来是如此使用

本文通过具体案例解析了SQL的几个核心思想:如何将查询结果作为临时表进行进一步处理、如何运用JOIN连接不同表以及如何灵活使用GROUP BY进行数据聚合。通过实战操作加深了对SQL的理解。
之前以为sql就那点东西,很容易掌握。

这些天我在做我们网站的年度运营数据统计,统计的内容很多,也很复杂。经过几天的折腾,我领悟了SQL的思想。

1.数据列组成表,包括在数据库中实实在在的表,也可以是查询出来的数据记录组成的‘表’,这一般在子查询,嵌套查询中用得比较多。所以要在头脑中形成一个概念,一切都可以from。
一个例子如,我想查询网站上每一个分类拍品价格总额大于30万元的拍品有多少个分类, auctions.price这个字段是表示价格,当然不能这样做:
[color=green]select count(*) from auctions a where sum(end_price) > 30000 group by category_id;[/color]哈哈
怎么做呢?这样做:
select a.category_id ,sum(a.end_price) price from auctions a group by a.category_id;
这个查出的结果作为一个临时的表,然后再来操作这个临时表,那么就应该是下面这个sql了:
select count(*) from 
(
select a.category_id ,sum(a.end_price) as price from auctions a group by a.category_id
)
where price > 300000

所以通过这个例子,应该可以很好地说明了1这个观点了。


2.连接(join)很强大,随你所想。 join on

3.分组很强大,想怎么分就怎么分。group by的时候,只能select 这个组和count还有sum之类的,但是不要忘记了你可以group by 多个列,这样的话,就能select多个列出来了。

一个例子:如我们网站要统计每个专场(special_topics表)中的拍品(auctions)的拍品件数和成交额。我想要的结果是 三列:专场id,专场名,成交件数,成交总额。
一般是这样做:
select a.special_topic_id,count(*), sum(a.end_price * (1+a.ac_buycharge/100)) from auctions a 
where a.ac_onsale=3
group by a.special_topic_id,order by a.special_topic_id;
这样只能显示专场id,现可以连接一下专场表(special_topics),然后group by 一下:
select a.special_topic_id,st.cn_n,count(*), sum(a.end_price * (1+a.ac_buycharge/100)) from auctions a 
join special_topics st on st.id=a.special_topic_id
where and a.ac_onsale=3
group by a.special_topic_id,st.cn_n order by a.special_topic_id;

另外一个例子[url]http://qichunren.iteye.com/blog/563188[/url]


总结:一切都是数据,利用连接,子查询,分组等对数据想怎么就怎么玩,感觉打通了任督二脉,很舒畅。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值