- 编写一个查询,查找每个部门的平均工资,并按照平均工资的降序进行排序。同时,只显示平均工资高于全公司平均工资的部门。
- 假设有一张
products表,其中包含产品名称和价格。编写一个查询,查找价格排名在前 10 位的产品,并显示它们的名称和价格。 - 假设有两张表:
students和grades。编写一个查询,找出每个学生的平均分数,并按照平均分数的降序进行排序。同时,只显示平均分数大于 80 的学生。 - 假设有一张
logs表,记录了用户的登录时间。编写一个查询,查找连续登录天数最长的用户,并显示其用户名和连续登录天数。 - 假设有一张
orders表,其中包含订单号、订单日期和订单金额。编写一个查询,查找每个月的销售总金额,并按照月份的升序进行排序。
1. 编写一个查询,查找每个部门的平均工资,并按照平均工资的降序进行排序。同时,只显示平均工资高于全公司平均工资的部门。
假设我们有一个名为 employees 的表,包含以下字段:employee_id、department_id 和 salary。下面是一个查询SQL,用于查找每个部门的平均工资并按照平均工资降序排序,只显示平均工资高于全公司平均工资的部门:
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (
SELECT AVG(salary)
FROM employees
)
ORDER BY avg_salary DESC;
该查询使用 GROUP BY 子句按部门分组,并使用 AVG 函数计算每个部门的平均工资。然后,使用 HAVING 子句过滤出平均工资高于全公司平均工资的部门。最后,使用 ORDER BY 子句按照平均工资降序排序结果。
请注意,上述查询中的表名和字段名应根据实际情况进行替换。另外,该查询假设公司的平均工资可通过全公司数据计算得出。如果有其他条件或需求,请根据实际情况进行调整。
2. 假设有一张 products 表,其中包含产品名称和价格。编写一个查询,查找价格排名在前 10 位的产品,并显示它们的名称和价格。
假设我们有一个名为 products 的表,包含以下字段:product_id、product_name 和 price。下面是一个查询SQL,用于查找价格排名在前 10 位的产品,并显示它们的名称和价格:
SELECT product_name, price
FROM products
ORDER BY price DESC
LIMIT 10;
该查询使用 ORDER BY 子句按价格降序排序产品。然后,使用 LIMIT 关键字限制结果集的大小为 10,这样只会返回前 10 个价格最高的产品。最后,选择显示产品名称和价格。
请注意,上述查询中的表名和字段名应根据实际情况进行替换。另外,如果你想查找价格排名在前 10 位的最低价格产品,只需将 ORDER BY 子句中的 DESC 改为 ASC 即可。
3. 假设有两张表:students 和 grades。编写一个查询,找出每个学生的平均分数,并按照平均分数的降序进行排序。同时,只显示平均分数大于 80 的学生。
假设我们有两张表,students 表包含学生的信息,grades 表包含学生的分数记录。以下是一个查询SQL,用于找出每个学生的平均分数,并按照平均分数的降序排序,同时只显示平均分数大于 80 的学生:
SELECT s.student_id, s.student_name, AVG(g.grade) AS average_grade
FROM students s
JOIN grades g ON s.student_id = g.student_id
GROUP BY s.student_id, s.student_name
HAVING AVG(g.grade) > 80
ORDER BY average_grade DESC;
该查询使用了 JOIN 操作将 students 表和 grades 表关联起来,通过 student_id 进行匹配。然后,使用 GROUP BY 子句将结果按学生分组。接着,使用 AVG 函数计算每个学生的平均分数。HAVING 子句用于筛选出平均分数大于 80 的学生。最后,使用 ORDER BY 子句按照平均分数的降序排序结果。
请注意,上述查询中的表名和字段名应根据实际情况进行替换。另外,该查询假设每个学生在 grades 表中有对应的分数记录。如果有其他条件或需求,请根据实际情况进行调整。
4. 假设有一张 logs 表,记录了用户的登录时间。编写一个查询,查找连续登录天数最长的用户,并显示其用户名和连续登录天数。
假设我们有一张名为 logs 的表,其中包含以下字段:user_id 和 login_date。下面是一个查询SQL,用于查找连续登录天数最长的用户,并显示其用户名和连续登录天数:
SELECT user_id, COUNT(*) AS consecutive_days
FROM (
SELECT user_id, login_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn
FROM logs
) AS t
GROUP BY user_id, DATE_DIFF(login_date, DATE_ADD(login_date, INTERVAL rn DAY)) -- 连续登录天数的标识
HAVING consecutive_days = MAX(consecutive_days)
该查询使用了窗口函数 ROW_NUMBER() 和子查询来标识每个用户的连续登录天数。首先,子查询按照 user_id 和 login_date 进行分组,并为每个分组分配一个行号(按照 login_date 的升序排列)。然后,外部查询使用 GROUP BY 子句将结果按 user_id 和连续登录天数分组,并计算每个分组的连续登录天数(通过计算 login_date 与 login_date 加上行号之间的日期差)。最后,通过使用 HAVING 子句过滤出连续登录天数最长的用户。
让我们逐行解析上面提到的 SQL 查询语句:
SELECT user_id, COUNT(*) AS consecutive_days
这一行表示我们正在选择两个列:user_id 和 COUNT(*),并将 COUNT(*) 的别名设置为 consecutive_days。
FROM (
SELECT user_id, login_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn
FROM logs
) AS t
这一行表示我们正在从一个子查询中获取数据。子查询使用 SELECT 语句选择三个列:user_id、login_date 和 ROW_NUMBER()。ROW_NUMBER() 是一个窗口函数,通过 OVER 子句定义了分区规则(PARTITION BY user_id)和排序规则(ORDER BY login_date)。AS rn 将 ROW_NUMBER() 的结果命名为 rn。
子查询的结果集被命名为 t,作为一个临时表供后续使用。
GROUP BY user_id, DATE_DIFF(login_date, DATE_ADD(login_date, INTERVAL rn DAY))
这一行表示我们将结果按照 user_id 和 DATE_DIFF(login_date, DATE_ADD(login_date, INTERVAL rn DAY)) 进行分组。DATE_DIFF() 函数用于计算两个日期之间的差值,这里计算的是当前登录日期与当前登录日期加上行号之间的天数差。
HAVING consecutive_days = MAX(consecutive_days)
这一行表示我们在分组后进行筛选,只保留符合条件 consecutive_days = MAX(consecutive_days) 的结果。也就是说,我们只选择连续登录天数等于最大连续登录天数的结果。
以上是对 SQL 查询语句的逐行解析,每一行的含义和作用。请注意,这只是对查询语句的解析,实际执行的结果取决于具体的数据和数据库环境。
5. 假设有一张 orders 表,其中包含订单号、订单日期和订单金额。编写一个查询,查找每个月的销售总金额,并按照月份的升序进行排序。
假设我们有一张名为 orders 的表,其中包含以下字段:order_id、order_date 和 order_amount。以下是一个查询SQL,用于查找每个月的销售总金额,并按照月份的升序排序:
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
SUM(order_amount) AS total_sales
FROM
orders
GROUP BY
DATE_FORMAT(order_date, '%Y-%m')
ORDER BY
DATE_FORMAT(order_date, '%Y-%m') ASC;
该查询使用了 DATE_FORMAT() 函数将 order_date 字段格式化为年月的形式(例如:2022-01)。然后,使用 SUM() 函数计算每个月的销售总金额。通过 GROUP BY 子句将结果按照月份进行分组。最后,使用 ORDER BY 子句按照月份的升序排序结果。
请注意,上述查询中的表名和字段名应根据实际情况进行替换。另外,该查询假设 order_date 是日期类型的字段,order_amount 是订单金额字段。如果有其他条件或需求,请根据实际情况进行调整。