联结

SQL的强大功能就是在数据检索查询的执行中联结(JOIN)表

关系表

由于数据库设计范式的原因,往往需要一个表的外键关联另一个表的主键id,定义2个表的关系。
关系数据库的可伸缩性远比非关系数据库要好
设计良好的数据库或应用程序称之为可伸缩性好

为什么要使用联结

联结是一种机制,用来在一个SELECT语句中关联表,因此称之为联结。
可以联结多个表返回一组输出,联结在运行时关联表中正确的行。

创建联结

只需要联结的所有表以及它们如何关联即可。

SELECT
	vend_name,
	prod_name,
	prod_price 
FROM
	vendors,
	products 
WHERE
	vendors.vend_id = products.vend_id 
ORDER BY
	vend_name,
	prod_name;
  • 解释
    1.SELECT语句中的列存在于2个不同的表中
    2.FROM子句列出了2个表,为SELECT语句联结的两个表的名字
    3.使用WHERE子句正确联结
    image.png
  • 注意
    在引用的列可能出现二义性时,必须使用完全限定列名

WHERE子句的重要性

利用WHERE子句建立联结关系。在联结两个表时,将第一个表中的每一行与第二个表中的每一行配对。
WHERE子句作为过滤条件,只匹配给定条件的行,没有WHERE子句那么第一个表中的每一行将和第二个表中的每一行配对,不管逻辑上是否可行。返回的结果行数将是一个笛卡尔乘积

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

内部联结

基于两个表之间的想等测试的联结称为等值联结也称为内部联结。
所以也可以写为

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

此时两表之间的关系是FROM子句的组成部分,以INNER JOIN指定。
联结条件用特定的ON子句而不是WHERE子句给出。

  • 使用哪种语法
    SQL规范首选INNER JOIN语法,这样可以确保不会忘记联结条件

联结多个表

对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;

image.png

  • 性能考虑
    MySQL在运行时关联指定的每个表以处理联结,不要联结不必要的表。联结的表越多,性能下降越厉害

使用联结查询时,可以避免执行复杂的SELECT操作

多做实验

为执行任一给定的SQL操作,一般存在不止一种方法,很少有绝对正确或绝对错误的方法。性能可能会受操作类型、数据量、索引等其他条件影响。可对不同的选择机制进行实验,找出最适合具体情况的方法


这个家伙很懒,啥也没有留下😋