【SQL 必知必会】- 第十二课 联结表

目录

联结

        关系表

        可伸缩(scale)

        为什么使用联结

创建联结

        WHERE子句的重要性

        笛卡儿积(cartesian product)

        不要忘了WHERE 子句

        叉联结

        内联结

扫描二维码关注公众号,回复: 15013283 查看本文章

        联结多个表

        性能考虑

        注意:联结中表的最大数目

查询的多种写法

        多做实验


联结

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


        关系表

        关系表的设计就是要把信息分解成多个表,一类数据一个表。各表通过某些共同的值互相关联(所以才叫关系数据库)。

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


        可伸缩(scale)

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


        为什么使用联结

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

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

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


创建联结

        创建联结非常简单,指定要联结的所有表以及关联它们的方式即可。

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

        在此处需要特别注意,区分列名,尤其是几个表具有相同列名的时候,不区分会导致出错。


        WHERE子句的重要性

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


        笛卡儿积(cartesian product)

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

SELECT vend_name, prod_name, prod_price
FROM Vendors, Products;

        笛卡尔积是非常不好的 SQL 结果,这会极大的消耗资源,并且无法筛选出合适的数据。在实际的工作中尽量避免出现笛卡尔积的形式。


        不要忘了WHERE 子句

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


        叉联结

        有时,返回笛卡儿积的联结,也称叉联结(cross join)。


        内联结

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

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

        此语句中的SELECT 与前面的SELECT 语句相同,但FROM 子句不同。这里,两个表之间的关系是以INNER JOIN 指定的部分FROM 子句。在使用这种语法时,联结条件用特定的ON 子句而不是WHERE 子句给出。传递给ON 的实际条件与传递给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 = 20007;

        性能考虑

        DBMS 在运行时关联指定的每个表,以处理联结。这种处理可能非常耗费资源,因此应该注意,不要联结不必要的表。联结的表越多,性能下降越厉害。


        注意:联结中表的最大数目

        虽然SQL 本身不限制每个联结约束中表的数目,但实际上许多DBMS都有限制。


查询的多种写法

SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'));

下面是使用联结的相同查询:

SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num
AND prod_id = 'RGAN01';

        多做实验

        可以看到,执行任一给定的SQL 操作一般不止一种方法。很少有绝对正确或绝对错误的方法。性能可能会受操作类型、所使用的DBMS、表中数据量、是否存在索引或键等条件的影响。因此,有必要试验不同的选择机制,找出最适合具体情况的方法。

猜你喜欢

转载自blog.csdn.net/qq_57163366/article/details/130058608