🍺写在前面
闲话不多说,最近开始写关于数据分析的基础知识,未来对于数据分析的路线规划也在逐步计划中,但是有关【数据库】这类内容肯定是不可缺少的基础知识储备,所以对数据分析有兴趣的同学和大佬可以持续关注本专栏哦!
🌟🌟往期回顾🌟🌟
【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 之后的字段名; 如果不一致,必须对该字段进行聚合处理。
关于分组操作,看似简单,实则它的处理逻辑却值得你细细品味,主要有以下几点需要注意:
- 只有分组操作,没有聚合和HAVING时:【先分组——>后去重】
- 分组、聚合同时存在时:【先分组——>后聚合(对每组)——>再去重】
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;
版权归原作者 kikokingzz 所有, 如有侵权,请联系我们删除。