自联结

使用表别名

别名除了用于列名和计算字段外,SQL还允许给表名起别名。这样做
有两个主要理由:

  • 缩短SQL语句;
  • 允许在单条SELECT语句中多次使用相同的表。

给表使用别名
SELECT vend_name, prod_id, prod_price FROM vendors AS v, products AS p WHERE v.vend_id = p.vend_id;

注意,表别名只在查询执行中使用。与列别名不一样,表别名不返回到客户机。
完全限定列名之间要用逗号分隔,别名之间也要用逗号分隔

自连接

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的引用具有二义性,因为MySQL不知道你引用的是products表中的哪个实例。
为解决此问题,使用了表别名。products的第一次出现为别名p1,第二次出现为别名p2。现在可以将这些别名用作表名。例如,SELECT语句使用p1前缀明确地给出所需列的全名。
如果不这样,MySQL将返回错误,因为分别存在两个名为prod_id、prod_name的列。MySQL不知道想要的是哪一个列(即使它们事实上是同一个列)。
WHERE(通过匹配p1中的vend_id和p2中的vend_id)首先联结两个表,然后按第二个表中的prod_id过滤数据,返回所需的数据。

用自联结而不用子查询 自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。虽然最终的结果是相同的,但有时候处理联结远比处理子查询快得多。应该试一下两种方法,以确定哪一种的性能更好。

posted @ 2020-09-24 17:21  bibicode  阅读(217)  评论(0)    收藏  举报