DQL对表中数据处理(查询)
------------------------------------单表查询------------------------------------
一、查询数据
- 查询不会对数据库中的数据进行修改.只是一种显示数据的方式 SELECT
单表查询
select [DISTINCT] --显示不相同的
[* / 分组字段名 / 聚合函数(字段名) ]
from
表名
[where [[条件表达式]/[字段名 like %字段值%]]] -- 条件(+模糊)
[limit 起始行数 , 返回的行数;] -- 分页
[order by 字段名 [asc / desc]] -- 排序
[GROUP BY 分组字段 [HAVING 条件]] -- 分组
查询表中所有数据
select * from 表名
查询表中所有记录,仅显示字段1,字段2
select 字段1,字段2 from 表名
二、条件查询
如果查询语句中没有设置条件,就会查询所有的行信息,在实际应用中,一定要指定查询条件,对记录进行过滤
select 列名 from 表名 where 条件表达式
-- 先取出表中的每条数据,满足条件的数据就返回,不满足的就过滤掉
运算符
-
比较运算符
符 说明 >
<
<=
>=
=
<>
!=
大于、小于、大于(小于)等于、不等于 BETWEEN
…AND
…显示在某一区间的值
例如: 2000-10000之间: Between 2000 and 10000IN
(集合)集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒)
in中的每个数据都会作为一次条件,只要满足条件就会显示LIKE
‘%张%’模糊查询 IS NULL
查询某一列为NULL的值, 注: 不能写 = NULL -
逻辑运算符
符 说明 And
、&&
多个条件同时成立 Or
、||
多个条件任一成立 Not
不成立,取反。 -
模糊查询 通配符
select 列名 from 表名 where 字段 like %字段值%
通配符 说明 %
表示匹配任意多个字符串, _
表示匹配 一个字符
三、排序方式
通过 ORDER BY
子句,可以将查询出的结果进行排序(排序只是显示效果,不会影响真实数据)
SELECT 字段名 FROM 表名 [WHERE 字段 = 值] [ORDER BY 字段名 [ASC / DESC]]
-
单列排序
只按照某一个字段进行排序, 就是单列排序SELECT * FROM 表名 ORDER BY 字段名 SELECT * FROM 表名 ORDER BY 字段名 DESC
-
组合排序
同时对多个字段进行排序, 如果第一个字段相同 就按照第二个字段进行排序,以此类推SELECT * FROM 表名 ORDER BY 字段1 ASC, 字段1 DESC;
四、聚合函数
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对某一列的值进行计算,然后返回一个单一的值(另外聚合函数会忽略null值。);
SELECT 聚合函数(字段名) FROM 表名
聚合函数 | 作用 |
---|---|
count(字段) | 统计指定列不为NULL的记录行数 |
sum(字段) | 计算指定列的数值和 |
max(字段) | 计算指定列的最大值 |
min(字段) | 计算指定列的最小值 |
avg(字段) | 计算指定列的平均值 |
五、分组查询(统计操作才有意义)
分组查询指的是使用 GROUP BY 语句,对查询的信息进行分组,相同数据作为一组
SELECT 分组字段/聚合函数 FROM 表名 GROUP BY 分组字段 [HAVING 条件];
注意
- 分组时可以查询要分组的字段, 或者使用聚合函数进行统计操作.
- 查询其他字段没有意义
六、limit关键字
limit 关键字的作用
- limit是限制的意思,用于 限制返回的查询结果的行数 (可以通过limit指定查询多少行数据)
- limit 语法是 MySql的方言,用来完成分页
SELECT 字段1,字段2... FROM 表名 LIMIT offset , length;
参数说明
limit offset , length; 关键字可以接受一个或者两个 为0 或者正整数的参数 |
---|
offset 起始行数, 从0开始记数, 如果省略 则默认为 0. |
length 返回的行数 |
分页公式:起始行数=( 当前页码 - 1)* 每页显示条数
------------------------------------多表查询------------------------------------
一、交叉连接查询:笛卡尔积(没法用)
交叉连接查询,因为会产生笛卡尔积,所以 基本不会使用
SELECT 字段名 FROM 表1, 表2;
笛卡尔积是什么
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
二、多表查询的分类
1.内连接查询
- 内连接的特点:
通过指定的条件去匹配两张表中的数据, 匹配上就显示,匹配不上就不显示
比如通过:从表的外键 = 主表的主键 方式去匹配
-
隐式内连接
from
子句 后面直接写 多个表名 使用where
指定连接条件的
这种连接方式是 隐式内连接。使用where
条件过滤无用的数据SELECT 字段名 FROM 左表, 右表 WHERE 连接条件;
-
显式内连接
使用inner join ...on
这种方式, 就是显式内连接SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件 -- inner 可以省略
PS:多表查询可以通过给表起别名的方式, 方便我们的查询(有提示)
2.外连接查询
- 左外连接 , 使用
LEFT OUTER JOIN
,OUTER
可以省略
左外连接的特点- 以左表为基准, 匹配右边表中的数据,如果匹配的上,就展示匹配到的数据
- 如果匹配不到, 左表中的数据正常展示, 右边的展示为
null
.
SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
- 右外连接 , 使用
RIGHT OUTER JOIN
,OUTER
可以省略
右外连接的特点- 以右表为基准,匹配左边表中的数据,如果能匹配到,展示匹配到的数据
- 如果匹配不到,右表中的数据正常展示, 左边展示为
null
SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件
3. 各种连接方式的总结
- 内连接:
inner join
, 只获取两张表中 交集部分的数据. - 左外连接:
left join
, 以左表为基准 ,查询左表的所有数据, 以及与右表有交集的部分 - 右外连接:
right join
, 以右表为基准,查询右表的所有的数据,以及与左表有交集的部分
三、子查询 (SubQuery)
1. 什么是子查询?
- 子查询概念
一条 select 查询语句的结果, 作为另一条 select 语句的一部分 - 子查询的特点
- 子查询必须放在小括号中
- 子查询一般作为父查询的查询条件使用
- 子查询常见分类
where
型 子查询: 将子查询的结果, 作为父查询的比较条件from
型 子查询 : 将子查询的结果, 作为 一张表,提供给父层查询使用exists
型 子查询: 子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果
2. 子查询的结果作为查询条件
where
型 子查询: 将子查询的结果, 作为父查询的比较条件
SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
3. 子查询的结果作为一张表
from
型 子查询 : 将子查询的结果, 作为 一张表,提供给父层查询使用
SELECT 查询字段 FROM (子查询)表别名 WHERE 条件;
注意: 当子查询作为一张表的时候,需要起别名,否则无法访问表中的字段。
4. 子查询结果是单列多行
exists
型 子查询: 子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果
SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
5. 子查询总结
1. 子查询如果查出的是一个字段(单列), 那就在where后面作为条件使用.
2. 子查询如果查询出的是多个字段(多列), 就当做一张表使用(要起别名).