【数据库】多表查询:子查询|关联查询 inner join 、left join、right join

news2025/6/19 19:18:04

一、外键:

就是把一张表的主键拿到另一张表中作为一个普通的字段

通过外键 可以把两张表连接起来

比如,下面【部门】表里的主键 拿到【员工】表里做普通字段(外键)

员工 部门

1员工,XXX,1部门 1部门,武当派

2员工,XXX,2部门 2部门,峨眉派

3员工,XXX,1部门 3部门,明教

4员工,XXX,2部门

 设计主外键关系的方案

1、图形化操作:(数据库管理工具)

2、写sql语句

constraint 约束名 foreign key (外键列名) references 对方表(列表)

-- 创建部门表
create table dept(
	id int(10) not null primary key auto_increment,
	deptName varchar(50),
	deptLeader varchar(50)
)

-- 创建员工表(需要部门表的支持)
create table emp(
	id int(10) not null primary key auto_increment,
	name varchar(50),
	salary decimal(10,2),
	deptNo int(10),
	constraint foreign_key_deptNo foreign key (deptNo) references dept(id)
);

二、多表查询

1、子查询 

举例:

  • 根据: 查询 where (表A 外键 in 表B)

题目1:通过部门的名称查询出该部门所有的员工信息——查询明教的员工信息
-- 分解
-- (1)查询明教的部门信息
select id from dept where deptName = '明教'
-- (2)根据ID查询员工信息
select * from emp where deptNo = 3
-- 结果
select * from emp where deptNo = (select id from dept where deptName = '明教')
-- ⚠️用in更适用 如果后面的查询结果不是唯一的 用 = 不合适
select * from emp where deptNo in (select id from dept where deptName = '明教')
  • 同时查询两张表 表A.字段 表B.字段 where( 表A.外键字段 = 表B.主键字段)

题目2: 查询各个部门的平均工资
-- 分解教学“各个部门的平均工资” 根据部门来区分,所以group by deptNo
select avg(salary) from emp group by deptNo

-- 但是⚠️希望展示部门 :部门 平均工资

-- 把部门和员工放在一起进行查询
select dept.deptName,avg(emp.salary) from emp,dept where emp.deptNo = dept.id group by dept.deptName

2、关联查询

  • 语法规则

    • join:关联
    • on: 通过 ... 做关联
    • A xxjoin B on A.字段 = B.字段
    • ⚠️通常关联项 on 后面的就是 主键 外键
  • 用的比较多的还是inner join 、left join 左联

    • inner join 内连接
    • left join 左联
    • right join 右联 效果和左联也差不多

2.1、inner join 内连接 筛选出两张表完全关联起来的数据

-- 通常关联项 on 后面的就是 主 外 键
SELECT * from dept INNER JOIN emp on dept.id = emp.deptNo

-- inner JOIN 改成 下面的 子查询 结果一样
SELECT * from dept,emp where emp.deptNo = dept.id

2.2、left join 左联 一定会把左边表的数据全部查询出来

把左边这张表所有的数据都摆出来 根据关联项 把右边表的数据插入进去

-- left join  一定会把左边表的数据全部查询出来
SELECT * from emp left JOIN dept on dept.id = emp.deptNo

⚠️应用场景非常多,比如
查询所有员工的部门信息 ⚠️所有员工 以员工为基准 emp在左边
-- 员工名字 部门名字
select emp.name,dept.deptName from emp LEFT JOIN dept on dept.id = emp.deptNo

结果如下:

 

2.3、right join 右联 一定会把右边表的数据全部查询出来

把右边这张表所有的数据都摆出来 根据关联项 把左边表的数据插入进去

-- 右联接 一定把右边的数据查询出来
SELECT * from emp RIGHT JOIN dept on emp.deptNo = dept.id

结果如下: 

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

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

相关文章

CraxsRat7.4 安卓手机远程管理软件

CRAXSRAT 7.4 最新视频 https://v.douyin.com/iFjrw2aD/ 官方网站下载 http://craxsrat.cn/ 不要问我是谁,我是活雷锋。 http://craxsrat.cn/ CraxsRat CraxsRat7 CraxsRat7.1 CraxsRat7.2 CraxsRat7.3 CraxsRat7.4

[java基础揉碎]super关键字

super关键字: 基本介绍 super代表父类的引用,用于访问父类的属性、方法、构造器 super给编程带来的便利/细节 1.调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化) 2.当子类中有和父类中的成员(属性和方法)重…

R语言更新版本

目录 一、更新R语言 1、安装最新的R语言版本 2、移动之前安装的packages 3、将Rstudio连接到最新的R语言 二、Rstudio更新 一、更新R语言 1、安装最新的R语言版本 查看当前R语言版本: R.version.string 下载最新的R语言安装包:R: The R Project…

链表|19.删除链表的倒数第N个节点

力扣题目链接 struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {//定义虚拟头节点dummy 并初始化使其指向headstruct ListNode* dummy malloc(sizeof(struct ListNode));dummy->val 0;dummy->next head;//定义 fast slow 双指针struct ListNode* f…

SkyWalking链路追踪上下文TraceContext的traceId生成的实现原理剖析

结论先行 【结论】 SkyWalking通过字节码增强技术实现,结合依赖注入和控制反转思想,以SkyWalking方式将追踪身份traceId编织到链路追踪上下文TraceContext中。 是不是很有趣,很有意思!!! 【收获】 skywal…

CSS的盒子模型:掌握网页设计的基石!

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

C#学习:初识各类应用程序

编写我们第一个程序——Hello,World! 1.编程不是“学”出来的,而是“练”出来的 2.在反复应用中积累,忽然有一天就会顿悟 3.学习原则: 3.1从感官到原理 3.2从使用别人的到创建自己的 3.3必需亲自动手 3.4必需学以致用,紧跟实际…

P4551 最长异或路径

最长异或路径 题目描述 给定一棵 n n n 个点的带权树,结点下标从 1 1 1 开始到 n n n。寻找树中找两个结点,求最长的异或路径。 异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 输入格式 第一行一个整数 n n n,表示点数…

机器人扫地 二分答案

#include<bits/stdc.h> using namespace std; int i,n,a[100009],k,ans0; bool check(int mid){int pos0,t;//pos前面清扫过的位置for(i0;i<k;i){ //已经清扫的位置还没到当前机器人的位置a[i]//一个位置机器人是要去回&#xff0c;一个格子消耗两个时间 tmid;//贪心…

turtle绘制小猪佩奇

turtle绘制小猪佩奇 import turtle as t 使用python的turtle绘制小猪佩奇 # 设置线条粗细为4 t.pensize(4) # 使海龟不可见 #t.hideturtle() # 后续表示三原色的r,g,b必须在0~255之间 t.colormode(255) # 设置画笔颜色和填充颜色 t.color((255, 155, 192), "pink")…

记录汇川:IO隔离编程

IO隔离&#xff1a;方便程序修改 无论是输入点坏了还是输出点坏了&#xff0c;或者人为接错线&#xff0c;或者对调点&#xff0c;我们只需要更改IO隔离得输入输出就可以了。方便。 停止按钮外接常闭&#xff0c;里面也使用常闭&#xff0c;为了断线检测功能(安全)&#xff…

【vue2基础教程】vue指令

文章目录 前言一、内容渲染指令1.1 v-text1.2 v-html1.3 v-show1.4 v-if1.5 v-else 与 v-else-if 二、事件绑定指令三、属性绑定指令总结 前言 Vue.js 是一款流行的 JavaScript 框架&#xff0c;广泛应用于构建交互性强、响应速度快的现代 Web 应用程序。Vue 指令是 Vue.js 中…

职场成功的秘诀:如何高效管理时间

在职场中&#xff0c;时间管理是一项至关重要的技能。高效的时间管理不仅能够提高工作效率&#xff0c;还能够帮助我们更好地平衡工作与生活&#xff0c;实现职场成功。本文将分享一些职场成功人士都在使用的时间管理秘诀&#xff0c;帮助你更好地管理时间&#xff0c;提升职场…

Linux上安装torch-geometric(pyg)1.7.2踩坑记录

重点&#xff1a;1.一定要在创建虚拟环境的时候设置好python版本。2.一定要先确定使用1.X还是2.X的pyg库&#xff0c;二者不兼容。3.一定要将cuda、torch、pyg之间的版本对应好。所以&#xff0c;先确定pyg版本&#xff0c;再确定torch和cuda的版本。 结论&#xff1a;如果在u…

流浪猫流浪狗领养源码

流浪猫流浪狗领养源码 适合做猫狗宠物类的发信息发布。当然其他信息发布也是可以的。刚刚开发出炉的&#xff01; 源码截图&#xff1a; 免费下载地址&#xff1a;https://download.csdn.net/download/u012241616/88935678

文件操作上(c语言)

目录 1. 文件的作用2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 二进制文件和文本文件4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开与关闭4.3.1 文件的打开模式4.3.2 实例代码 1. 文件的作用 使用文件可以将数据进行持久化的保…

备战蓝桥杯---动态规划的一些思想2

话不多说&#xff0c;直接看题&#xff1a; 1.换根DP&#xff1a; 我们肯定不能对每一个根节点暴力求&#xff0c;我们不妨先求f[1]&#xff0c;我们发现当他的儿子作为根节点时深度和为f[1](n-cnt[i])-cnt[i](cnt[i]表示以i为根的节点数&#xff09;&#xff0c;这样子两遍DFS…

机器学习流程—数据预处理 清洗

机器学习流程—数据预处理 清洗 数据清洗因为它涉及识别和删除任何丢失、重复或不相关的数据。数据清理的目标是确保数据准确、一致且无错误,因为不正确或不一致的数据会对 ML 模型的性能产生负面影响。专业数据科学家通常会在这一步投入大量时间,因为他们相信Better data b…

C++顺序结构实例

1.计算浮点数相除的余数 计算两个双精度浮点数a和b相除的余数,a和b都是双精度浮点数。这里的余数r的定义是: a=k * 吧+r,其中k是整数,0<=r<b。 输入 一行,包括两个双精度浮点数a和b 输出 一行,a➗b的余数 样例输入 73.263 0.9973 样例输出 0.4301 #i…

go切片实现原理

近日一直在学习golang,已经产出如下博客一篇 GO闭包实现原理(汇编级讲解) 引言 最近在使用go语言的切片时,出现了一些意料之外的情况,遂查询相关文档学习后写下此篇博客 正文 首先,我们思考,go在通过函数传递一个切片时,是通过引用传递的吗,还是通过值传递的呢(答案将会很…