MySQL数据库聚合查询和联合查询详解

 更新时间:2024年03月06日 10:13:32   作者:晚餐是PM  
聚合查询就是在一个表里通过聚合函数进行查询操作,通常是求和,求平均值等操作,这篇文章主要介绍了MySQL聚合查询和联合查询的相关资料,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

聚合查询:

下文中的所有聚合查询的示例操作都是基于此表:

聚合函数

聚合函数都是行与行之间的运算。

count()

select count(列名) from 表名;

统计该表中该列的行数,但是 null 值不会统计在内,但是如果写为 count(*) 那么 null 也会算进去(就算一整行都是 null 也会算进去

例如我们暂时使用这个表进行演示:

此表有一行全为空

sum()

select sum(列名) from 表名;

只能针对数字类型使用,也可以对多列进行相加求一个总和;

对该表中的math列的值进行求和。

注:会将 null 值排除在外,不予计算。

avg()

select avg(列名) from 表名;

对该表中的该列进行求平均值。

只能针对数字类型使用

注:会将 null 值排除在外,不予计算。

max()

select max(列名) from 表名;

求出该表中该列的最大值。

只能针对数字类型使用

注:会将 null 值排除在外,不予计算。

min()

select min(列名) from 表名;

求出该表中该列的最小值。

只能针对数字类型使用

注:会将 null 值排除在外,不予计算。

group by

group by 可以实现对数据进行分组

一般的使用方法都是先用  group by 进行分组,然后再利用聚合函数进行聚合查询。

select * from 表名 group by 列名;

group by 会将该列中值相同的分为一组。因为没有使用order by 进行排序操作所以MySQL并不会对查询结果的顺序做出保证。

此时我们在原有表的基础上再加一行数据。

加入该条数据后该表变成了:

此时再进行分组查询操作:

此时因为没有使用聚合函数所以 张三这一行 只是在张三这一组中选了一个代表

如果加入聚合函数就可以很清楚的看到,聚合函数会以每组为单位进行操作

此时如果我们不想让某行(某几行)参与分组就可以在 group by 之前加入 where 进行条件筛选。

select * from 表名 where 条件 group by 列名;

例:此时我们不想让 null 这个空值和 math=100 的行参与分组 

注意:where 条件 必须在 group by 之前

在后面就会报错。

having

having 其实和 where 差不多都是进行条件筛选的语句。

group by 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 where 语句,而需要用 having

having是对分组之后的数据进行筛选的。

例:此时我们不想让 null 这个空值和 成绩=100 的行参与分组 

此时的语句执行顺序为:

所以 having 子句中的条件一定要和 select 中的对应

注:having 必须写在 group by 子句之后。

联合查询:

实际开发中往往数据来自不同的表,所以需要多表联合查询。

多表查询的关键是对多张表的数据取笛卡尔积:

下面我先简单介绍一下笛卡尔积,假设我们现在有如下的两张表。而对他们的数据取笛卡尔积就是用第一个表的每行数据分别与第二张表的每行数据进行组合。 

这两张表进行笛卡尔积之后就变成了一个 9 行 4 列的新表,如图所示

这就是对两个表进行去取笛卡尔积的结果。

但是,我们很容易就可以发现这里面有非常多的所谓的非法数据,

从图中我们可以看到只有三条数据是合法的,而我们再进行数据库操作的时候肯定不能允许有这么多的非法数据出现在查询结果中,此时我们就可以通过寻找两张表的关联属性来通过 where 条件来进行筛选,比如上面的表就可以通过设置两张表的班级相同来进行筛选。

内连接

内连接其实就是在多张表中求交集(或者说就是最终查询的结果中的每条数据的链接条件都存在于原本的多张表中)。

此处为了更好的演示,我先创建了三张表

内连接的语句就这两条: 

select 字段 from 表1  [inner] join 表2  on 连接条件 and 其他条件;

select 字段 from 表1 ,表2  where 连接条件 and 其他条件;

上面这些格式看着很复杂其实完全没有必要记这些。只要按照下面这些步骤一步一步的多练习几次就能掌握。

内连接本质上分为以下几步:

例:查询凌华的各科成绩。

第一步:先求出笛卡尔积

select * from 表一,表二,……

通过上述语句就可以求出多张表的笛卡尔积。

此时一共输出了27条数据。

第二步:加上连接条件,筛选出合法信息

此处推荐再写where中的条件时,使用 表名 点 列名 的写法因为表中可能会有相同的列名。

第三步:结合需求进一步增加条件,对结果进行筛选;

此处需要增加的条件就是名字是凌华。

第四步:对列进行精简,筛选出需要展示的列

此时你再对照开头的表达式就会发现一摸一样,基本上所有的内连接都可以套用这四大步。

select 字段 from 表1  [inner] join 表2  on 连接条件 and 其他条件;

select 字段 from 表1 ,表2  where 连接条件 and 其他条件;

注:第一条语句中的 [inner] join 中的 inner 之所以用 [] 括起来是因为可以省略不写。

外连接

如果多张表中的信息都存在对应关系那么内连接和外连接的结果就都是一样的,如果表中的数据不对应内外连接就会出现差别。

外连接分为左外连接和右外连接。

例:有如下两张数据没有完全对应的表

左外连接

select 字段 from 表1  left join 表2 on 连接条件 and 其他条件;

这个表达式除了 left 之外和内连接都是相同的。

左外连接就是以左表为基础,如果左表有右表没有那么就用 null 代替。

右外连接

select 字段 from 表1  right join 表2 on 连接条件 and 其他条件;

这个表达式除了 right 之外和左外连接都是相同的。

右外连接就是以右表为基础,如果右表有左表没有那么就用 null 代替。

自连接

自连接就是自己和自己取笛卡尔积,和内连接的解题方法相同。

注:在自连接中必须要给表取别名否则会报错。

自连接的优点:可以将行与行之间的关系转换成列与列。

例:在上述表中查询出 C++ 成绩大于单片机成绩的人。

子查询

子查询本质上就是‘套娃’,就是将多个简单的sql语句嵌套成一个复杂的sql语句。 

例:查找出名为可莉的学生在几年级。

1.先找出可莉的班级号

2.根据班级号在班级表中找到班级名

而子查询就是将这两句sql语句嵌套起来

合并查询

合并查询是通过 union 来实现的

在MySQl中可以通过 union 来将多个表的查询结果合并成一张表。

注:合并的两个结果的对应列之间列数和数据类型必须相同(列名系统会自动按照第一个表的列名),union 会去掉结果中的重复项。

例如查询这两张表中的 id 和 name 结果返回一张表;

在这张结果中只有一个 id = 1 的学生。

如果你不想对结果进行去重处理,就可以使用 union all 

如果对同一张表使用 union 那么它的结果会和使用 or 相同

总结 

到此这篇关于MySQL数据库聚合查询和联合查询的文章就介绍到这了,更多相关MySQL聚合查询和联合查询内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • Mysql存储引擎特性总结

    Mysql存储引擎特性总结

    这篇文章主要介绍了Mysql存储引擎特性总结,同时总结了最常用的2种存储引擎的特性,以及各引擎的适用环境,需要的朋友可以参考下
    2014-07-07
  • MySQL?insert死锁问题解决详细记录

    MySQL?insert死锁问题解决详细记录

    上周遇到一个因insert而引发的死锁问题,其成因比较令人费解,下面这篇文章主要给大家介绍了关于MySQL?insert死锁问题解决详细记录的相关资料,需要的朋友可以参考下
    2022-11-11
  • mysql报1292?Incorrect?datetime?value错误的解决方法

    mysql报1292?Incorrect?datetime?value错误的解决方法

    这篇文章主要给大家介绍如何解决mysql报1292?Incorrect?datetime?value错误,文中有详细的解决方案,具有一定的参考价值,需要的同学可以参考阅读下本文
    2023-07-07
  • MySQL 随机密码生成代码

    MySQL 随机密码生成代码

    晚上有朋友问起,简单的写了一个。
    2009-09-09
  • MySQL定时备份方案(利用Linux crontab)

    MySQL定时备份方案(利用Linux crontab)

    这篇文章主要给大家介绍了关于MySQL定时备份方案的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • Centos7 安装mysql 8.0.13(rpm)的教程详解

    Centos7 安装mysql 8.0.13(rpm)的教程详解

    这篇文章主要介绍了Centos7 安装mysql 8.0.13(rpm)的教程详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • MySQL数据表基本操作实例详解

    MySQL数据表基本操作实例详解

    这篇文章主要介绍了MySQL数据表基本操作,结合实例形式较为详细的分析了MySQL针对数据表的基本创建、表结构查看、修改、删除等相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • mysql记录耗时的sql实例详解

    mysql记录耗时的sql实例详解

    这篇文章主要介绍了mysql记录耗时的sql实例详解的相关资料,这里提供实现方法,希望能帮助到大家,需要的朋友可以参考下
    2017-08-08
  • mac系统OS X10.10版本安装最新5.7.9mysql的方法

    mac系统OS X10.10版本安装最新5.7.9mysql的方法

    这篇文章给大家介绍mac系统OS X10.10版本安装最新5.7.9mysql的方法,本文分步骤纯文字说明,介绍的非常详细,具有参考价值,在此分享供大家参考
    2015-10-10
  • mysql 优化日记

    mysql 优化日记

    mysql 优化日记 使用mysql的朋友可以参考下,大家知道如果mysql优化与没优化性能会相差不少呢。
    2009-07-07

最新评论

?


http://www.vxiaotou.com