MySQL——多表查询

news2024/12/29 11:18:13

多表查询

多表查询的出现,是为了解决当我们的数据不能存放在一张表上,或者我们的数据本身就是存在多张表上,需要根据字段之间的关系,联合多张表查询出想要的数据。那么根据业务实现的关系,表与表之前也出现了三种基本关系

  • 一对一
  • 一对多(多对一)
  • 多对多

一对多(多对一)

这种关系的典型案例就是员工和部门之间的关系,一个员工只能属于一个部分,而一个部门可以拥有多个员工。

这种文字描述的关系体现在数据表上的就是:在多的一方建立外键,指向一的一方的主键。在案例中就是将员工信息表中的部分信息做外键,关联部门表中的部门信息。

新建两个表,一个是员工表一个是部门表,建表语句如下:

# 部门表 create table if not exists department( department_id int primary key, department_name varchar(20) ); # 员工表 create table if not exists employee( employee_id int , employee_name varchar(20), department_id int , foreign key (department_id) references department(department_id) );

数据内容如下:

部门表:

员工表:

从建表语句中可以看到,我们员工表的部门信息与部门表的部门信息是建立了外键约束。那么一对多的关系,就是一个员工对应一个部门,多对一就是一个部门可以对应多个员工。

多对多

这种关系的最典型的案例就是学生与课程的关系,一个学生可以选择多个课程,一个课程也可以被多个学生选择,那么两者的关系就形成了多对多的关系。

这种文字的多对多关系描述要如何提现到数据库中呢,单一的表肯定是无法描述多对多的关系,因为一个属性只能存储一个值,多个属性肯定就不仅是一个值,那么就需要一个单独的表去描述两个表之间的关系,这个表叫做中间表。

也就是说我们在描述多对多关系的时候,我们需要三张表来描述它们之间的关系:

# 学生表 create table if not exists student( student_id int, student_name varchar(20) ); # 课程表 create table if not exists class( class_id int , class_name varchar(20) ); # 中间表 create table if not exists course_selection( id int, student_id int , class_id int );

他们的数据内容如下:

学生表:

班级表:

中间表:

对于前两个表中的数据我们已经非常熟悉了,对于中间表的数据我们需要解释一下,如何去看这张表的数据呢,student_id表示学生的id,class_id表示班级的id,那么相同的student_id就表示同一个学生,那么同一个学生选择多个课程就用多个相同的student_id对应多个不同的class_id就表示同一个课程,那么我们要如何去查询数据呢?比如我们要查询id为1的学生选择了什么课程:

当我们对中间表进行查询的时候,根据筛选的条件,当条件是student_id的时候,就表示查询对应学生选择的课程,则学生号相同,课程号不同,对应的,如果要查询某一个课程被多少学生选择,我们的语句就变成了:

这样,我们就查询出了某一个课程被多少个学生所选择,至于后面更加详细的操作,我们在实际使用到的时候再去使用和介绍。

一对一

一对一关系的典型案例就是用户与用户详情的关系。

一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。

将文字描述在数据库中实现就是将任意一方加入外键,关联另一方的主键,并且设置外键为唯一的(UNIQUE)

多表查询

从多张表中进行查询

select * from 表名1,表名2;

多张表就是在form关键字的后面添加多张表,多张表之间用逗号隔开:

但是在这种情况下会出现很多的错误数据,比如张三的信息应该数据财务部,但是却和所有的部门都进行了匹配,那么这种情况肯定是不行的,这种现象叫做笛卡尔积。

笛卡尔积:是指在数学中,两个集合A和B集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积。)

消除笛卡尔积的方法就是在多表查询的时候添加条件,条件就是将两个表相关联的字段相等即可:

在上图中,employee表和department表是通过department_id这个字段关联在一起的,也就是连个表都存在一个字段叫做department_id,那么在查询的时候只保留这两个字段相等的值即可。

多表查询的分类

连接查询:

内连接:相当于查询A,B交集部分数据

外连接:

左外连接:查询左表的所有数据,以及两张表交集部分数据

右外连接:查询右表的所有数据,以及两个表交集部分数据

自连接:当前表与自身的连接查询,自连接必须使用表别名

子查询:

将自身分为两个表进行查询。

内连接

内连接查询的是两张表交集的部分。

隐式内连接:

select 字段 from 表名1,表名2 where 条件……;

显式内连接:

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

两者的区别主要在于表的连接形式以及连接条件的表现形式,就是是否显式的使用关键字。

首先演示使用隐式内连接的方式进行多表查询,要查询员工的姓名以及对应的部门的名称:

在上图中,我们演示了如果使用隐式内连接的方式在两张表中查询数据。

然后演示一下显式内连接,同样是查询员工的姓名以及对应部门的名称:

查询结果与之前是一样的,只不过使用了inner join和on关键字。

如果两个表中的字段有相同的部门,可以通过给表起别名,然后用“别名.列名”的方式指明他是来自那张表的列

外连接

左外连接

select 字段 from 表1 left join 表2 on 条件;

相当于查询表1(左表)的所有数据包含表1和表2交集部分的数据

右外连接

select 字段 from 表1 right join 表2 on 条件;

相当于查询表2(右表)的所有数据包含表1和表2交集部分的数据

首先演示一下左外连接,比如要查询员工的所有信息,并且查询员工对应的部门的名称:

上图就是将员工表的所有数据全部查出,并且展示部分的部门表的数据。

然后演示右外连接,比如查询出所有的部门表的信息,并且输出部门对应的员工的姓名:

这样就是查询出所有的部门以及部门对应的员工的名称。

在使用的时候,一般左外连接会用的比较多一点。

自连接

自己连接自己,自连接查询,可以是内连接查询,也可以是外连接查询

select 字段 from 表A 别名A join 表A 别名B on 条件……;

我们对员工表添加一个新的列叫做领导id:

这一列存放的是领导的ID,但是领导的信息和员工的信息在同一张表上,现在要查询员工对应领导的信息,就需要使用自连接进行查询:

注意此时他的条件,是自己关联自己,但是on之后的条件就变成了同一个表中的两个关键的字段,manager对应的就是员工的id,所以让这两个字段相等,就可以查询出员工对应的领导的信息。

使用外连接可以查询出没有领导的员工,如果要查询出有领导的员工可以使用内连接

这样查询,则会查询交集的数据,不会出现有空值的数据出现

在使用自连接的时候,必须使用别名,否则会报错,因为他不知道你的字段是来自哪一个表,尽管都来自于同一个表。

联合查询

将多次查询的结果联合起来,形成一个新的查询结果集。

select 字段 from 表A …… union [all] select 字段 from 表B ……;

比如当需要将两个条件查询的结果进行展示的时候:

比如现在我有两个语句,现在我要同时展示这两条语句的结果:

那么只要满足任意一个sql语句的结果都会被展示。

union all会直接合并两条sql语句的结果,如果中间有重复的,也就是同时满足两条sql语句的结果,则两次都保留:

对于联合查询的多张表的列数必须保持一致,字段类型也需要把持一致。

union表示对查询结果去重,union all表示直接合并。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建微服务项目时启动网关服务失败的解决方案

启动网关服务时报“Unable to create the temporary folder: C:\WINDOWS\TEMP\/nio-file-upload”错误。 代码与之前没有任何变化,但就是启动不了,观察错误意思大概是不能创建临时文件夹:C盘下的WINDOWS下的TEMP目录下的nio-file-upload这个东…

C#,数值计算——多项式微分(Binomial Deviates)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 二项式偏差 /// Binomial Deviates /// </summary> public class Binomialdev : Ran { private double pp { get; set; } private double p…

day57 补

647. 回文子串 力扣题目链接(opens new window) 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 示例 1&#xff1a; 输入&#xff1a…

机器学习——boosting之提升树

提升树和adaboost基本流程是相似的 我看到提升树的时候&#xff0c;懵了 这…跟adaboost有啥区别&#xff1f;&#xff1f;&#xff1f; 直到看到有个up主说了&#xff0c;我才稍微懂 相当于&#xff0c;我在adaboost里的弱分类器&#xff0c;换成CART决策树就好了呗&#xff1…

Yolov8-pose关键点检测:模型轻量化创新 | ​BiLevelRoutingAttention 动态稀疏注意力 | CVPR2023 BiFormer

💡💡💡本文解决什么问题:BiLevelRoutingAttention ,通过双层路由(bi-level routing)提出了一种新颖的动态稀疏注意力(dynamic sparse attention ) ​BiLevelRoutingAttention | GFLOPs从9.6降低至8.5,参数量从6482kb降低至6134kb, mAP50从0.921提升至0.926 Yolov8…

云备份服务端——实用类工具实现

一&#xff0c;文件实用类设计实现 不管是客户端还是服务端&#xff0c;文件的传输备份都涉及到文件的读写&#xff0c;包括数据管理信息的持久化也是如此&#xff0c;因此首先设计封装文件操作类&#xff0c;这个类封装完毕之后&#xff0c;则在任意模块中对文件进行操作时都将…

SLAM ORB-SLAM2(1)总体框架

SLAM ORB-SLAM2(1)总体框架 1. 简介2. 框架3. TRACKING4. LOCAL MAPPING5. LOOP CLOSING6. MAP1. 简介 ORB-SLAM2 是一个实时和完整的视觉SLAM系统(包括闭环检测、重定位、地图重用等功能) 提供了利用单目、双目以及RGB-D相机完成稀疏三维重建的功能和接口 2. 框架 总体来说…

c++day3

1> 自行封装一个栈的类&#xff0c;包含私有成员属性&#xff1a;栈的数组、记录栈顶的变量 成员函数完成&#xff1a;构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 #include <iostream>using namespace std; clas…

baichuan2(百川2)本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Vue3,Typescript中引用组件路径无法找到模块报错

是这么个事&#xff0c;我在vue3新创建的项目里&#xff0c;写了个组件叫headerIndex.vue&#xff0c;放到app.vue中import就会报错 路径肯定没写错&#xff0c;找到了解决方法&#xff0c;但是也没想明白为什么 解决方法如下 在vite-env.d.ts文件中加入 declare module &qu…

《向量数据库》——向量数据库Milvus 和大模型出联名款AI原生Milvus Cloud

大模型技术的发展正加速对千行百业的改革和重塑,向量数据库作为大模型的海量记忆体、云计算作为大模型的大算力平台,是大模型走向行业的基石。而电商行业因其高度的数字化程度,成为打磨大模型的绝佳“战场”。 在此背景下,Zilliz 联合亚马逊云科技举办的【向量数据库 X 云计…

Java类和对象(七千字详解!!!带你彻底理解类和对象)

目录 一、面向对象的初步认知 1、什么是面向对象 2、面向对象和面向过程 &#xff08;1&#xff09;传统洗衣服的过程 &#xff08;2&#xff09;现代洗衣服过程 ​编辑 二、类的定义和使用 1、类的定义格式 三、类的实例化 1、什么是实例化 2、类和对象说明 四、t…

【2023年11月第四版教材】第11章《成本管理》(合集篇)

第11章《成本管理》&#xff08;合集篇&#xff09; 1 章节说明2 管理基础3 管理过程3.1 管理ITTO汇总★★★ 4 规划成本管理4.1 成本管理计划★★★ 5 估算成本5.1 估算成本★★★ &#xff08;19上57&#xff09; &#xff08;19下35&#xff09;5.2 数据分析★★★5.4 成本估…

阿里云免费镜像仓库+金克斯+码云实现自动CI

前提 有阿里云账号&#xff0c;并且已经完成实名认证。最好有一台云服务器&#xff0c;以及码云账号&#xff0c;还有现成的项目以及Dockerfile一、开通阿里云容器镜像服务 1、新建命名空间(一般只需要建一个就行了) 2、在命名空间下&#xff0c;建立镜像仓库&#xff0c;看下…

D. Choosing Capital for Treeland

Problem - 219D - Codeforces 问题描述&#xff1a;Treeland国有 n 个城市, 这 n 个城市连接成了一棵树, 靠单向道路相连, 现在政府想要选择一个城市作为首都, 条件是首都必须能到达其他所有城市, 现在我们不得不将一些道路反转方向, 记反转的条数为 k 条, 我们要找到所有使 k…

c++day2---9.7

1> 思维导图 2> 封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个公有成员…

VMware的三种连接模式

目录 目录 前言 系列文章列表 思维导图 1&#xff0c;VMware是什么? 2&#xff0c;VMware的连接模式 2.1,VMware的连接模式是什么? 2.2, VMware的连接模式的分类 3&#xff0c;桥接模式 3.1,图示介绍 3.2,详细介绍 3.3,注意点 4.NAT模式 4.1,NAT协议 4.2,图示…

安科瑞精密配电多回路监控装置在轨道交通项目上的应用

安科瑞 崔丽洁 一、行业背景 轨道交通作为城市公共交通系统的一部分&#xff0c;在过去几十年中得到了广泛的发展和扩张。它在解决城市交通拥堵、减少环境污染、提高城市可持续性等方面发挥了重要作用。随着科技的进步&#xff0c;轨道交通系统也在不断引入新的技术和创新&…

桉木板材的优缺点

桉木&#xff08;Eucalyptus&#xff09;是一种常见的木材品种&#xff0c;具有一些独特的特点和用途。以下是桉木板材的一些优点和缺点&#xff1a; 优点&#xff1a;强度高&#xff1a;桉木具有较高的密度和强度&#xff0c;使其在承重和结构应用中表现出色。它的强度比一些其…

HashMap核心方法:put()、putVal()、resize()与treeifyBin()

一、put方法 put方法的源码如下&#xff1a; 由此可见put的核心方法为putVal() putVal方法各参数值讲解&#xff1a; 前面三个参数不做过多讲解&#xff0c;第4个参数是控制是否要覆盖原来key中已经存在的值&#xff0c;比如HashMap的putIfAbsent方法调的也是putVal方法&…