返回顶部
首页 > 资讯 > 数据库 >MySQL 数据库聚合查询和联合查询操作
  • 512
分享到

MySQL 数据库聚合查询和联合查询操作

2024-04-02 19:04:59 512人浏览 泡泡鱼
摘要

目录1. 插入被查询的结果2. 聚合查询2.1 介绍2.2 聚合函数2.3 group by 子句2.4 having3. 联合查询3.1 介绍3.2 内连接3.3 外连接

1. 插入被查询的结果

语法:


insert into 要插入的表 [(列1, ..., 列n)] select {* | (列1, ..., 列n)}from 要查询的表

上述语句可以将要查询的表的某些列插入到新的表中对应的某些列

2. 聚合查询

2.1 介绍

聚合查询:是指对一个数据表中某个字段的数据进行部分或者全部统计查询的一种方式(即是在行的维度进行合并的查询)。比如所有全部书的平均价格或者是书籍的总数量等等,在这些时候就会使用到聚合查询这种方法。

2.2 聚合函数

聚合查询可以使用以下常用聚合函数,这些聚合函数就相当于 sql 提供的“库函数”

补充:

  • 当只针对某列进行行数的查询时,如果某行的值为 null,则查询结果不计算这行
  • 对数据进行求和时,数据类型必须为数字,字符串和日期都无法求和
  • 如果语法没有错误,但是出现运行时错误则会报出警告 warnings,此时可以通过 show warnings SQL 语句查看警告信息

接下来以表名为 exam_result,具体数据如下的表,进行示例展示

idnamechinesemathenglish
1唐三藏67.098.056.0
2孙悟空87.578.077.0
3猪悟能88.098.590.0
4曹孟德82.084.067.0
5刘玄德55.585.045.0
6孙权70.073.078.5
7宋公明nullnullnull

2.3 group by 子句

使用前面的聚合函数,实际上是把该表中的所有行结合起来。但还可以使用 group by 来进行分组聚合(在 group by 后面加上指定列名,那么该列中值相同的就将分成一组)

接下来我们将对表名为 emp,数据如下的表进行示例展示

idnamerolesalary
1张三开发10000
2李四开发11000
3王五测试9000
4赵六测试12000
5田七销售7000
6魔王老板50000

2.4 having

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

注意:

  • where 语句是在分组之前进行筛选
  • having 语句是在分组之后进行筛选
  • where 语句和 having 语句可以同时使用

示例1: 查询薪资大于10000的岗位

3. 联合查询

3.1 介绍

联合查询:是可合并多个相似的选择查询的结果集。 也就是进行多表查询,其核心思想是使用了笛卡尔积

笛卡尔积思想:

使用笛卡尔积的思想,其实就是把两个表的结果进行一个排列组合,接下来我们将两个表 A、B 通过笛卡尔积的思想得到一个新的表 C

学生表 A:

学号姓名班级id
1张三2001
2李四2001
3王五2002

班级表 B:

 

班级id班级名
2001高二(1)班
2002高二(2)班

新表 C:

学号姓名班级id班级id班级名
1张三20012001高二(1)班
1张三20012002高二(2)班
2李四20012001高二(1)班
2李四20012002高二(2)班
3王五20022001高二(1)班
3王五20022002高二(2)班

补充:

  • 笛卡尔积得到的结果任然是一个表
  • 该表的列数,是两张表的列数之和
  • 该表的行数,是两张表的行数之积

通过新得到的 C 表,我们就可以将 A、B 两张表联系起来,而联系的纽带在上面的示例中就是班级id。到此时,虽然将两个表联系起来了,但是不是新表中的每条数据都是合理的,例如第2行的信息其实就是不正确的。因此将两表联系起来后,还需要加上一些条件的限制,如 A 和 B 表的班级id应该相同,此时就可以得到一个数据更合理的表 D

新表 D:

学号姓名班级id班级id班级名
1张三20012001高二(1)班
2李四20012001高二(1)班
3王五20022001高二(2)班

此时我们就可以进行一个多表查询

注意:

联合查询由于使用了笛卡尔积,那么新表的行数就是所有表联合的乘积。因此使用联合查询结果的数据可能很大,要谨慎使用

以下示例都是通过下面 SQL 语句建的表来进行操作学习的,如果你想在后面的内容进行操作,可以直接复制使用


drop table if exists classes;
drop table if exists student;
drop table if exists course;
drop table if exists score;

create table classes (id int primary key auto_increment, name varchar(20), `desc` varchar(100));

create table student (id int primary key auto_increment, sn varchar(20),  name varchar(20), qq_mail varchar(20) ,
        classes_id int);

create table course(id int primary key auto_increment, name varchar(20));

create table score(score decimal(3, 1), student_id int, course_id int);

insert into classes(name, `desc`) values 
('计算机系2019级1班', '学习了计算机原理、C和Java语言、数据结构算法'),
('中文系2019级3班','学习了中国传统文学'),
('自动化2019级5班','学习了机械自动化');

insert into student(sn, name, qq_mail, classes_id) values
('09982','黑旋风李逵','xuanfeng@qq.com',1),
('00835','菩提老祖',null,1),
('00391','白素贞',null,1),
('00031','许仙','xuxian@qq.com',1),
('00054','不想毕业',null,1),
('51234','好好说话','say@qq.com',2),
('83223','tellme',null,2),
('09527','老外学中文','foreigner@qq.com',2);

insert into course(name) values
('Java'),('中国传统文化'),('计算机原理'),('语文'),('高阶数学'),('英文');

insert into score(score, student_id, course_id) values
-- 黑旋风李逵
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
-- 菩提老祖
(60, 2, 1),(59.5, 2, 5),
-- 白素贞
(33, 3, 1),(68, 3, 3),(99, 3, 5),
-- 许仙
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
-- 不想毕业
(81, 5, 1),(37, 5, 5),
-- 好好说话
(56, 6, 2),(43, 6, 4),(79, 6, 6),
-- tellme
(80, 7, 2),(92, 7, 6);

3.2 内连接

语法:


-- 方法一:
select 展示的列名 from 表1 [表1别名],表2 [表2别名] where 连接条件;

-- 方式二:使用 [inner] join on
select 展示的列名 from 表1 [表1别名] [inner] join 表2 [表2别名] on 连接条件;

补充:

  • 使用多表查询时,由于有多个表,所以使用其中的列,方式为:表名.列名
  • 可以使用 表名 别名 的方式,将表名起一个别名使用
  • 使用 [inner] join on 方式,如果省略 inner,则默认内连接

示例1: 查询许仙同学每门课的成绩

3.3 外连接

外连接:分为左外连接和右外连接。如果使用联合查询,左侧的表完全显示就是用了左外连接;右侧的表完全显示就是用了右外连接

外连接其实和内连接差不多,都是使用了笛卡尔积。内连接是针对的两个表中的每一条数据都是一一对应的,那怎么就不是一一对应了呢?例如下面两个表 A、B

A 表:

idname
1张三
2李四
3王五

B 表:

student_idscore
190
280
470

我们发现经过笛卡尔积后建立的新表时,A 表的 id 为3的记录和 B 表中没有对应的数据,B 表中 student_id 为4的记录和 A 表中也没有对应的数据,因此这两个表就不能使用内连接的方式去查询,要使用外连接

如果使用左连接的方式,新表 C 为:

idnamestudent_idscore
1张三190
2李四280
3王五nullnull

如果使用右连接的方式,新表 D 为:

idnamestudent_idscore
1张三190
2李四280
nullnull470

补充:

  • 当两个表中的数据可以一一对应时,使用外连接和内连接是等价的
  • 除了内连接、左外连接、右外连接,其实还有全外连接,但是 Mysql 中不支持全外连接操作

语法:


-- 左连接,表1完全显示
select 展示的列名 from 表1 [表1别名] [left] join 表2 [表2别名] on 连接条件;

-- 右连接,表2完全显示
select 展示的列名 from 表1 [表1别名] [right] join 表2 [表2别名] on 连接条件;

3.4 自连接

自连接:是指在同一张表中连接自身进行查询,使用自连接其实可以将”行转换成列“来进行操作

为什么自连接可以将行转换成列来进行操作呢?假设有一张表 A

student_idcourse_idscore
1170
1290
1380

如果我想找到原表中 student_id 为1,且其课程2成绩高于课程3的同学的信息时,就是要对行与行之间进行比较,但是一张表是不能进行该操作的

通过对自己进行笛卡尔积之后,得到新的表 B

student_idcourse_idscorestudent_idcourse_idscore
11701170
12901290
13801380

此时我们发现,如果将原表进行笛卡尔积后,有了两张一样的表,就可以实施行与行之间操作

示例: 查询 Java 成绩高于计算机原理成绩的同学

3.5 子查询

子查询:是指嵌入在其它 SQL 语句中的 select 语句,也叫嵌套查询

分类:

  • 单行子查询:返回一行记录的子查询
  • 多行子查询:返回多行记录的子查询(使用 in 或者 exists)

补充:

  • in 进行多行查询过程: 使用子查询时,先执行子查询,将查询的结果存放在内存里,再执行外层查询,根据内存里的结果进行筛选
  • exists 进行多行查询过程: 先执行外层循环,这样就会得到很多记录,在针对每行记录将它带入到子查询中,符合条件的就保留(exists 就是检测子查询结果是否为空集合

综上所述:

基于 in 的写法,速度快,适合子查询结果集合比较小的情况(较大内存装不下)
基于 exists 的写法,速度慢,适合子查询结果集合比较大,且外层查询结果数量比较少的情况

示例1: 查询不想毕业同学的同班同学(首先要知道不想毕业同学的班级,然后通过班级筛选学生)

3.6 合并查询

合并查询:是使用集合操作符 uNIOn union all 来合并多个 select 的执行结果。使用合并查询时,前后查询的结果集中,字段需要一致

补充:

  • union 操作符不会对结果集的数据进行去重,union all 会进行去重
  • 集合操作符的功能其实和操作符 or 的功能类似,但是如果针对不同的表进行查询,那么 or 就不能使用

示例: 查看 id 小于3,或者课程为 Java 的信息

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 数据库聚合查询和联合查询操作

本文链接: https://lsjlt.com/news/159334.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL 数据库聚合查询和联合查询操作
    目录1. 插入被查询的结果2. 聚合查询2.1 介绍2.2 聚合函数2.3 group by 子句2.4 having3. 联合查询3.1 介绍3.2 内连接3.3 外连接...
    99+
    2024-04-02
  • MySQL --- 聚合查询 和 联合查询
    聚合查询: 下文中的所有聚合查询的示例操作都是基于此表: 聚合函数 聚合函数都是行与行之间的运算。 count() select count(列名) from 表名; 统计该表中该列的行数,但是 null 值不会统计在内,但是...
    99+
    2023-10-21
    mysql 数据库 sql
  • MySQL聚合查询与联合查询操作实例
    目录一. 聚合查询1.聚合函数(count,sum,avg...)2.GROUP BY子句3.HAVING二. 联合查询((重点)多表)1.内连接2.外连接3.自连接4.子查...
    99+
    2024-04-02
  • MySQL中的聚合查询和联合查询操作代码
    目录一、聚合查询(行与行之间的计算)1.常见的聚合函数有:2.group by3.having二、联合查询(多表查询)1.进行联合查询的步骤:2.内连接(from,join on)3.外连接(left/righ...
    99+
    2023-03-20
    mysql聚合查询和联合查询 mysql聚合查询 mysql联合查询
  • MySQL数据库聚合查询和联合查询怎么实现
    这篇文章主要介绍“MySQL数据库聚合查询和联合查询怎么实现”,在日常操作中,相信很多人在MySQL数据库聚合查询和联合查询怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL数据库聚合查询和联合...
    99+
    2023-06-21
  • MySQL进阶查询、聚合查询和联合查询
    目录1. 前言2. 表的设计2.1 一对一2.2 一对多2.3 多对多3.将查询结果放到另一个表中4. 聚合查询4.2 GROUP BY4.3 HAVING5. 联合查询(多表查询)5.1 内连接5.2 外连接5...
    99+
    2023-04-12
    MySQL进阶查询 MySQL聚合查询 MySQL联合查询
  • 【MySQL】进阶查询-聚合查询和联合查询
    文章目录 1. 前言2. 表的设计2.1 一对一2.2 一对多2.3 多对多 3.将查询结果放到另一个表中4. 聚合查询4.1 聚合函数4.2 GROUP BY4.3 HAVING 5. 联合查询(多表查询)5.1 ...
    99+
    2023-08-17
    mysql 数据库 sql
  • MySQL聚合查询与联合查询操作的示例分析
    这篇文章主要为大家展示了“MySQL聚合查询与联合查询操作的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL聚合查询与联合查询操作的示例分析”这篇文章吧。一. 聚合查询1.聚合函...
    99+
    2023-06-29
  • 【MySQL】聚合查询 + 多表联合查询(重点)
    文章目录 前言一、聚合查询1, 聚合函数2, 聚合函数使用示例3, GROUP BY 子句4, HAVING 子句 二、联合查询(重点)1, 笛卡尔积2, 内连接2.1, 示例12...
    99+
    2023-09-29
    mysql 数据库 聚合查询 联合查询 内连接
  • thinkphp5 数据库链式操作聚合查询
    在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: www.96net.com.cn 获取用户数: Db::ta...
    99+
    2019-04-23
    thinkphp5 数据库链式操作聚合查询 数据库入门 数据库基础教程 数据库 mysql
  • MySQL中的聚合查询和联合查询怎么实现
    这篇文章主要介绍“MySQL中的聚合查询和联合查询怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL中的聚合查询和联合查询怎么实现”文章能帮助大家解决问题。一、聚合查询(行与行之间的计...
    99+
    2023-07-05
  • MySQL数据库复合查询操作实战
    目录1.基本查询回顾2.多表查询 (重要)3.自连接4.子查询1)单行子查询 (子查询的结果是单行)(2)多行子查询(3)多列子查询5.合并查询总结:1.基本查询回顾 准备工作,创建一个雇员信息表:(来自oracle 9...
    99+
    2023-05-12
    mysql复合查询语句 mysql复合语句 sql复合查询语句
  • MySQL数据查询中如何使用集合/聚合函数查询
    小编给大家分享一下MySQL数据查询中如何使用集合/聚合函数查询,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!MySQL聚合函数如下:函数作用avg()返回某列的平均值count()返回某...
    99+
    2024-04-02
  • mysql 联合查询
    mysql联合查询 联合查询:union,将多次查询(多条select语句)的结果,在字段数相同的情况下,在记录的层次上进行拼接。 基本语法 联合查询由多条select语句构成,每条select语句获取的字段数相同,但与...
    99+
    2023-08-31
    数据库 sql mysql
  • MySQL数据库之联合查询 union
    目录1、应用场景2、基本语法3、order by的使用前言: 将多个查询结果的结果集合并到一起(纵向合并),字段数不变,多个查询结果的记录数合并 1、应用场景 同一张表中不同结果合并...
    99+
    2024-04-02
  • MySQL数据库之怎么联合查询
    这篇文章主要介绍了MySQL数据库之怎么联合查询的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL数据库之怎么联合查询文章都会有所收获,下面我们一起来看看吧。前言:将多个查询结果的结果集合并到一起(纵向合...
    99+
    2023-06-30
  • MySQL联合查询(多表查询)
    一、内连接 select *from 表1 [ inner | cross ] join 表2 [ on过滤条件 ] [ where查询条件 ] ; [ inner | cross ]: join 内连接关键字(必须要有...
    99+
    2023-09-14
    mysql 数据库 database
  • MySQL 分组查询和聚合函数
    概述 相信我们经常会遇到这样的场景:想要了解双十一天猫购买化妆品的人员中平均消费额度是多少(这可能有利于对商品价格区间的定位);或者不同年龄段的化妆品消费占比是多少(这可能有助于对商品备货量的预估)。 这个时候就要...
    99+
    2022-05-24
    MySQL 分组查询 MySQL 聚合函数
  • 【MySQL】详解聚合查询、多表查询
    MySQL 增删查改(进阶) 文章目录 MySQL 增删查改(进阶)01 表的设计表的三大范式 02 查询操作进阶新增聚合查询countsumavgmaxmin 分组查询 GR...
    99+
    2023-10-07
    mysql adb 数据库
  • MySQL三表联合查询操作举例
    目录一、题目概述二、查询思路三、错误总结附:sql 三个表联合查询(三表左联查询)总结一、题目概述 给定三张表(学生表、科目表、成绩表),查出各科成绩最高的学生的信息(学号、姓名、科目名称、成绩)。三张表下所示。 ...
    99+
    2023-03-06
    sql三表查询 MySQL三表连接 三表连接查询
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作