SQL中的联结表

本文介绍什么是联结,为什么使用联结,以及如何编写使用联结的SELECT语句。

1. 联结

SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。联结是SQL的SELECT能执行的最重要的操作,理解联结及其语法是学习SQL的重要部分。要有效使用联结,首先需要了解关系表及关系数据库设计的一些基础知识。下面的介绍是入门级的内容,足以帮助理解联结的基本概念。

1.1 关系表

理解关系表,最好通过一个例子来说明。假设有一个包含产品目录的数据库表,每一类物品占一行。对于每种物品,要存储的信息包括产品描述、价格和生产该产品的供应商信息。如果同一供应商生产了多种物品,那么如何存储供应商的名称、地址、联系方式等信息呢?将这些数据与产品信息分开存储的理由有以下几点:

  1. 同一供应商生产的每个产品,其供应商信息是相同的,若对每个产品重复存储这些信息,不仅浪费时间,也浪费存储空间;
  2. 如果供应商信息发生变化,例如供应商的地址或电话号码变动,更新一次即可,无需更新所有产品数据;
  3. 如果供应商信息重复存储,会导致数据一致性问题,不同的输入方式可能造成数据不一致,影响后续分析和报表。

关键在于,相同的数据出现多次是低效的,这是关系数据库设计的基础。关系表的设计应将信息分解成多个表,每类数据存一个表,通过某些共同的值将各表关联(因此称为关系数据库)。

在这个例子中,可以建立两个表:一个存储供应商信息,另一个存储产品信息。Vendors 表包含所有供应商信息,每个供应商占一行,且具有唯一标识(主键,primary key)。Products 表仅存储产品信息,除了存储供应商ID外,不存储其他供应商信息。通过供应商ID,Products 表与 Vendors 表关联,可以从 Vendors 表中查询到相关供应商的详细信息。

这样做的好处包括:

  1. 供应商信息不重复,节省存储空间;
  2. 如果供应商信息发生变动,只需在 Vendors 表中更新一次,其他表中的数据无需更改;
  3. 数据一致性更好,便于数据处理和报表生成。

总之,关系数据库能有效存储数据,并方便后续处理,因此,其可伸缩性要优于非关系数据库。

1.2 为什么使用联结

如前所述,将数据分解为多个表可以更高效地存储数据,且更便于管理,但这也带来了挑战:如何用一条SELECT语句从多个表中检索数据?答案是使用联结。联结是一种机制,可以在一条SELECT语句中将多个表关联,返回关联后的数据集。联结在执行时会根据特定条件把表中的行匹配在一起。

2. 创建联结

创建联结非常简单,只需要指定要联结的所有表和它们的关联条件。以下是一个例子:

SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;

输出结果

 

分析:这段代码与前面所写的SELECT语句类似,指定了需要检索的列。不同之处在于,这里列出了两个表:VendorsProducts。在 FROM 子句中,指定了这两个表,表示要联结的表。然后在 WHERE 子句中,通过条件 Vendors.vend_id = Products.vend_id,将两个表中的行关联起来。

注意,在联结中需要明确列名的表名,如 Vendors.vend_idProducts.vend_id,因为每个表都有一个 vend_id 列,否则数据库系统会无法知道你是指哪个表的列。

2.1 WHERE子句的重要性

使用 WHERE 子句来建立联结关系,可能有些令人困惑,但这是有充分理由的。实际上,表之间的关系是在查询执行时动态构造的,数据库表的定义中并没有指定如何联结表。在联结两个表时,数据库会将第一个表中的每一行与第二个表中的每一行配对,WHERE 子句则作为过滤条件,确保只有那些满足联结条件的行才会被返回。如果没有 WHERE 子句,数据库将进行笛卡尔积计算,即第一个表的每一行将与第二个表的每一行配对,可能会返回大量无意义的结果。

笛卡儿积(Cartesian Product)
没有联结条件的查询会返回笛卡尔积,结果行数等于第一个表的行数乘以第二个表的行数。以下示例会展示这一点:

SELECT vend_name, prod_name, prod_price
FROM Vendors, Products;

输出结果

 

从输出中可以看到,这个查询返回的是笛卡尔积,这意味着每个供应商都会与每个产品匹配,显然这不是我们想要的结果。为了避免这种情况,必须确保在联结查询中正确使用 WHERE 子句。

2.2 内联结

到目前为止,我们使用的联结是等值联结(equijoin),它基于两个表之间的相等测试,也叫做内联结(inner join)。这种联结也可以使用另一种语法来明确指定联结类型,语法如下:

SELECT vend_name, prod_name, prod_price
FROM Vendors
INNER JOIN Products ON Vendors.vend_id = Products.vend_id;

分析:此语句的 SELECT 部分与之前相同,但 FROM 子句有所不同。这里,使用了 INNER JOIN 来明确指定两个表之间的关系,并通过 ON 子句来指定联结条件。ON 子句中的条件与 WHERE 子句中的条件是等价的。

说明:“正确的”语法
ANSI SQL标准推荐使用 INNER JOIN 语法,而传统的等值联结语法(如 WHERE 子句方式)则属于较旧的形式。虽然DBMS支持两者,但建议大家理解这两种格式,实际应用时可以根据自己的习惯和需求选择。

总结

SQL联结是强大的查询工具,通过它可以将多个表中的相关数据整合到一起,方便分析和处理。理解关系表设计和联结语法对于高效使用SQL至关重要。联结能够帮助我们优化数据库设计,减少冗余数据,提高存储效率和一致性。在实际使用中,正确使用 WHEREINNER JOIN 子句来指定联结条件,是确保查询结果准确的关键。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每天40分玩转Django:实操 Todo List应用

实操 Todo List应用 一、今日学习内容概述 学习模块重要程度预计学时主要内容项目初始化⭐⭐⭐⭐0.5小时创建项目、配置环境模型设计⭐⭐⭐⭐⭐1小时Todo模型设计与实现CRUD视图⭐⭐⭐⭐⭐2小时实现增删改查功能模板开发⭐⭐⭐⭐1.5小时页面布局与交互设计功能测试⭐⭐⭐1小时…

Freertos任务切换

一、操作系统进行任务切换的时机: 采用信号量实现任务的互斥: 二、FreeRTOS 任务切换场合 PendSV 中断的时候提到了上下文(任务)切换被触发的场合: ● 可以执行一个系统调用 ● 系统滴答定时器(SysTick)中断。 1、执行系统调用 执行系统…

【Linux】自定义项目-进度条

更多精彩内容..... 🎉❤️播主の主页✨😘 Stark、-CSDN博客 准备工作:"\r"与"\n"字符 ①:基本含义 在C语言和Linux环境中,\r是回车符,\n是换行符,用于控制文本格式和输出…

【ubuntu24.04】PDFMathTranslate 本地PDF翻译GPU部署

https://huggingface.co/spaces/reycn/PDFMathTranslate-Docker排不上号官方都是要安装包,感觉可以本地试着源码部署一下, http://localhost:7860/官方是这个端口,但是我本地启动是:5000IDEA 里本地 backend启动效果 GUI 是监听7860的

基于卷积神经网络的垃圾分类系统实现(GUI应用)

1.摘要 本文主要实现了一个卷积神经网络模型进行垃圾图像分类,为了提高垃圾分类模型的准确率,使用使用Batch Normalization层、使用早期停止策略来防止过拟合等方法来优化模型,实验结果显示最终优化后的模型准确率较高90%左右。最终&#xf…

Vulnstack红日安全内网域渗透靶场2实战攻略

一:环境搭建 新增的网卡VMnet2,ip调成10段。 PC配置如下: DC在该环境中充当是域控。DC配置如下 : WEB配置:需要两块网卡,相当于网关服务器。 作者把外网网段都写成了192.168.111.1/24,我们可以…

Http协议在网站中的体现

文章目录 1. Http协议简介2. 网站中的体现2.1 访问网站2.2 请求2.3 请求头2.4 请求方式2.5 响应 3. 总结 1. Http协议简介 HTTP(超文本传输协议) 是一种广泛应用于互联网上的应用层协议,用于在Web浏览器和Web服务器之间传输数据。HTTP协议定…

JavaWeb——前端三剑客

前言:今天开始学习JavaWeb相关内容了,陆续会总结一些前后端分离开发的相关知识,有遗漏和错误的地方欢迎大家指出~ 目录 一、前端三剑客二、HTML2.1 HTML介绍2.2 常用标签 三、 CSS3.1 CSS介绍3.2 CSS引用的三种形式3.3. CSS选择器及其类型3.…

【经典】制造供应链四类策略(MTS、MTO、ATO、ETO)细说

关注作者 制造供应链的牛鞭问题与复杂问题主要是从两个方面解决,一是同步化供应链消减从需求到供应的放大效应,二是供应链细分,针对不同的客户、不同的需求供应的匹配策略来应对复杂性,更好的满足客户并以最低的总成本来实现。 对…

fixture装饰器

普通代码案例: python本身执行 import pytestdef init_new():print("init_new...")return Truedef test_case(init_new):if init_new is True:print("如果init_new返回True,就执行用例test_case")if __name__ __main__:#用python本…

数智读书笔记系列008 智人之上:从石器时代到AI时代的信息网络简史

书名:智人之上:从石器时代到AI时代的信息网络简史 作者:[以]尤瓦尔赫拉利 译者:林俊宏 出版时间:2024-09-01 ISBN:9787521768527 中信出版集团制作发行 作者信息 尤瓦尔・赫拉利 1976 年出生于以色列海法,是牛津大学历史学…

【C++】10___文件操作

目录 一、文本文件---写文件 二、文本文件---读文件 三、二进制文件---写文件 四、二进制文件---读文件 一、文本文件---写文件 通过文件操作可以将数据持久化 对文件操作需要包含头文件<fstream> 文件类型分两类&#xff1a; 文本文件&#xff1a;文件以文本的ASCII码形…

信号处理:概念、技术、领域

目录 基本概念 主要技术 应用领域 信号处理是一个涉及分析、修改和再生信号的多学科领域。信号可以是各种形式的&#xff0c;例如声音、图像、视频或其他类型的监测数据。信号处理的主要目标是提取有用的信息并增强信号的质量。以下是信号处理的一些基本概念和应用&#xff…

排序算法(5):归并排序

问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 归并排序 归并排序采用分治法&#xff0c;将序列分成若干子序列&#xff0c;每个子序列有序后再合并成有序的完整序列。 在数组排序中&#xff0c;如果只有一个数&#xff0c;那么它本身就是有序的。如果有两个数&#xff0…

vue 自定义组件image 和 input

本章主要是介绍自定义的组件&#xff1a;WInput&#xff1a;这是一个验证码输入框&#xff0c;自动校验&#xff0c;输入完成回调等&#xff1b;WImage&#xff1a;这是一个图片展示组件&#xff0c;集成了缩放&#xff0c;移动等操作。 目录 一、安装 二、引入组件 三、使用…

基于Java的图书借阅管理系统详细设计和实现

目录 一、前言介绍&#xff1a; 二、主要技术&#xff1a; 2.1 Java技术介绍&#xff1a; 2.2 MYSQL数据库&#xff1a; 三、系统设计&#xff1a; 3.1 系统架构设计&#xff1a; 3.2 登录时序图设计&#xff1a; 四、功能截图&#xff1a; 4.1 用户登录注册 4.2 系统…

每天五分钟深度学习:解析m个样本向量化前向传播的原理

本文重点 上一节课程中,我们学会了多样本的前向传播的向量化形式,使用这种方式我们可以同时计算m个样本的前向传播,我们将m个样本以矩阵形式表示,实现了m个样本的向量化,本节课程我们再来看一下为什么使用上节课程的方式就可以完成m个样本的向量化。 x(1)、x(2)、x(3)在…

Android显示系统(10)- SurfaceFlinger内部结构

Android显示系统(01)- 架构分析 Android显示系统(02)- OpenGL ES - 概述 Android显示系统(03)- OpenGL ES - GLSurfaceView的使用 Android显示系统(04)- OpenGL ES - Shader绘制三角形 Android显示系统(05)- OpenGL ES - Shader绘制三角形(使用glsl文件) Android显…

软考高级架构 - 11.1- 信息物理系统CPS

信息物理系统CPS 信息物理系统(CPS)是控制系统、嵌入式系统的扩展与延伸。通过集成先进的感知、计算、通信、控制等信息技术和自动控制技&#xff0c;构建了物理空间与信息空间中人、机、物、环境、信息等要素相互映射、适时交互、高效协同的夏杂系统。 CPS的本质是基于…

数据可视化的Python实现

一、GDELT介绍 GDELT ( www.gdeltproject.org ) 每时每刻监控着每个国家的几乎每个角落的 100 多种语言的新闻媒体 -- 印刷的、广播的和web 形式的&#xff0c;识别人员、位置、组织、数量、主题、数据源、情绪、报价、图片和每秒都在推动全球社会的事件&#xff0c;GDELT 为全…