MySQL联结表介绍以及使用详解

 更新时间:2024年03月04日 09:52:45   作者:M malloc  
这篇文章主要给大家介绍了关于MySQL联结表介绍及使用的相关资料,联结SQL最强大的功能之一就是能在数据检索查询的执行中联结表,文中通过代码介绍的非常详细,需要的朋友可以参考下

MySQL的前情介绍

😁大家好呀,今天是我第N次写MySQL,也是最近才学习MySQL,也想着记录一下自己的学习过程,并且分享给大家尼!

本章详情

🐤本章将介绍什么是联结,为什么要使用联结,如何编写使用联结的SELECT语句。

联结

前言

SQL最强大的功能之一就是能在数据检索查询的执行中联结 (join)表。联结是利用SQL的SELECT能执行的最重要的操作,很好地理解联结及其语法是学习SQL的一个极为重要的组成部分。

在能够有效地使用联结前,必须了解关系表以及关系数据库设计的些基础知识。下面的介绍并不是这个内容的全部知识,但作为入门已经足够了。

关系表

💐理解关系表的最好方法是来看一个现实世界中的例子:

现在,假如有由同一供应商生产的多种物品,那么在何处存储供应商信息(如,供应商名、地址、联系方法等)呢?将这些数据与产品信息分开存储的理由如下。

  • 因为同一供应商生产的每个产品的供应商信息都是相同的,对每个产品重复此信息既浪费时间又浪费存储空间。
  • 如果供应商信息改变(例如,供应商搬家或电话号码变动),只需改动一次即可。
  • 如果有重复数据(即每种产品都存储供应商信息),很难保证每次输入该数据的方式都相同。不一致的数据在报表中很难利用。

关键

关键是,相同数据出现多次决不是一件好事,此因素是关系数据库设计的基础。关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各表通过某些常用的值(即关系设计中的关系 (relational))互相关联。

分析

🌱在这个例子中,可建立两个表,一个存储供应商信息,另一个存储产品信息。vendors表包含所有供应商信息,每个供应商占一行,每个供应商具有唯一的标识。此识称为主键 (primary key) (在第首篇文章中首次提到),可以是供应商ID或任何其他唯一值。

products表只存储产品信息,它除了存储供应商ID (vendors表的主键)外不存储其他供应商信息。vendors表的主键又叫作products的外键,它将vendors表与products表关联,利用供应商ID能从vendors表中找出相应供应商的详细信息。

外键(foreign key)

外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。

好处

  • 供应商信息不重复,从而不浪费时间和空间;
  • 如果供应商信息变动,可以只更新vendors表中的单个记录,相关表中的数据不用改动;
  • 由于数据无重复,显然数据是一致的,这使得处理数据更简单。

🌻总之,关系数据可以有效地存储和方便地处理。因此,关系数据库的可伸缩性远比非关系数据库要好。

可伸缩性(scale)

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

为什么要使用联结

正如所述,分解数据为多个表能更有效地存储,更方便地处理,并且具有更大的可伸缩性。但这些好处是有代价的。

🌼如果数据存储在多个表中,怎样用单条SELECT语句检索出数据?

答案是使用联结。简单地说,联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。

维护引用完整性

维护引用完整性重要 的是,要理解联结不是物理实体。换句话说,它在实际的数据库表中不存在。联结由MySQL根据需要建立,它存在于查询的执行当中。

在使用关系表时,仅在关系列中插入合法的数据非常重要。回到这里的例子,如果在products表中插入拥有非法供应商ID即没有在vendors表中出现)的供应商生产的产品,则这些产品是不可访问的,因为它们没有关联到某个供应商。为防止这种情况发生,可指示MySQL只允许在products表的供应商ID列中出现合法值(即出现在vendors表中的供应商)这就是维护引用完整性,它是通过在表的定义中指定主键和外键来实现的。(这将在后面的文章种介绍)。

创建联结

联结的创建非常简单,规定要联结的所有表以及它们如何关联即可。请看下面的例子:

输入

SELECT vend_name,prod_name,prod_price FROM vendors,products
	WHERE vendors.vend_id = products.vend_id 
		ORDER BY vend_name,prod_name;

输出

分析

我们来考察一下此代码。SELECT语与前面所有语一样指定要检索的列。这里,最大的差别是所指定的两个列(prod_name和prod_price)在一个表中,而另一个列(vend_name)在另一个表中。

现在来看FROM子句。与以前的SELECT语句不一样,这条语句的FROM子句列出了两个表,分别是vendors和products。它们就是这条SELECT语句联结的两个表的名字。这两个表用WHERE子句正确联结,WHERE子句指示MySQL匹配vendors表中的vend_id和products表中的vend_id。

可以看到要匹配的两个列以vendors.vend id和products.vend_id指定。这里需要这种完全限定列名,因为如果只给出vend_id则MySQL不知道指的是哪一个 (它们有两个,每个表中一个)。

完全限定列名

在引用的列可能出现二义性时,必须使用完全限定列名(用一个点分隔的表名和列名)。如果引用一个没有用表名限制的具有二义性的列名,MySOL将返回错误。

WHERE子句的重要性

提示

利用WHERE子句建立联结关系似乎有点奇怪,但实际上,有一个很充分的理由。请记住,在一条SELECT语句中联结几个表时,相应的关系是在运行中构造的。在数据库表的定义中不存在能指示MySQL如何对表进行联结的东西。你必须自已做这件事情。在联结两个表时,你实际上做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE子句作为过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行。没有WHERE子句,第一个表中的每个行将与第二个表中的每个行配对,而不管它们逻辑上是否可以配在一起。

笛卡尔积(cartesian product)

由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

为了理解这一点,请看下面的SELECT语句及其输出

输入

SELECT vend_name,prod_name,prod_price FROM vendors,products
	ORDER BY vend_name,prod_name;

输出

分析

从上面的输出中可以看到,相应的笛卡儿积不是我们所想要的。这里返回的数据用每个供应商匹配了每个产品,它包括了供应商不正确的产品。实际上有的供应商根本就没有产品。

不要忘记WHERE子句

应该保证所有联结都有WHERE子,否则MySQL将返回比想要的数据多得多的数据。同理,应该保证WHERE子句的正确性。不正确的过滤条件将导致MySQL返回不正确的数据.

叉联结

有时我们会听到返回称为叉联结(cross join)的笛卡儿积的联结类型。

内部联结

目前为止所用的联结称为等值联结 (equijoin),它基于两个表之间的相等测试。这种联结也称为内部联结。其实,对于这种联结可以使用稍微不同的语法来明确指定联结的类型。下面的SELECT语句返回与前面例子完全相同的数据:

输入

SELECT vend_name,prod_name,prod_price FROM vendors INNER JOIN products  
	ON vendors.vend_id = products.vend_id;

分析

🌼此语句中的SELECT与前面的SELECT语句相同,但FROM子句不同。这里,两个表之间的关系是FROM子句的组成部分,以INNER JOIN指定。在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句给出。传递给ON的实际条件与传递给WHERE的相同。

使用哪种语法

ANSI SQL规范首选INNER JOIN语法。此外尽管使用WHERE子句定义联结的确比较简单,但是使用明确的联结语法能够确保不会忘记联结条件,有时候这样做也能影响性能。

联结多个表

⭐SQL对一条SELECT语句中可以联结的表的数目没有限制。创建联结的基本规则也相同。首先列出所有表,然后定义表之间的关系。例如:

输入

SELECT prod_name,vend_name,prod_price,quantity FROM orderitems, products,vendors 
	WHERE products.vend_id = vendors.vend_id 
		AND orderitems.prod_id = products.prod_id 
			AND order_num = 20005;

输出

分析

⭐此例子显示编号为20005的订单中的物品。订单物品存储在orderitems表中。每个产品按其产品ID存储,它引用products表中的产品。这些产品通过供应商ID联结到vendors表中相应的供应商,供应商ID存储在每个产品的记录中。这里的FROM子句列出了3个表,而WHERE子句定义了这两个联结条件,而第三个联结条件用来过滤出订单20005中的物品。

如何巩固学习

提示:在学习的过程中,我们需要先自行进行思考,而不是一遇到不会的就放弃思考直接看答案,如果最后遇到真的不会的题目,我们可以适当的进行观看答案,看自己的思路是否正确,在作出正确的判断

本文小结

联结是SQL中最重要最强大的特性,有效地使用联结需要对关系数据库设计有基本的了解。本章随着对联结的介绍讲述了关系数据库设计的一些基本知识,包括等值联结(也称为内部联结) 这种最经常使用的联结形式。下一篇文章将介绍如何创建其他类型的联结

总结

到此这篇关于MySQL联结表介绍以及使用的文章就介绍到这了,更多相关MySQL联结表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL特殊函数使用技巧梳理

    MySQL特殊函数使用技巧梳理

    MySQL提供了各种特殊函数,它们可以帮助管理者查询复杂的数据,资料库包括字符串函数,数学函数,日期函数,程序函数等,下面这篇文章主要给大家介绍了关于MySQL特殊函数使用技巧的相关资料,需要的朋友可以参考下
    2023-05-05
  • sql中替换函数replace()用法与实例总结

    sql中替换函数replace()用法与实例总结

    这篇文章主要给大家介绍了关于sql中替换函数replace()用法与实例的相关资料,在SQL中REPLACE函数用于替换一个字符串中的一部分为另一个字符串,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • MySql中now()与sysdate()区别小结

    MySql中now()与sysdate()区别小结

    本文主要介绍了MySql中now()与sysdate()区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • MySQL表分区的几种实现

    MySQL表分区的几种实现

    本文主要介绍了MySQL表分区的几种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • MySQL主从同步机制与同步延时问题追查过程

    MySQL主从同步机制与同步延时问题追查过程

    这篇文章主要给大家介绍了关于MySQL主从同步机制与同步延时问题追查的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • MySQL 中 datetime 和 timestamp 的区别与选择

    MySQL 中 datetime 和 timestamp 的区别与选择

    MySQL 中常用的两种时间储存类型分别是datetime和 timestamp。如何在它们之间选择是建表时必要的考虑。下面就谈谈他们的区别和怎么选择,需要的朋友可以参考一下
    2021-09-09
  • MySql恢复数据方法梳理讲解

    MySql恢复数据方法梳理讲解

    MySQL的binlog日志是MySQL日志中非常重要的一种日志,下面这篇文章主要给大家介绍了关于mysql如何利用binlog进行数据恢复的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • MySql 如何实现无则插入有则更新

    MySql 如何实现无则插入有则更新

    这篇文章主要介绍了MySql 实现无则插入有则更新的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • MySQL 两张表数据合并的实现

    MySQL 两张表数据合并的实现

    本文主要介绍了MySQL 两张表数据合并的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • mysql5.7同时使用group by和order by报错问题

    mysql5.7同时使用group by和order by报错问题

    这篇文章主要介绍了mysql5.7同时使用group by和order by报错的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08

最新评论