有一位学生在找数据分析工作的时候,遇到一个笔试题,内容如下:

现有注册用户表table_user,有两个字段:user_id(用户id)、reg_tm(注册时间)。有订单表table_order,有三个字段:order_id(订单号)、order_tm(下单时间)、user_id(用户id)。

查询2019年1月1日至今,每天的注册用户数,下单用户数,以及注册当天即下单的用户数(请尽量在一个 sql语句中实现)。

题意分析:

1.要查看的是每一天的情况,所以要以日期为维度进行汇总观测,也就是group by后面跟日期字段;

2.要看每天的注册用户数(来自用户表),每天的下单用户数(来自订单表),所以要将用户表和订单表做横向连接;

3.两表连接的字段是什么?第一感觉应该是user_id,但是我们通过user_id字段连接两表后,两表都有时间字段,那以哪个字段为分组依据呢?比如用户「小包总」在6月10日注册了网站,在6月20日下了第一笔订单,以user_id字段连接两表,一个user_id对应两个时间,以注册时间为分组依据,得不到准确的当日下单用户数,以下单时间为分组依据,得不到准确的当日注册用户数;

4.不能用user_id做连接字段,需要用用户表的注册时间和订单表的下单时间作为连接字段。如果两个表的时间范围保持一致,那直接做表连接没有问题,但如果时间范围不一致,比如用户表在6月20日没有注册量,在订单表6月20日有多笔订单,用户注册表在6月10日有多位用户注册,而订单表6月10日没有订单。而在MySQL里面只有左连、右连、内连三种连接方式,不管以何种方式做连接,总会丢失部分日期记录;

5.只有外连才会不丢失日期数据,而MySQL里面没有外连方式,这要怎么办?我们可以通过union纵向链接的方式构造外连一样的结果;

综合以上分析,得到解题思路:

1.将注册表的注册时间和订单表的下单时间做纵向链接,生成一个临时表,只有一个字段 reg_tm:

select reg_tm from table_user

union

select order_tm from table_order;

2.再用上表和注册表及订单表做左连接:

select * from(

select reg_tm from table_user

union

select order_tm from table_order) as table_date

left join table_user on table_date.reg_tm=table_user.reg_tm

left join table_order on table_date.reg_tm=table_order.order_tm;

3.题目要求查询2019年1月1日至今的数据情况,把这个条件加在where后面:

select * from(

select reg_tm from table_user

union

select order_tm from table_order) as table_date

left join table_user on table_date.reg_tm=table_user.reg_tm

left join table_order on table_date.reg_tm=table_order.order_tm

where table_date.reg_tm>="2019-01-01";

4.题目是查看每天的注册用户数,下单用户数,以及注册当天即下单的用户数;需要对日期进行分组,注册用户数是对注册表的user_id进行计数,下单用户数是对订单表的user_id进行计数,注册当天即下单的用户数是对注册表的注册时间与订单表的注册时间相等的user_id进行计数。需要注意的是,在将临时表table_date与table_user左连时,对应关系是一对多,生成的结果是一个多表,再与table_order左连,对应关系是多对多,多对多的情况下,数据一定是有重复的,所以需要去重处理(distinct函数)。另外把没有结果的null替换成0(ifnull函数),最终代码如下:

select table_date.reg_tm,ifnull(count(distinct table_user.user_id),0) 注册用户数,ifnull(count(distinct table_order.user_id),0) 下单用户数,ifnull(count(distinct if(table_user.reg_time=table_order.order_time and table_user.user_id=table_order.user_id,table_user.user_id,null)),0) 下单用户数

from(

select reg_tm from table_user

union

select order_tm from table_order) as table_date

left join table_user on table_date.reg_tm=table_user.reg_tm

left join table_order on table_date.reg_tm=table_order.order_tm

where table_date.reg_tm>="2019-01-01"

group by table_date.reg_tm;

题目是没有数据的,如果直接看看不懂的话,可以自己先构造一个数据,再尝试文中的代码,一步一步理解。

内容较多,可以先码后看,如果对你有帮助,给个赞和关注哈~,如有其它解题思路,欢迎交流~

mysql 笔试题_MySQL笔试题详解(一)(中等难度)相关推荐

  1. mysql explain语句_Mysql explain 语句详解

    explain 语句详解 explain 写在 select 前,如下 mysql> explain select * from user_info where id = 2\G ******* ...

  2. mysql.user表_mysql.user表详解

    GRANT语法: GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码' 权限: ALL,ALTER,CREATE,DROP,SELECT,UPDATE, ...

  3. mysql 8安装_mysql安装过程详解

    mysql是后端开发常用的数据库,它常常与java.idea.maven等开发工具结合在一起开发相应的后台应用. mysql安装过程主要分为以下几步: 1.安装.NETFramework4.5.2. ...

  4. mysql explain 索引_MySql中Explain详解与索引最佳实践

    使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是 如何处理你的SQL语句的.分析你的查询语句或是结构的性能瓶颈 下面是使用 explain 的例子: 在 select 语句之 ...

  5. mysql关系数据库引擎_MySQL数据库引擎详解

    作为Java程序员,MySQL数据库大家平时应该都没少使用吧,对MySQL数据库的引擎应该也有所了解,这篇文章就让我详细的说说MySQL数据库的Innodb和MyIASM两种引擎以及其索引结构.也来巩 ...

  6. mysql mysqladmin 介绍_Mysql—mysqladmin 命令详解

    mysqladmin是一个执行管理操作的客户端程序.它可以用来检查服务器的配置和当前状态.创建和删除数据库等. mysqladmin工具的使用格式:mysqladmin [option] comman ...

  7. mysql autoenlist默认_mysql连接参数详解

    通常数据库连接字符串为: Database=dbname;Data Source=192.168.1.1;Port=3306;User Id=root;Password=****;Charset=ut ...

  8. mysql 插入加锁_Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

    你需要知道的 之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁. 行锁 记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁. 生活中的间隙 ...

  9. mysql数据库迁徙_mysql数据迁徙详解

    数据迁徙是每个后端都会遇到的工作之一,本文介绍了一些常见的数据迁徙方法与工具 mysqldump:数据结构不变的数据迁徙 导出数据 mysqldump -u root -p DATABASE_NAME ...

  10. mysql concat例子_MYSQL中CONCAT详解

    concat()函数 1. 功能: 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 2. 语法 concat(str1, str2,...) 3. 例子 案例一: ...

最新文章

  1. Linux wait函数解析
  2. 基于安卓的考试系统_基于安卓11定制!华为最新手机系统曝光:体验堪比苹果iOS!...
  3. 人工智能可能成为我们检测COVID-19最有效的方法吗?
  4. (011) java后台开发之泛型类
  5. 出远门需要检查的物件
  6. Linux socket编程(二) 服务器与客户端的通信
  7. 最优二叉查找树(动态规划)——详解
  8. python加密字符串小写字母循环后错两位_python数据类型_字符串常用操作(详解)
  9. visionpro图片读取、写入
  10. Python爬虫实战源码合集(持续更新)
  11. 基于树莓派的遥控开锁装置
  12. 大话设计模式 设计模式书籍 编程书籍
  13. 联想电脑如何进入BIOS的方法汇总
  14. 能耗监控 | FCU1101物联数采网关在电力能效管理系统中的应用
  15. 热评云厂商:网易数帆8.5亿元,企业数字化服务带来差异化
  16. 【自制壁纸生成器】2022新年壁纸领取,换一张手机壁纸,迎接2022叭~
  17. SQLSTATE=08S01通讯连接失败
  18. hotmail服务器密码已修改密码,修改过密码的hotmail无法在mac和iphone上登陆和收取邮件...
  19. GeneXus与其它低代码平台有什么不同
  20. 【Antdv】input type=number去掉上下箭头、提示文字、鼠标滚轮

热门文章

  1. python int64,如何从Python生成唯一的64位整数?
  2. python神经网络多元函数_阿里达摩院推荐的最新400集python教程,据说懂中文就能上手...
  3. 华三交换机配置多个镜像口_配置本地端口镜像详解(多个镜像口:多个观察口)...
  4. ibe加密原理_ibe 基于身份的IBE加密源代码,采用C++语言编写,能够运行。 Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...
  5. 利用计算机进行有理数的运算教学反思,《有理数加减乘除混合运算》教学反思...
  6. css3动画--位移加阴影
  7. 记-php连接mssql遇上的问题
  8. 让最新的 Android Q Beta 3 强制重启的 Project Mainline,到底是什么?
  9. Javascript 程序放在哪
  10. Ubuntu16.04删除客人会话