数据分析面试【二】—— SQL复杂语句查询

本文探讨了数据分析面试中涉及的SQL复杂查询,包括从用户登录和套餐订购两个方面。详细介绍了如何获取用户最新登录记录、累计登录次数,以及查询用户购买歌曲的数量、特定歌曲的购买者、购买总数超过200的客户、用户购买最多的歌曲和购买数量低于平均值的情况。内容深入浅出,适合准备数据分析面试者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、用户登录

1、用户表结构

1)用户的信息表user示例

idphone
100113987884537

2)用户登录表login示例

idtime
10012020-05-13 16:46:29.029

2、取出用户最新一条的登录记录

max()函数:取出时间最大的一条记录

SELECT u.name,max(l.time)
FROM login l,user u
WHERE l.id = u.id
GROUP BY l.name
ORDER BY l.name

3、用户的累计登录次数

SELECT u.name,count(l.id) num
FROM login l,user u
WHERE l.id = u.id
GROUP BY u.id
ORDER BY num DESC

二、用户套餐订购

1、表结构

1)用户信息表user_msg

idphoneadbirthday
100113894578385广东省1998-04-03

2)用户订购表 user_order

userIdtypeIdnum
1001111

3)歌曲信息表 user_order

idname
1蓝莲花

一个用户可以购买多个歌曲,针对一个歌曲也可以购买多次

1、查询每个用户购买的歌曲信息

多表连接最好用join on,from多表并表拼接产生笛卡尔积,数据量大时占用内存。

//方法一
SELECT m.name,s.name,o.num 
from user_order o 
join user_msg m 
on o.userId = m.id 
join service s
on o.typeId = s.id
//方法二
SELECT m.name,s.name,o.num 
from user_order o,user_msg m,service s 
WHERE o.userId = m.id and o.typeId = s.id
方法三
SELECT
(SELECT m.name from user_msg m WHERE m.id = o.userId),
(SELECT s.name from service s WHERE s.id = o.typeId),o.num
from user_order o

2、请查出每个歌曲购买的用户数量,并按照数量进行排序

SELECT s.name,count(o.userid) num
from user_order o,service s 
WHERE o.typeId= s.id 
GROUP BY s.name
ORDER BY num 

3、查询每个用户购买的歌曲数量,并按照数量降序,有多个用户名称相同

SELECT u.id,u.name,count(o.userid) num 
from user_order o,user_msg u 
WHERE o.userId= u.id 
GROUP BY u.id,u.name 
ORDER BY num desc 

4、查询购买了蓝莲花的用户信息

SELECT * 
from user_order 
WHERE typeId in (
SELECT id 
FROM service
WHERE name = "蓝莲花"
)

5、查出购买总数大于200的客户信息

SELECT userId,sum(num) s 
from user_order 
GROUP BY userId 
HAVING s>200

6、查出每个客户自己购买最多的歌曲信息

SELECT a.* 
FROM source a 
WHERE a.source = (
SELECT max(b.source) 
FROM source b 
WHERE a.s_id = b.s_id
)

7、查出每个歌曲购买最多的用户信息;

SELECT a.typeId,a.userId,a.num 
from user_order a 
WHERE a.num in (
SELECT max(num) 
from user_order b 
WHERE a.typeId = b.typeId
)

8、查出购买数量低于该首歌曲平均购买数量的用户信息

select * 
from user_order a 
WHERE num < (
SELECT avg(num) 
FROM user_order b 
WHERE a.typeId = b.typeId
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值