【SQL高频练习带刷】day17:子查询

题目一:院系无效的学生

题目要求:

找出那些所在院系不存在的学生的 id 和姓名

可以以 任何顺序 返回结果。

1350. 院系无效的学生 - 力扣(LeetCode)

表结构:

运行结果示例:

思路:

        本题要求我们寻找院系不存在在院系表中的学生信息,我们可以先查询出院系表中已有的全部院系id,再在学生表中查询院系id不在我们子查询结果中的学生数据。

运行代码示例:

select id,name
from Students
where department_id not in (
    select id
    from Departments 
)

题目二:求团队人数

题目要求:

编写解决方案以求得每个员工所在团队的总人数。

返回结果表 无顺序要求 

1303. 求团队人数 - 力扣(LeetCode)

表结构:

运行结果示例:

思路:

        我们先用group by分组查询出每个团队的id,及对应的人数,将查询结果作为临时表,与原始表通过团队id字段连接,找到每个员工及其所在团队的人数。

运行代码示例:

select employee_id,cnt as team_size
from Employee
left join (
    select count(employee_id) as cnt,team_id from Employee group by team_id
) t
using(team_id)

题目三:游戏玩法分析II

题目要求:

请编写解决方案,描述每一个玩家首次登陆的设备名称

512. 游戏玩法分析 II - 力扣(LeetCode)

表结构:

运行结果示例:

思路:

        依旧是子查询的思路,我们先找到每个用户id及其对应的最早登录时间(即首次登录时间)作为临时表,再查找游戏玩家id和日期在该临时表中的数据对应的设备id。

运行代码示例:

select player_id,device_id
from Activity
where (player_id,event_date) in (
    select player_id,min(event_date) as event_date from  Activity group by player_id
)

题目四:部门工资最高的员工

题目要求:

查找出每个部门中薪资最高的员工。
按 任意顺序 返回结果表。

184. 部门工资最高的员工 - 力扣(LeetCode)

表结构:

运行结果示例:

思路:

        

 本题要求寻找每个部门中工资最高的员工,不难想到要用group by 子句实现,但是根据示例可以看出,结果中存在多者并列的情况,因此不能使用limit子句来筛选。这时我们可以考虑使用子查询来解决这个问题。

        首先我们使用group by子句结合mix()函数,查询出每个部门的最高工资数额,之后我们将得到的结果作为子查询的条件,查询主表中工资数、部门在查询结果中的数据,并连接Department表获取部门名称。

运行代码示例:

select d.name as Department, e.name as Employee,salary
from Employee e
left join Department d 
on e.departmentId = d.id 
where (salary,departmentId) in (
    select max(salary),departmentId
    from Employee e
    group by departmentId
) 

题目五:每件商品的最新订单

题目要求:

写一个解决方案, 找到每件商品的最新订单(可能有多个).

返回的结果以 product_name 升序排列, 如果有排序相同, 再以 product_id 升序排列. 如果还有排序相同, 再以 order_id 升序排列.

1549. 每件商品的最新订单 - 力扣(LeetCode)

表结构:

运行结果示例:

思路:

        先查询出产品id及其对应的最新订单日期,再使用where子句结合in关键字找到我们需要的数据,最后按照要求排序即可。

运行代码示例:

select p.product_name, p.product_id, o.order_id, o.order_date
from Orders o
left join Products p
on p.product_id = o.product_id 
where (p.product_id,p.order_date) in (
    select product_id , max(order_date) as order_date
    from Orders
    group by product_id
)
order by product_name, order_id

猜你喜欢

转载自blog.csdn.net/Liu_y_xin/article/details/141862735