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

数据查询是数据库的核心操做。在mysql中咱们使用 select 语句进行数据查询。本篇文章将学习在单表中进行数据查询的一些操做。mysql

准备工做

进入数据库,导入咱们学习查询所须要的数据。 sql

向数据库中导入数据
进入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后面全部的属性列。如咱们查询全体学生的信息,代码以下:spa

select * from tab_student;
复制代码

查询全体学生的信息

对查询的数据记录进行去重

有时咱们在查询数据记录时会产生相同的数据,这时能够使用mysql为咱们提供的distinct关键字,下面经过查询 选修了课程的 学生学号 进行演示,代码以下:3d

# 使用了 distinct 关键字
select distinct s_id
from tab_sc;

#没使用 distinct 关键字
select s_id from tab_sc;
复制代码

查询选修了课程的学生学号

查询和数学中的加、减、乘、除、取模结合使用

select后面的属性列中,能够进行简单的数学运算,下面经过查询全体学生的出生年份,了解如何使用运算符,代码以下:code

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 后面能够添加关系运算符、逻辑运算符、肯定集合、肯定范围、检测空值等等。cdn

使用关系运算符

MySQL中的关系运算符有六个分别是:>, <, >=, <=, =, !=。下面经过几个例子了解它的应用,代码以下:blog

# 查询计算机科学系全体学生的名单
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;
复制代码

限制查询数量

小结

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

公众号:HarLearn

公众号:HarLearn
相关文章
相关标签/搜索