其他分享
首页 > 其他分享> > 今天你登录了吗?

今天你登录了吗?

作者:互联网

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

【题目】

“7月登录表”里记录了7月登录的用户信息。“8月登录表”里记录了是8月登录的用户信息。

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

问题1:7月、8月两个月登录人数共有多少

问题2:7月未登录但8月登录的人数有多少

 

【问题1解题思路】

 

查询7月登录和8月登录人数的总和

 

1.7月和8月两个月登录的用户数据分别在“7月登录表”和”8月登录表”中,涉及到多个表,所以要用到多表联结

 

2.可以通过“表的加法”(union)先将两张表合在一起,这里两张表相加时需要去掉重复值,所以要用“union”而不能用“union all”

 

select 用户IDfrom 7月份登录表unionselect 用户IDfrom 8月份登录表;

 

3.通过汇总函数“count()”对合并后的表进行统计,把上一步的查询结果作为这一步的子查询

 

select count(distinct 用户ID)from (select 用户IDfrom 7月份登录表unionselect 用户IDfrom 8月份登录表) as a;

 

查询结果

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

【本题考点】

 

1.用“union” 或 “union all” 进行表的加法运算。如果需要保留两个表中重复出现的数据行,需要使用“union all”

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

2.SQL子查询的应用。子查询就是一次性的视图,还记得子查询的应用场景吗?我们对照下面的图来复习一下

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

3.本题要特别注意,因为做了两个表的加法,产生了一个新表,MySQL要求每一个新产生的表都要有一个别名(as 别名),否则就会报错(每一个新产生出来的表都必须有一个自己的别名)

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

【问题2解题思路】

 

查询7月未登录,同时8月登录的人数

 

1.这道题目的关键在于要明确7月未登录,同时8月登录的人在哪里。我们可以画一个文氏图清晰地把这部分数据表现出来:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

左边圆圈代表“7月登录的人”右边圆圈代表“8月登录的人”,通过图形能清楚地看出来阴影部分就是我们要找的“7月未登录,同时8月登录的人”

 

2.如何把阴影部分的数据找出来呢?我们先要用SQL把右边表的数据取出来,然后再去掉左边和右边共有部分的数据,这时我们想到通过“表的联结”,可以通过“右联结”,完成上面的操作

 

select from 7月份登录表 as a right join 8月份登录表 as b;

 

3.注意这里我们找的是下图中框出部分的数据,所以要加一个条件:

7月份登录表.用户ID is null

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

selectfrom 7月份登录表 as a right join 8月份登录表 as bon a.用户ID=b.用户IDwhere a.用户ID is null;

 

4.最后再用汇总函数统计去重后的用户人数

 

select count(distinct 用户ID) as 人数from 7月份登录表 as a right join 8月份登录表 as bon a.用户ID=b.用户IDwhere a.用户ID is null;

 

查询结果

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

【本题考点】

本题用到了右联结的应用,几种联结和它们的用法还记得吗,我们来复习一下

 

1.什么是联结

 

联结是表与表之间的关联关系

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

2.内联结、左联结、右联结和全联结分别对照下图复习一下吧

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

当实际业务中想要生成固定行数的表单或者特别说明了要某一张表里的全部数据时,使左联结或者右联结。

 

其他情况下,使用内联结,获取两个表的公共部分。

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 

 

标签:登录,union,用户,查询,今天,联结,ID
来源: https://blog.51cto.com/u_15241767/2920166