MySQL --- 聚合查询 和 联合查询

聚合查询:

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

聚合函数

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

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 相同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/165089.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis性能滑坡:哈希表碰撞的不速之客【redis第二部分】

Redis性能滑坡:哈希表碰撞的不速之客 前言第一部分:Redis哈希表简介第二部分:哈希表冲突原因第三部分:Redis哈希函数第四部分:哈希表冲突的性能影响第五部分:解决冲突策略第六部分:redis是如何解…

偶数科技发布实时湖仓数据平台Skylab 5.3版本

近日, 偶数发布了最新的实时湖仓数据平台 Skylab 5.3 版本。Skylab包含七大产品,分别为云原生分布式数据库 OushuDB、数据分析与应用平台 Kepler、数据资产管理平台 Orbit、自动化机器学习平台 LittleBoy、数据工厂 Wasp、数据开发与调度平台 Flow、系统…

深入探讨 Golang 中的追加操作

通过实际示例探索 Golang 中的追加操作 简介 在 Golang 编程领域,append 操作是一种多才多艺的工具,使开发人员能够动态扩展切片、数组、文件和字符串。在这篇正式的博客文章中,我们将踏上一段旅程,深入探讨在 Golang 中进行追加…

Linux入门攻坚——4、shell编程初步、grep及正则表达式

bash的基础特性(续): 1、提供了编程环境: 编程风格:过程式:以指令为中心,数据服务于执行;对象式:以数据为中心,指令服务于数据 shell编程,编译执…

墨迹天气商业版UTF-8模板,Discuz3.4灰白色风格(带教程)

1.版本支持:Discuzx3.4版本,Discuzx3.3版本,DiscuzX3.2版本。包括网站首页,论坛首页,论坛列表页,论坛内容页,论坛瀑布流,资讯列表页(支持多个),产品列表页(支持多个),关于…

Visual Components软件有哪些用途 衡祖仿真

Visual Components是一款用于制造业虚拟仿真的软件,主要用于工业自动化和制造领域。我们一起来看一下该软件有哪些功能吧! 1、工厂仿真 Visual Components可以建立虚拟的工厂环境,模拟和优化生产流程。用户可以创建工厂布局、定义设备和机器人…

多年没有遇到如此流畅的面试了

美东一公司的面试,有多年没有遇到如此流畅的面试了。 本来说的面试时间是 30 分钟,这个还是第一轮处于电话面试那种,但是不知道为什么最后面试整个时间都延长到了快一个小时,貌似双方都还继续沟通下,有点意犹未尽的感觉…

【Java】正则表达式,校验数据格式的合法性。

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 正则表达式 正则表达式: ①可以校…

“第四十五天” 数据结构基本概念

目前看的有关数据结构的课,估计这周就看完了,但感觉差很多,还是和c一样,这样过一下吧。但可能比较急,目前是打算争取寒假回家之前把四大件都先大致过一遍。 数据结构里面有很多新的定义和概念,学到现在&am…

R语言中fread怎么使用?

R语言中 fread 怎么用? 今天分享的笔记内容是数据读取神器fread,速度嘎嘎快。在R语言中,fread函数是data.table包中的一个功能强大的数据读取函数,可以用于快速读取大型数据文件,它比基本的read.table和read.csv函数更…

SELECT COUNT(*) 会造成全表扫描吗?

前言 SELECT COUNT(*)会不会导致全表扫描引起慢查询呢? SELECT COUNT(*) FROM SomeTable 网上有一种说法,针对无 where_clause 的 COUNT(*),MySQL 是有优化的,优化器会选择成本最小的辅助索引查询计数,其实反而性能…

物联网_00_物理网介绍

1.物联网为什么会出现? 一句话-----追求更高品质的生活, 随着科技大爆炸, 人类当然会越来越追求衣来伸手饭来张口的懒惰高品质生活, 最早的物联网设备可以追溯到19世纪末的"在线可乐售卖机"和"特洛伊咖啡壶"(懒惰的技术人员为了能够实时看到物品的情况而设…

spring cloud Eureka集群模式搭建(IDEA中运行)

spring cloud Eureka集群模式搭建(IDEA中运行) 新建springboot 工程工程整体目录配置文件IDEA中部署以jar包形式启动总结 新建springboot 工程 新建一个springboot 工程,命名为:eureka_server。 其中pom.xml文件为: …

如何理解TCP/IP协议?

一、是什么 TCP/IP,传输控制协议/网际协议,是指能够在多个不同网络间实现信息传输的协议簇 TCP(传输控制协议) 一种面向连接的、可靠的、基于字节流的传输层通信协议 IP(网际协议) 用于封包交换数据网…

笔记本电脑Windows10安装

0 前提 安装windows10的电脑为老版联想笔记本电脑,内部没有硬盘,临时加装了1T的硬盘。 1u盘准备 准备u盘,大小大于16G。u盘作为系统盘时,需要将内部的其他文件备份,然后格式化。u盘格式化后,插入一款可以…

马赫数相关函数

1 函数 k是常数&#xff0c;Ma是变量 2应用程序 点击上方资源下载 3 计算 3.1 c语言 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h>#define k 1.4 // k为常数// 定义的函数 double T(double Ma) {return pow((1 (k - 1) / 2 * Ma …

SpringCloud 微服务全栈体系(二)

第三章 Eureka 注册中心 假如我们的服务提供者 user-service 部署了多个实例&#xff0c;如图&#xff1a; 思考几个问题&#xff1a; order-service 在发起远程调用的时候&#xff0c;该如何得知 user-service 实例的 ip 地址和端口&#xff1f;有多个 user-service 实例地址…

Cloud Studio连接MySQL,Access denied for一系列问题

官方文档有写如何安装Mysql $ apt update $ apt install mysql-server mysql-client -y$ service mysql start mysql -uroot -p123456进入MySQL命令行 问题出在连接数据库这一步&#xff0c;命令行能进去&#xff0c;但是数据库插件和代码都连不上 Access denied for 大概率…

mybatisplus开启sql打印的三种方式

1、在application.yml文件中添加mybatisplus的配置文件 使用mybatisplus自带的log-impl配置&#xff0c;可以在控制台打印出sql语句、执行结果的数据集、数据结果条数等详细信息&#xff0c;这种方法适合再调试的时候使用&#xff0c;因为这个展示的信息详细&#xff0c;更便于…

攻防世界web篇-cookie

看到cookie立马就会想到F12键看cookie的一些信息 我这个实在存储里面看的&#xff0c;是以.php点缀结尾&#xff0c;可以试一下在链接中加上.php 得到的结果是这样 这里&#xff0c;我就只能上csdn搜索一下了&#xff0c;看到别人写的是在get请求中可以看到flag值