我们从上篇文章开始,我们已经开始介绍数据库基础知识。上篇文章我们主要给大家介绍了数据的基础,包括几种大型数据库的区别与联系以及学习数据库的必要性,以及还介绍了数据库与数据库管理系统以及数据管理员之间的关系。另外,给大家介绍了数据定义语言,包括数据库的增删改查以及进入数据库的命令。最后给大家介绍了数据操作语言,包括对表中的数据进行增删改查。最后还对delete和truncate进行了对比。本文给大家介绍数据库查询中的单表查询,并且通过一些案例加深对各个知识点的理解。接下来,给大家介绍单表查询:
• 全表查询:
select * from 表名;
• 查询指定列:select 字段1[,字段2,…] from 表名;
• 别名的设置:select 字段名 as 列别名 from 原表名 [as ]表别名;
• 查询不重复的记录:select distinct 字段名 from 表名;
• 条件查询:select 字段1[,字段2,…] from 表名 where 查询条件;
• 空值查询:select 字段1[,字段2,…] from 表名 where 空值字段 is[ not] null;
• 模糊查询:select 字段1[,字段2,…] from 表名 where 字符串字段[ not] like 通配符;
百分号(%)通配符:匹配多个字符
下划线(_)通配符:匹配一个字符
模糊查询只能用于字符串类型的字段
在介绍代码之前,我们首先进入数据库
use test;
show tables;
执行结果如下:
单表查询的代码实现如下:
select * from emp;
具体执行的结果如下:
不过需要我们注意的是:单表查询的结果只是虚拟的结果集,即我们查询表的时候返回的结果只是一张虚拟的临时表,不会占用计算机内存,不会对我们原始的数据产生影响。接下来,对指定的列进行查询,具体代码的实现如下:
select empname, job, sal from emp;
具体执行的结果如下:
给其他字段设置别名,具体实现如下:
-- 设置别名:查询每位员工调整后的薪资(基本工资+1000)
select *, sal+1000 as comm from emp;
具体执行的结果如下:
我们通过一个练习加强对这个知识点的理解:
查询每位员工的年薪(基本工资*12):empno,ename,年薪
select empno, empname, sal*12 as 年薪 from emp;
具体执行的结果如下:
查询不重复的数据,具体实现如下:
select distinct deptno from emp;
select distinct deptno, job from emp;
具体执行的结果如下:
接下来介绍条件查询,用代码实现如下:
-- 查询基本工资大于等于2000小于等于3000的员工信息
select *
from emp
where sal >= 2000 and sal <= 3000;
select *
from emp
where sal between 2000 and 3000;
具体执行的结果如下:
我们通过两个案例来加深对条件查询这一知识点的理解
查询10号部门和20号部门中sal低于2000的员工信息
select *
from emp
where (deptno = 10 or deptno = 20) and sal < 2000;
select *
from emp
where deptno in (10,20) and sal < 2000;
具体执行的结果如下:
这里需要注意的是:我们在方法1中,由于涉及到运算符的先后顺序问题,因此需要加括号来改变其优先级。本sql命令之所以查到空不是命令写的有问题,而是在数据表本身就没有低于2000的,因此,结果显示为空。
查询salesman的所属部门:姓名,职位,所在部门
select empname, deptno,job
from emp
where job = 'salesman';
具体执行的结果如下:
接下来介绍空值查询:
查询mgr为空的记录
select *
from emp
where mgr is null;
-- 当然我们也可以查找不为空的记录
select *
from emp
where mgr is not null;
具体执行的结果如下:
这里需要我们注意的是:在空值查询过程中,由于空值是一种字符,不是任何的一种数值,因此不能用>、<、=来比较大小,而是通过is null
或者is not null
来表示。我们通过一个案例来加深对空值查询的理解:
查询comm不为空的记录
具体实现如下:
select *
from emp
where comm is not null;
具体执行的结果如下:
接下来,给大家介绍单表查询中的模糊查询。
– 查询姓名以a开头的员工信息
具体实现如下:
select *
from emp
where empname like'a%';
具体执行的结果如下:
这里需要我们注意的是:在模糊查询中,我们用到的关键字是like
。我们通过几个案例对模糊查询知识点进行巩固。
查询姓名中包含a的员工信息
具体实现如下:
select *
from emp
where empname like'%a%';
具体执行的结果如下:
查询姓名中第二个字符为a的员工信息
具体实现如下:
select *
from emp
where empname like'_a%';
具体执行的结果如下:
查询员工姓名中不包含s的员工信息
具体实现如下:
select *
from emp
where empname not like '%s%';
具体执行的结果如下:
我们接下来介绍单表查询中的结果查询进行排序:
查询结果排序:
select 字段1[,字段2,…] from 表名 order by 字段1[ 排序方向,字段2 排序方向,…];
,如果对多字段排序时,先按第一个字段排序,第一个字段值相同时再按第二个字段排序。指定排序方向:asc升序,desc降序(没有指定排序方向时,默认是asc升序)单字段排序:查询所有员工信息按sal降序显示
具体实现如下:
select *
from emp
order by sal desc;
select *
from emp
order by sal asc;
具体执行的结果如下:
多字段排序:查询所有员工信息按deptno升序、sal降序显示
具体实现如下:
select *
from emp
order by deptno asc, sal desc;
具体执行的结果如下:
如果在排序中,如果我们不指定字段的排序是降序还是升序,则默认是升序。接下来介绍单表查询中限制查询结果数量的用法:
限制查询结果数量:
select 字段1[,字段2,…] from 表名 limit [偏移量,] 行数;
这里需要注意的是:limit接受一个或两个数字参数,参数必须是一个整数常量,然而,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。如果只给定一个参数,表示返回最大的记录行数目。初始记录行的偏移量是0(而不是1)。
查询基本工资最高的前5位员工
具体实现如下:
select *
from emp
order by sal desc
limit 5;
具体执行的结果如下:
查询基本工资第6到10名的员工
具体实现如下:
select *
from emp
order by sal desc
limit 5,5;
具体执行的结果如下:
查询最后入职的5位员工
具体实现如下:
select *
from emp
order by hiredate
limit 5;
具体执行的结果如下:
接下来,给大家介绍聚合函数,我们MySQL中常用的聚合函数主要包括avg()
、count()
、max()
、min()
、sum()
,具体说明如下:
查询emp表中员工总数、最高工资、最低工资、平均工资及工资总和
具体实现如下:
select count(*) 员工总数, max(sal) 最高工资, min(sal) 最低工资,avg(sal) 平均工资, sum(sal) 工资总和
from emp;
具体执行的结果如下:
接下来,给大家介绍单表查询中的分组查询:
分组查询:
select 字段1[,字段2,…] from 表名[ where 查询条件] group by 分组字段1[,分组字段2,…];
将查询结果按照一个或多个字段进行分组,字段值相同的为一组,对每个组进行聚合计算
&emsp**;分组后筛选**:select 字段1[,字段2,…] from 表名[ where 查询条件][ group by 分组字段1[,分组字段2,…]] having 筛选条件;
查询各部门的平均工资
具体实现如下
select deptno, avg(sal) as 平均工资
from emp
group by deptno;
具体执行的结果如下:
查询各部门不同职位的平均工资
具体实现如下:
select deptno,job,avg(sal)
from emp
group by deptno, job;
具体执行的结果如下:
查询各部门的员工数
具体实现如下:
select deptno,count(*) 员工数
from emp
group by deptno;
具体执行的结果如下:
查询各部门不同职位的人数
具体实现如下:
select deptno,job,count(*) 人数
from emp
group by deptno, job;
具体执行的结果如下:
查询各部门clerk的平均工资
具体实现如下:
select deptno, job, avg(sal)
from emp
group by deptno, job
having job = 'clerk';
select deptno, job, avg(sal)
from emp
where job = 'clerk'
group by deptno;
具体执行的结果如下:
这里需要我们注意的是:既然having和where都表示筛选条件,有的时候可以共用,那么二者的区别在于:
- where子句作用于表,having子句作用于组。
- where条件查询的作用域是针对数据表进行筛选,而having条件查询则是对分组结果进行过滤。
- where在分组和聚合计算之前筛选行,而having 在分组和聚合之后筛选分组的行,因此 where子句不能包含聚合函数。
我们介绍一个只能用having
而不能用where
的案例,具体如下:
查询平均工资大于2000的部门
具体实现如下:
select deptno, avg(sal) as 平均工资
from emp
group by deptno
having 平均工资 > 2000;
具体执行的结果如下:
我们在MySQL单表查询中有算术运算符、逻辑运算符、比较运算符以及他们之间的优先级,具体如下:
最后给大家介绍MySQL在书写查询语句时一般的顺序如下:
然而MySQL数据库执行的顺序为:
我们从上篇文章开始,我们已经开始介绍数据库基础知识。上篇文章我们主要给大家介绍了数据的基础,包括几种大型数据库的区别与联系以及学习数据库的必要性,以及还介绍了数据库与数据库管理系统以及数据管理员之间的关系。另外,给大家介绍了数据定义语言,包括数据库的增删改查以及进入数据库的命令。最后给大家介绍了数据操作语言,包括对表中的数据进行增删改查。最后还对delete和truncate进行了对比。本文给大家介绍了数据库查询中的单表查询,主要包括整张表查询、条件查询、聚合函数、分组查询、查询后筛选以及排序等各个知识点,并且每个知识点之后还通过一些案例加深了读者对各个知识点的理解。最后介绍了MySQL在查询中的书写顺序以及执行顺序。因此,mysql是很重要的一个技能,几乎计算机中的每个岗位都需要一个mysq技能,因此,需要我们特别的掌握。生命不息,奋斗不止,我们每天努力,好好学习,不断提高自己的能力,相信自己一定会学有所获。加油!!!