SQL第12课——联结表

news2024/11/26 14:37:55

三点:什么是联结?为什么使用联结?如何编写使用联结的select语句

12.1 联结

SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。联结是利用SQL的select能执行的最重要的操作。

在使用联结前,需要了解关系表和关系数据库设计的一些基础知识。

12.1.1 关系表

例子:

一个产品目录的数据库表,一类物品占一行,每一行对物品的介绍包含:产品描述,价格,以及生产该产品的供应商。

现在有同一供应商生产的多种物品,那么在何处存储供应商名,地址,联系方式等供应商信息?

产品信息与供应商信息分开存储的理由:

1. 同一供应商生产的每个产品,其供应商信息都是相同的,对每个产品重复此信息既浪费时间又浪费存储空间;

2. 当供应商信息发生变化,例如供应商迁址或电话号码变动,只需要修改一次就行;

3. 当有重复数据,很难保证每次输入该数据的方式都相同。不一致的数据在报表中就很难利用。

关系数据库设计的基础:相同的数据出现多次决不是一件好事。

关系表的设计把信息分解成多个表:一类数据一个表,各个表通过某些共同的值互相关联。

此例中可以建立两个表:一个存储供应商信息,另一个存储产品信息。

Vendors表包含所有供应商信息,每个供应商占一行,具有唯一的标识,此标识称为主键(primary key).可以是供应商ID或任何其他唯一值。

Products表只存储产品信息,除了存储供应商ID(Vendors表的主键)外,不存储其他有关供应商的信息。

Vendors表的主键将Vendors表和Products表关联。

好处:

1. 供应商信息不重复,不会浪费时间和空间;

2. 当供应商信息变动时,只需要更新Vendors表中的单个记录,相关表中的数据不用改动。

3. 由于数据不重复,数据显然是一致的,使得处理数据和生成报表更简单。

关系数据可以有效地存储,方便地处理。关系数据库的可伸缩性更好。

可伸缩(scale):

能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称为可伸缩性好。

12.1.2 为什么使用联结

将数据分解为多个表能更有效地存储,更方便的处理,并且可伸缩性更好。

使用联结,联结是一种机制,用来在一条select语句中关联表。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。

12.2 创建联结

指定要联结的所有表,并关联它们的方式。

vend_name来自一个表;prod_name, prod_price来自一个表。

要匹配的两列指定为:venders.vend_id和products.vend_id。

这里需要这种完全限定列名,一条select语句返回了两个不同表中的数据

12.2.1 where子句的重要性

where子句作为过滤条件,只包含那些匹配给定条件(这里是联结条件)的行。没有where子句,第一个表中的每一行将与第二个表中的每一行配对,而不管它们逻辑上是否能配在一起。

笛卡儿积(cartesian product):没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。返回笛卡儿积的联结,也称叉联结(cross join)

从上面的输出可以看出来,相应的笛卡儿积不是我们想要的,返回的数据用每个供应商匹配了每个产品,包括了供应商不正确的产品(即使供应商根本就没有产品)

所有联结都必须有where子句!!!

12.2.2 内联结

目前为止使用的联结成为等值联结(equijoin),基于两个表之间的相等测试,也称为内联结(inner join).

联结条件用特定的on子句而不是where子句给出。传递给on的实际条件与传递给where的相同

12.2.3 联结多个表

SQL不限制一条select语句中可以联结的表的数目。

创建联结的基本规则也相同。首先列出所有表,然后定义表之间的关系。

where子句定义两个联结条件,第三个联结条件用来过滤出订单20007中的物品。

!!!不要联结不必要的表,联结的表越多,性能下降越厉害。

执行复杂的select操作的两种方法:第11课中的子查询和第12课中的联结:

子查询:返回订购产品rgan01的顾客列表:

联结:

!!!联结的列名,在上述的例子中名字都是一样的,但是列名相同并不是必需的。

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

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

相关文章

Vue组件库Element-ui

Vue组件库Element-ui Element是一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库。Element - 网站快速成型工具 安装element-ui npm install element-ui # element-ui版本(可以指定版本号引入ElementUI组件库,在main.js中添加内容得到&…

【动态规划-最长公共子序列(LCS)】力扣1035. 不相交的线

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足: nums1[i] nums2[j] 且绘制的直线不与任何其他连线(非水平线&#xff09…

graphql--快速了解graphql特点

graphql--快速了解graphql特点 1.它的作用2.demo示例2.1依赖引入2.2定义schema2.3定义GrapQL端点2.4运行测试2.5一些坑 今天浏览博客时看到graphQL,之前在招聘网站上第一次接触,以为是图数据查询语言, 简单了解后,发现对graphQL的介绍主要是用作API的查询语言,不仅限于图数据查…

dbeaver的使用

新增mysql连接 新增clickhouse 连接 新建编辑器 执行 结果,想看某条结果明细,选中某行安tab键 设置快捷键 窗口-》首选项-》用户界面-》键

ReentrantLock 实现原理

文章目录 ReentrantLock 基本使用可重入锁等待可中断设置超时时间公平锁条件变量 ReentrantLock 原理加锁流程解锁流程可重入锁原理可打断原理公平锁原理条件变量原理 ReentrantLock 基本使用 在Java中,synchronized 和 ReentrantLock 都是用于确保线程同步的锁&am…

JUPITER Benchmark Suite:是一套全面的23个基准测试程序,目的支持JUPITER——欧洲首台E级超级计算机的采购

2024-08-30,由于利希超级计算中心 创建JUPITER Benchmark Suite,这是一个全面的 23 个基准测试程序集合,经过精心记录和设计,目的支持购买欧洲第一台百万兆次级超级计算机 JUPITER。 一、研究背景: 随着E级超级计算机…

AI大模型有哪些,收藏起来防踩坑

大模型是指具有数千万甚至数亿参数的深度学习模型,通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能,能够处理更加复杂的任务和数据。以下是对大模型的详细数据与分析&#xff1…

在网页中渲染LaTex公式

概述 MathJax可以实现网页浏览器中的LaTex公式渲染。 引入 可以使用特定的模板形式引入和配置&#xff0c;具体可参考&#xff1a;配置mathjax — MathJax 3.2 文档 (osgeo.cn)。其中代码可以以CDN形式引入&#xff1a;mathjax (v3.2.2) -BootCDN。 <script> MathJax …

【C++驾轻就熟】vector深入了解及模拟实现

​ 目录 ​编辑​ 一、vector介绍 二、标准库中的vector 2.1vector常见的构造函数 2.1.1无参构造函数 2.1.2 有参构造函数&#xff08;构造并初始化n个val&#xff09; 2.1.3有参构造函数&#xff08;使用迭代器进行初始化构造&#xff09; 2.2 vector iterator 的使…

集全CNS!西北农林发表建校以来第一篇Nature

9月25日&#xff0c;国际学术期刊《自然》&#xff08;Nature&#xff09;在线发表了西北农林科技大学青年科学家岳超研究员领衔的团队题为《极端森林大火放大火后地表升温》的研究成果。该研究首次从林火规模这一独特视角&#xff0c;揭示了极端大火对生态系统破坏性、林火碳排…

受电端取电快充协议芯片的工作原理

随着电池技术的不断进步&#xff0c;快充技术应运而生&#xff0c;它以惊人的速度解决了“电量焦虑”成为手机技术发展的重要程碑。 快充技术&#xff0c;通过提高充电功率&#xff0c;大幅度缩短手机等设备充电时间的技术。相对于传统的慢充方式&#xff0c;快充技术能够在短…

ASP.NET MVC 下拉框的传值-foreach循环

数据表&#xff1a; -- 创建包裹分类表 CREATE TABLE PackageCategories (CategoryID INT PRIMARY KEY IDENTITY(1,1), -- 分类ID&#xff1a;整数类型&#xff0c;主键&#xff0c;自增&#xff0c;包裹分类的唯一标识CategoryName NVARCHAR(255) NOT NULL -- 包裹分类名称&a…

从零开始讲PCIe(11)——数据链路层介绍

一、概述 数据链路层这一层的逻辑是用来负责链路管理的&#xff0c;它主要表现为 3 个功能TLP 错误纠正、流量控制以及一些链路电源管理。它是通过如图 2-24 所示的DLLP&#xff08;Data Link Layer Packet&#xff09;来完成这些功能的。 二、DLLPs 数据链路层包&#xff08;D…

基于Springboot+Vue的在线问诊系统的设计与实现(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

PDFToMarkdown

pdf转markdown 安装Tesseract-OCR项目拉取pytorch安装开始转换转换单个文件转换多个文件总结github开源PDF转markdown git clone https://github.com/VikParuchuri/marker.git 注意该项目有些包的语法需要python3.10,所以需要安装python3.10. 导入pycharm,下面选择取消 安…

Git分支-团队协作以及GitHub操作

Git分支操作 在版本控制过程中&#xff0c;同时推进多个任务> 程序员开发与开发主线并行&#xff0c;互不影响 分支底层也是指针的引用 hot-fix:相当于若在进行分支合并后程序出现了bug和卡顿等现象&#xff0c;通过热补丁来进行程序的更新&#xff0c;确保程序正常运行 常…

【Conda】Conda命令详解:高效更新与环境管理指南

目录 1. Conda 更新命令1.1 更新 Conda 核心1.2 更新所有包 2. 严格频道优先级3. 强制安装特定版本4. 创建与管理环境4.1 创建新环境4.2 激活和停用环境4.3 导出和导入环境4.4 删除环境 5. 清理缓存总结 Conda 是一个强大的包管理和环境管理工具&#xff0c;广泛应用于数据科学…

Linux中环境变量

基本概念 环境变量Environmental variables一般是指在操作系统中用来指定操作系统运行环境一些参数。 我们在编写C、C代码时候&#xff0c;在链接的时候从来不知道我们所链接的动态、静态库在哪里。但是还是照样可以链接成功。生成可执行程序。原因就是相关环境变量帮助编译器…

C#医学影像分析源码,医院影像中心PACS系统源码

医学影像系统源码&#xff0c;影像诊断系统PACS源码&#xff0c;C#语言&#xff0c;C/S架构的PACS系统全套源代码。 PACS系统是医院影像科室中应用的一种系统&#xff0c;主要用于获取、传输、存档和处理医学影像。它通过各种接口&#xff0c;如模拟、DICOM和网络&#xff0c;以…

【数据结构】【链表代码】相交链表

/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {//先求出两个链表的长度ListNode…