• 【MySQL入门】第五话 · SQL单表查询


    🍺写在前面


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


    🌟🌟往期回顾🌟🌟

    【MySQL入门】第一话 · 初入“数据库”大陆https://kikoking.blog.csdn.net/article/details/125594651

    【MySQL入门】第二话 · 数据库与数据表的基本操作https://kikoking.blog.csdn.net/article/details/125106100

    【MySQL入门】第三话 · MySQL中常见的数据类型https://kikoking.blog.csdn.net/article/details/125401775

    【MySQL入门】第四话 · 和kiko一起探索MySQL中的运算符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.1 ORDER BY(排序)


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

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

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

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

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

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

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

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

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

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

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

     ✨✨✨我是分割线✨✨✨ 

    🍯7.2 LIMIT(限制显示)


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

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

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

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

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

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

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

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

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

      ✨✨✨我是分割线✨✨✨

    🍯7.3 聚合函数


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

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

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

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

    SELECT MAX(attack) FROM hero;

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

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

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

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

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

    SELECT COUNT(id) FROM hero;

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

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

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

     ✨✨✨我是分割线✨✨✨

    🍯7.4 GROUP BY(分组操作)


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

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

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

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

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

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

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

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

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

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

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

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

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

      ✨✨✨我是分割线✨✨✨

    🍯7.5 HAVING(筛选操作)


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

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

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

    • 查找攻击力大于100的英雄:由于攻击力字段 attack 是表格中实际存在的字段,因此使用 WHERE 来对其进行限制。
      1. SELECT * FROM hero
      2. WHERE attack>100;
    • 查找平均攻击力大于150的国家:由于原表格中并没有平均攻击力字段,因此我们要使用聚合函数对attack字段进行处理,处理后的 AVG(attack) 字段就必须由 HAVING 进行限制处理。
      1. SELECT country,AVG(attack) FROM hero
      2. GROUP BY country
      3. HAVING AVG(attack)>150;

     ✨✨✨我是分割线✨✨✨

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


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

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

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

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

    • 使用分组操作:
      1. SELECT country FROM hero
      2. GROUP BY country;
    • 直接使用 DISTINCT 操作:
      SELECT DISTINCT country FROM hero;

      ✨✨✨我是分割线✨✨✨

    🍯7.7 查询时运算


    格式:+ - * / %

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

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

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

    SELECT name,attack*2 FROM hero;

  • 相关阅读:
    python的opencv操作记录(五) - 空间域与频域转换
    【从入门到起飞】JavaSE—方法引用
    pta-sql补题(2)
    数字三角形-蓝桥杯
    中医-通过舌象判断身体状况
    Default Probability
    暴雨信息|低碳发展共拓数字能源产业绿色空间
    css溢出隐藏的五种方法
    智芯传感推出性能卓越的多量程硅微加速传感器ZXA
    AVR单片机开发7——产生不同的频率的声音
  • 原文地址:https://blog.csdn.net/qq_54151955/article/details/125544253