当前位置: 首页 > article >正文

【SQL】SQL多表查询

🎄概念

  • 一般我们说的多表查询都涉及外键和父子表之间的关系。
  • 比如一对多:一般前面指的是父表后面指的是子表。

⭐分类

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

⭐一对多

📢案例:部门与员工的关系

📢关系:一个部门对应多个员工,一个员工对应一个部门

📢实现:在多的一方建立外键,指向一的一方的主键(例如上一章节的SQL约束示例)

⭐多对多

📢案例:学生与课程的关系

📢关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择

📢实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键,使用中间表来维护二者之间的关联关系

  1. 创建学生表
  • id为学生表的主键。并插入三条数据。
create table student(id int auto_increment primary key comment '主键 学生ID',name varchar(10) comment '姓名',no varchar(10) comment '学号')
comment '学生表';insert into student values (null, '黛绮丝', '2000100101'),(null, '谢逊',
'2000100102'),(null, '殷天正', '2000100103'),(null, '韦一笑', '2000100104');

   2.创建课程表

create table course(id int auto_increment primary key comment '课程表主键ID',name varchar(10) comment '课程名称'
)comment '课程表';insert into course values (null, 'Java'), (null, 'C++'), (null , 'MySQL') ,(null, 'Hadoop');

 3.创建关联表

  • 这里创建是会失败的,是因为我们关联的是学生表中的no学号字段和课程表中的name名称字段,但这两个字段并不是主键以及唯一约束。
  • 外键所关联的字段必须要具有唯一性。
create table student_course(id int  auto_increment primary key comment '主键',studentno varchar(10) not null comment '学生表学号',courseno  varchar(10) not null comment '课程表课程名',constraint fk_studentNo foreign key (studentno) references student (no),constraint fk_courseno foreign key (courseno) references course (name)
)comment '学生课程中间表';

 4. 增加唯一约束,保证外键创建成功。

alter table student add constraint unique_No unique (no);
alter table course add constraint unique_name unique (name);

insert into student_course values (null,'2000100101','C++'),(null,'2000100102','Hadoop'),(null,'2000100103','C++'),(null,'2000100104','Java')

5.关联图

  • 从显示图中可以看出,中间表的studentno对应student的no字段。courserno对应course表的name字段。

⭐一对一

📢案例:用户 与 用户详情的关系

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

📢 实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的 (UNIQUE)
create table user_base(id int auto_increment primary key comment '用户id主键',name varchar(10) comment '用户姓名',age int comment '年龄',gender char(1) comment '性别1 男 2 女',phone char(11) comment '手机号'
)comment '用户基本信息表'create table user_base_all(id int auto_increment primary key comment '主键ID',degree varchar(20) comment '学历',major varchar(50) comment '专业',primaryschool varchar(50) comment '小学',middleschool varchar(50) comment '中学',university varchar(50) comment '大学',userid int unique comment '用户表id',constraint fk_userud foreign key (userid) references user_base (id)
)comment '用户详情表'insert into user_base(id, name, age, gender, phone) values
(null,'黄渤',45,'1','18800001111'),
(null,'冰冰',35,'2','18800002222'),
(null,'码云',55,'1','18800008888'),
(null,'李彦宏',50,'1','18800009999');insert into user_base_all(id, degree, major, primaryschool, middleschool,university, userid) values
(null,'本科','舞蹈','静安区第一小学','静安区第一中学','北京舞蹈学院',1),
(null,'硕士','表演','朝阳区第一小学','朝阳区第一中学','北京电影学院',2),
(null,'本科','英语','杭州市第一小学','杭州市第一中学','杭州师范大学',3),
(null,'本科','应用数学','阳泉第一小学','阳泉区第一中学','清华大学',4);

📢关联图

🎄多表查询引入

⭐数据准备

📢创建部门表并插入数据
create table department(id int auto_increment primary key comment '主键 自增ID',name varchar(20) not null comment '部门名称'
)comment '部门表';insert into department values (null,'研发部'),(null,'市场部'),(null,'财务部')
,(null,'销售部')
,(null,'总经办')
,(null,'人事部')

📢创建员工表并插入数据

create table employee(id int auto_increment primary key comment '主键 自增ID',name varchar(50) not null comment '姓名',age int comment '年龄',job varchar(20) comment '职位',salary int comment '薪资',entrydate date comment '入职时间',managerid int comment '直属领导ID',dept_id int comment '部门ID',constraint fk_employee_deptid foreign key (dept_id) references department (id)
)comment '员工表';insert into employee values (1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
(2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),(3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
(4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
(5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
(6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),(7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3),
(8, '周芷若', 19, '会计',48000, '2006-06-02', 7,3),
(9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3),
(10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2),(11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2),
(12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2),
(13, '方东白', 19, '职员',5500, '2009-02-12', 10,2),
(14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4),(15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4),
(16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4),
(17, '陈友谅', 42, null,2000, '2011-10-12', 1,null);

⭐笛卡尔积

📢如果我们针对上面的员工和部门表进行多表查询时,没有给顶足够多的条件,就会产生笛卡尔积

📢比如部门表有6条记录,而员工表有12条记录,那么我们利用这条SQL查出来的将是17*6=102条记录。这显然是不对的了。

📢显而易见我们在多表查询中需要消除掉无效的笛卡尔积

select * from employee,department;

⭐消除笛卡尔积

select * from employee,department where employee.dept_id = department.id;

🎄多表查询

⭐分类

📢连接查询

  • 内连接:相当于查询AB交集部分数据
  • 外连接:
  1. 左外连接:查询左表所有数据,以及两张表交集部分数据
  2. 右外连接:查询右表所有数据,以及两张表交集部分数据
  • 自连接:当前表与自身的连接查询,自连接必须使用表别名
📢子查询

🎄内连接

  • 📢内连接查询的是两张表交集的部分
  • 📢内连接分为隐式内连接和显式内连接
  • 📢二者的查询结果是一致的。

⭐隐式内连接

📢语法

SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;

📢案例:

A. 查询每一个员工的姓名 , 及关联的部门的名称 ( 隐式内连接实现 )
select employee.name, department.name from employee,department
where employee.dept_id = department.id;

⭐显式内连接

📢语法

  • inner关键字可以省略
SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;

📢案例:

A. 查询每一个员工的姓名 , 及关联的部门的名称 ( 显式内连接实现 )
select employee.name, department.name from employee inner join department
on employee.dept_id = department.id;

🎄外连接

📢外连接分为两种,分别是左外连接和右外连接。

📢对于外连接,想查的表在右边就是右连接,想查的表在左边就是左连接。

📢对于左右连接是可以调换顺序的,以开发者的习惯为主,如果习惯把要查的表放在左表那就只需要记住左外连接一种即可。

⭐左外连接

  • 查询左表的所有数据以及和右表交集的数据。
  • outer可以省略,直接使用left join

📢语法

select 字段列表 FROM 左表 left [outer] join 右表 on 条件...

📢示例

A:查询 emp 表的所有数据 , 和对应的部门信息
由于需求中提到,要查询 emp 的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询。
select employee.*, department.name from employee left outer join departmenton employee.dept_id = department.id

⭐右外连接

  • 查询右表的所有数据以及和左表交集的数据。

📢语法

select 字段列表 from 左表 right [outer] join 右表 on 条件...

📢示例

A: 查询dept表的所有数据, 和对应的员工信息(右外连接)

select department.*,employee.* from employee right outer join departmenton employee.dept_id = department.id

⭐自连接

  • 顾名思义,就是自己连接自己,也就是把一张表连接查询多次。
  • 对于自连接查询,可以是内连接查询,也可以是外连接查询

📢语法

  • 必须起别名
  • 否则不清楚所指定的条件、返回的字段,到底
    是哪一张表的字段。
select 字段列表 from 表A 别名a JOIN 表A 别名b on 条件...

📢案例

A: 查询员工 及其 所属领导的名字

select a.name '员工',b.name '领导' from employee as a, employee as b where a.managerid = b.id;

B:查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来

  • 对于案例A 查询并没有查到没有领导的员工,比如总裁的信息。
select a.name '员工',b.name '领导' from employee a left join  employee b on a.managerid = b.id;

相关文章:

【SQL】SQL多表查询

🎄概念 一般我们说的多表查询都涉及外键和父子表之间的关系。比如一对多:一般前面指的是父表后面指的是子表。 ⭐分类 一对多(多对一) 多对多 一对一 ⭐一对多 📢案例:部门与员工的关系 📢关系:一个部门对应多个员…...

HTML之JavaScript DOM(document)编程处理事件

HTML之JavaScript DOM&#xff08;document&#xff09;编程处理事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...

知识篇 | DeepSeek企业部署模式主要有6种

国际数据公司IDC近日发文《DeepSeek爆火的背后&#xff0c;大模型/生成式AI市场生态潜在影响引人关注》表示&#xff1a; “大模型的部署过程需同时满足高并发与低延迟的严苛要求&#xff0c;并需全面考量数据安全、隐私保障、资源弹性扩展以及系统维护等多重因素&#xff0c;D…...

uniapp中@input输入事件在修改值只有第一次有效的问题解决

在uniapp中使用输入框&#xff0c;要求输入不超过7个字&#xff0c;所以需要监听输入事件&#xff0c;当每次输入文字的时候&#xff0c;就把输入的值截断&#xff0c;取前7个值。但是在input事件中&#xff0c;重新赋值的值发生了变化&#xff0c;但是页面上的还是没有变&…...

linux环境-nginx通过nginx_upstream_check_module模块,配置服务自动检测-日志自动分割

依赖包正在审核中,通过后将在文章顶部展示,如再次编辑请到内容管理-下载类目 cd nginx源码目录(nginx-1.27.3) 在源码目录下执行一下操作,完成nginx安装和启动 1、双击执行gccCheck.sh,安装gcc化境 脚本内容如下 #!/bin/bash # 检查GCC是否安装 if ! gcc --vers…...

AI 百炼成神:线性回归,预测房价

我们开始第一个项目——线性回归:预测房价。这是一个经典的机器学习入门项目,可以帮助你理解如何使用线性回归模型来预测连续的数值。 第一个项目:线性回归预测房价 项目目标 学习线性回归的基本概念。使用历史房价数据建立一个预测模型。理解如何评估模型的性能。项目步骤…...

Linux运维篇-存储基础知识

什么是存储 用于存放数据信息的设备和介质&#xff0c;等同于计算机系统中的外部存储&#xff0c;是一个完整的系统。 存储的结构和趋势 存储的体系结构 当前存储的主要体系结构有三种&#xff1a; DASNASSAN 存储的发展趋势 ssd固态硬盘云存储一体化应用存储设备非结构…...

Pytorch实现论文之三元DCGAN生成RGB图像用于红外图像着色生成

简介 简介:采用了三次DCGAN单独生成单通道图像之后进行组成RGB图像放入鉴别器中检测,并在鉴别器和生成器的损失训练中采用梯度方法来提升或者降低权重。该方法将用于获得红外图像着色的生成。 论文题目:Infrared Image Colorization based on a Triplet DCGAN Architectur…...

Socket通讯协议理解及客户端服务器程序流程

Socket通讯我们可以从以下几个方面简单理解 1.Socket是网络通信中的一项重要技术&#xff0c;它提供了在网络上进行数据交换的接口。用C#、Java、C等开发语言&#xff0c;都可以开发Socket网络通信程序。 2.Socket(套接字)是计算机网络编程中的一种抽象&#xff0c;它允许不同…...

ceph部署-14版本(nautilus)-使用ceph-ansible部署实验记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、环境信息二、部署步骤2.1 基础环境准备2.2 各节点docker环境安装2.3 搭建互信集群2.4 下载ceph-ansible 三、配置部署文件3.1 使用本地docker3.2 配置hosts…...

vue3 + thinkphp 接入 七牛云 DeepSeek-R1/V3 流式调用和非流式调用

如何获取七牛云 Token API 密钥 https://eastern-squash-d44.notion.site/Token-API-1932c3f43aee80fa8bfafeb25f1163d8 后端 // 七牛云 DeepSeek API 地址private $deepseekUrl https://api.qnaigc.com/v1/chat/completions;private $deepseekKey 秘钥;// 流式调用public f…...

vlanif接口转发vlan

一.为什么需要VLAN 1.1 什么是VLAN&#xff1f; VLAN&#xff08;Virtual LAN&#xff09;&#xff0c;翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络&#xff0c;也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——…...

Rook-ceph(1.92最新版)

安装前准备 #确认安装lvm2 yum install lvm2 -y #启用rbd模块 modprobe rbd cat > /etc/rc.sysinit << EOF #!/bin/bash for file in /etc/sysconfig/modules/*.modules do[ -x \$file ] && \$file done EOF cat > /etc/sysconfig/modules/rbd.modules &l…...

第2章 信息技术发展(一)

2.1 信息技术及其发展 2.1.1 计算机软硬件 计算机硬件(Computer Hardware)是指计算机系统中由电子、机械和光电元件等组成的各种物理装置的总称。 计算机软件 (Computer Software)是指计算机系统中的程序及其文档&#xff0c;程序是计算任务的处理对象和处理规则的描述; 文档…...

python学习笔记,python处理 Excel、Word、PPT 以及邮件自动化办公

文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python 二、处理 Excel 文件&#xff08;openpyxl库&#xff09;三、 处理 Word 文件&#xff08;python-docx库&#xff09;四、 处理 PPT 文件&#xff08;python-pptx库&#xff09;五、 自动发送邮件&#xff08;smtplib和…...

【网络基本知识--2】

网络基本知识--2 1.主机A和主机B通过三次握手TCP连接&#xff0c;过程是&#xff1a; TCP三次握手连接过程如下&#xff1a; 1.客户端发送SYN(SEQx)报文发送给服务器端&#xff0c;进入SYN_SEND状态&#xff1b; 2.服务器端收到SYN报文&#xff0c;回应一个SYN(SEQy)ACK(ACKx1)…...

MoE硬件部署

文章目录 MoE硬件部署硬件需求**专家硬件映射&#xff1a;模块化计算单元****路由硬件加速&#xff1a;门控网络专用单元****内存与通信优化****能效控制策略****实例&#xff1a;假设部署Mixtral 8x7B到自研AI芯片** 资源分配硬件资源预分配&#xff08;编译时&#xff09;运行…...

摄影——曝光三要素

曝光三要素 光圈&#xff08;F&#xff09;&#xff1a;控制进光量的装置快门&#xff08;1/X&#xff09;&#xff1a;接受光线的时间感光度&#xff08;ISO&#xff09;&#xff1a;感光器件对光线的敏感程度 一、快门&#xff08;1/X&#xff09; 静物 1/125 动物 1/500 …...

DeepSeek-R1论文阅读及蒸馏模型部署

DeepSeek-R1论文阅读及蒸馏模型部署 文章目录 DeepSeek-R1论文阅读及蒸馏模型部署摘要Abstract一、DeepSeek-R1论文1. 论文摘要2. 引言3. DeepSeek-R1-Zero的方法3.1 强化学习算法3.2 奖励建模3.3 训练模版3.4 DeepSeek-R1-Zero的性能、自进化过程和顿悟时刻 4. DeepSeek-R1&am…...

一周学会Flask3 Python Web开发-post请求与参数获取

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili app.route 装饰器默认只支持get请求。假如我们要让绑定的视图函数支持其他请求方式&#xff0c;我们可以在methods属性里配置…...

Python的那些事第二十五篇:高效Web开发与扩展应用实践FastAPI

FastAPI:高效Web开发与扩展应用实践 摘要 FastAPI 是一种基于 Python 的现代 Web 框架,以其高性能、自动文档生成、数据验证和异步支持等特性受到开发者的青睐。本文首先介绍了 FastAPI 的核心特性及其开发流程,然后通过实际案例探讨了其在异步编程、微服务架构、WebSocket…...

ES6模块化和CommonJs模块化区别

ES6模块化和CommonJs模块化区别 在JavaScript中&#xff0c;模块化是将代码拆分成独立的块&#xff0c;每个块可以独立封装和管理。ES6模块化和CommonJS是两种常见的模块化规范&#xff0c;它们在语法、加载方式和运行时特性上有显著差异。 语法差异 CommonJS模块使用requir…...

情书网源码 情书大全帝国cms7.5模板

源码介绍 帝国cms7.5仿《情书网》模板源码&#xff0c;同步生成带手机站带采集。适合改改做文学类的网站。 效果预览 源码获取 情书网源码 情书大全帝国cms7.5模板...

文档检测校正的重要性

鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为推出的一款面向未来、面向全场景的分布式操作系统。它旨在为用户提供流畅、安全、可靠的跨设备交互体验&#xff0c;支持多种终端设备&#xff0c;如智能手机、平板电脑、智能穿戴设备等。为了确保文档在不同设备上的一致性…...

深入解析iOS视频录制(二):自定义UI的实现

深入解析 iOS 视频录制&#xff08;一&#xff09;&#xff1a;录制管理核心MWRecordingController 类的设计与实现 深入解析iOS视频录制&#xff08;二&#xff09;&#xff1a;自定义UI的实现​​​​​​​ 深入解析 iOS 视频录制&#xff08;三&#xff09;&#xff1a;完…...

基于开源Odoo、SKF Phoenix API与IMAX-8数采网关的圆织机设备智慧运维实施方案 ——以某纺织集团圆织机设备管理场景为例

一、方案背景与需求分析 1.1 纺织行业设备管理痛点 以某华东地区大型纺织集团为例&#xff0c;其圆织机设备管理面临以下挑战&#xff1a; 非计划停机损失高&#xff1a;圆织机主轴轴承故障频发&#xff0c;2024年单次停机损失达12万元&#xff08;停机8小时导致订单延误&am…...

Deepseek 万能提问公式:高效获取精准答案

### **Deepseek 万能提问公式&#xff1a;高效获取精准答案** 在使用 Deepseek 或其他 AI 工具时&#xff0c;提问的质量直接决定了答案的精准度和实用性。以下是一个万能的提问公式回答&#xff1a; --- ### **1. 明确背景&#xff08;Context&#xff09;** - **作用**…...

SQL进阶技巧:如何统计用户跨端消费行为?

目录 0 问题描述 2 问题剖析 技术难点解析 3 完整解决方案 步骤1:构造全量日期平台组合 步骤2:用户行为标记 步骤3:最终关联聚合 4 核心技巧总结 5 复杂度评估 往期精彩 0 问题描述 支出表: Spending +-------------+---------+ | Column Name | Type | +-----…...

DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地

对于个人开发者或尝鲜者而言&#xff0c;本地想要部署 DeepSeek 有很多种方案&#xff0c;但是一旦涉及到企业级部署&#xff0c;则步骤将会繁琐很多。 比如我们的第一步就需要先根据实际业务场景评估出我们到底需要部署什么规格的模型&#xff0c;以及我们所要部署的模型&…...

算法——舞蹈链算法

一&#xff0c;基本概念 算法简介 舞蹈链算法&#xff08;Dancing Links&#xff0c;简称 DLX&#xff09;是一种高效解决精确覆盖问题的算法&#xff0c;实际上是一种数据结构&#xff0c;可以用来实现 X算法&#xff0c;以解决精确覆盖问题。由高德纳&#xff08;Donald E.…...