平均活跃天数和月活人数(sql练习)

用户在牛客试卷作答区作答记录存储在表exam_record中,内容如下:

exam_record表(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分)

id uid exam_id start_time submit_time score
1 1001 9001 2021-07-02 09:01:01 2021-07-02 09:21:01 80
2 1002 9001 2021-09-05 19:01:01 2021-09-05 19:40:01 81
3 1002 9002 2021-09-02 12:01:01 (NULL) (NULL)
4 1002 9003 2021-09-01 12:01:01 (NULL) (NULL)
5 1002 9001 2021-07-02 19:01:01 2021-07-02 19:30:01 82
6
<think>嗯,用户之前已经问过关于SQL练习的指南,现在他们想要具体的练习答案。首先,我需要确定用户的水平,可能他们已经掌握了基础,需要更多的实践题目来提高。用户提到“十几道题目”,所以大概需要覆盖不同的难度级别,从基础到进阶,确保他们能逐步提升。 之前的回复里,我已经分阶段介绍了SQL的学习路径,现在需要具体题目。题目类型应该包括单表查询、多表连接、聚合函数、子查询、窗口函数等,这些都是常见的考点。同时,用户可能需要实际案例来应用这些知识,比如电商、员工管理这样的常见场景。 还要注意题目的顺序,从简单到复杂排列,帮助用户逐步挑战自己。每个题目后面附带答案,但用户要求答案放在最后,所以需要把题目答案分开,避免混淆。此外,要确保答案准确,最好使用标准SQL语法,避免特定数据库的扩展,这样适用性更广。 另外,用户可能希望题目涉及实际问题,比如计算销售额、排名、统计部门人数等,这样他们可以将所学应用到真实场景中。可能还需要提醒用户注意性能问题,比如索引的使用,避免全表扫描,但题目中可能不需要涉及太多优化,主要还是查询的正确性。 最后,检查题目是否覆盖了不同的关键知识点,确保没有遗漏重要的SQL功能,比如JOIN、GROUP BY、HAVING、子查询、窗口函数等。同时,答案部分需要清晰,步骤明确,帮助用户理解解题思路,而不仅仅是给出答案。</think>以下是为您精心设计的15道SQL实战练习题,涵盖基础到进阶的不同场景,附带答案在最后: --- ### **基础查询(单表操作)** 1. 查询员工表中所有薪资大于8000的工程师信息(表名:employees,字段:id, name, job_title, salary) 2. 统计订单表中2023年每个的订单总数(表名:orders,字段:order_id, order_date) 3. 找出学生表中没有填写邮箱的学生姓名(表名:students,字段:id, name, email) --- ### **多表关联查询** 4. 查询所有客户及其最新订单日期(客户表customers字段:cust_id, cust_name;订单表orders字段:order_id, cust_id, order_date) 5. 列出所有从未下过订单的产品名称(产品表products字段:product_id, product_name;订单明细表order_items字段:item_id, product_id) 6. 显示每个部门的平均薪资,并列出部门名称(部门表departments字段:dept_id, dept_name;员工表employees字段:emp_id, dept_id, salary) --- ### **聚合函数与分组** 7. 找出销售额超过10万元的销售员及其总销售额(销售表sales字段:sale_id, salesperson_id, amount) 8. 统计每个类别下商品数量超过50的类别名称(商品表products字段:product_id, category_id, product_name;类别表categories字段:category_id, category_name) 9. 查询选修超过3门课程的学生学号及选课数(选课表course_selection字段:student_id, course_id) --- ### **子查询与复杂条件** 10. 找出薪资高于所在部门平均薪资的员工信息 11. 查询比所有产品平均价格高出20%以上的商品信息 12. 显示2023年购买次数最多的前5名客户信息 --- ### **窗口函数与高级查询** 13. 为每个部门的员工按薪资排名(相同薪资并列名次) 14. 计算每个客户连续下单的天数最大值(订单表orders字段:cust_id, order_date) 15. 生成度销售环比增长率报告(示例输出:份 | 销售额 | 增长率) --- ### **参考答案** ```sql -- 1. 筛选工程师 SELECT * FROM employees WHERE job_title = '工程师' AND salary > 8000; -- 2. 按统计订单 SELECT EXTRACT(MONTH FROM order_date) AS month, COUNT(*) AS order_count FROM orders WHERE EXTRACT(YEAR FROM order_date) = 2023 GROUP BY month; -- 3. 空邮箱查询 SELECT name FROM students WHERE email IS NULL OR email = ''; -- 4. 客户最新订单 SELECT c.cust_name, MAX(o.order_date) AS last_order FROM customers c LEFT JOIN orders o ON c.cust_id = o.cust_id GROUP BY c.cust_id; -- 5. 无订单产品 SELECT product_name FROM products WHERE product_id NOT IN ( SELECT DISTINCT product_id FROM order_items ); -- 6. 部门平均薪资 SELECT d.dept_name, AVG(e.salary) AS avg_salary FROM departments d JOIN employees e ON d.dept_id = e.dept_id GROUP BY d.dept_name; -- 7. 销售精英筛选 SELECT salesperson_id, SUM(amount) AS total_sales FROM sales GROUP BY salesperson_id HAVING SUM(amount) > 100000; -- 8. 热门商品类别 SELECT c.category_name FROM categories c JOIN products p ON c.category_id = p.category_id GROUP BY c.category_name HAVING COUNT(p.product_id) > 50; -- 9. 多选课学生 SELECT student_id, COUNT(*) AS course_count FROM course_selection GROUP BY student_id HAVING COUNT(*) > 3; -- 10. 薪资对比部门平均 SELECT e.* FROM employees e WHERE salary > ( SELECT AVG(salary) FROM employees WHERE dept_id = e.dept_id ); -- 11. 高价商品筛选 SELECT * FROM products WHERE price > (SELECT AVG(price)*1.2 FROM products); -- 12. 活跃客户排行 SELECT cust_id, COUNT(*) AS order_count FROM orders WHERE EXTRACT(YEAR FROM order_date) = 2023 GROUP BY cust_id ORDER BY order_count DESC LIMIT 5; -- 13. 部门薪资排名 SELECT emp_name, salary, DENSE_RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rank FROM employees; -- 14. 最大连续下单天数 WITH date_diff AS ( SELECT cust_id, order_date - LAG(order_date) OVER ( PARTITION BY cust_id ORDER BY order_date ) AS diff FROM orders ) SELECT cust_id, MAX(diff) FROM date_diff WHERE diff = 1 -- 连续下单间隔为1天 GROUP BY cust_id; -- 15. 销售环比增长 WITH monthly_sales AS ( SELECT DATE_TRUNC('month', order_date) AS month, SUM(amount) AS total FROM sales GROUP BY month ) SELECT curr.month, curr.total, (curr.total - prev.total)/prev.total * 100 AS growth FROM monthly_sales curr LEFT JOIN monthly_sales prev ON curr.month = prev.month + INTERVAL '1 month'; ``` --- **练习建议**: 1. 先独立完成至少3次尝试再查看答案 2. 使用EXPLAIN分析复杂查询的执行计划 3. 尝试在真实数据库执行并验证结果 4. 扩展题目:为每个问题添加LIMIT/OFFSET分页功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值