【MySql】DQL对表中数据处理

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 条件表达式
-- 先取出表中的每条数据,满足条件的数据就返回,不满足的就过滤掉

运算符

  1. 比较运算符

    说明
    > < <= >= = <> != 大于、小于、大于(小于)等于、不等于
    BETWEENAND 显示在某一区间的值
    例如: 2000-10000之间: Between 2000 and 10000
    IN(集合) 集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒)
    in中的每个数据都会作为一次条件,只要满足条件就会显示
    LIKE ‘%张%’ 模糊查询
    IS NULL 查询 某一列为NULL的值, 注: 不能写 = NULL
  2. 逻辑运算符

    说明
    And&& 多个条件同时成立
    Or|| 多个条件任一成立
    Not 不成立,取反。
  3. 模糊查询 通配符

    select 列名 from 表名 where 字段 like %字段值%
    
    通配符 说明
    % 表示匹配任意多个字符串,
    _ 表示匹配 一个字符

三、排序方式

通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示效果,不会影响真实数据)

SELECT 字段名 FROM 表名 [WHERE 字段 =] [ORDER BY 字段名 [ASC / DESC]]
  1. 单列排序
    只按照某一个字段进行排序, 就是单列排序

    SELECT * FROM 表名 ORDER BY 字段名
    SELECT * FROM 表名 ORDER BY 字段名 DESC
    
  2. 组合排序
    同时对多个字段进行排序, 如果第一个字段相同 就按照第二个字段进行排序,以此类推

    SELECT * FROM 表名 ORDER BY 字段1 ASC, 字段1 DESC;
    

四、聚合函数

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对某一列的值进行计算,然后返回一个单一的值(另外聚合函数会忽略null值。);

SELECT 聚合函数(字段名) FROM 表名
聚合函数 作用
count(字段) 统计指定列不为NULL的记录行数
sum(字段) 计算指定列的数值和
max(字段) 计算指定列的最大值
min(字段) 计算指定列的最小值
avg(字段) 计算指定列的平均值

五、分组查询(统计操作才有意义)

分组查询指的是使用 GROUP BY 语句,对查询的信息进行分组,相同数据作为一组

SELECT 分组字段/聚合函数 FROM 表名 GROUP BY 分组字段 [HAVING 条件];

分析: GROUP BY 分组过程

注意

  • 分组时可以查询要分组的字段, 或者使用聚合函数进行统计操作.
  • 查询其他字段没有意义

六、limit关键字

limit 关键字的作用

  • limit是限制的意思,用于 限制返回的查询结果的行数 (可以通过limit指定查询多少行数据)
  • limit 语法是 MySql的方言,用来完成分页
SELECT 字段1,字段2... FROM 表名 LIMIT offset , length;

参数说明

limit offset , length; 关键字可以接受一个或者两个 为0 或者正整数的参数
offset 起始行数, 从0开始记数, 如果省略 则默认为 0.
length 返回的行数

分页公式:起始行数=( 当前页码 - 1)* 每页显示条数

------------------------------------多表查询------------------------------------

一、交叉连接查询:笛卡尔积(没法用)

交叉连接查询,因为会产生笛卡尔积,所以 基本不会使用

SELECT 字段名 FROM1,2;

笛卡尔积是什么
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
在这里插入图片描述

二、多表查询的分类

1.内连接查询

  • 内连接的特点:
    通过指定的条件去匹配两张表中的数据, 匹配上就显示,匹配不上就不显示
    比如通过:从表的外键 = 主表的主键 方式去匹配
  1. 隐式内连接
    from子句 后面直接写 多个表名 使用where指定连接条件的
    这种连接方式是 隐式内连接。使用where条件过滤无用的数据

    SELECT 字段名 FROM 左表, 右表 WHERE 连接条件;
    
  2. 显式内连接
    使用 inner join ...on 这种方式, 就是显式内连接

    SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件
    -- inner 可以省略
    

PS:多表查询可以通过给表起别名的方式, 方便我们的查询(有提示)

2.外连接查询

  1. 左外连接 , 使用 LEFT OUTER JOIN , OUTER 可以省略
    左外连接的特点
    1. 以左表为基准, 匹配右边表中的数据,如果匹配的上,就展示匹配到的数据
    2. 如果匹配不到, 左表中的数据正常展示, 右边的展示为null.
    SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
    
  2. 右外连接 , 使用 RIGHT OUTER JOIN , OUTER 可以省略
    右外连接的特点
    1. 以右表为基准,匹配左边表中的数据,如果能匹配到,展示匹配到的数据
    2. 如果匹配不到,右表中的数据正常展示, 左边展示为null
    SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件
    

3. 各种连接方式的总结

在这里插入图片描述

  • 内连接: inner join , 只获取两张表中 交集部分的数据.
  • 左外连接: left join , 以左表为基准 ,查询左表的所有数据, 以及与右表有交集的部分
  • 右外连接: right join , 以右表为基准,查询右表的所有的数据,以及与左表有交集的部分

三、子查询 (SubQuery)

1. 什么是子查询?

  1. 子查询概念
    一条 select 查询语句的结果, 作为另一条 select 语句的一部分
  2. 子查询的特点
    1. 子查询必须放在小括号中
    2. 子查询一般作为父查询的查询条件使用
  3. 子查询常见分类
    • where型 子查询: 将子查询的结果, 作为父查询的比较条件
    • from型 子查询 : 将子查询的结果, 作为 一张表,提供给父层查询使用
    • exists型 子查询: 子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果

2. 子查询的结果作为查询条件

where型 子查询: 将子查询的结果, 作为父查询的比较条件

SELECT 查询字段 FROMWHERE 字段=(子查询);

3. 子查询的结果作为一张表

from型 子查询 : 将子查询的结果, 作为 一张表,提供给父层查询使用

SELECT 查询字段 FROM (子查询)表别名 WHERE 条件;

注意: 当子查询作为一张表的时候,需要起别名,否则无法访问表中的字段。

4. 子查询结果是单列多行

exists型 子查询: 子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果

SELECT 查询字段 FROMWHERE 字段 IN (子查询);

5. 子查询总结

1. 子查询如果查出的是一个字段(单列), 那就在where后面作为条件使用.
2. 子查询如果查询出的是多个字段(多列), 就当做一张表使用(要起别名).

猜你喜欢

转载自blog.csdn.net/Guai_Ka/article/details/113522384