SQL之母闯关练习题(一)

一、基础语法

**查询 **
建表

-- `student`
create table if not exists `student`
(
    `id`       integer          not null primary key AUTOINCREMENT,
    `name`     varchar(256)     not null,
    `age`      int              null,
    `class_id`    bigint           not null,
    `score`    double default 0 null,
    `exam_num` int    default 0 null
);

insert into `student` (`name`, `age`, `class_id`, `score`, `exam_num`)
values ('鸡哥', 25, 1, 2.5, 1);
insert into `student` (`name`, `age`, `class_id`, `score`, `exam_num`)
values ('鱼皮', 18, 1, 400, 4);
insert into `student` (`name`, `age`, `class_id`, `score`, `exam_num`)
values ('热dog', 40, 2, 600, 4);
insert into `student` (`name`, `age`, `class_id`, `score`, `exam_num`)
values ('摸FISH', null, 2, 360, 4);
insert into `student` (`name`, `age`, `class_id`, `score`, `exam_num`)
values ('李阿巴', 19, 3, 120, 2);
insert into `student` (`name`, `age`, `class_id`, `score`, `exam_num`)
values ('老李', 56, 3, 500, 4);
insert into `student` (`name`, `age`, `class_id`, `score`, `exam_num`)
values ('李变量', 24, 4, 390, 3);
insert into `student` (`name`, `age`, `class_id`, `score`, `exam_num`)
values ('王加瓦', 23, 4, 0, 4);
insert into `student` (`name`, `age`, `class_id`, `score`, `exam_num`)
values ('赵派森', 80, 4, 600, 4);
insert into `student` (`name`, `age`, `class_id`, `score`, `exam_num`)
values ('孙加加', 60, 5, 100.5, 1);

1.请编写 SQL 查询语句,从名为 student 的数据表中查询出所有学生的信息。

select * from student

2.请编写一条 SQL 查询语句,从名为 student 的数据表中选择出所有学生的姓名(name)和年龄(age)信息。

注意,所有题目的 数据列输出顺序必须和题目的要求保持一致 !比如本题必须学生姓名(name)在前,年龄(age)在后。

select name, age from student

3.请编写一条 SQL 查询语句,从名为 student 的数据表中选择出所有学生的姓名(name)和年龄(age)信息,并为它们取别名为 学生姓名 和 学生年龄。

select name as 学生姓名, age as 学生年龄 from student

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

select name, score , score * 2 as double_score from student

5.请编写一条 SQL 查询语句,从名为student 的数据表中选择出所有学生的姓名(name)和成绩(score),要求学生姓名为 ‘鱼皮’。

select name, score from student where name = '鱼皮'

6.请编写一条 SQL 查询语句,从名为 student 的数据表中选择出所有学生的姓名(name)和年龄(age),要求学生姓名不等于 ‘热dog’ 。

select name, age from student where name != '热dog'

7.请编写一条 SQL 查询语句,从名为 student 的数据表中选择出所有学生的姓名(name)、年龄(age)和成绩(score),要求学生年龄不为空值。

select name, age, score from student where age is not null

在SQL查询中,我们可以使用 “IS NULL” 和 “IS NOT NULL” 来判断字段是否为空值或非空值。

8.模糊查询
百分号(%):表示任意长度的任意字符序列。
下划线(_):表示任意单个字符。
示例:在这里插入图片描述
题目
请编写一条 SQL 查询语句,从名为 student 的数据表中选择出所有学生的姓名(name)和成绩(score),要求姓名(name)不包含 “李” 这个字。

select name, score from student where name not like '%李%'

9.逻辑运算
逻辑运算是一种在条件查询中使用的运算符,它允许我们结合多个条件来过滤出符合特定条件的数据。

在逻辑运算中,常用的运算符有:

AND:表示逻辑与,要求同时满足多个条件,才返回 true。
OR:表示逻辑或,要求满足其中任意一个条件,就返回 true。
NOT:表示逻辑非,用于否定一个条件(本来是 true,用了 not 后转为 false)
在这里插入图片描述
题目
请编写一条 SQL 查询语句,从名为 student 的数据表中选择出所有学生的姓名(name)、成绩(score),要求学生的姓名包含 “李”,或者成绩(score)大于 500。

select name, score from student where name like '%李%' or score > 500

9.去重
教程
在 SQL 中,我们可以使用 DISTINCT 关键字来实现去重操作。
在这里插入图片描述
题目
请编写一条 SQL 查询语句,从名为 student 的数据表中选择出所有不重复的班级 ID(class_id)和考试编号(exam_num)的组合。

select distinct class_id, exam_num from student

10.排序
在 SQL 中,我们可以使用 ORDER BY 关键字来实现排序操作。ORDER BY 后面跟上需要排序的字段,可以选择升序(ASC)或降序(DESC)排列。
示例
在这里插入图片描述在这里插入图片描述
题目
请编写一条 SQL 查询语句,从名为 student 的数据表中选择出学生姓名(name)、年龄(age)和成绩(score),首先按照成绩从大到小排序,如果成绩相同,则按照年龄从小到大排序。

select name, age, score from student order by score DESC, age ASC

11.截断和偏移
在 SQL 中,我们使用 LIMIT 关键字来实现数据的截断和偏移。
截断和偏移的一个典型的应用场景是分页,即网站内容很多时,用户可以根据页号每次只看部分数据。
在这里插入图片描述
在这里插入图片描述
题目
请编写一条 SQL 查询语句,从名为 student 的数据表中选择学生姓名(name)和年龄(age),按照年龄从小到大排序,从第 2 条数据开始、截取 3 个学生的信息。

select name, age from student order by age ASC limit 1, 3

12.条件分支
条件分支 case when 是 SQL 中用于根据条件进行分支处理的语法。它类似于其他编程语言中的 if else 条件判断语句,允许我们根据不同的条件选择不同的结果返回。
使用 case when 可以在查询结果中根据特定的条件动态生成新的列或对现有的列进行转换。
在这里插入图片描述
在这里插入图片描述
题目
假设有一个学生表 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

时间函数
在 SQL 中,时间函数是用于处理日期和时间的特殊函数。它们允许我们在查询中操作和处理日期、时间、日期时间数据,从而使得在数据库中进行时间相关的操作变得更加方便和灵活。
常用的时间函数有:
DATE:获取当前日期
DATETIME:获取当前日期时间
TIME:获取当前时间
在这里插入图片描述
题目
假设有一个学生表 student,包含以下字段:name(姓名)、age(年龄)。
请你编写一个 SQL 查询,展示所有学生的姓名(name)和当前日期(列名为 “当前日期”)。

select name, date() as 当前日期 from student

字符串处理
在 SQL 中,字符串处理是一类用于处理文本数据的函数。它们允许我们对字符串进行各种操作,如转换大小写、计算字符串长度以及搜索和替换子字符串等。字符串处理函数可以帮助我们在数据库中对字符串进行加工和转换,从而满足不同的需求。
在这里插入图片描述
在这里插入图片描述
题目
假设有一个学生表 student,包含以下字段:id(学号)、name(姓名)。请你编写一个 SQL 查询,筛选出姓名为 ‘热dog’ 的学生,展示其学号(id)、姓名(name)及其大写姓名(upper_name)。

select id, name, upper(name) as upper_name from student where name = '热dog'

聚合函数
在 SQL 中,聚合函数是一类用于对数据集进行 汇总计算 的特殊函数。它们可以对一组数据执行诸如计数、求和、平均值、最大值和最小值等操作。聚合函数通常在 SELECT 语句中配合 GROUP BY 子句使用,用于对分组后的数据进行汇总分析。
常见的聚合函数包括:
COUNT:计算指定列的行数或非空值的数量。
SUM:计算指定列的数值之和。
AVG:计算指定列的数值平均值。
MAX:找出指定列的最大值。
MIN:找出指定列的最小值。
在这里插入图片描述
在这里插入图片描述
题目
假设有一个学生表 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

单字段分组
SQL 中,分组聚合是一种对数据进行分类并对每个分类进行聚合计算的操作。它允许我们按照指定的列或字段对数据进行分组,然后对每个分组应用聚合函数,如 COUNT、SUM、AVG 等,以获得分组后的汇总结果。
举个例子:某个学校可以按照班级将学生分组,并对每个班级进行统计。查看每个班级有多少学生、每个班级的平均成绩。这样我们就能够对学校各班的学生情况有一个整体的了解,而不是单纯看个别学生的信息。
在 SQL 中,通常使用 GROUP BY 关键字对数据进行分组。
在这里插入图片描述
在这里插入图片描述
题目
假设有一个学生表 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

多字段分组
有时,单字段分组并不能满足我们的需求,比如想统计学校里每个班级每次考试的学生情况,这时就可以使用多字段分组。
多字段分组和单字段分组的实现方式几乎一致,使用 GROUP BY 语法即可。
在这里插入图片描述
题目
假设有一个学生表 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 子句
在 SQL 中,HAVING 子句用于在分组聚合后对分组进行过滤。它允许我们对分组后的结果进行条件筛选,只保留满足特定条件的分组。
HAVING 子句与条件查询 WHERE 子句的区别在于,WHERE 子句用于在 分组之前 进行过滤,而 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 
    sum(score) > 150

关联查询 - cross join

待续…

在这里插入代码片
在这里插入代码片
  • 38
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sqllibs闯关是一个关于SQL注入的平台,它提供了一系列的挑战和实践,让用户可以学习和测试SQL注入攻击的技术。通过在sqllibs闯关完成各种任务,用户可以提升他们对SQL注入的理解和技能。在这个平台上,用户可以使用各种工具和技术来尝试不同类型的SQL注入攻击,如基于错误的注入、联合查询注入等。用户可以通过检测和利用应用程序SQL注入漏洞来获取敏感信息或者执行任意的数据库操作。通过挑战和实践,用户可以提高他们对SQL注入攻击的防御意识,并学习如何编写安全的代码来防止这类攻击。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [sql-lib 闯关课程第一课](https://blog.csdn.net/m0_37175113/article/details/105753588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [sqli-libs(1-6)闯关笔记(纯手注)](https://blog.csdn.net/qq_40671478/article/details/107968190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值