分组与子查询

发布时间 2023-11-13 00:26:36作者: 粥粥alg

第一章 分组查询

1.GROUP BY子句

请编写 SQL 语句,查询教师表 teachers,统计不同年龄教师的人数,并将结果按照年龄从大到小排列,返回列名显示为 age_count。

SELECT age,count(age) as age_count
FROM teachers
group by age
order by age desc

请编写 SQL 语句,查询教师表 teachers 和课程表 courses,统计每个老师教授课程的数量,并将结果按课程数量降序排列,课程数量相同时按教师姓名升序排列,返回老师姓名和课程数量,分别命名为 teacher_name 和 course_count。

SELECT t.name as teacher_name,count(c.teacher_id) as course_count
FROM teachers t
left join courses c on t.id=c.teacher_id
group by (t.id)
order by course_count desc, teacher_name asc;

2.HAVING 子句

请编写 SQL 语句,从 teachers 表中,筛选出同一国家的教师平均年龄大于所有教师平均年龄的国家,并获取这些国家的所有教师信息。

select * from teachers where country in (
    select country from teachers group by country having avg(age) > 
    (select avg(age) from teachers ) 
)

第二章 简单子查询

1.SELECT 语句中的子查询

请编写 SQL 语句,查询 courses 表和 teachers 表,查询 'Big Data' 课程对应的老师姓名。
SELECT t.name
FROM teachers t
WHERE t.id=(
SELECT c.teacher_id
FROM courses c
WHERE c.name='Big Data'
)

2.INSERT 语句中的子查询

请编写 SQL 语句,将教师表 teachers 中年龄大于 20(不包括 20) 的教师的数据复制到与它结构相同的空表 teachers_bkp 表中。

INSERT INTO teachers_bkp
SELECT *
FROM teachers
WHERE age>20

3.UPDATE 语句中的子查询

学校教务处排课时发现教师 Western Venom 创建的课程有误,现紧急需要将该教师创建的课程名称修改为 Java,请你使用相关的 SQL 语句完成。(课程中例题需收费)

UPDATE `courses`
SET `name` = 'Java'
WHERE `teacher_id` = (
	SELECT `id`
    FROM `teachers`
    WHERE `name` = 'Western Venom'
);

4.DELETE 语句中的子查询

请编写 SQL 语句,删除教师表 teachers 中在 2020 年前(不包括 2020 年)创建过课程的教师。

DELETE FROM teachers
WHERE id in(
    SELECT teacher_id
    FROM courses
    WHERE created_at<'2020-01-01'
)

第三章:子查询进阶