Mysql数据库--聚合查询、分组查询、联合查询(不同的连接方式)
文章目录
- 1.查询的进阶版
- 1.1查询搭配插入进行使用
- 1.2聚合查询
- 1.3group by分组查询
- 1.4联合查询之笛卡尔积
- 1.5左外连接,右外连接介绍join on
- 1.6自连表
1.查询的进阶版
1.1查询搭配插入进行使用
我们首先创建两张表,一个叫做student,一个叫做student2,两个表都是只有这个int和varchar 的数据类型,这个时候,我们向这个第一个表里面直接使用这个insert插入数据,但是这个时候student2这个表还是空的;
我们查询这个student这个表里面插入的内容:
把这个查询的结果直接插入到我们的这个student2这个表里面去:这个实际上就是把两个步骤合成了一步,但是因为这个是查询结果的插入,所以就可以直接把两个语句合并了,查询发现这个是成功的;
但是上面的这个查询结果的直接插入显然是有局限性的,就是两个表的结构必须是一样的,否则这个插入注定无法成功,我们的两个表都是只有这个id和name两列,因此这个是可以把我们查询到的结果直接插入的;
1.2聚合查询
聚合查询的这个里面主要就是我们的这个sum,count,min,max等等之类的这个函数的用法添加到了我们原来的这个语句里面去罢了,下面我们会依次去演示这个例如count,sum,min,max的用法;
首先还是要创建一张表,然后向这个表里面插入一些数据,例如下面的这个所示,我下面的这个演示也是基于下面的这个表进行的:
下面的这个就是聚合查询里面的这个count的使用,我们可以使用这个count计算这个数据的行数,虽然我们通过这个select好像是可以看到这个数据的行数的,但是这个是客户端,当我们在这个服务器里面通过代码来操作的时候,我们是看不到这个信息的,因此这个count还是很有必要的;
我们不仅可以使用这个通配符(表示所有)作为我们的查询的内容,我们也可以使用这个name进行指定,反正我们这个表里面无论使用哪一个索引,查询出来的这个结果都是一样的;
但是如果哦我们的这个表里面有些数据是空的,这个时候我们再次使用这个select进行这个count计数的时候,这个null也是会被算上的,我们可以insert进去一行全部都是空的数据尝试一下,但是我们使用这个name进行统计的时候,这个null就不会被统计进去;
当然,在上面的这个基础之上,我们也可以添加上前面的这个约束,例如下面的这个就是使用的distinct约束之后对于这个数学这一列进行统计的,这个时候分数相同的情况下就不会重复统计了;
下面的这个是使用的sum函数进行这个统计的,)因为这个里面的这个语句写的有问题,中间出现了小状况,因此这个打上了马赛克),我们使用这个sum的时候,如果这个里面的参数是我们的这个具体的学科的时候,因为这个分数是double类型的数据,这个是可以进行相加操作的,但是如果我们对于这个name进行求和的操作,这个时候输出的结果是0,而且会有警告;
其实这个主要就是因为我们的name这个类型的数据如果是想要进行求和,需要首先进行转化,但是这个转化失败了,所以这个输出的结果就是0,如果我们的这个名字是类似于这个代号001,002,003之类的这个,其实这个就是可以正常转换的了;
下面的这个就是插入了一行名字是006的数据,这个时候再次进行sum求和,就会发现这个时候的结果就是我们的6,因此这个就可以说明我们的这个006这样类似的这个name是可以被转换成功的,但是其他的这个“孙悟空”之类的这个不会被正确转换;
此外,这个sum里面可以添加一些这个表达式之类的,像下面的这个就是在我们的这个sum里面添加了一个表达式,表达的就是三门学科的平均成绩,这个时候我们的这个sql语句执行的时候,就会首先去执行这个求和的过程(chinese+math+english),然后再去把每一个人的这个分数进行sum操作,这其实就是两个步骤,使用一个sql语句进行表达罢了;
除此之外,这个SQL语句里面,还可以使用这个min,max,avg这样的函数,进行一些数据的处理:下面的这个就是求出来某一门科目的这个最大值,最小值,以及平均值的SQL语句,其实也不是很困难;
1.3group by分组查询
我们的操作还是基于这个表来完成的,因此我们首要的任务就是创建一张表:我下面的这个是一个简单的和这个公司的业务类型以及这个薪资,姓名制作的一张表;
这个时候,我们计算一下这几个人的平均的薪资,使用的就是我们的这个avg聚合函数:但是这个是所有人的平均薪资,这个显然是不可以客观反应我们的实际情况的,因此我们需要按照这个置为分别去求解这个对应岗位的平均薪资,这个就是我们的group by分组查询;
下面的这个就是按照岗位进行的平均薪资的计算,这个就是在原来的基础上面加上了这个group by+分组的依据,select后面的两个参数就是我们打印输出的选定的内容;
我们使用这个groupby的时候去,即使是可以搭配条件进行使用的,例如这个需要注意的是,我们的这个条件是分组之前的条件还是分组之后的条件:
例如下面的两个情况:
1.查询每一个岗位的平均工资,但是排除张三;
2.查询每一个岗位的平均薪资,但是排除平均薪资超过了2w的结果;
上面的这两个情况就是很明显的,第一个就是属于分组前就需要使用这个条件,第二个则是分组之后,计算出来的结果结合我们的条件再去进行判断;
首先看第一个情况:这个时候的条件我们只需要使用这个sql语句里面的where加上这个条件进行筛选就可以了;
select role,avg(salary) from emp where name != ‘张三’ group by role;
再看第二个情况:这个时候我们需要使用这个having子句,加在这个group by的后面;
select role,avg(salary) from emp group by role having avg(salary) < 20000;
在我们玩呢SQL语句里面,可以只使用一个语句同时进行上面两个条件的筛选:
select role,avg(salary) from emp where name != ‘张三’ group by role having avg(salary) < 20000;
1.4联合查询之笛卡尔积
想要知道这个联合查询,我们时候选要来学习一下这个笛卡尔积
下面的这个是两张表:一个是我们的class班级表,一个是我们的student学生表,两个表里面都有学生班级的信息,只不过这个列名不一样,一个是使用的id表示的,一个是使用的classid表示的;
什么是笛卡尔积:实际上就是排列组合,我们的第一个表里面的每一行都要和第二个表里面的内容进行组合,因此这个新的表的列数就是两个表的和,新的表的行数就是两个表的行的乘积(数学知识,不难理解哈);
我们首先创建四张表:
学生表,班级表,分数表和课程表,内容如下:
这个分数表里面虽然都是数字,但是这个是可以看出来一定的信息的,这个score就是我们的分数,但是这个student_id和course_id就需要到上面的表里面去找到对应的这个课程的名字和学生的名字,例如这个里面的第一行的student_id对象的就是李逵,course_id对应的就是课程表里面的这个java课程,因此这个就是李逵同学的这个java课程的分数就是70.5,通过这样的方式,我们在每一行数据代表的都是某一个同学的某一门课程的实际分数;
练习案例:查询许仙同学的成绩
我们首先要知道需要合并那两个表,一个就是我们学生表(因为是许仙同学),一个就是分数表(因为要找的是成绩)
我们的这个联合查询也是很简单的,就是使用的这个
select * from student,score;(这个顺序决定了哪个表在左边,哪个表在右边)
先取出来哪个表和另外的表进行排列组合,都是可以的;
我们要选出来上面的这个笛卡尔积之后的这个里面两个id相等的情况,其他的数据都是无意义的,这个时候我们可以使用这个
select * from student,score where id = student_id;
但是这个语句会有问题,因为如果我们的这两个表里面出现了相同名字的类,这个时候的连接就会出现问题;
下面的这个是建议的写法:指出来自己的这个咧处于哪一个表里面:
下面的这个就是我们只需要选择出来这个成绩的name是许仙的:
select * from student,score where student.id=score.student_id and student.name=‘许仙’;
上面的这个依然显得很冗余,这个时候,我们让这个select后面的这个东西制定出来具体的类,不要显示出阿里所有的这个信息,因此,我们针对查询结果进行精简:
select student.name score.score from student,score where student.id=score.student_id and student.name=‘许仙’;
1.5左外连接,右外连接介绍join on
上面介绍的这个内容都是属于内连接,实际上我们还有外连接等连接方式,其中这个外连接里面还分为这个左外连接和右外连接;
在下面的这个表里面,如果我们的右边的这个表里面的这个4换成3,两个表里面的这个id是对应的,这个时候无论我们是使用这个内连接,还是外连接,其实这个结果都是一样的,但是我们为什么要了解这个外连接呢,就是如果这个是4,两个表里面的这个id不是完全对应的,这个时候需要我们的外连接方式;
就上面的这个数据,我们可以按照下面的这个流程逐步过渡到这个外连接:
==select * from student,score where student.id=score.id;==这个方式就是内连接的方式,得到的是两边的这个公共属性的数据;
==select * from student join score on student.id=score.id;==这个加上了join on这个选项,实际上输出的结果和上面的这个是一样的;
join on和上面的这个内连接可以达到相同的效果,为什么还要知道这个,就是因为我们的这个左外连接和有外连接是基于这个进行改造的
左外连接:select * from student left join score on student.id=score.id;
右外连接:select * from student right join score on student.id=score.id;
仔细观察不难发现,两个连接方式很显然,就是因为两个表里面的一些内容是你有我没有或者是我有你没有的,这个时候左外连接就是把左边的这个表里面的特有内容添加上去(添加到我们的内连接的这个结果里面,因为我们的内连接是显示的公共的属性内容,左外连接和右外链接都是在这个公共的上面去添加内容的),这个时候右边的这个表里面没有对应内容,就是用null进行填充,反之亦然;
1.6自连表
就是自己和自己连接:首先通过下面的这个,看一下为什么要搞这个自连接
我们想要显示这个计算机原理比这个java课程的成绩高的这个相关的信息,我们的这个成绩表里面,这个成绩都是一行一行进行读取的,这个时候我们的这个每一行是没有办法直接比较的,因为我们上面的这个各种函数和操作都是列与列作为判断的条件的;
这个时候我们想要比较,需要是这个相同的student_id,找出这个对应的这个1,3(分别对应这个计算机原理和java课程)对应的成绩进行比较,这个就需要使用我们的自连接;
但是链接的时候,名字不可以一样,如果我们直接使用score 链接这个score就会报错,我们可以给这个表取两个别名,然后自连接;
select * from score as s1,score as s2 where s1.student_id = s2.student_id;
select * from score as s1,score as s2 where s1.student_id = s2.student_id and s1.course_id=3 and s2.course_id =1;
这个时候,其实打印的这个结果就已经有些眉目了:我们的每一行里面,这个student=1代表的就是一个学生的,这一行数据里面既有这个1课程的成绩,又有这个3课程的成绩,这个就可以使用这个列进行这个成绩的比较了-------这个就是把行之间的比较转换为我们的列之间的比较------------------自连接的核心精魂
select * from score as s1,score as s2 where s1.student_id = s2.student_id and s1.course_id=3 and s2.course_id =1 and s1.score>s2.score;---------------进一步筛选;
select s1.student_id,s1.score,s2.score from score as s1,score as s2 where s1.student_id = s2.student_id and s1.score > s2.score;—选出来有用信息的列;
最后的这个结果和学生表进行笛卡尔积就可以得到这个学生的名字;
最后的结果和我们的课程表进行笛卡尔积就可以得到这个课程的名字;
相关文章:

Mysql数据库--聚合查询、分组查询、联合查询(不同的连接方式)
文章目录 1.查询的进阶版1.1查询搭配插入进行使用1.2聚合查询1.3group by分组查询1.4联合查询之笛卡尔积1.5左外连接,右外连接介绍join on1.6自连表 1.查询的进阶版 1.1查询搭配插入进行使用 我们首先创建两张表,一个叫做student,一个叫做student2,两个…...

计算机视觉——图像修复综述篇
目录 1. Deterministic Image Inpainting 判别器图像修复 1.1. sigle-shot framework (1) Generators (2) training objects / Loss Functions 1.2. two-stage framework 2. Stochastic Image Inpainting 随机图像修复 2.1. VAE-based methods 2.2. GAN-based methods …...

集中式架构和分布式架构
数据是企业的核心资产和战略资源。面对爆炸性的数据增长,如何有效地组织、管理和利用数据成为企业的重大挑战。数据架构作为企业数据管理的蓝图和框架,发挥重要作用。本文就来详细说下当下主流的两种数据架构的类型。 首先明确数据架构定义:…...

Redis: 集群高可用之故障转移和集群迁移
故障转移 故障转移,包括自动故障转移和手动故障转移 1 )自动故障转移 Redis 集群,主节点挂了,从节点可以顶上来继续提供服务常用制造故障的两种方式 第一,对其中一个节点进行 SHUTDOWN 操作第二,kill 掉…...

记账软件在线、会计记账网站、财务记账官网、记账云、云记账、在线免费做账以及易舟云财务软件
记账软件在线、会计记账网站、财务记账官网、记账云、云记账、在线免费做账以及易舟云财务软件,以下是一些详细的介绍和推荐: 一、记账软件在线与会计记账网站 记账软件和会计记账网站是现代财务管理中不可或缺的工具,它们能够帮助企业或个人…...

Elasticsearch基础_3.基础操作
文章目录 一、索引操作1.1、创建索引1.2、删除索引 二、映射操作2.1、查看映射2.2、扩展映射 三、文档操作3.1、单条写入文档3.2、更新单条文档3.3、查看单条文档3.4、删除单条文档3.5、根据条件删除文档 一、索引操作 1.1、创建索引 PUT /${index_name} {"settings&quo…...

PHP永久性Cookie的含义
PHP中的永久性Cookie(也称为持久性Cookie)是指在用户的计算机上存储的一种持久性的HTTP Cookie。与常规的临时Cookie不同,永久性Cookie在浏览器关闭后依然保留,并且可以在用户下次访问该网站时被读取和使用。 主要特点 持久存储…...

瑜伽培训行业为何要搭建自己的专属知识付费小程序平台?集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统
在当今快节奏的生活中,瑜伽作为一种舒缓压力、增强体质的生活方式,受到了越来越多人的青睐。瑜伽培训行业也随之蓬勃发展,但如何在激烈的市场竞争中脱颖而出,成为众多瑜伽培训机构面临的一大挑战。搭建自己的专属知识付费小程序平…...

FFT 分析进阶-笔记
FFT 分析进阶 边界不连续与泄漏效应解决方法增加窗函数海宁窗与哈布什窗混叠效应频率高到什么程度会出现混叠现象呢?那我们有办法去应对这个混叠吗?经典平均指数平均关于结果的显示模式FFT计算的三个常见的范例计算FFT图谱中某一段的总值,图中…...

毕业设计_基于springboot+layui+mybatisPlus的中小型仓库物流管理系统源码+SQL+教程+可运行】41004
毕业设计_基于springbootlayuimybatisPlus的中小型仓库物流管理系统源码SQL教程可运行】41004 下载地址: https://download.csdn.net/download/qq_24428851/89843203 技术栈 后端:springboot、mybatis-plus、shiro 前端:layUI 存储&…...

ROS基础入门——实操教程
ROS基础入门——实操教程 前言 本教程实操为主,少说书。可供参考的文档中详细的记录了ROS的实操和理论,只是过于详细繁杂了,看得脑壳疼,于是做了这个笔记。 Ruby Rose,放在这里相当合理 本文初编辑于2024年10月4日 C…...

etcd 快速入门
简介 随着go与kubernetes的大热,etcd作为一个基于go编写的分布式键值存储,逐渐为开发者所熟知,尤其是其还作为kubernetes的数据存储仓库,更是引起广泛专注。 本文我们就来聊一聊etcd到底是什么及其工作机制。 首先,…...

Spring MVC__HttpMessageConverter、拦截器、异常处理器、注解配置SpringMVC、SpringMVC执行流程
目录 一、HttpMessageConverter1、RequestBody2、RequestEntity3、ResponseBody4、SpringMVC处理json5、SpringMVC处理ajax6、RestController注解7、ResponseEntity7.1、文件下载7.2、文件上传 二、拦截器1、拦截器的配置2、拦截器的三个抽象方法3、多个拦截器的执行顺序 三、异…...

GAMES101(19节,相机)
相机 synthesis合成成像:比如光栅化,光线追踪,相机是capture捕捉成像, 但是在合成渲染时,有时也会模拟捕捉成像方式(包括一些技术 动态模糊 / 景深等),这时会有涉及很多专有名词&a…...

Django Nginx+uwsgi 安装配置
Django Nginx+uwsgi 安装配置 本文将详细介绍如何在Linux环境下安装和配置Django应用程序,使用Nginx作为Web服务器和uwsgi作为应用程序服务器。我们将覆盖以下主题: 安装Python和相关库安装和配置Django安装Nginx安装和配置uwsgi配置Nginx以使用uwsgi测试和调试1. 安装Pytho…...

oracle数据备份和导入
一、数据导出 创建目录对象: CREATE DIRECTORY dpump_dir AS /path/to/your/directory;授予权限: GRANT READ, WRITE ON DIRECTORY dpump_dir TO test_user; #导出的用户导出全库数据 expdp your_user/your_password DIRECTORYdpump_dir DUMPFILEfu…...

C++ | Leetcode C++题解之第452题用最少数量的箭引爆气球
题目: 题解: class Solution { public:int findMinArrowShots(vector<vector<int>>& points) {if (points.empty()) {return 0;}sort(points.begin(), points.end(), [](const vector<int>& u, const vector<int>&…...

react-问卷星项目(3)
项目实战 React Hooks 缓存,性能优化,提升时间效率,但是不要为了技术而优化,应该是为了业务而进行优化 内置Hooks保证基础功能,灵活配合实现业务功能,抽离公共部分,自定义Hooks或者第三方&am…...

69 BERT预训练_by《李沐:动手学深度学习v2》pytorch版
系列文章目录 文章目录 系列文章目录NLP里的迁移学习Bert的动机Bert架构对输入的修改五、预训练任务1、2、3、 六、1、2、3、 七、1、2、3、 八、1、2、3、 NLP里的迁移学习 之前是使用预训练好的模型来抽取词、句子的特征,例如 word2vec 或语言模型这种非深度学习…...

Java报错输出的信息究竟是什么?
Java报错输出的信息究竟是什么? 本篇会带大家了解一下java运行时报错输出的信息内容,简单学习一下虚拟机内存中Java虚拟机栈的工作方式以及栈帧中所存储的信息内容 异常信息 当你的程序运行报错时,你是否会好奇打印出来的那一大坨红色的究竟…...

解表之紫苏
** 声明:本文介绍的中药仅供学习使用,请勿擅自使用,否则后果自负!!!因水平有限,如有不当之处,请批评指正!!!!图片来源网络࿰…...

JavaScript数据类型
目录 JavaScripit数据类型 原始类型(Primitive Types) 1 Undefined 特点 实例 2 Null 实例 3 Boolean 重点: 常用falsy情况: 思考 4 Number,BigInt 实例 特点 NaN 5 String 在JavaScript中表示字符串有三种表示方…...

市场中的新兴力量与未来发展
在当前瞬息万变的全球金融市场中,期货交易以其高杠杆与灵活性,吸引了越来越多的投资者参与其中。大粤期货作为中国期货行业的新兴力量,凭借其创新的交易平台、广泛的产品线及专业的风险管理服务,迅速在市场中崭露头角。本文将介绍…...

Golang | Leetcode Golang题解之第446题等差数列划分II-子序列
题目: 题解: func numberOfArithmeticSlices(nums []int) (ans int) {f : make([]map[int]int, len(nums))for i, x : range nums {f[i] map[int]int{}for j, y : range nums[:i] {d : x - ycnt : f[j][d]ans cntf[i][d] cnt 1}}return }...

Java 常用序列化对比
Java 中常用的序列化方式主要包括以下几种: 1. Java 原生序列化 使用方式: 使用 java.io.Serializable 接口。对象需要实现该接口,然后通过 ObjectOutputStream 和 ObjectInputStream 进行序列化和反序列化。 示例代码: import java.io.*;public class Person impleme…...

【redis学习篇1】redis基本常用命令
目录 redis存储数据的模式 常用基本命令 一、set 二、keys pattern keys 字符串当中携带问号 keys 字符串当中携带*号 keys 【^字母】 keys * 三、exists 四、del 五、expire 5.1 ttl命令 5.2key删除策略 5.2.1惰性删除 5.2.2定期删除 六、type key的数据类型…...

量子计算:颠覆未来计算的革命性技术
量子计算:颠覆未来计算的革命性技术 量子计算作为下一代颠覆性技术,正在引领计算领域的重大变革。与传统计算机基于比特的二进制运算不同,量子计算通过量子比特(qubits)在叠加态和纠缠态下实现并行计算,能…...

ctfshow-web入门(信息收集,持续更新中。。)
写在之前:近期打了个比赛,备受打击,入手了vip账号进修,加油! 文章目录 ctfshow-web1查看源代码ctfshow-web2burp抓包ctfshow-web3burp抓包ctfshow-web4访问robots.txtctfshow-web5dirscarch扫描PHPS文件泄露ctfshow-web6dirscarch扫描ctfshow-web7dirscarch扫描ctfshow-w…...

蓝桥杯【物联网】零基础到国奖之路:十五. 扩展模块之双路ADC
蓝桥杯【物联网】零基础到国奖之路:十五. 扩展模块之双路ADC 第一节 硬件解读第二节 CubeMX配置第三节 代码编写 第一节 硬件解读 STM32的ADC是12位,通过硬件过采样扩展到16位,模数转换器嵌入到STM32L071xx器件中。有16个外部通道和2个内部通道…...

李飞飞谈AI+3D发展:3D/4D AI将成为下一个重要前沿
人工智能(AI)的发展已经深刻改变了我们的世界,从简单的图像识别到复杂的自然语言处理,再到如今正在兴起的生成式模型。在这个过程中,李飞飞教授认为,3D/4D AI技术将是推动下一波变革的关键力量。以下根据她的观点整理了AI发展历程中的关键里程碑以及对3D/4D AI未来发展的…...