一、基础语法
**查询 **
建表
-- `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
待续…
在这里插入代码片
在这里插入代码片