【MySQL】数据库必考知识点:查询操纵全面详解与深度剖解 ...

打印 上一主题 下一主题

主题 852|帖子 852|积分 2556

        前言:本节内容报告根本查询, 根本查询要分为两篇文章进行讲解。 本篇文章主要讲解的是表内删除数据、查询结果进行插入、聚合统计、分组聚合统计。 假如想要学习对应知识的可以观看哦。
          ps:本篇内容友友们只要会创建表了就可以看起来了哦!!!
  目录
删除数据
delete from
truncate
插入查询结果
创建空表
去重
插入新表
更换旧表
重命名
聚合函数
group by分组聚合查询        
根据部门列出最高薪资和平均薪资
根据部门和工作列出最低薪资和平均薪资
显示平均工资低于2000的部门和他的平均工资
having 和 where的区别


删除数据

delete from

  1. delete from 表名 (where筛选) (排序)(limit);
复制代码
       下面为示例: 
        假如不加where筛选就会将全部的表删除, 所以要使用where语句进行筛选, 删除某一条:
  1. delete from exam_result where id = 6;
复制代码

        别的, 另有一点需要注意的就是, delete 操纵不会影响自增约束的字段。就比如一个表里面有一个id列, 这个列的约束是auto_increment。 当我们插入了3个数据后, 这个id自增就会增长到4, 假如这个时间我们将三个数据删除, 这个自增数不会重置, 照旧4。 也就是不会影响自增。
         下面为示例:
  1. create table for_delete( id int primary key auto_increment, name varchar(20) );
  2. insert into for_delete(name) values('张三');
  3. insert into for_delete(name) values('张三');
  4. insert into for_delete(name) values('张三');
复制代码

然后将整个表删除,再进行插入:

truncate

        想要将auto_increment清空, 就可以使用截断表:
  1. create table for_truncate( id int primary key auto_increment, name varchar(20) );
  2. insert into for_truncate(name) values('张三');
  3. insert into for_truncate(name) values('张三');
  4. insert into for_truncate(name) values('张三');
复制代码

然后我们截断表:
  1. truncate 表名;
复制代码

           ps:其实truncate和delete from也有其他的区别, 但是博主没有学习过事件, 对于它们之间的更深度的区别理解不了。 有兴趣的友友们可以自行查阅。
  插入查询结果

        插入查询结果我们使用一个案例来进行理解, 就是对一个表进行去重。
将select和insert做组合。 现在进行一个案例:
  1. create table duplicate_table( id int, name varchar(20) );
复制代码
  1. insert into duplicate_table values(100, 'aaa'), (200, 'bbb'), (100, 'aaa'), (200, 'bbb'), (200, 'bbb'), (300, 'ccc');
复制代码

然后想要对上图的数据进行去重, 需要五步:
        第一步:创建一个空表, 空表的表结构和我们上面的表的结构一样。 
        第二步:通过select 筛选出去重后的查找结果。
        第三步:将查找结果直接插入到新的空表当中。
        第四步:重命名原表
        第五步:重命名新创建的表。 
创建空表

        首先创建一个空表, 这个空表和本来的表是一样的:

去重

        然后将原表中的去重后的结果筛选出来:

插入新表

        然后将这个结果插入到新的空表当中:

更换旧表

    然后rename旧的表酿成old_duplicate_table:

重命名

        最后rename新的去重后的表:

        以上就能对一个表内的数据进行去重。 
        为什么最后是使用rename方式进行的?这是因为就是相等统统都已经停当了, 然后统一放入,更新, 生效等。 
聚合函数

           mysql当中也是有函数的, 这些函数是可以直接被我们调用的。 我们可以对一组数据进行聚合统计, 而使用的就是聚合函数
    下面是几个聚合函数:
  

  •         count : 返回查询到的数据的数量。
  •         sum : 返回查询到的多少列的总和,
  •         avg : 返回特定命据的平均值。
  •         max : 返回数据的平均值。
  •         min : 返回数据的最小值。 
          下面进行示例:
        假如我们使用count计算*, 那么就是返回一共有多少行数据。 

        统计数学结果的个数:

        但是有些同学的数学结果是相同的。 我们想要统计不同的数学的结果的个数, 也就是对数学结果进行去重。 所以为了能够得到不一样的数学结果, 就要使用distinct:

        想要统计班级中, 数学结果不及格的人:

查看三个结果的平均分:
  1. select avg(english + chinese + math) 平均分 from exam_result;
复制代码

查找数学超过50分的数学最少的同学:


group by分组聚合查询        

        分组的目的是为了分组之后, 方便进行聚合统计。我们下面使用员工数据库的示例进行理解, 整个员工数据库可以在网络上面找一下
        我们先来看一下这三张表:
        我们使用对应这个数据库, 然后就能看到下面这三张表: 

        下面这是里面的所有员工, 属性包括员工的姓名、员工的工作、员工的工号、员工的时间、员工的工资、员工的奖金、员工的所属部门:

         下面是所有的部门, 属性包括部门的名称, 部门的地点:

         下面是所有的薪资品级:

根据部门列出最高薪资和平均薪资

  1. select max(sal) 最高, avg(sal) 平均, from emp; //这是一张表的聚合统计。
  2. select deptno, max(sal) 最高, avg(sal) 平均, from emp group by deptno;//然后分组,再聚合统计。  //分组的时候要明确列名,但实际分组是用该列的不同的行进行分组的。分组的条件比如deptno,在组内一定是相同的---可以被聚合压缩。并且, 分组, 就是把一组按照条件拆成了多个组,进行各自组内的统计, 就是把一个表, 在逻辑上拆成了多个子表,然后对多个子表进行聚合统计。
复制代码

根据部门和工作列出最低薪资和平均薪资

  1. select deptno, job, avg(sal) 平均, min(sal) 最低 from emp group by deptno, job;
复制代码
         这里要讨论的是, 假如我们这里select后面跟enamel, 叨教可不可以呢? 

        答案是不可以, 因为对于ename来说, ename不是被分组的数据, 对于分组聚合统计,只有聚合统计的以及分组的可以被查看, 其他的, 都不可以查看。 
显示平均工资低于2000的部门和他的平均工资

        我们就要先统计出每个部门的平均工资(结果先聚合出来), 再进行判定(对聚合出来的结果进行判定)。(这里要用到一个新的函数——having:对聚合后的数据进行统计)
        先统计所有的部门:
  1. select deptno, avg(sal) 平均工资 from emp group by deptno;
复制代码

        然后再对上面的聚合结果进行筛选(使用having, 对聚合统计的结果进行判定, 所以having的执行顺序在最后)
  1. select deptno, avg(sal) 平均工资 from emp group by deptno having 平均工资 < 2000;
复制代码

having 和 where的区别

        having和where都能做条件筛选, 但是这两个是完全不同的。
        我们使用下面的这个例子进行理解。 首先, 我们查出员工表里面不是SMITH的人:

        然后将这些数据按照部门, 工作进行分组:

        然后做聚合统计, 统计平均工资:

        然后筛选出平均工资小于2000的那些:

然后我们就开始讲解上面的例子了:
        首先, 这里的where, 是对具体的恣意列进行条件筛选。having是对分组聚合之后的结果进行条件筛选。所以, 这里面的肯定是from第一执行, where 第二执行, 分组第三执行, 聚合统计第四执行, 筛选统计结果第五执行。
   

  •         所以, where 和 having的第一个区别就是条件筛选的阶段是不同的!
  •         第二个区别:不要以为只有磁盘上真实的表结构才是表, 我们筛选条件, 或者执行各种语句之中, 中心筛选出来的, 包括最终结果, 在我看来,全部都是逻辑上的表。“MySQL统统皆表“——未来只要我们能够处理好单表的CURD, 所有的sql场景,我们全部都能使用统一的方式进行!
  

  ——————以上就是本节全部内容哦, 假如对友友们有资助的话可以关注博主, 方便学习更多知识哦!!!    

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表