• 【MySQL功法】第5话 · SQL单表查询


    **??**写在前面


    闲话不多说,最近开始写关于数据分析的基础知识,未来对于数据分析的路线规划也在逐步计划中,但是有关【数据库】这类内容肯定是不可缺少的基础知识储备,所以对数据分析有兴趣的同学和大佬可以持续关注本专栏哦!


    ???往期回顾???

    【MySQL入门】第一话 · 初入“数据库”大陆[这里是图片003]https://kikoking.blog.csdn.net/article/details/125594651

    【MySQL入门】第二话 · 数据库与数据表的基本操作[这里是图片004]https://kikoking.blog.csdn.net/article/details/125106100

    【MySQL入门】第三话 · MySQL中常见的数据类型[这里是图片005]https://kikoking.blog.csdn.net/article/details/125401775

    【MySQL入门】第四话 · 和kiko一起探索MySQL中的运算符[这里是图片006]https://kikoking.blog.csdn.net/article/details/125595448

    目录

    ??写在前面

    ??知识点7:单表查询

    ??7.1?ORDER BY(排序)

    ??7.2?LIMIT(限制显示)

    ??7.3?聚合函数

    ??7.4 GROUP BY(分组操作)

    ??7.5?HAVING(筛选操作)

    ??7.6?DISTINCT(不显示重复字段)

    ??7.7?查询时运算

    **??**知识点7:单表查询


    对于一个单独数据表的查询,不会涉及其他表格,这种查询就是单表查询,它是最简单的查询方式。单表查询语句由许多段组成,其主要的查询写法如下图所示:

    值得注意的是,上述语句并不是从上到下顺序执行,在具体的查询过程中各部分有其执行顺序:

    • 第一步,我们会执行WHERE条件,对记录中进行一次筛选。
    • 第二步,我们会通过 GROUP BY 对表进行分组。
    • 第三步,我们执行聚合函数,对分组后的字段进行聚合处理。
    • 第四步,此时我们再对经过处理后的表中数据进一步筛选(having)。
    • 第五步,我们对表中数据进行排序(ORDER BY)。
    • 第六步,我们截取部分记录来显示。

    当然,看到这里大家肯定还是一脸懵逼啦,不过没有关系,我们在这里就是先提一嘴,接下来我们就对上述的各个字段逐一开始分析讲解!

    ??7.1ORDER BY(排序)


    格式:··· ORDER BY 字段名 升序/降序
    
    升序——ASC(默认的排序方式); 降序——DESC
    
    作用:给查询结果进行排序
    
    • 1
    • 2
    • 3
    • 4
    • 5

    对于ORDER BY的应用,我们通过三道例题来快速掌握:

    1、将英雄按防御值从低到高排序。(升序ASC)

    由于我们这边需要进行排序的查找,因此使用 SELECT 关键字,由于要从低到排序,那就是排升序,因此在 ORDER BY 中选择 _ASC(升序)_方式。

    SELECT * FROM hero 
    ORDER BY defense ASC;
    
    • 1
    • 2

    2、将蜀国英雄按攻击值从高到低排序。(降序DESC)

    我们这里要按照攻击值进行降序排列,因此就要使用 _DESC(降序)_方式进行排列,特别注意的是,由于我们这里要求是对蜀国英雄进行排序,因此就要在排序前限制排序内容的范围,因此将 WHERE限定语句 放在 _ORDER BY_之前。

    SELECT * FROM hero 
    WHERE country='蜀国'
    ORDER BY attack DESC;
    
    • 1
    • 2
    • 3

    3、将魏蜀两国中名字为三个字的英雄按防御值升序排序。(升序ASC)

    我们这里将排序内容的范围进一步缩小,这里在 _WHERE限定语句_中用到了模糊比较运算符与逻辑运算符,关于这部分的内容,如果有所遗忘,可以看我们的上一章内容:

    SELECT * FROM hero 
    WHERE country in('魏国','蜀国') AND name LIKE "___"
    ORDER BY attack ASC;
    
    • 1
    • 2
    • 3

    我是分割线

    ??7.2LIMIT(限制显示)


    两种格式:
    (1) LIMIT n ——>显示前n条记录    
        例如:LIMIT 6 ——>显示前6条记录
    
    (2) LIMIT m,n ——>从第m+1条记录开始显示之后的n条记录  
        例如:LIMIT 2,3 ——>显示第3,4,5条记录
    
    作用:限制查询记录的显示条数
    
    注意:LIMIT永远都要放在SQL查询语句的最后写
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    值得注意的是,LIMIT永远都要放在SQL查询语句的最后写,这是因为这是查询操作的最终操作,即显示操作。接下来我们同样通过几道例题来进行进一步地熟悉。

    1、在蜀国英雄中,查找防御值倒数第二名至倒数第四名的英雄记录。

    由于这里的显示涉及到名次,因此我们需要先对蜀国英雄进行排序 ORDER BY,然后再用 LIMIT 来截取倒数第二名至第四名的英雄记录。

    SELECT * FROM hero 
    WHERE country = '蜀国'
    ORDER BY defense ASC
    LIMIT 1,3;
    
    • 1
    • 2
    • 3
    • 4

    2、在蜀国英雄中,查找攻击值前三名且名字不为NULL的英雄的名字、攻击值和国家。

    本题限制了查询的字段,同时限定了英雄的条件为蜀国英雄且名字不为空,最后按攻击力降序(DESC)排列,截取(LIMIT)前3条英雄记录。

    SELECT name,attack,country FROM hero 
    WHERE country = '蜀国' AND name IS NOT NULL
    ORDER BY attack DESC
    LIMIT 0,3;
    
    • 1
    • 2
    • 3
    • 4

    除了上述功能以外,这边我们再介绍一下 LIMIT 的拓展功能——分页;说白了,分页功能其实就是把每一页的记录使用 LIMIT 进行截断展示。

    我是分割线

    ??7.3聚合函数


    格式: SELECT ··· (聚合函数) ··· FROM 表名
    
    聚合函数种类:
        (1)AVG(字段名) ——> 求该字段的平均值
        (2)SUM(字段名) ——> 求和
        (3)MAX(字段名) ——> 求最大值
        (4)MIN(字段名) ——> 求最小值
        (5)COUNT(字段名) ——> 统计该字段记录的个数
    
    作用:对表中某个字段的数据进行聚合操作
    
    注意:聚合函数的结果为一个数值,一般与分组、HAVING等结构配合使用。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    聚合操作其实就是对表中的数据进行计算,例如进行求和、求平均值、最大值、最小值等操作,我们不妨通过下面四道例题来巩固一番:

    1、所有英雄中,攻击力最强值是多少?(MAX)

    这里我们需要查找攻击力最强值,因此我们需要用到聚合函数中的求最大值 MAX

    SELECT MAX(attack) FROM hero;
    
    • 1

    2、计算蜀国英雄的总攻击力。(SUM)

    我们这里要计算总攻击力,即使用聚合函数 SUM,同时限定了英雄必须是蜀国英雄。

    SELECT SUM(attack) FROM hero WHERE country='蜀国';
    
    • 1

    3、统计id字段共有几条记录?(COUNT)

    我们此处要统计该字段记录的个数,就需要用到聚合函数_COUNT_。

    SELECT COUNT(id) FROM hero;
    
    • 1

    4、统计蜀国英雄中攻击力>200的英雄数量。(COUNT)

    我们此处统计的是英雄数量,此处限定了英雄为蜀国,且攻击力需要大于200,此时我们需要选择一个字段进行统计_COUNT_,此时可能有的同学选择attack字段或name字段等,我们这时不妨采用一个新的方式,即 COUNT(*) ,它表示但凡该条记录中有一个字段非空,COUNT(*) 就会将这条记录统计进来。

    SELECT COUNT(*) FROM hero
    WHERE country='蜀国' AND attack>200;
    
    • 1
    • 2

    我是分割线

    ??7.4 GROUP BY(分组操作)


    格式: ··· GROUP BY 字段名
    
    作用:按照某种规则对查询结果进行分组操作、
    
    注意:GROUP BY之后的字段名必须要为 SELECT 之后的字段名;
         如果不一致,必须对该字段进行聚合处理。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    关于分组操作,看似简单,实则它的处理逻辑却值得你细细品味,主要有以下几点需要注意:

    1. 只有分组操作,没有聚合和HAVING时:【先分组——>后去重】
    2. 分组、聚合同时存在时:【先分组——>后聚合(对每组)——>再去重】

    1、查询表中有哪些国家?(只有分组操作,先分组,后去重)

    我们此处要对国家进行分组,然后就可以将多个国家的重复值去除,使其成为单独的值,即实现去重操作。

    SELECT country FROM hero
    GROUP BY country;
    
    • 1
    • 2

    2、计算每个国家的平均攻击力。(含聚合操作,先分组,按分好的组聚合,再去重)

    关于这一题的逻辑细节,我们通过下面这张图来理解,我们首先按照国家进行分组,然后再各个分组中进行聚合操作。

    SELECT country,AVG(attack) FROM hero
    GROUP BY country;
    
    • 1
    • 2

    值得注意的是,此处_SELECT_之后的attack字段并没有在_GROUP BY_之后出现,按理说不符合要求,但是这里对 attack 字段使用了_聚合操作AVG_,所以可以不在_GROUP BY_出现。

    3、查找所有国家中英雄数量最多的前2名的国家名称和英雄数量。

    我们这里要求显示英雄最多的国家及其英雄数量,因此我们指定国家与英雄数量字段(COUNT)进行显示,由于还需要显示最多的前两名,因此还需要使用排序(ORDER BY)与限制显示操作(LIMIT)

    SELECT country,COUNT(id) FROM hero
    GROUP BY country
    ORDER BY COUNT(id) DESC
    LIMIT 2;
    
    • 1
    • 2
    • 3
    • 4

    我是分割线

    ??7.5HAVING(筛选操作)


    格式: HAVING ···
    
    作用:对查询的结果进行进一步的筛选操作
    
    • 1
    • 2
    • 3

    Q1:请问 HAVING 与 WHERE 到底有什么区别呢?

    A1:WHERE 只能操作表中实际存在的字段,而 HAVING 则可以操作由聚合函数生成的显示列,接下来我们以下面两个例子来进行说明:

    • **查找攻击力大于100的英雄:**由于攻击力字段 attack 是表格中实际存在的字段,因此使用 WHERE 来对其进行限制。

      SELECT * FROM hero
      WHERE attack>100;
      
      • 1
      • 2

    • **查找平均攻击力大于150的国家:**由于原表格中并没有平均攻击力字段,因此我们要使用聚合函数对attack字段进行处理,处理后的 AVG(attack) 字段就必须由 HAVING 进行限制处理。

      SELECT country,AVG(attack) FROM hero
      GROUP BY country
      HAVING AVG(attack)>150;
      
      • 1
      • 2
      • 3

    我是分割线

    ??7.6DISTINCT(不显示重复字段)


    格式: DISTINCT 字段名
    
    作用:不显示字段的重复值
    
    注意: (1)只能修饰普通的已存在的字段
          (2)当DISTINCT同时修饰多个字段时,所有字段的值全相同才会去重
          (3)DISTINCT不能对任何字段做聚合处理
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    简单来说这就是一个去重字段操作,我们同样可以通过几道例题来进行进一步理解。

    1、查找表中有哪些国家。

    这一题有两种解决办法,一种是通过单一的分组操作(GROUP BY),对其进行先分组后去重的操作;另一种就是直接使用_DISTINCT_,对指定的_country_字段进行去重:

    • 使用分组操作:

      SELECT country FROM hero
      GROUP BY country;
      
      • 1
      • 2

    • 直接使用 DISTINCT 操作:

      SELECT DISTINCT country FROM hero;
      
      • 1

    我是分割线

    ??7.7查询时运算


    格式:+ - * / %
    
    • 1

    我们其实可以在查询表记录的过程中进行数学运算(加、减、乘、除、取余),我们可以通过一道例题直接掌握:

    1、查询所有国家英雄的攻击力字段与名字字段,并在查询时将所有英雄攻击力翻倍。

    我们在这里就进行了查询中运算的操作,具体代码实现如下:

    SELECT name,attack*2 FROM hero;
    
    • 1

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    基于Java毕业设计永川区自行车在线租赁管理系统源码+系统+mysql+lw文档+部署软件
    【Flink 问题集】The generic type parameters of ‘Collector‘ are missing
    Linux内核设计与实现 第十一章 定时器和时间管理
    【多线程】常见的锁策略
    系统架构设计师(第二版)学习笔记----需求工程
    Docker与微服务实战——基础篇
    Redis学习笔记(下):持久化RDB、AOF+主从复制(薪火相传,反客为主,一主多从,哨兵模式)+Redis集群
    Java双非大二找实习记录
    Python----range方法(函数)
    49位主播带货破亿,单品直播销量100万+,9月的黑马都是谁?
  • 原文地址:https://blog.csdn.net/m0_67402564/article/details/126080629