MySQL学习笔记之对单表数据记录的查询操作

本文详细介绍了MySQL中对单表数据记录的查询操作,包括查询格式、简单查询、条件查询、排序、分组统计等。通过实例讲解了如何使用SELECT语句查询指定列、去重、使用数学运算、模糊查询、处理空值以及运用逻辑运算符。此外,还探讨了ORDER BY用于结果排序,GROUP BY和聚合函数用于数据分组统计,以及LIMIT用于限制查询结果显示的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据查询是数据库的核心操作。在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 起始位置,显示条数

上面这些 关键字不一定都要用到,根据自己的需求进行选择,但是selectfrom 是必须的。这些关键字的相对顺序也是固定的,不能乱写位置。下面开始每个关键字的具体用法进行学习:

简单的查询

查询指定列的数据记录

我们可以对表中的需要的部分属性列,进行查询。只需要把属性列(多个属性列时,它们之间需要,隔开)添加到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;

限制查询数量

小结

本章学习了关于单表数据的查询操作,内容比较多,知识点比较基础。今天的学习到此结束,有什么不对或不准确的地方,欢迎在评论区指定出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值