16.1 使用表别名
在之前的例子中,我们用的都是用的列别名,SQL还允许给表名起别名。
16.2 使用不同类型的联结
我们在上一章使用的只是称为内部联结或等值联结( equijoin) 的简单联结,现在来看3种其他联结,它们分别是自联结、自然联结和外部联结。
16.2.1 自联结
这里的自联结通俗来讲就是表自己与自己联结,此时表别名就发挥作用了。
我们看一个例子:
发现某物品(其ID为DTNTR)存在问题,因此想知道生产该物品的供应商生产的其他物品是否也存在这些问题。此查询要求首先找到生产ID为DTNTR的物品的供应商,然后找出这个供应商生产的其他物品。
一方面,我们可以用子查询来实现。
SELECT prod_id, prod_name FROM products WHERE vend_id = ( SELECT vend_id FROM products WHERE prod_id = 'DTNTR' );
另一方面,我们可以用自联结来实现。
SELECT p1. prod_id, p1. prod_name FROM products AS p1, products AS p2 WHERE p1.vend_id = p2.vend_id AND p2.prod_id = 'DTNTR' );
此查询中需要的两个表实际上是相同的表,因此products表在FROM子句中出现了两次。 但对products 的引用具有二义性 。为解决此问题,使用了表别名。products的第一次出现为别名p1, 第二次出现为别名p2。
16.2.2 自然联结