3.1 单表查询四步曲——单表查询

  数据库管理系统最重要的功能就是数据查询,数据查询不仅仅是简单的从数据库中提取数据,还需要根据业务要求对查询的数据进行清洗及整理。而MySQL提供了一系列功能强大、灵活的SQL语句来实现查询操作,本节作为数据库查询的起始章节,将介绍如何使用select语句进行单表查询,并且在单表查询中如何实现筛选、分组、排序等操作。

3.1.1 select查询框架需牢记

  使用select语句从数据库中查询数据是数据分析师日常最基本的工作内容,那么select语句的基础框架是怎样的?该如何利用select语句进行数据表查询?编译select语句需要注意哪些细节?接下来,将逐一为大家答疑解惑。
(1)select语句长啥样

select column_name from table_name

注意:实际操作中我们经常会看到类似select * from table_name; 其中*是通配符,表示查询数据表中所有字段。

本节将使用样例表emp,表结构及创建语句如下:

字段名称 数据类型 备注
empno int(10) 员工编号
ename varchar(20) 员工姓名
job varchar(20) 员工职位
leader int(10) 直系领导
hiredate datetime(6) 雇佣时间
sal float(20) 员工薪资
comm float(20) 员工津贴
deptno int(10) 部门编号

这时我们查看emp表中所有的字段。
MySQL输入及输出如下:

接下来将数据插入emp表中,再执行查询语句,emp表数据如下:

empno ename job leader hiredate sal comm deptno
3005 chloe salesman 3001 1987-02-20 5600 6000 3
3002 danae salesman 3001 1987-02-24 6000 10000 3
3005 chloe salesman 3001 1987-02-20 5600 6000 3
3002 danae salesman 3001 1987-02-24 6000 10000 3
1001 blanche persident   1980-11-17 50000   1
2001 an manager 1001 1982-09-02 35000 5000 2
3003 snow salesman 3001 1991-11-28 5500 5400 3
3004 celina manager 1001 1982-07-01 30000 5000 3
1002 sicily manager 1001 1981-06-09 25000 5000 1
2002 claudia analyst 2001 1985-11-17 30000   2
2003 elina analyst 2001 1987-04-19 24000   2
3001 dolores salesman 3001 1985-07-08 5500 2000 3
1011 claudia clerk 2001 1987-05-23 9000   2
3006 laraine clerk 3001 1992-12-03 9500   3
2004 gina analyst 2001 1991-12-03 18000   2
1003 nana clerk 1002 1992-01-23 8000   1

MySQL输入及输出如下:

(2)select语句及它的四个子句

select  column_name  from  table_name
where  
group by  
having
order by

注意事项:
① 四个子句使用顺序不能颠倒;
② 四个子句可少用但不可多用或重复使用;
③ having子句与group by子句连用,没有group by不能用having,但没有having仍可使用group by。

  接下来我们尝试利用这四个子句完成一个比较复杂的业务需求:
查询单个员工薪资高于20000且总人数大于1的职位,按照总人数由小到大进行排序。当我们拿到比较复杂的业务需求时,首先要学会对业务需求进行拆解,上述需求可以拆解为以下几个部分:
① 筛选出薪资高于20000的员工——条件查询where
② 按职位进行分组并计算总人数——分组查询group by
③ 筛选出总人数大于1的职位——分组后筛选having
④ 按照总人数由小到大进行排序——排序查询order by
根据我们的分析,MySQL输入及输出如下:

3.1.1 select查询框架需牢记

  条件查询作为select语句中第一条子句,在数据库日常查询过程中使用率大概达到了80%以上,例如提取某个地区的用户表或者是某一天的订单表等。MySQL中使用where对数据进行条件查询,基本语法形式为:

select column_name from table_name
where 查询条件;

(1)查询指定行
【例】查询emp表中所有salesman销售人员的数据,MySQL输入及输出如下:

逻辑操作符 备注
= 相等
!=,<> 不相等
> 大于
>= 大于等于
< 小于
<= 小于等于
between …and … 介于两者之间

(2)查询空值
【例】查询emp表中comm津贴为空的员工,MySQL输入及输出如下:

注意:MySQL中null空值不属于任何数据类型,有且只能与is连用,其中is null表示为空,is not null表示非空。

(3)多条件查询
【例】查询emp表中部门编号为1和2的员工,MySQL输入及输出如下:

注意:MySQL进行多条件判断时,如果字段相同,可以用in来减少代码冗余,上述句式可改写成:

【例】查询emp表中部门编号为1和部门编号为2中薪资大于20000的员工
上述需求可以拆解为以下几个部分:
① 查询部门编号为1的员工
② 查询部门编号为2且薪资大于20000的员工
根据我们的分析,MySQL输入及输出如下:

注意:MySQL做多条件查询时会用到and/or作为连接符,and表示且,or表示或。当判断条件多于两个时,我们需要注意判断条件的先后顺序,必要时可添加括号。

(4)模糊查询
【例】查询emp表中员工姓名第二个字母为a的数据,MySQL输入及输出如下:

注意:模糊查询通常用于检索字符串类型数据。

3.2.3 数据分组巧用group by

  数据查询时经常会遇到分组的情况,分组查询是对数据按照单个或多个字段进行分组,通常会与count()、sum()等集合函数一起使用,MySQL中使用group by对数据进行分组,基本语法格式为:

select column_name from table_name
group by 字段;

(1)单字段分组
【例】查询emp表中各部门薪资总和,MySQL输入及输出如下:

(2)多字段分组
【例】查询emp表中各部门、各职位薪资总和,MySQL输入及输出如下:

(3)条件判断与数据分组
【例】查询emp表中各部门员工薪资大于10000的人数
上述需求可以拆解为以下几个部分:
① 员工薪资大于10000
② 各部门员工人数
根据我们的分析,MySQL输入及输出如下:

3.2.4 分组后筛选别忘having

  having子句用来筛选满足条件的分组,因此只有当数据分组后才会使用having子句,MySQL基本语法格式为:

select column_name from table_name
group by 字段
having 条件表达式;

【例】查询emp表中各部门、各职位薪资总和大于20000的数据,MySQL输入及输出如下:

3.2.5 整齐排序还看order by

  通常情况下为了更清晰的展示数据集,我们需要对查询的数据结果进行排序,MySQL中使用order by进行数据排序,基本语法格式为:

select column_name from table_name
order by 字段;

(1)单字段排序
【例】查询emp表中所有数据,并按sal薪资由小到大升序排列,MySQL输入及输出如下:

注意:MySQL也支持数据由大到小进行降序排列,只需在字段后加desc固定语法即可。
【例】查询emp表中所有数据,并按sal薪资由大到小降序排列,MySQL输入及输出如下:

(2)多字段排序
【例】查询emp表中所有数据,并按deptno部门编号升序,sal薪资降序排列,MySQL输入及输出如下:

多字段排序时需要注意:
① 多个需要排序的字段间用逗号分隔;
② 字段前后位置要与业务需求一致;
③ 哪个字段需要降序排列则desc紧随其后;
(3)分组排序
【例】查询emp表中各部门薪资总和,按薪资总和降序排列,MySQL输入及输出如下:

练习

根据样例表emp,我们来尝试以下练习:
1、查询姓名首字母为c,薪资高于6000,津贴不为空的员工。
2、查询人数超过1个的职位,并按照人数升序排列。
3、尝试用两种方法查询职位为analyst分析师的员工人数。

练习答案

1、第一题的语句如下:

2、第二题的语句如下:

3、第三题的语句如下:
方法1

方法2

分类: 数据库技术