下面所有示例均来自 SQL之母 - SQL自学网站
-- 查询所有学生 -- 请编写 SQL 查询语句,从名为 `student` 的数据表中查询出所有学生的信息。 select * from student; -- 查询学生的姓名和年龄 -- 请编写一条 SQL 查询语句,从名为 `student` 的数据表中选择出所有学生的姓名(name)和年龄(age)信息。 select name, age from student; -- 查询 - 别名 -- 请编写一条 SQL 查询语句,从名为 `student` 的数据表中选择出所有学生的姓名(name)和年龄(age)信息,并为它们取别名为 `学生姓名` 和 `学生年龄`。 select name as 学生姓名, age as 学生年龄 from student; -- 查询 - 常量和运算 -- 请编写一条 SQL 查询语句,从名为`student`的数据表中选择出所有学生的姓名(name)和分数(score),并且额外计算出分数的 2 倍(double_score)。 select name, score, 2 * score as double_score from student; -- 条件查询 - where -- 请编写一条 SQL 查询语句,从名为`student` 的数据表中选择出所有学生的姓名(name)和成绩(score),要求学生姓名为 '鱼皮'。 select name, score from student where name = '鱼皮' -- 条件查询 - 运算符 -- 请编写一条 SQL 查询语句,从名为 `student` 的数据表中选择出所有学生的姓名(name)和年龄(age),要求学生姓名不等于 '热dog' 。 select name, age from student where name != '热dog' -- 条件查询 - 空值 -- 请编写一条 SQL 查询语句,从名为 `student` 的数据表中选择出所有学生的姓名(name)、年龄(age)和成绩(score),要求学生年龄不为空值。 select name, age, score from student where age is not null; -- 条件查询 - 模糊查询 -- 请编写一条 SQL 查询语句,从名为 `student` 的数据表中选择出所有学生的姓名(name)和成绩(score),要求姓名(name)不包含 "李" 这个字。 select name, score from student where name not like '%李%' -- 条件查询 - 逻辑运算 -- 请编写一条 SQL 查询语句,从名为 `student` 的数据表中选择出所有学生的姓名(name)、成绩(score),要求学生的姓名包含 "李",或者成绩(score)大于 500。 select name, score from student where name like '%李%' or score >= 500 -- 去重 -- 请编写一条 SQL 查询语句,从名为 `student` 的数据表中选择出所有不重复的班级 ID(class_id)和考试编号(exam_num)的组合。 select distinct class_id, exam_num from student -- 排序 -- 请编写一条 SQL 查询语句,从名为 `student` 的数据表中选择出学生姓名(name)、年龄(age)和成绩(score),首先按照成绩从大到小排序,如果成绩相同,则按照年龄从小到大排序。 select name, age, score from student order by score desc, age asc -- 截断和偏移 -- 请编写一条 SQL 查询语句,从名为 `student` 的数据表中选择学生姓名(name)和年龄(age),按照年龄从小到大排序,从第 2 条数据开始、截取 3 个学生的信息。 select name, age from student order by age asc limit 1, 3 -- 条件分支 -- 假设有一个学生表 `student`,包含以下字段:`name`(姓名)、`age`(年龄)。请你编写一个 SQL 查询,将学生按照年龄划分为三个年龄等级(age_level):60 岁以上为 "老同学",20 岁以上(不包括 60 岁以上)为 "年轻",20 岁及以下、以及没有年龄信息为 "小同学"。返回结果应包含学生的姓名(name)和年龄等级(age_level),并按姓名升序排序。 select name, case when (age > 60) then '老同学' when (age > 20) then '年轻' else '小同学' end as age_level from student order by name asc -- 函数 - 时间函数 -- 假设有一个学生表 `student`,包含以下字段:`name`(姓名)、`age`(年龄)。请你编写一个 SQL 查询,展示所有学生的姓名(name)和当前日期(列名为 "当前日期")。 select name, date () as 当前日期 from student -- 函数 - 字符串处理 -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)。请你编写一个 SQL 查询,筛选出姓名为 '热dog' 的学生,展示其学号(id)、姓名(name)及其大写姓名(upper_name)。 select id, name, upper(name) as upper_name from student where name = '热dog' -- 函数 - 聚合函数 -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`class_id`(班级编号)、`score`(成绩)。请你编写一个 SQL 查询,汇总学生表中所有学生的总成绩(total_score)、平均成绩(avg_score)、最高成绩(max_score)和最低成绩(min_score)。 select sum(score) as total_score, avg(score) as avg_score, max(score) as max_score, min(score) as min_score from student -- 分组聚合 - 单字段分组 -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`class_id`(班级编号)、`score`(成绩)。请你编写一个 SQL 查询,统计学生表中的班级编号(class_id)和每个班级的平均成绩(avg_score)。 select class_id, avg(score) as avg_score from student group by class_id -- 分组聚合 - 多字段分组 -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`class_id`(班级编号)、`exam_num`(考试次数)、`score`(成绩)。请你编写一个 SQL 查询,统计学生表中的班级编号(class_id),考试次数(exam_num)和每个班级每次考试的总学生人数(total_num)。 select class_id, exam_num, count(*) as total_num from student group by class_id, exam_num -- 分组聚合 - having 子句 -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`class_id`(班级编号)、`score`(成绩)。请你编写一个 SQL 查询,统计学生表中班级的总成绩超过 150 分的班级编号(class_id)和总成绩(total_score)。 select class_id, sum(score) as total_score from student group by class_id having total_score > 150 -- 查询进阶 - 关联查询 - cross join -- 假设有一个学生表 `student` ,包含以下字段:id(学号)、name(姓名)、age(年龄)、class_id(班级编号);还有一个班级表 `class` ,包含以下字段:id(班级编号)、name(班级名称)。请你编写一个 SQL 查询,将学生表和班级表的所有行组合在一起,并返回学生姓名(student_name)、学生年龄(student_age)、班级编号(class_id)以及班级名称(class_name)。 select s.name as student_name, s.age as student_age, s.class_id, c.name as class_name from student s cross join class c -- 查询进阶 - 关联查询 - inner join -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`age`(年龄)、`class_id`(班级编号)。还有一个班级表 `class`,包含以下字段:`id`(班级编号)、`name`(班级名称)、`level`(班级级别)。请你编写一个 SQL 查询,根据学生表和班级表之间的班级编号进行匹配,返回学生姓名(`student_name`)、学生年龄(`student_age`)、班级编号(`class_id`)、班级名称(`class_name`)、班级级别(`class_level`)。 select s.name as student_name, s.age as student_age, s.class_id, c.name as class_name, c.level as class_level from student s join class c on s.class_id = c.id -- 查询进阶 - 关联查询 - outer join -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`age`(年龄)、`class_id`(班级编号)。还有一个班级表 `class`,包含以下字段:`id`(班级编号)、`name`(班级名称)、`level`(班级级别)。请你编写一个 SQL 查询,根据学生表和班级表之间的班级编号进行匹配,返回学生姓名(`student_name`)、学生年龄(`student_age`)、班级编号(`class_id`)、班级名称(`class_name`)、班级级别(`class_level`),要求必须返回所有学生的信息(即使对应的班级编号不存在)。 select s.name as student_name, s.age as student_age, s.class_id, c.name as class_name, c.level as class_level from student s left join class c on s.class_id = c.id -- 查询进阶 - 子查询 -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`age`(年龄)、`score`(分数)、`class_id`(班级编号)。还有一个班级表 `class`,包含以下字段:`id`(班级编号)、`name`(班级名称)。请你编写一个 SQL 查询,使用子查询的方式来获取存在对应班级的学生的所有数据,返回学生姓名(`name`)、分数(`score`)、班级编号(`class_id`)字段。 select name, score, class_id from student where class_id in ( select id from class ) -- 查询进阶 - 子查询 - exists -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`age`(年龄)、`score`(分数)、`class_id`(班级编号)。还有一个班级表 `class`,包含以下字段:`id`(班级编号)、`name`(班级名称)。请你编写一个 SQL 查询,使用 exists 子查询的方式来获取 **不存在对应班级的** 学生的所有数据,返回学生姓名(`name`)、年龄(`age`)、班级编号(`class_id`)字段。 select name, age, class_id from student where not exists ( select id from class where class.id = student.class_id ) -- 查询进阶 - 组合查询 -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`age`(年龄)、`score`(分数)、`class_id`(班级编号)。还有一个新学生表 `student_new`,包含的字段和学生表完全一致。请编写一条 SQL 语句,获取所有学生表和新学生表的学生姓名(`name`)、年龄(`age`)、分数(`score`)、班级编号(`class_id`)字段,要求保留重复的学生记录。 select name, age, score, class_id from student union all select name, age, score, class_id from student_new -- 查询进阶 - 开窗函数 - sum over -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`age`(年龄)、`score`(分数)、`class_id`(班级编号)。请你编写一个 SQL 查询,返回每个学生的详细信息(字段顺序和原始表的字段顺序一致),并计算每个班级的学生平均分(class_avg_score)。 select id, name, age, score, class_id, avg(score) over(partition by class_id) as class_avg_score from student -- 查询进阶 - 开窗函数 - sum over order by -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`age`(年龄)、`score`(分数)、`class_id`(班级编号)。请你编写一个 SQL 查询,返回每个学生的详细信息(字段顺序和原始表的字段顺序一致),并且按照分数升序的方式累加计算每个班级的学生总分(class_sum_score)。 select id, name, age, score, class_id, sum(score) over (partition by class_id order by score asc) as class_sum_score from student -- 查询进阶 - 开窗函数 - rank -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`age`(年龄)、`score`(分数)、`class_id`(班级编号)。请你编写一个 SQL 查询,返回每个学生的详细信息(字段顺序和原始表的字段顺序一致),并且按照分数降序的方式计算每个班级内的学生的分数排名(ranking)。 select id, name, age, score, class_id, rank() over(partition by class_id order by score desc) as ranking from student -- 查询进阶 - 开窗函数 - row_number -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`age`(年龄)、`score`(分数)、`class_id`(班级编号)。请你编写一个 SQL 查询,返回每个学生的详细信息(字段顺序和原始表的字段顺序一致),并且按照分数降序的方式给每个班级内的学生分配一个编号(row_number)。 select id, name, age, score, class_id, row_number() over(partition by class_id order by score desc) as row_number from student -- 查询进阶 - 开窗函数 - lag / lead -- 假设有一个学生表 `student`,包含以下字段:`id`(学号)、`name`(姓名)、`age`(年龄)、`score`(分数)、`class_id`(班级编号)。请你编写一个 SQL 查询,返回每个学生的详细信息(字段顺序和原始表的字段顺序一致),并且按照分数降序的方式获取每个班级内的学生的前一名学生姓名(prev_name)、后一名学生姓名(next_name)。 select id, name, age, score, class_id, lag(name) over(partition by class_id order by score desc) as prev_name, lead(name) over (partition by class_id order by score desc) as next_name from student
还没有评论,来说两句吧...