- 1、基础查询
- 2、条件查询
- 3、分组查询
- 4、排序查询
- 5、分页查询
- 6、多表查询
- 6.1、连接查询
- 6.1.1、内连接
- 6.1.2、外连接
- 6.1.3、自连接
- 6.1.4、联合查询
- 6.2、子查询
- 6.1、连接查询
- 7、执行顺序
DQL 全称 Data Query Language。数据查询语言,用来查询数据库中表的记录。
1、基础查询
语法:
select 查询列表(字段、常量、函数、表达式) from 表名;
字段别名:
select 字段1 as '字段1别名', 字段2 as '字段2别名', ... from 表名;
注意:别名可用单或双引号引起来,当别名是一个单词时可省略引号,当别名是多个单词组合且含空格或特殊符号时不能省略,as 可省略。
2、条件查询
语法:
select 字段列表 from 表名 [where 条件列表];
条件分类:
- 条件运算符:大于(>)、大于等于(>=)、小于(<)、小于等于(<=)、等于(=)、不等于(!= 或 <>);
- 逻辑运算符:并且(and)、或(or)、非(not);
- 模糊运算符:
- like 占位符:模糊匹配,_匹配单个字符,%匹配任意个字符;
- between ... and ...:在某个范围之内,包含最小最大值;
- not between ... and ...:不在某个范围之内,包含最小最大值;
- in(...):多选;
- is null:为空;
- is not null:非空。
3、分组查询
语法:
select 字段列表 from 表名 [where 条件列表] group by 分组字段列表 [having 分组后条件列表];
where 与 having 区别:
- 执行时机不同:where 是对分组前的原始表进行过滤,不满足 where 条件不参与分组,having 是对分组后对结果集进行过滤;
- 判断条件不同:where 不能对聚合函数进行判断,having 可以。
注意事项:分组之后,查询的字段一般为聚合函数与分组字段。
4、排序查询
语法:
select 字段列表 from 表名 [order by 字段名1 排序方式, 字段名2 排序方式, ...];
排序方式:升序:asc(默认值,可以不写)、降序:desc。
注意事项:如果是多个字段排序,当第一个字段值相同时,才会根据第二个字段排序。
5、分页查询
语法:
select 字段列表 from 表名 [limit 起始索引, 查询记录数];
注意事项:起始索引从0开始,起始索引 = (查询页码 - 1) * 每页显示记录数
,若查询第一页,起始索引可省略,简写为 limit 查询记录数
。
6、多表查询
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多(多对一)、多对多、一对一。
-
一对多
案例:部门与员工的关系。
关系:一个部门对应多个员工,一个员工对应一个部门。
实现:在多的一方建立外键,指向一的一方的主键。 -
多对多
案例:学生与课程的关系。
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择。
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。 -
一对一
案例:用户与用户详情的关系。
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的。
多表查询时需要消除无效的笛卡尔积。笛卡尔积是指在数学中,两个集合:A集合与B集合的所有组合情况。
6.1、连接查询
6.1.1、内连接
查询两表交集部分的数据。
隐式内连接:
select 字段列表 from 表1, 表2 [where 条件列表...];
显示内连接:
select 字段列表 from 表1 [inner] join 表2 on 连接条件 ...;
6.1.2、外连接
左外连接:查询左表(表1)所有数据,以及两表交集部分的数据。
select 字段列表 from 表1 left [outer] join 表2 on 连接条件 ...;
右外连接:查询右表(表2)所有数据,以及两表交集部分的数据。
select 字段列表 from 表1 right [outer] join 表2 on 连接条件 ...;
6.1.3、自连接
当前表与自身的连接查询,自连接必须使用别名。自连接可以是内连接,也可以是外连接。
select 字段列表 from 表1 别名1 [inner|left|right] join 表1 别名2 on 连接条件 ...;
6.1.4、联合查询
将多张表查询的结果合并成一个新的结果集,同时多张表的查询列数及数据类型需保持一致。
union all 直接将全部数据合并在一起,union 会对合并之后的数据去重。
select 字段列表 from 表1 ...
union [all]
select 字段列表 from 表2 ...;
6.2、子查询
SQL 语句中嵌套 select 语句,称为嵌套查询,又称子查询。子查询外部的语句可以是 insert / delete / update / select 的任意一个。
根据子查询结果分为:
- 标量子查询(子查询结果为单个值);
- 列子查询(子查询结果为一列);
- 行子查询(子查询结果为一行);
- 表子查询(子查询结果为多行多列)。
根据子查询位置分为:select 之后、from 之后、where 之后。
select 之后:
select (select B.字段 from 表2 B where B.字段 = A.字段) from 表1 A;
from 之后:
select A.* from (select * from 表名 where 条件列表 ...) A;
where 之后:
select A.* from 表1 A where A.字段 in (select B.字段 from 表2 B);
7、执行顺序
5 select 字段列表
1 from 表名列表
2 where 条件列表
3 group by 分组字段列表
4 having 分组后条件列表
6 order by 排序字段列表
7 limit 分页参数