Mysql学习(八)——多表查询
文章目录
- 五、多表查询
- 5.1 多表关系
- 5.2 多表查询概述
- 5.3 内连接
- 5.4 外连接
- 5.5 自连接
- 5.6 联合查询
- 5.7子查询
- 5.8 总结
五、多表查询
5.1 多表关系
-
概述:项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
- 一对多(多对一)
案例:部门与员工的关系
关系:一个部门对应多个员工,一个员工对应一个部门
实现:在多的一方建立外键,指向一的一方主键

- 多对多
案例:学生与课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

-- 创建学生表 create table student(id int auto_increment primary key ,name varchar(10),no varchar(10) )comment '学生表'; insert into student values (null,'黛绮丝','2000100101'),(null,'谢逊','2000100102'),(null,'殷天正','2000100103'),(null,'韦一笑','2000100104'); -- 创建课程表 create table course(id int auto_increment primary key,name varchar(10) )comment '课程表'; insert into course values (null,'java'),(null,'PHP'),(null,'MySQL'),(null,'Hadoop'); -- 创建学生课程中间表 create table student_course(id int auto_increment primary key ,studentid int not null ,courseid int not null ,constraint fk_courseid foreign key (courseid) references course(id),constraint fk_studentid foreign key (studentid) references student(id) )comment '学生课程中间表'; insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);- 一对一
案例:用户与用户详情的关系
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
实现:在任意一方加入外键,关联另一方的主键,并且设置外键为唯一的(unique)


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

消除无效的笛卡尔积之后:

select * from 表1,表2 where 表1外键字段 = 表2关联的字段;
- 多表查询分类:
- 连接查询:
- 内连接:相当于查询A,B交集部分数据
- 外连接:
- 左外连接:查询左表所有数据,以及两张表交集部分数据
- 右外连接:查询右表所有数据,以及两张表交集部分数据
- 自连接:当前表与自身的连接查询,自连接必须使用表别名
- 子查询
- 连接查询:
5.3 内连接
- 隐式内连接
select 字段列表 from 表1,表2 where 条件…;select emp.name,dept.name from emp , dept where dept_id = dept.id;
- 显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件…;select e.name,d.name from emp e inner join dept d on dept_id = d.id;

5.4 外连接
- 左外连接
-- 相当于查询表1(左表)的所有数据包含表1和表2交集部分的数据
select 字段列表 from 表1 left [outer] join 表2 on 条件…;select e.*, d.name from emp e left outer join dept d on e.dept_id = d.id;
- 右外连接
-- 相当于查询表2(右边)的所有数据包含表1和表2交集部分的数据
select 字段列表 from 表1 right [outer] join 表2 on 条件…;select e.name,d.* from emp e right join dept d on e.dept_id = d.id;
5.5 自连接
- 自连接查询语法:
select 字段列表 from 表A 别名A join 表A 别名B on 条件…;
-- 自连接查询可以是内连接查询也可以是外连接查询。
select a.name ,b.name from emp a , emp b where a.managerid = b.id;
select a.name ,b.name from emp a left outer join emp b on a.managerid = b.id;
5.6 联合查询
- 对于union查询,就是把多次查询的结果合并起来形成一个新的查询结果集。
select 字段列表 from 表A …
union [all]
select 字段列表 from 表B …;
-- 直接合并
select * from emp where salary < 5000
union all
select * from emp where age > 50;
-- 去重后的合并
select * from emp where salary < 5000
union
select * from emp where age > 50;
注意:对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。union all会将全部的数据直接合并在一起,union会对合并之后的数据去重。
5.7子查询
- 概念:SQL语句中嵌套
select语句,称为嵌套语句,又称子查询。
select * from t1 where column1 = (select column1 from t2);
/*
子查询外部的语句可以是insert/update/delete/select的任何一个。
*/
-
根据子查询结果不同,分为:
- 标量子查询(子查询结果为单个值)
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。
常用的操作符:= <> > >= < <=
-- 标量子查询 -- 查询“销售部”的所有员工信息 -- a 查询“销售部”部门ID select id from dept where name = '销售部'; -- b 根据销售部门ID,查询员工信息 select * from emp where dept_id = 4; -- 等价于 select * from emp where dept_id = (select id from dept where name = '销售部');- 列子查询(子查询结果为一列)
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用的操作符:in not in any some all

select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部');-- 查询比财务部所有人工资都高的员工信息 select * from emp where salary > all(select salary from emp where dept_id = (select id from dept where name = '财务部'));- 行子查询(子查询结果为一行)
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:= <> in not in
select * from emp where (salary,managerid) = (select salary,managerid from emp where name = '张无忌');- 表子查询(子查询结果为多行多列)
子查询返回的结果是多行多列,这种子查询称为表子查询。
常用的操作符:in
select * from emp where (job,salary) in (select job,salary from emp where name = '鹿杖客' or name = '宋远桥'); -
根据子查询位置,分为:where之后、from之后和select之后。
5.8 总结

相关文章:
Mysql学习(八)——多表查询
文章目录 五、多表查询5.1 多表关系5.2 多表查询概述5.3 内连接5.4 外连接5.5 自连接5.6 联合查询5.7子查询5.8 总结 五、多表查询 5.1 多表关系 概述:项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,…...
LabVIEW进行图像拼接的实现方法与优化
在工业检测和科研应用中,对于大尺寸物体的拍摄需要通过多次拍摄后进行图像拼接。LabVIEW 作为强大的图形化编程工具,能够实现图像拼接处理。本文将详细介绍LabVIEW进行图像拼接的实现方法、注意事项和提高效率的策略。 图像拼接的实现方法 1. 图像采集…...
纷享销客安全体系:安全合规认证
安全合规认证是指组织通过独立的第三方机构对其信息系统和数据进行评估和审查,以确认其符合相关的安全标准、法律法规和行业要求的过程。 安全合规认证可以帮助组织提高信息系统和数据的安全性,并向客户、合作伙伴和监管机构证明其符合相关的安全标准和…...
推荐这两款AI工具,真的很好用
巨日禄 巨日禄是一款由杭州巨日禄科技有限公司开发的AI工具,主要功能是将文本内容转换为视频。该工具通过分析大量的剧本数据和影视作品,为用户提供各种类型的故事情节和角色设置,帮助用户快速找到灵感,减少构思剧本的困难和犹豫。…...
装饰器在实际开发中的作用
首先先说说装饰器的整体优点。 使用装饰器可以实现代码的模块化、可重用性。当需要对多个函数进行相同的功能增强时,通过装饰器可以避免重复代码的编写,提高开发效率。 1、权限检查:通过装饰器可以在函数执行之前检查用户权限,决…...
JVM学习-监控工具(三)
jconsole 从Java5开始,在JDK中自带的java监控和管理控制台用于对JVM中内存、线程、和类等的监控,是一个基本JMX(java management extendsions)的GUI性能监控工具 三种连接方式 Local:使用JConsole连接是一个正在本地系统运行的JVM…...
GPU显卡计算能力怎么算?
GPU的算力指的是什么? GPU的计算能力可以使用FLOPS表示,FLOPS是floating-point operations per second的缩写,表示“每秒所执行的浮点运算次数”。是被用来估算处理的计算能力 1 MFLOPS 每秒可以执行一百万(10^6)次浮点运算 1 GFLOPS 每秒可以执行十…...
Spark参数配置不合理的情况
1.1 内存设置 💾 常见的内存设置有两类:堆内和堆外 💡 我们作业中大量的设置 driver 和 executor 的堆外内存为 4g,造成资源浪费 📉。 通常 executor 堆外内存在 executor.cores1 的时候,1g 足够了&…...
【OpenGL学习】OpenGL不同版本渲染管线汇总
文章目录 一、《OpenGL编程指南》第6版/第7版的渲染管线二、《OpenGL编程指南》第8版/第9版的渲染管线 一、《OpenGL编程指南》第6版/第7版的渲染管线 图1. OpenGL 2.1、OpenGL 3.0、OpenGL 3.1 等支持的渲染管线 二、《OpenGL编程指南》第8版/第9版的渲染管线 图2. OpenGL …...
等保测评练习
等级保护初级测评师试题11 姓名: 成绩: 判断题(10110分) 1. windows使用"service -status-all | grep running"命令查看危险的网络服务是否已经关闭。( F ) …...
第十五届蓝桥杯大赛 国赛 pb组F题【括号与字母】(15分) 栈的应用
博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 试题F:括号与字母 【问题描述】 给定一个仅包含小写字母和括号的字符串 S …...
MYSQL 三、mysql基础知识 4(存储过程与函数)
MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。 一、存储过程概述: 1.1理解: 含义&am…...
鸿蒙开发文件管理:【@ohos.statfs (statfs)】
statfs 该模块提供文件系统相关存储信息的功能,向应用程序提供获取文件系统总字节数、空闲字节数的JS接口。 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import stat…...
C++和C语言到底有什么区别?
引言:C和C语言是两种非常常见的编程语言,由于其广泛的应用和灵活性,它们在计算机科学领域内受到了广泛的关注。虽然C是从C语言发展而来的,但是这两种语言在许多方面都有所不同。本文将对C和C语言进行比较和分析,以便更…...
【Centos】深度解析:CentOS下安装pip的完整指南
【Centos】深度解析:CentOS下安装pip的完整指南 大家好 我是寸铁👊 总结了一篇【Centos】深度解析:CentOS下安装pip的完整指南✨ 喜欢的小伙伴可以点点关注 💝 方式1(推荐) 下载get-pip.py到本地 sudo wget https://bootstrap.p…...
半导体PW和NPW的一些小知识
芯片制造厂内的晶圆主要由两种,生产晶圆(PW:Product Wafer)和非生产晶圆(NPW:None Product Wafer)。 一、生产晶圆(PW) 生产晶圆的一些关键特点: 高纯度硅材料:生产晶…...
后端启动项目端口冲突问题解决
后端启动项目端口冲突 原因: Vindows Hyper-V虚拟化平台占用了端口。 解决方案一: 查看被占用的端口范围,然后选择一个没被占用的端口启动项目。netsh interface ipv4 show excludedportrange protocoltcp 解决方案二: 禁用H…...
【优选算法】优先级队列 {优先级队列解决TopK问题,利用大小堆维护数据流的中位数}
一、经验总结 优先级队列(堆),常用于在集合中筛选最值或解决TopK问题。 提示:对于固定序列的TopK问题,最优解决方案是快速选择算法,时间复杂度为O(N)比堆算法O(NlogK)更优;而对于动态维护数据流…...
11 IP协议 - IP协议头部
什么是 IP 协议 IP(Internet Protocol)是一种网络通信协议,它是互联网的核心协议之一,负责在计算机网络中路由数据包,使数据能够在不同设备之间进行有效的传输。IP协议的主要作用包括寻址、分组、路由和转发数据包&am…...
【java】【python】leetcode刷题记录--二叉树
144.二叉树的前序遍历 题目链接 前、中、后的遍历的递归做法实际上都是一样的,区别就是遍历操作的位置不同。 对于先序遍历,也就是先根,即把查看当前结点的操作放在最前面即可。 class Solution {public List<Integer> preorderTrav…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...
