数据查询是数据库的核心操作。在mysql中我们使用 select
语句进行数据查询。本篇文章将学习在单表中进行数据查询的一些操作。
准备工作
进入数据库,导入我们学习查询所需要的数据。
进入mysql,创建一个school
数据库,然后通过 source d:\school.sql
把数据导入school
数据库中。source
后面跟的是SQL文件的路径(根据你的SQL文件所在的实际位置进行填写)。可以关注公众号:HarLearn,回复:MySQL数据,获得school.sql
文件。
一共三张表,里面总共几十条数据,用于辅助我们对单表查询的理解。下面开始对查询的学习。
数据查询的格式
MySQL中的数据查询主要是以select
子句为主,里面还附带了一些关键字来丰富我们的查询。下面是单表查询的一般格式:
select 属性列表达式,属性列表达式,...,属性列表达式
from 表名或者视图
where 条件表达式
group by 列名1,列名2,..,列名n
having 条件表达式
order by 列名
limit 起始位置,显示条数
上面这些 关键字不一定都要用到,根据自己的需求进行选择,但是select
和from
是必须的。这些关键字的相对顺序也是固定的,不能乱写位置。下面开始每个关键字的具体用法进行学习:
简单的查询
查询指定列的数据记录
我们可以对表中的需要的部分属性列,进行查询。只需要把属性列(多个属性列时,它们之间需要,
隔开)添加到select
后面。如查询tab_student
表中全体学生的学号和姓名,代码如下:
select s_id, s_name
from tab_student;
查询表中全部列的数据记录
查询全部列,可以把表中的所有列都添加到select
后面。虽然这样操作比较繁琐,但是可以调整显示列的顺序。如果不在乎显示的顺序,也可以使用*
代替select
后面所有的属性列。如我们查询全体学生的信息,代码如下:
select * from tab_student;
对查询的数据记录进行去重
有时我们在查询数据记录时会产生相同的数据,这时可以使用mysql为我们提供的distinct
关键字,下面通过查询 选修了课程的 学生学号 进行演示,代码如下:
# 使用了 distinct 关键字
select distinct s_id
from tab_sc;
#没使用 distinct 关键字
select s_id from tab_sc;
查询和数学中的加、减、乘、除、取模结合使用
在select
后面的属性列中,可以进行简单的数学运算,下面通过查询全体学生的出生年份,了解如何使用运算符,代码如下:
select s_name, 2019-s_age
from tab_student;
上图中在2019-s_age
后面添加了一个birth_year
,它是为2019-s_age
起的一个别名,我们也可以通过关键字as
来实现,如select s_name, 2019-s_age as birth_year from tab_student;
。
查询满足条件的数据记录
MySQL中通过 where
子句为查询设置条件,放在from
的后面。where
后面可以添加关系运算符、逻辑运算符、确定集合、确定范围、检测空值等等。
使用关系运算符
MySQL中的关系运算符有六个分别是:>, <, >=, <=, =, !=
。下面通过几个例子了解它的应用,代码如下:
# 查询计算机科学系全体学生的名单
select s_name
from tab_student
where s_dept = 'CS';
# 查询所有年龄在20岁以下的学生姓名和年龄
select s_name, s_age
from tab_student
where s_age < 20;
确定范围
在MySQL中通过between and
来表示在一个范围间的判断,判断不在这个范围内可以使用not between and
。
注: 这些关键字操作符只针对数字类型。通过下面样例进行理解,代码如下:
# 查询年龄在 20 ~ 23 岁之间的学生。 利用 between and
select s_name, s_age
from tab_student
where s_age between 20 and 23;
# 查询年龄不在 20~23之间的学生。利用 not between and
select s_name, s_age
from tab_student
where s_age not between 20 and 23;
通过上面我们知道,between and
是一个闭区间,[20,23]。
确定集合
通过关键字 in
可以用来判断查找的属性值是否属于指定的集合,与之相反的是not in
,用来判断查找的属性值是否不属于指定的集合。看下面样例:
# 查询计算机系和数学系学生的信息。 利用 in
select *
from tab_student
where s_dept in ('CS','MA');
# 查询不是 计算机系和数学系学生的信息 利用 not in
select *
from tab_student
where s_dept not in ('CS','ma');
注: 使用关键字not in
,查询的集合中如果存在null
,则不会有任何的查询结果。如:select * from tab_course where c_pno not in ( 6,1,null);
不会查询到结果。为什么是这样,应该和 null
的特殊性有关,具体也不清楚,等待解决。
模糊查询
模糊查询解决的是 我们在查询时 只知道字段值部分的情况。比如我们知道有一个同学姓刘,但是具体叫什么不知道。这时,可以使用模糊查询进行查询。模糊查询是通过关键字like
和通配符(_, %)
组合来完成的,通配符也可以省略。_
通配符只能匹配单个字符。%
通配符可以匹配任意长度的字符串,如果匹配%%
则表示查询所有数据记录。下面通过几个样例进行理解:
# 查询2018年入学的学生。 利用 like 模糊查询
select *
from tab_student
where s_id like '2018%';
# 查询名字中第二个字是 白 的学生。利用占位符 _
select *
from tab_student
where s_name like '_白%';
# 查询所有不姓 刘 的学生。 利用 not like
select *
from tab_student
where s_name not like '刘%';
注: 如果查询的字符串本身就包含通配符_
和 %
,可以是使用转义字符(默认是\
)对其转义。或者使用escape
指定一个转义字符。下面通过几个样例进行理解。
# 查询course 表中 database_design 课程的信息。 利用 \ 转义字符
select *
from tab_course
where c_name like '%\_design';
# 查询course 表中 database_design 课程的信息。
# 通过 escape 关键字指定 字符 C 为转义字符
select *
from tab_course
where c_name like '%C_design' escape 'C';
涉及空值的查询
对用空值的查询可以使用关键字is null
或者 is not null
,一个检测是空值,一个检测不是空值。下面通过样例学习它们的使用。
# 查询没有参加考试的学生的学号和课程号。利用 is null
select s_id, c_id
from tab_sc
where sc_grade is null;
# 查询参加考试学生的学号和课程号。利用 is not null
select s_id, c_id
from tab_sc
where sc_grade is not null;
逻辑运算符
逻辑运算符包括:AND(&&) , OR (||), XOR , NOT(!)
。通过逻辑运算符可以连接多个查询条件,下面通过样例进行了解:
# 查询计算机科学系年龄在20岁以下的学生信息
select *
from tab_student
where s_dept = 'CS' and s_age < 20;
对查询结果进行排序
MySQL提供了order by
来设置查询结果的顺序,默认是升序。可以通过关键字DESC
设置为降序,关键字ASC
设置为升序。
# 查询2号课程的学生的学号和成绩, 默认是 升序 也可以使用asc。
select s_id, sc_grade
from tab_sc
where c_id = 2
order by sc_grade;
# 以降序排列。降序使用关键字desc设置
select s_id, sc_grade
from tab_sc
where c_id = 2
order by sc_grade desc;
注: 空值在排序时是最小的。
按照多字段进行排序,在具体运行过程中,首先按照第一个字段进行排序,如果遇到相同的字段,按照第二个字段进行排序。
# 对学生表进行排序,先按照年龄排序,年龄相同时 按照学号排序
select *
from tab_student
order by s_age,s_id;
统计函数和对数据分组
统计函数
MySQL提供了一些函数,为了方便我们做一些统计任务,统计函数在遇到空值时进行忽略(count(*)除外)下面列举几个常用的函数:
函数名 | 描述 |
---|---|
count(*或列名) | 统计数据记录的个数 |
sum(列名) | 计算计算一列值的总和(数值类型) |
avg(列名) | 计算一列值的平均值(数值类型) |
max(列名) | 求一列值中的最大值 |
min(列名) | 求一列值中的最小值 |
# 查询学生总人数。利用count()
select count(*)
from tab_student;
# 查询选修了课程的学生人数,利用 distinct 关键字去除重复
select count(distinct s_id)
from tab_sc;
# 查询全体学生的平均年龄。利用 avg() 函数
select avg(s_age)
from tab_student;
# 查询选择3号课程学生的最高分和最低成绩。利用 max() 和 min()
select max(sc_grade) maxGrade, min(sc_grade) minGrade
from tab_sc
where c_id = 3;
# 查询 201915121 选修课程的总学分。 利用 sum() 函数
select sum(c_credit)
from tab_sc, tab_course
where s_id = '201915121' and tab_sc.c_id = tab_course.c_id;
数据分组
MySQL提供group by
子句将查询结果按某一列或多列的值进行分组,值相同的在一组。在进行多列分组时,首先按照第一个列名进行分组,然后对每一组再按照第二个列名进行分组。 分组后统计函数将作用于每一个组。
# 查询各个课程号及相应的选课人数。利用 group by 分组
select c_id, count(s_id)
from tab_sc
group by c_id;
MySQL中的where
子句主要是作用于基本表或视图,如果实现对分组进行条件限制,可以使用MySQL提供的having
关键字。通过样例来了解:
# 查询平均成绩大于等于 90 分的学生学号和平均成绩。利用 having 进行条件限制
select s_id,avg(sc_grade)
from tab_sc
group by s_id
having avg(sc_grade) >= 90;
限制查询数据显示的数量
通过关键字limit
来限制数据查询结果数量,格式为limit start, row_count
,参数start
设置数据记录的起始位置(省略默认为0),参数row_count
设置显示的行数。经常用在分页系统中,和 order by
一起使用。
# 查询前学生表中前五名学生
select *
from tab_student
limit 5;
# 查询学生表中第五名到第八名的学生
select *
from tab_student
limit 5,3;
小结
本章学习了关于单表数据的查询操作,内容比较多,知识点比较基础。今天的学习到此结束,有什么不对或不准确的地方,欢迎在评论区指定出来。