【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
<think>好的,用户想了解工作中常用的SQL练习。首先,我需要确定用户的需求。他们可能刚开始学习SQL,或者想在工作中提升自己的查询能力。需要介绍常见的练习内容,确保覆盖实际工作场景中的常见操作。 用户可能对哪些方面感兴趣呢?基础操作肯定是必须的,比如SELECT、WHERE、JOIN这些。然后是分组聚合,因为数据分析中经常用到GROUP BY和聚合函数。子查询和CTE也是高级查询中常用的,应该包括进去。 窗口函数在数据处理中很重要,尤其是在排名和分区计算时,用户可能需要这方面的练习。表操作如创建、修改表结构,还有插入更新数据,这些也是日常维护的一部分。优化部分,比如索引和执行计划,能帮助用户提高查询效率,但可能对初学者稍难,不过还是有必要提一下。 实际应用场景的例子会更具体,比如销售数据或用户行为分析,这样用户可以更直观地理解如何应用SQL练习题的设计需要由浅入深,从简单查询到复杂分析,逐步提升难度。同时,推荐学习资源可以帮助用户自主学习,比如LeetCode、牛客网这些平台。 需要确保语言简洁明了,避免使用专业术语过多,让初学者也能理解。结构上分点列出,每个部分用小标题和代码示例,这样用户看起来清晰。可能用户没有提到的深层需求是希望直接应用到工作中,所以实际例子和练习题特别重要,能帮助他们巩固知识。 最后检查是否有遗漏的部分,比如常见的日期处理、字符串函数,这些在练习中也经常遇到,应该包含进去。还有性能优化部分,虽然进阶但很实用。确认内容全面,覆盖了大多数工作场景,这样用户能得到实用的指导。</think>在工作中进行 SQL 练习时,建议重点关注以下实用场景和常见操作,这些内容能帮助你应对实际工作中的数据处理需求: --- ### **1. 基础查询与过滤** - **SELECT + WHERE** ```sql -- 查询特定条件下的数据(如时间范围、状态) SELECT order_id, customer_name, order_date FROM orders WHERE order_date >= '2023-01-01' AND status = 'completed'; ``` - **DISTINCT 去重** ```sql -- 获取唯一值列表 SELECT DISTINCT department FROM employees; ``` --- ### **2. 分组聚合与统计** - **GROUP BY + 聚合函数** ```sql -- 按部门统计平均工资 SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department; ``` - **HAVING 过滤分组结果** ```sql -- 筛选出销售额超过 1 万的部门 SELECT department, SUM(sales) AS total_sales FROM sales_data GROUP BY department HAVING SUM(sales) > 10000; ``` --- ### **3. 多表关联与连接** - **JOIN 操作(INNER/LEFT/RIGHT JOIN)** ```sql -- 关联订单表和客户表 SELECT o.order_id, c.customer_name, o.amount FROM orders o LEFT JOIN customers c ON o.customer_id = c.id; ``` - **自关联查询(如层级数据)** ```sql -- 查询员工及其经理 SELECT e.name AS employee, m.name AS manager FROM employees e LEFT JOIN employees m ON e.manager_id = m.id; ``` --- ### **4. 子查询与 CTE** - **子查询嵌套** ```sql -- 查询工资高于部门平均工资的员工 SELECT name, salary, department FROM employees WHERE salary > (SELECT AVG(salary) FROM employees e2 WHERE e2.department = e1.department); ``` - **CTE(公共表表达式)** ```sql WITH dept_avg AS ( SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department ) SELECT e.name, e.salary, d.avg_salary FROM employees e JOIN dept_avg d ON e.department = d.department; ``` --- ### **5. 窗口函数(高级分析)** - **排名(ROW_NUMBER/RANK/DENSE_RANK)** ```sql -- 按销售额给销售员排名 SELECT salesperson, sales, RANK() OVER (ORDER BY sales DESC) AS rank FROM sales; ``` - **累计计算(SUM OVER)** ```sql -- 计算月度销售额累计 SELECT month, sales, SUM(sales) OVER (ORDER BY month) AS cumulative_sales FROM monthly_sales; ``` --- ### **6. 日期与字符串处理** - **日期格式化与计算** ```sql -- 计算订单处理时长(天数) SELECT order_id, DATEDIFF(day, order_date, shipped_date) AS processing_days FROM orders; ``` - **字符串截取与拼接** ```sql -- 合并姓和名 SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees; ``` --- ### **7. 数据更新与表操作** - **INSERT/UPDATE/DELETE** ```sql -- 更新用户状态 UPDATE users SET status = 'inactive' WHERE last_login < '2022-01-01'; ``` - **表结构修改(ALTER TABLE)** ```sql -- 添加新列 ALTER TABLE products ADD COLUMN category VARCHAR(50); ``` --- ### **8. 性能优化技巧** - **索引的使用场景** ```sql -- 为高频查询字段创建索引 CREATE INDEX idx_customer_id ON orders (customer_id); ``` - **EXPLAIN 分析执行计划** ```sql EXPLAIN SELECT * FROM orders WHERE customer_id = 1001; ``` --- ### **实际场景练习建议** 1. **模拟业务数据**(如电商、金融、用户行为数据) - 分析用户留存率、销售额趋势、产品库存状态等。 2. **LeetCode/牛客网** - 题平台提供真实面试题(如「第二高的薪水」「连续登录用户」)。 3. **Kaggle 公开数据集** - 用真实数据集练习复杂分析(如 COVID 数据、电影评分)。 --- 通过以上练习,你可以快速掌握工作中高频使用的 SQL 技能,应对数据查询、报表生成、业务分析等实际需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值