rokevin
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
  • SQL面试

  • 查询特定条件下的记录
  • 统计各年龄段员工数量
  • 计算员工薪资排名
  • 查询销售业绩最好的员工
  • 统计每个部门的平均工资和最高薪资
  • 找出没有销售记录的员工
  • 计算每个部门的员工薪资中位数
  • 查询每个部门薪资最高的员工信息
  • 统计每个部门的男女员工比例
  • 查询薪资在全公司员工薪资分布的前10%的员工
  • 找出每个月销售额最高的商品
  • 查询至少有两门课程成绩及格的学生
  • 计算每个学生的总成绩和平均成绩
  • 查询每个学生的选课数量和平均成绩
  • 查询每门课程的平均分和及格率
  • 查询每个学生的选课列表和每门课的成绩
  • 查询每门课程的最高分和最低分
  • 查询成绩排名前三的学生
  • 查询每个学生的最近一次考试成绩
  • 查询每门课程的平均分和标准差
  • 查询每个学生的选课总数和平均成绩
  • 找出销售额最高的商品类别
  • 查询每个部门的平均薪资和最高薪资
  • 找出最活跃的用户
  • 查询每门课程的平均分和最高分
  • 找出销售额最高的员工
  • 查询每个学生的不及格课程数量
  • 找出每个部门薪资最高的员工
  • 查询每门课程的平均成绩和最高成绩
  • 找出销售额最低的商品
  • 查询每个学生的姓名和他们的成绩排名
  • 查询每个月的销售总额
  • 查询每门课程至少有两名学生选修的课程名称
  • 查询每个部门的员工数量和平均工资
  • 查询每个学生的姓名和他们的最新成绩
  • 查询销售额最高的商品类别和其销售额
  • 查询每个学生的姓名和他们的平均成绩

SQL面试

在当今数据驱动的时代,掌握SQL(Structured Query Language)对于任何希望在大数据领域发展的专业人士来说都是至关重要的。SQL不仅是一种查询语言,更是一种强大的工具,能够帮助我们从海量数据中提取有价值的信息。因此,编写优质的SQL面试题及参考答案,不仅可以帮助读者巩固和提升SQL技能,还能作为衡量他们是否准备好迎接数据相关工作挑战的标准。

以下是一些精选的SQL面试题及其参考答案,旨在帮助读者深入理解SQL的核心概念和应用场景。

查询特定条件下的记录

题目:给定一个员工表(employees),其中包含员工的ID、姓名、部门和薪资。编写一个SQL查询,找出所有薪资高于部门平均薪资的员工信息。

参考答案:

SELECT e1.*
FROM employees e1
JOIN (
    SELECT department, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department
) e2 ON e1.department = e2.department AND e1.salary > e2.avg_salary;

这个查询首先通过子查询计算出每个部门的平均薪资,然后通过外部查询找出那些薪资高于各自部门平均薪资的员工。这里使用了内连接(INNER JOIN)来关联两个查询结果。

统计各年龄段员工数量

题目:在员工表中,除了上述字段外,还包括员工的出生年份(birth_year)。请编写一个SQL查询,统计公司中每个年龄段(20-29, 30-39, ...)的员工数量。

参考答案:

SELECT 
    CASE
        WHEN YEAR(CURRENT_DATE) - birth_year BETWEEN 20 AND 29 THEN '20-29'
        WHEN YEAR(CURRENT_DATE) - birth_year BETWEEN 30 AND 39 THEN '30-39'
        WHEN YEAR(CURRENT_DATE) - birth_year BETWEEN 40 AND 49 THEN '40-49'
        ELSE '50+'
    END AS age_group,
    COUNT(*) AS number_of_employees
FROM employees
GROUP BY age_group;

这个查询使用CASE语句根据员工的出生年份计算年龄,并将其分组到不同的年龄段。然后,使用GROUP BY语句对年龄段进行分组,并计算每个年龄段的员工数量。

计算员工薪资排名

题目:编写一个SQL查询,为每个员工计算其在部门内的薪资排名。

参考答案:

SELECT e1.emp_id, e1.emp_name, e1.salary,
       DENSE_RANK() OVER (PARTITION BY e1.department ORDER BY e1.salary DESC) AS salary_rank
FROM employees e1;

这个查询使用了窗口函数DENSE_RANK(),它为每个部门内的员工根据薪资降序排列,并计算排名。由于DENSE_RANK()不会在并列的情况下跳过排名,因此如果两个员工薪资相同,他们将共享同一个排名。

查询销售业绩最好的员工

题目:给定一个销售记录表(sales),其中包含销售ID、员工ID和销售额。请编写一个SQL查询,找出销售业绩最好的员工。

参考答案:

SELECT emp_id, SUM(sales_amount) AS total_sales FROM sales GROUP BY emp_id ORDER BY total_sales DESC LIMIT 1;

这个查询首先计算每个员工的总销售额,然后通过GROUP BY和ORDER BY语句对结果进行分组和排序。最后,使用LIMIT 1来获取销售业绩最好的员工。

统计每个部门的平均工资和最高薪资

题目:在员工表中,编写一个SQL查询,统计每个部门的平均工资和最高薪资。

参考答案:

SELECT department, AVG(salary) AS average_salary, MAX(salary) AS max_salary FROM employees GROUP BY department;

这个查询使用AVG()和MAX()聚合函数来计算每个部门的平均工资和最高薪资。通过GROUP BY语句对部门进行分组,确保每个部门的统计数据是独立的。

找出没有销售记录的员工

题目:在员工表和销售记录表之间存在员工ID的关联。请编写一个SQL查询,找出在销售记录表中没有记录的员工。

参考答案:

SELECT e.* FROM employees e LEFT JOIN sales s ON e.emp_id = s.emp_id WHERE s.emp_id IS NULL;

这个查询使用LEFT JOIN将员工表和销售记录表连接起来,并通过WHERE子句筛选出那些在销售记录表中没有对应记录的员工。

计算每个部门的员工薪资中位数

题目:请编写一个SQL查询,计算每个部门员工薪资的中位数。

参考答案:

SELECT department, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS median_salary FROM employees GROUP BY department;

这个查询使用了窗口函数PERCENTILE_CONT来计算每个部门员工薪资的中位数。由于中位数是一个统计概念,所以这个查询对于理解数据分布非常有用。

查询每个部门薪资最高的员工信息

题目:请编写一个SQL查询,找出每个部门薪资最高的员工信息。

参考答案:

SELECT e1.*, DENSE_RANK() OVER (PARTITION BY e1.department ORDER BY e1.salary DESC) AS salary_rank FROM employees e1 WHERE salary_rank = 1;

这个查询与第3题类似,但是这次我们只关注每个部门薪资排名第一的员工。

统计每个部门的男女员工比例

题目:请编写一个SQL查询,统计每个部门的男女员工比例。

参考答案:

SELECT department,
       COUNT(CASE WHEN sex = 'M' THEN 1 END) AS male_count,
       COUNT(CASE WHEN sex = 'F' THEN 1 END) AS female_count,
       (COUNT(CASE WHEN sex = 'M' THEN 1 END) / COUNT(*)) AS male_ratio,
       (COUNT(CASE WHEN sex = 'F' THEN 1 END) / COUNT(*)) AS female_ratio
FROM employees
GROUP BY department;

这个查询使用COUNT和CASE语句来分别计算每个部门的男女员工数量,并通过总员工数计算出男女比例。

查询薪资在全公司员工薪资分布的前10%的员工

题目:请编写一个SQL查询,找出那些薪资位于全公司员工薪资分布前10%的员工信息。

参考答案:

WITH SalaryPercentile AS (
    SELECT emp_id, salary,
           PERCENT_RANK() OVER (ORDER BY salary DESC) AS pr
    FROM employees
)
SELECT *
FROM SalaryPercentile
WHERE pr <= 0.1;

这个查询首先使用WITH子句创建了一个名为SalaryPercentile的临时结果集,其中包含每个员工的薪资和其在全公司薪资分布中的百分位排名。然后,通过WHERE子句筛选出那些薪资位于前10%的员工。

找出每个月销售额最高的商品

题目:给定一个销售记录表(sales_records),其中包含销售日期(sale_date)、商品ID(product_id)和销售额(sale_amount)。请编写一个SQL查询,找出每个月销售额最高的商品。

参考答案:

SELECT YEAR(sale_date) AS sale_year, MONTH(sale_date) AS sale_month, product_id, SUM(sale_amount) AS total_sales, DENSE_RANK() OVER (PARTITION BY YEAR(sale_date), MONTH(sale_date) ORDER BY SUM(sale_amount) DESC) AS sales_rank FROM sales_records GROUP BY YEAR(sale_date), MONTH(sale_date), product_id ORDER BY sale_year, sale_month, sales_rank;

这个查询首先使用GROUP BY语句按年(YEAR)和月(MONTH)对销售记录进行分组,并计算每个商品每个月的总销售额。接着,使用DENSE_RANK()窗口函数计算每个月销售额的排名。最后,通过ORDER BY语句对结果进行排序,确保每个月的排名是独立的。

查询至少有两门课程成绩及格的学生

题目:给定一个学生表(students),课程表(courses)和成绩表(scores),其中学生表包含学生ID(student_id)和姓名(student_name),课程表包含课程ID(course_id)和课程名称(course_name),成绩表包含学生ID、课程ID和成绩(score)。请编写一个SQL查询,找出至少有两门课程成绩及格(分数大于等于60)的学生名单。

参考答案:

SELECT DISTINCT s.student_id, s.student_name FROM students s JOIN scores sc ON s.student_id = sc.student_id WHERE sc.score >= 60 HAVING COUNT(DISTINCT sc.course_id) >= 2;

这个查询通过JOIN操作将学生表和成绩表连接起来,并通过WHERE子句筛选出成绩及格的学生记录。使用HAVING子句和COUNT(DISTINCT ...)函数确保至少有两门不同的课程成绩及格。DISTINCT关键字在这里用于确保学生即使在多门课程中取得及格成绩,也不会被重复计算。

计算每个学生的总成绩和平均成绩

题目:给定相同的学生表、课程表和成绩表,请编写一个SQL查询,计算每个学生的总成绩和平均成绩。

参考答案:

SELECT s.student_id, s.student_name, SUM(sc.score) AS total_score, AVG(sc.score) AS average_score FROM students s JOIN scores sc ON s.student_id = sc.student_id GROUP BY s.student_id, s.student_name;

这个查询通过JOIN操作将学生表和成绩表连接起来,然后使用GROUP BY语句按学生ID和姓名对结果进行分组。SUM()函数用于计算每个学生的总成绩,而AVG()函数用于计算平均成绩。

查询每个学生的选课数量和平均成绩

题目:继续使用上述表结构,请编写一个SQL查询,查询每个学生的选课数量和平均成绩。

参考答案:

SELECT s.student_id, s.student_name, COUNT(sc.course_id) AS course_count, AVG(sc.score) AS average_score FROM students s JOIN scores sc ON s.student_id = sc.student_id GROUP BY s.student_id, s.student_name;

这个查询与前一个查询类似,但是这里使用COUNT()函数来计算每个学生的选课数量。同时,使用AVG()函数计算平均成绩。通过GROUP BY语句确保每个学生的记录是唯一的。

查询每门课程的平均分和及格率

题目:继续使用上述表结构,请编写一个SQL查询,查询每门课程的平均分和及格率(即成绩大于等于60分的学生所占的比例)。

参考答案:

SELECT c.course_id, c.course_name, AVG(s.score) AS average_score, (COUNT(CASE WHEN s.score >= 60 THEN 1 END) / COUNT(s.score)) * 100 AS passing_rate FROM courses c JOIN scores s ON c.course_id = s.course_id GROUP BY c.course_id, c.course_name;

这个查询通过JOIN操作将课程表和成绩表连接起来,然后使用AVG()函数计算每门课程的平均分。为了计算及格率,使用COUNT(CASE WHEN ...)来统计及格的学生数量,然后除以总的学生数量,并乘以100得到百分比。

查询每个学生的选课列表和每门课的成绩

题目:继续使用上述表结构,请编写一个SQL查询,查询每个学生的选课列表和每门课的成绩。

参考答案:

SELECT s.student_id, s.student_name, c.course_id, c.course_name, sc.score FROM students s JOIN scores sc ON s.student_id = sc.student_id JOIN courses c ON sc.course_id = c.course_id ORDER BY s.student_id, c.course_id;

这个查询通过两次JOIN操作将学生表、课程表和成绩表连接起来,确保能够获取每个学生的选课信息和成绩。使用ORDER BY语句按学生ID和课程ID对结果进行排序,以便于查看每个学生的选课列表。

查询每门课程的最高分和最低分

题目:继续使用上述表结构,请编写一个SQL查询,查询每门课程的最高分和最低分。

参考答案:

SELECT c.course_id, c.course_name, MAX(sc.score) AS highest_score, MIN(sc.score) AS lowest_score FROM courses c JOIN scores sc ON c.course_id = sc.course_id GROUP BY c.course_id, c.course_name;

这个查询通过JOIN操作将课程表和成绩表连接起来,然后使用MAX()和MIN()函数分别计算每门课程的最高分和最低分。通过GROUP BY语句对课程进行分组。

查询成绩排名前三的学生

题目:继续使用上述表结构,请编写一个SQL查询,查询成绩排名前三的学生。

参考答案:

WITH RankedStudents AS ( SELECT student_id, student_name, score, DENSE_RANK() OVER (ORDER BY score DESC) AS score_rank FROM scores ) SELECT student_id, student_name, score FROM RankedStudents WHERE score_rank <= 3;

这个查询首先使用WITH子句创建一个名为RankedStudents的临时结果集,其中包含每个学生的成绩和排名。DENSE_RANK()窗口函数用于计算成绩排名。然后,通过WHERE子句筛选出排名前三的学生。

查询每个学生的最近一次考试成绩

题目:继续使用上述表结构,请编写一个SQL查询,查询每个学生的最近一次考试成绩。

参考答案:

SELECT s.student_id, s.student_name, MAX(sr.sale_date) AS last_exam_date, sc.score FROM students s JOIN scores sc ON s.student_id = sc.student_id JOIN sales_records sr ON sc.course_id = sr.product_id GROUP BY s.student_id, s.student_name;

这个查询通过JOIN操作将学生表、成绩表和销售记录表连接起来,假设销售记录表中的sale_date字段代表考试日期,product_id字段代表课程ID。使用MAX()函数找到每个学生的最新考试日期,并通过GROUP BY语句对结果进行分组。

查询每门课程的平均分和标准差

题目:继续使用上述表结构,请编写一个SQL查询,查询每门课程的平均分和标准差。

参考答案:

SELECT c.course_id, c.course_name, AVG(sc.score) AS average_score, STDDEV_POP(sc.score) AS standard_deviation FROM courses c JOIN scores sc ON c.course_id = sc.course_id GROUP BY c.course_id, c.course_name;

这个查询通过JOIN操作将课程表和成绩表连接起来,然后使用AVG()函数计算每门课程的平均分。STDDEV_POP()函数用于计算成绩的标准差,它衡量成绩分布的离散程度。通过GROUP BY语句对课程进行分组。

查询每个学生的选课总数和平均成绩

题目:给定学生表(students)、课程表(courses)和选课表(enrollments),其中学生表包含学生ID(student_id)和学生姓名(student_name),课程表包含课程ID(course_id)和课程名称(course_name),选课表包含学生ID、课程ID和成绩(grade)。请编写一个SQL查询,查询每个学生的选课总数和平均成绩。

参考答案:

SELECT e.student_id, e.student_name, COUNT(e.course_id) AS total_courses, AVG(e.grade) AS average_grade FROM enrollments e GROUP BY e.student_id, e.student_name;

这个查询通过GROUP BY语句按学生ID和学生姓名对选课表进行分组,以确保每个学生的选课记录是独立的。使用COUNT()函数来计算每个学生的选课总数,使用AVG()函数来计算平均成绩。

找出销售额最高的商品类别

题目:给定商品表(products)和销售记录表(sales),其中商品表包含商品ID(product_id)、商品名称(product_name)和商品类别(category),销售记录表包含商品ID和销售额。请编写一个SQL查询,找出销售额最高的商品类别。

参考答案:

SELECT p.category, SUM(s.amount) AS total_sales FROM products p JOIN sales s ON p.product_id = s.product_id GROUP BY p.category ORDER BY total_sales DESC LIMIT 1;

这个查询通过JOIN操作将商品表和销售记录表连接起来,然后使用GROUP BY语句按商品类别对记录进行分组。SUM()函数用于计算每个类别的总销售额。通过ORDER BY语句对总销售额进行降序排序,并使用LIMIT 1来获取销售额最高的商品类别。

查询每个部门的平均薪资和最高薪资

题目:给定员工表(employees)和部门表(departments),其中员工表包含员工ID(employee_id)、员工姓名(employee_name)、薪资(salary)和部门ID(department_id),部门表包含部门ID和部门名称。请编写一个SQL查询,查询每个部门的平均薪资和最高薪资。

参考答案:

SELECT d.department_id, d.department_name, AVG(e.salary) AS average_salary, MAX(e.salary) AS highest_salary FROM departments d JOIN employees e ON d.department_id = e.department_id GROUP BY d.department_id, d.department_name;

这个查询通过JOIN操作将员工表和部门表连接起来,然后使用GROUP BY语句按部门ID和部门名称对记录进行分组。AVG()函数用于计算每个部门的平均薪资,MAX()函数用于计算最高薪资。

找出最活跃的用户

题目:给定用户表(users)和活动记录表(activity_log),其中用户表包含用户ID(user_id)和用户名(username),活动记录表包含用户ID、活动类型(activity_type)和活动时间(activity_time)。请编写一个SQL查询,找出在过去一个月内最活跃的用户。

参考答案:

SELECT u.user_id, u.username, COUNT(a.activity_id) AS activity_count FROM users u JOIN activity_log a ON u.user_id = a.user_id WHERE a.activity_time >= NOW() - INTERVAL '1 MONTH' GROUP BY u.user_id, u.username ORDER BY activity_count DESC LIMIT 1;

这个查询通过JOIN操作将用户表和活动记录表连接起来,然后使用WHERE子句限制查询范围为过去一个月内的活动记录。使用COUNT()函数来计算每个用户的活动次数,并通过GROUP BY语句进行分组。最后,通过ORDER BY语句对活动次数进行降序排序,并使用LIMIT 1来获取最活跃的用户。

查询每门课程的平均分和最高分

题目:给定课程表(courses)和成绩表(grades),其中课程表包含课程ID(course_id)和课程名称(course_name),成绩表包含课程ID、学生ID(student_id)和分数(grade)。请编写一个SQL查询,查询每门课程的平均分和最高分。

参考答案:

SELECT c.course_id, c.course_name, AVG(g.grade) AS average_grade, MAX(g.grade) AS highest_grade FROM courses c JOIN grades g ON c.course_id = g.course_id GROUP BY c.course_id, c.course_name;

这个查询通过JOIN操作将课程表和成绩表连接起来,然后使用GROUP BY语句按课程ID和课程名称对记录进行分组。AVG()函数用于计算每门课程的平均分,MAX()函数用于计算最高分。

找出销售额最高的员工

题目:给定员工表(employees)和销售记录表(sales),其中员工表包含员工ID(employee_id)和员工姓名(employee_name),销售记录表包含员工ID和销售额。请编写一个SQL查询,找出销售额最高的员工。

参考答案:

SELECT e.employee_id, e.employee_name, SUM(s.amount) AS total_sales FROM employees e JOIN sales s ON e.employee_id = s.employee_id GROUP BY e.employee_id, e.employee_name ORDER BY total_sales DESC LIMIT 1;

这个查询通过JOIN操作将员工表和销售记录表连接起来,然后使用GROUP BY语句按员工ID和员工姓名对记录进行分组。SUM()函数用于计算每个员工的总销售额。通过ORDER BY语句对总销售额进行降序排序,并使用LIMIT 1来获取销售额最高的员工。

查询每个学生的不及格课程数量

题目:给定学生表(students)、课程表(courses)和成绩表(grades),其中学生表包含学生ID(student_id)和学生姓名(student_name),课程表包含课程ID(course_id)和课程名称(course_name),成绩表包含学生ID、课程ID和分数(grade)。请编写一个SQL查询,查询每个学生的不及格课程数量(分数小于60分)。

参考答案:

SELECT s.student_id, s.student_name, COUNT(g.course_id) AS failed_courses FROM students s JOIN grades g ON s.student_id = g.student_id WHERE g.grade < 60 GROUP BY s.student_id, s.student_name;

这个查询通过JOIN操作将学生表、课程表和成绩表连接起来,然后使用WHERE子句筛选出不及格的成绩记录。使用COUNT()函数来计算每个学生的不及格课程数量,并通过GROUP BY语句进行分组。

找出每个部门薪资最高的员工

题目:给定员工表(employees)和部门表(departments),其中员工表包含员工ID(employee_id)、员工姓名(employee_name)、薪资(salary)和部门ID(department_id),部门表包含部门ID和部门名称。请编写一个SQL查询,找出每个部门薪资最高的员工。

参考答案:

SELECT 
    e.employee_id,
    e.employee_name,
    d.department_id,
    d.department_name,
    e.salary
FROM 
    employees e
JOIN 
    departments d ON e.department_id = d.department_id
WHERE 
    (e.department_id, e.salary) IN (
        SELECT 
            department_id,
            MAX(salary)
        FROM 
            employees
        GROUP BY 
            department_id
    )

查询每门课程的平均成绩和最高成绩

题目:给定课程表(courses)和成绩表(grades),其中课程表包含课程ID(course_id)和课程名称(course_name),成绩表包含课程ID、学生ID(student_id)和分数(grade)。请编写一个SQL查询,查询每门课程的平均成绩和最高成绩。

参考答案:

SELECT c.course_id, c.course_name, AVG(g.grade) AS average_grade, MAX(g.grade) AS highest_grade FROM courses c JOIN grades g ON c.course_id = g.course_id GROUP BY c.course_id, c.course_name;

这个查询通过JOIN操作将课程表和成绩表连接起来,然后使用GROUP BY语句按课程ID和课程名称对记录进行分组。AVG()函数用于计算每门课程的平均成绩,MAX()函数用于计算最高成绩。

找出销售额最低的商品

题目:给定商品表(products)和销售记录表(sales),其中商品表包含商品ID(product_id)、商品名称(product_name)和商品价格(price),销售记录表包含商品ID和销售数量(quantity)。请编写一个SQL查询,找出销售额最低的商品。

参考答案:

SELECT p.product_id, p.product_name, p.price AS product_price, SUM(s.quantity) * p.price AS total_sales FROM products p JOIN sales s ON p.product_id = s.product_id GROUP BY p.product_id, p.product_name, p.price ORDER BY total_sales ASC LIMIT 1;

这个查询通过JOIN操作将商品表和销售记录表连接起来,然后使用GROUP BY语句按商品ID、商品名称和商品价格对记录进行分组。通过SUM()函数计算每个商品的销售数量,并乘以商品价格得到总销售额。使用ORDER BY语句对总销售额进行升序排序,并使用LIMIT 1来获取销售额最低的商品。

查询每个学生的姓名和他们的成绩排名

题目:给定学生表(students)和成绩表(grades),其中学生表包含学生ID(student_id)和学生姓名(student_name),成绩表包含学生ID和分数(grade)。请编写一个SQL查询,查询每个学生的姓名和他们的成绩排名。

参考答案:

SELECT s.student_id, s.student_name, RANK() OVER (ORDER BY g.grade DESC) AS grade_rank FROM students s JOIN grades g ON s.student_id = g.student_id;

这个查询通过JOIN操作将学生表和成绩表连接起来,然后使用窗口函数RANK()计算每个学生的成绩排名。ORDER BY g.grade DESC确保排名是基于成绩降序排列的。

查询每个月的销售总额

题目:给定销售记录表(sales),其中包含销售日期(sale_date)和销售金额(amount)。请编写一个SQL查询,查询每个月的销售总额。

参考答案:

SELECT YEAR(sale_date) AS sale_year, MONTH(sale_date) AS sale_month, SUM(amount) AS total_sales FROM sales GROUP BY YEAR(sale_date), MONTH(sale_date) ORDER BY sale_year, sale_month;

这个查询使用GROUP BY语句按销售年份和销售月份对销售记录进行分组,并使用SUM()函数计算每个月的销售总额。ORDER BY语句确保结果按年份和月份排序。

查询每门课程至少有两名学生选修的课程名称

题目:给定课程表(courses)和选课表(enrollments),其中课程表包含课程ID(course_id)和课程名称(course_name),选课表包含课程ID和学生ID(student_id)。请编写一个SQL查询,查询至少有两名学生选修的课程名称。

参考答案:

SELECT c.course_id, c.course_name FROM courses c JOIN enrollments e ON c.course_id = e.course_id GROUP BY c.course_id, c.course_name HAVING COUNT(DISTINCT e.student_id) >= 2;

这个查询通过JOIN操作将课程表和选课表连接起来,然后使用GROUP BY语句按课程ID和课程名称对记录进行分组。HAVING子句用于确保每个课程至少有两名不同的学生选修。

查询每个部门的员工数量和平均工资

题目:给定员工表(employees)和部门表(departments),其中员工表包含员工ID(employee_id)、员工姓名(employee_name)、薪资(salary)和部门ID(department_id),部门表包含部门ID和部门名称。请编写一个SQL查询,查询每个部门的员工数量和平均工资。

参考答案:

SELECT d.department_id, d.department_name, COUNT(e.employee_id) AS employee_count, AVG(e.salary) AS average_salary FROM departments d JOIN employees e ON d.department_id = e.department_id GROUP BY d.department_id, d.department_name;

这个查询通过JOIN操作将员工表和部门表连接起来,然后使用GROUP BY语句按部门ID和部门名称对记录进行分组。COUNT()函数用于计算每个部门的员工数量,AVG()函数用于计算平均工资。

查询每个学生的姓名和他们的最新成绩

题目:给定学生表(students)和成绩表(grades),其中学生表包含学生ID(student_id)和学生姓名(student_name),成绩表包含学生ID、课程ID(course_id)和分数(grade),且每名学生每门课程只有一条成绩记录。请编写一个SQL查询,查询每个学生的姓名和他们的最新成绩。

参考答案:

SELECT s.student_id, s.student_name, g.grade FROM students s JOIN ( SELECT student_id, course_id, grade, MAX(grade) OVER (PARTITION BY student_id) AS latest_grade FROM grades ) g ON s.student_id = g.student_id WHERE g.grade = g.latest_grade;

这个查询使用子查询和窗口函数MAX() OVER (PARTITION BY ...)来为每个学生找出最新成绩。子查询中的MAX()函数计算每名学生的最高成绩,即最新成绩。外部查询通过JOIN操作将学生表和子查询结果连接起来,并使用WHERE子句确保只选择最新成绩。

查询销售额最高的商品类别和其销售额

题目:给定商品表(products)和销售记录表(sales),其中商品表包含商品ID(product_id)、商品名称(product_name)、商品类别(category)和商品价格(price),销售记录表包含商品ID和销售数量(quantity)。请编写一个SQL查询,查询销售额最高的商品类别和其销售额。

参考答案:

SELECT p.category, SUM(p.price * s.quantity) AS total_sales FROM products p JOIN sales s ON p.product_id = s.product_id GROUP BY p.category ORDER BY total_sales DESC LIMIT 1;

这个查询通过JOIN操作将商品表和销售记录表连接起来,然后使用GROUP BY语句按商品类别对记录进行分组。通过SUM()函数计算每个类别的总销售额,并使用ORDER BY语句对总销售额进行降序排序。LIMIT 1用于获取销售额最高的商品类别。

查询每个学生的姓名和他们的平均成绩

题目:给定学生表(students)和成绩表(grades),其中学生表包含学生ID(student_id)和学生姓名(student_name),成绩表包含学生ID和分数(grade)。请编写一个SQL查询,查询每个学生的姓名和他们的平均成绩。

参考答案:

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;

这个查询通过JOIN操作将学生表和成绩表连接起来,然后使用GROUP BY语句按学生ID和学生姓名对记录进行分组。AVG()函数用于计算每个学生的平均成绩。

最近更新:: 2025/10/23 21:22
Contributors: luokaiwen