SQL之母_sql自学网站例题

发布时间 2023-08-18 18:24:48作者: 鸭叭越宝

http://sqlmother.yupi.icu/
感觉还是直接写题对我有效果些 虽然我有点容易知难而退。

请编写一条 SQL 查询语句,从名为student的数据表中选择出所有学生的姓名(name)和分数(score),并且额外计算出分数的 2 倍(double_score)。

点击查看代码
select name,score,score*2 as double_score from student;

请编写一条 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)的组合。distinct

点击查看代码
select distinct class_id,exam_num from student;

请编写一条 SQL 查询语句,从名为 student 的数据表中选择出学生姓名(name)、年龄(age)和成绩(score),首先按照成绩从大到小排序,如果成绩相同,则按照年龄从小到大排序。asc--升序 desc--降序

点击查看代码
select name,age,score from student order by score desc,age asc;

请编写一条 SQL 查询语句,从名为 student 的数据表中选择学生姓名(name)和年龄(age),按照年龄从小到大排序,从第 2 条数据开始、截取 3 个学生的信息。

点击查看代码
-- 在 SQL 中,我们使用 LIMIT 关键字来实现数据的截断和偏移。
-- 截断和偏移的一个典型的应用场景是分页,即网站内容很多时,用户可以根据页号每次只看部分数据。
select name,age from student order by age limit 1,3;

假设有一个学生表 student,包含以下字段:name(姓名)、age(年龄)。请你编写一个 SQL 查询,将学生按照年龄划分为三个年龄等级(age_level):60 岁以上为 "老同学",20 岁以上(不包括 60 岁以上)为 "年轻",20 岁及以下、以及没有年龄信息为 "小同学"。返回结果应包含学生的姓名(name)和年龄等级(age_level),并按姓名升序排序。

点击查看代码

 -- 请在此处输入 SQL
select
  name,
  case
    when (age > 60) then '老同学'
    when (age > 20 and age <=60) then '年轻'
    when (age <=20 or age is null) then '小同学'
  end as age_level
from
  student
order by
  name asc;

14 假设有一个学生表 student,包含以下字段:name(姓名)、age(年龄)。请你编写一个 SQL 查询,展示所有学生的姓名(name)和当前日期(列名为 "当前日期")。

点击查看代码
select name,DATE() as '当前日期' from student;

假设有一个学生表 student,包含以下字段:id(学号)、name(姓名)。请你编写一个 SQL 查询,筛选出姓名为 '热dog' 的学生,展示其学号(id)、姓名(name)及其大写姓名(upper_name)。使用字符串处理函数 LENGTH 计算姓名长度

点击查看代码
`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)。

点击查看代码
sql
-- 请在此处输入 SQL
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)。

点击查看代码
sql
-- 请在此处输入 SQL
select class_id, avg(score) as avg_score from student group by class_id;

假设有一个学生表 student,包含以下字段:id(学号)、name(姓名)、class_id(考试班级编号)、exam_num(考试次数)、score(成绩)。请你编写一个 SQL 查询,统计学生表中每个班级每次考试的总学生人数(total_num)。

点击查看代码 ``` sql -- 请在此处输入 SQL select class_id,exam_num,count(*) as total_num from student group by class_id,exam_num; ```
区分count和sum:count用于行数统计,sum用于求和(sum遇到null会不计算) [区分count和sum](https://blog.csdn.net/huanghai_fu/article/details/117263069)

假设有一个学生表 student,包含以下字段:id(学号)、name(姓名)、class_id(班级编号)、score(成绩)。请你编写一个 SQL 查询,统计学生表中班级的总成绩超过 150 分的班级编号(class_id)和总成绩(total_score)。

在 SQL 中,HAVING 子句用于在分组聚合后对分组进行过滤。它允许我们对分组后的结果进行条件筛选,只保留满足特定条件的分组。
HAVING 子句与条件查询 WHERE 子句的区别在于,WHERE 子句用于在 分组之前 进行过滤,而 HAVING 子句用于在 分组之后 进行过滤。

点击查看代码 ``` ```sql -- 请在此处输入 SQL select class_id,sum(score) as total_score from student group by class_id having total_score > 150 ```

假设有一个学生表 student ,包含以下字段:id(学号)、name(姓名)、age(年龄)、class_id(班级编号);还有一个班级表 class ,包含以下字段:id(班级编号)、name(班级名称)。请你编写一个 SQL 查询,将学生表和班级表的所有行组合在一起,并返回学生姓名(student_name)、学生年龄(student_age)、班级编号(class_id)以及班级名称(class_name)。

在之前的教程中,我们所有的查询操作都是在单个数据表中进行的。但有时,我们可能希望在单张表的基础上,获取更多额外数据,比如获取学生表中学生所属的班级信息等。这时,就需要使用关联查询。

在 SQL 中,关联查询是一种用于联合多个数据表中的数据的查询方式。

其中,CROSS JOIN 是一种简单的关联查询,不需要任何条件来匹配行,它直接将左表的 每一行 与右表的 每一行 进行组合,返回的结果是两个表的笛卡尔积。

点击查看代码
-- 请在此处输入 SQL
select s.name as student_name,age as student_age,class_id,c.name as class_name from student s cross join class c;

假设有一个学生表 student,包含以下字段:id(学号)、name(姓名)、age(年龄)、class_id(班级编号)。还有一个班级表 class,包含以下字段:id(班级编号)、name(班级名称)、level(班级级别)。 请你编写一个 SQL 查询,根据学生表和班级表之间的班级编号进行匹配,返回学生姓名(student_name)、学生年龄(student_age)、班级编号(class_id)、班级名称(class_name)、班级级别(class_level)。

使用 INNER_JOIN 后,只有两个表之间存在对应关系的数据才会被放到查询结果中。在 SQL 中,INNER JOIN 是一种常见的关联查询方式,它根据两个表之间的关联条件,将满足条件的行组合在一起。
注意,INNER JOIN 只返回两个表中满足关联条件的交集部分,即在两个表中都存在的匹配行。

点击查看代码
select
  s.name as student_name,
  s.age as student_age,
  s.class_id as class_id,
  c.name as class_name,
  c.level as class_level
from
  student s join class c
on
  s.class_id = c.id

在 SQL 中,OUTER JOIN 是一种关联查询方式,它根据指定的关联条件,将两个表中满足条件的行组合在一起,并 包含没有匹配的行 。
在 OUTER JOIN 中,包括 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 两种类型,它们分别表示查询左表和右表的所有行(即使没有被匹配),再加上满足条件的交集部分。

假设有一个学生表 student,包含以下字段:id(学号)、name(姓名)、age(年龄)、class_id(班级编号)。还有一个班级表 class,包含以下字段:id(班级编号)、name(班级名称)、level(班级级别)。 请你编写一个 SQL 查询,根据学生表和班级表之间的班级编号进行匹配,返回学生姓名(student_name)、学生年龄(student_age)、班级编号(class_id)、班级名称(class_name)、班级级别(class_level),要求必须返回所有学生的信息(即使对应的班级编号不存在)。

点击查看代码
-- 请在此处输入 SQL
select s.name student_name,s.age student_age,s.class_id,c.name class_name,c.level 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)字段。

点击查看代码
-- 请在此处输入 SQL
select name, score, class_id from student where class_id in (select distinct id from class);

子查询是指在一个查询语句内部 嵌套 另一个完整的查询语句,内层查询被称为子查询。子查询可以用于获取更复杂的查询结果或者用于过滤数据。

当执行包含子查询的查询语句时,数据库引擎会首先执行子查询,然后将其结果作为条件或数据源来执行外层查询。

假设有一个学生表 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 class_id from class where id = student.class_id)

假设有一个学生表 student,包含以下字段:id(学号)、name(姓名)、age(年龄)、score(分数)、class_id(班级编号)。还有一个新学生表 student_new,包含的字段和学生表完全一致。

请编写一条 SQL 语句,获取所有学生表和新学生表的学生姓名(name)、年龄(age)、分数(score)、班级编号(class_id)字段,要求保留重复的学生记录。
在 SQL 中,组合查询是一种将多个 SELECT 查询结果合并在一起的查询操作。
包括两种常见的组合查询操作:UNION 和 UNION ALL。
UNION 操作:它用于将两个或多个查询的结果集合并, 并去除重复的行 。即如果两个查询的结果有相同的行,则只保留一行。
UNION ALL 操作:它也用于将两个或多个查询的结果集合并, 但不去除重复的行 。即如果两个查询的结果有相同的行,则全部保留。

点击查看代码
 -- 请在此处输入 SQL
select
  name,age,score,class_id
from
  student
union all
select
  name,age,score,class_id
from
  student_new