SQL最强大的功能之一就是能够使用联结(join)表。
看个实际例子。假设我们有一个产品信息表,主要包括产品ID,供应商ID,价格等信息,还有一个供应商表,主要包括供应商ID,供应商地址,联系方式等。那么为啥要把供应商信息单独放一个表呢?
优点如下:
1.同一供应商生产的每个产品,其供应商信息是相同的,在产品信息表中重复记录这些信息浪费空间和时间;
2. 假设供应商信息变动,比如电话等,只需要在供应商表中修改相应的一次就够了;
3. 不重复使得数据一致性好,出错概率小。
SELECT联结表如下:
select vend_name,prod_name
from vendors,products
where vendors.vend_id=products.vend_id;
注意,vend_name,prod_name来自两个不同的表,所以from需要两个表。where子句很重要,使结果只包含给定条件的行。没有where条件,第一个表的每一行将与第二个表每一行配对,称为笛卡尔积,也就是说,表1有M行,表2有N行,最终结果为M*N行,这显然不符合我们的预期。
而where条件是隐含在语义中的,我们要查询一件产品的名字及其供应商名字,而两个表公有的属性是供应商的ID,因此需要通过这个来配对,不需要别的供应商的名字。
上面这种联结也叫内联结或等值联结。
等同于下面的语法
select vend_name,prod_name
from vendors INNER JOIN products
ON vendors.vend_id=products.vend_id;
当然可以联结多个表,表越多,性能越差。
并且,表也可以使用别名,主要是为了缩短SQL语句,如下
select vend_name,prod_name
from vendors AS V INNER JOIN products AS P
ON V.vend_id=P.vend_id;
但是,表别名只用于查询,不返回客户端,这和列别名有区别,
并且,别名可以帮助同一个表逻辑上查询为两个表。用自联结代替子查询。
自然连接(Natural join)是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。
外连接分为三种:左外连接,右外连接,全外连接。对应SQL:LEFT/RIGHT/FULL OUTER JOIN。
左连接LEFT JOIN的含义就是求两个表A表和B表的交集外加左表剩下的数据。依旧从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表A表中剩余的记录。
其他的类似。