数据查询是数据库的核心操做。在mysql中咱们使用 select
语句进行数据查询。本篇文章将学习在单表中进行数据查询的一些操做。mysql
进入数据库,导入咱们学习查询所须要的数据。 sql
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
后面全部的属性列。如咱们查询全体学生的信息,代码以下: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;
复制代码
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;
复制代码
本章学习了关于单表数据的查询操做,内容比较多,知识点比较基础。今天的学习到此结束,有什么不对或不许确的地方,欢迎在评论区指定出来。