有的时候可能会用到select作为子句的情况,也就是说select语句查询到的东西作为结果给另一个select语句查询,举个简单的例子,假如我有这么一张表:
ticket:
game | bets | is_quidpick |
LG21020801 | 1 | 0 |
LG21020801 | 2 | 1 |
LG21020801 | 1 | 2 |
LG21020801 | 3 | 0 |
LG21020801 | 1 | 1 |
LG21020802 | 2 | 0 |
LG21020802 | 1 | 1 |
LG21020802 | 3 | 2 |
LG21020802 | 4 | 0 |
LG21020802 | 2 | 1 |
如果我想统计一下每个游戏中每种状态(is_quidpick:0,1,2)买的票的注数以及该种游戏总的注数,每个游戏总的注数直接用sum(bets)..group by game就可以得到,同样的,每个状态的总注数可以用sum(bets) ..group by is_quidpick, game得到。这里明显有两种求和方式,如果用一条select语句肯定是无法同时得到2个求和结果了,因此,这时就要用到select子句。输入:
select tt.game_name,
tt.is_quidpick,
sum(tt.bets) bets,
nt.total_bets
from (select t.game_name, sum(bets) total_bets
from ticket t
group by t.game_name) nt,
ticket tt
where nt.game_name = tt.game_name
group by tt.is_quidpick, tt.game_name, nt.total_bets
order by tt.game_name, tt.is_quidpick;
得到:
game | is_quidpick | bets | total_bets |
LG21020801 | 0 | 4 | 8 |
LG21020801 | 1 | 3 | 8 |
LG21020801 | 2 | 1 | 8 |
LG21020802 | 0 | 6 | 12 |
LG21020802 | 1 | 3 | 12 |
LG21020802 | 2 | 3 | 12 |
这里不仅仅是用了select子句,同时还使用了自连接,即同一张表内的连接,不管是自连接也好,还是多张表连接也好,都不影响select子句的使用,这里着重select子句的使用,对于连接就不多说了,有兴趣可看上篇文章‘SQL连接—笛卡尔积’。
select子句其实跟一般的select语句没什么不同,在使用的过程中只要把select得到的结果当作一张新表来使用即可,相当于多一张表而已。
转载于:https://blog.51cto.com/sunmoonrili/957193