0


【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:单表查询


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

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

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

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

🍯7.1 ORDER BY(排序)


格式:··· ORDER BY 字段名 升序/降序

升序——ASC(默认的排序方式); 降序——DESC

作用:给查询结果进行排序

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

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

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

SELECT * FROM hero 
ORDER BY defense ASC;

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

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

SELECT * FROM hero 
WHERE country='蜀国'
ORDER BY attack DESC;

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

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

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

** ✨✨✨我是分割线✨✨✨**

🍯7.2 LIMIT(限制显示)


两种格式:
(1) LIMIT n ——>显示前n条记录    
    例如:LIMIT 6 ——>显示前6条记录

(2) LIMIT m,n ——>从第m+1条记录开始显示之后的n条记录  
    例如:LIMIT 2,3 ——>显示第3,4,5条记录

作用:限制查询记录的显示条数

注意:LIMIT永远都要放在SQL查询语句的最后写

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

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

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

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

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;

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

** ✨✨✨我是分割线✨✨✨**

🍯7.3 聚合函数


格式: SELECT ··· (聚合函数) ··· FROM 表名

聚合函数种类:
    (1)AVG(字段名) ——> 求该字段的平均值
    (2)SUM(字段名) ——> 求和
    (3)MAX(字段名) ——> 求最大值
    (4)MIN(字段名) ——> 求最小值
    (5)COUNT(字段名) ——> 统计该字段记录的个数

作用:对表中某个字段的数据进行聚合操作

注意:聚合函数的结果为一个数值,一般与分组、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() *就会将这条记录统计进来。

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

** ✨✨✨我是分割线✨✨✨**

🍯7.4 GROUP BY(分组操作)


格式: ··· GROUP BY 字段名

作用:按照某种规则对查询结果进行分组操作、

注意:GROUP BY之后的字段名必须要为 SELECT 之后的字段名;
     如果不一致,必须对该字段进行聚合处理。

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

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

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

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

SELECT country FROM hero
GROUP BY country;

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

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

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

值得注意的是,此处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;

** ✨✨✨我是分割线✨✨✨**

🍯7.5 HAVING(筛选操作)


格式: HAVING ···

作用:对查询的结果进行进一步的筛选操作

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

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

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

** ✨✨✨我是分割线✨✨✨**

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


格式: DISTINCT 字段名

作用:不显示字段的重复值

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

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

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

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

  • 使用分组操作:SELECT country FROM heroGROUP BY country;
  • 直接使用 DISTINCT 操作:SELECT DISTINCT country FROM hero;

** ✨✨✨我是分割线✨✨✨**

🍯7.7 查询时运算


格式:+ - * / %

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

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

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

SELECT name,attack*2 FROM hero;

标签: mysql sql 数据库

本文转载自: https://blog.csdn.net/qq_54151955/article/details/125544253
版权归原作者 kikokingzz 所有, 如有侵权,请联系我们删除。

“【MySQL入门】第五话 · SQL单表查询”的评论:

还没有评论