DQL-(Data Query Language)
DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录。
基本语法结构:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
order by
排序字段列表
limit
分页参数
我们在讲解这部分内容的时候,会将上面的完整语法进行拆分,分为以下几个部分:
- 基本查询(不带任何条件)
- 条件查询(where)
- 聚合函数(count、max、min、avg、sum)
- 分组查询(group by)
- 排序查询(order by)
- 分页查询(limit)
基础查询
在基本查询的DQL语句中,不带任何的查询条件,查询的语法如下:
- 查询多个字段
select 字段1, 字段2, 字段3 ... from 表名;
select * from 表名;
- 字段设置别名
select 字段1 [ as 别名1 ], 字段2 [ as 别名2 ] ... from 表名;
select 字段1 [ 别名1 ], 字段2 [ 别名2 ] ... from 表名;
- 去除重复记录
select distinct 字段列表 from 表名;
条件查询
select 字段列表 from 表名 where 条件列表 ;
- 常用的比较运算符
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
between ... and ... | 在某个范围之内(含最小、最大值) |
in(...) | 在in之后的列表中的值,多选一 |
like 占位符 | 模糊匹配(_匹配单个字符, %匹配任意个字符) |
is null | 是空 |
- 常用的逻辑运算符
逻辑运算符 | 功能 |
---|---|
and 或 && | 并且 (多个条件同时成立) |
or 或 || | 或者 (多个条件任意一个成立) |
not 或 ! | 非 , 不是 |
聚合函数
将一列数据作为一个整体,进行纵向计算。
函数 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
select 聚合函数(字段列表) from 表名 ;
注意:null值是不参与所有聚合函数运算的。
例:
select count(*) from employee;
select count(id) from employee;
/*对于count聚合函数,统计符合条件的总记录数,还可以通过 count(数字/字符串)的形式进行统计查询*/
select count(1) from employee;
分组查询
语法
select 字段列表 from 表名 [ where 条件 ] group by 分组字段名 [ having 分组后过滤条件 ];
where与having区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
注意事项: - 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
- 执行顺序: where > 聚合函数 > having 。
- 支持多字段分组, 具体语法为 : group by columnA,columnB
排序查询
语法
select 字段列表 from 表名 order by 字段1 排序方式1, 字段2 排序方式2;
排序方式
- asc : 升序(默认值)
- desc: 降序
分页查询
select 字段列表 from 表名 limit 起始索引, 查询记录数;
注意事项:
- 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是limit。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
执行顺序
在讲解DQL语句的具体语法之前,我们已经讲解了DQL语句的完整语法,及编写顺序,接下来,我们要来说明的是DQL语句在执行时的执行顺序,也就是先执行那一部分,后执行那一部分。
select
字段列表:4
from
表名列表:1
where
条件列表: 2
group by
分组字段列表:3
having
分组后条件列表
order by
排序字段列表:5
limit
分页参数:6
简单验证:
select name, age from employee where age > 15 order by age asc;
/*在查询时,我们给employee表起一个别名 e,然后在select 及 where中使用该别名。*/
select e.name, e.age from employee e where e.age > 15 order by age asc;
/*执行上述SQL语句后,我们看到依然可以正常的查询到结果,此时就说明:from 先执行, 然后where和select执行。*/
/*此时,此时我们可以给select后面的字段起别名,然后在where中使用这个别名,然后看看是否可以执行成功。*/
select e.name ename , e.age eage from employee e where eage > 15 order by age asc; --执行报错
/*由此我们可以得出结论: from 先执行,然后执行 where,再执行select 。*/
/*接下来,我们再执行如下SQL语句,查看执行效果:*/
select e.name ename , e.age eage from employee e where e.age > 15 order by eage asc;
/*结果执行成功。 那么也就验证了: order by 是在select语句之后执行的。*/
综上所述,我们可以看到DQL语句的执行顺序为: from ... where ... group by ...having ... select ... order by ... limit ...