3.1 单表查询四步曲——单表查询
24 Oct 2019数据库管理系统最重要的功能就是数据查询,数据查询不仅仅是简单的从数据库中提取数据,还需要根据业务要求对查询的数据进行清洗及整理。而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
分类: 数据库技术