内部联结:
SELECT vend_name,prod_name,prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id=Products.vend_id;
ON子句给出联结条件
自联结:
SELECT c1.cust_id,c1.cust_name,c1.cust_contact
FROM Customers AS c1,Customers AS c2
WHERE c1.cust_name=c2.cust_name
AND c2.cust_contact = 'Jim Jones';
此查询中需要的两个表实际上是相同的表,因此对Customers使用了表别名。Customers的第一次出现为别名C1,第二次出现为别名C2。WHERE 首先联结两个表,然后按第二个表中的cust_contact过滤数据,返回所需的数据。
自然联结:
SELECT C.*, O.order_num,O.order_date,OI.prod_id,OI.quantity FROM Customers AS C,OrderOrderItems AS OI WHERE C.cust_id=O.cust_id AND OI.order_num=O.order_num AND prod_id='RGAN01';
等效于:SELECT C.*, O.order_num,O.order_date,OI.prod_id,OI.quantity FROM Customers AS C NATURAL JOIN Orders AS O NATURAL JOIN OrderItems AS OI WHERE prod_id='RGAN01';
它要求两个关系进行比较的分量必须是相同的属性组,并且在结果集中将重复属性列去掉。
自然连接是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系。即自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。
一个简单的例子,将下列关系R和S进行自然连接:
R:
A B C
a b c
b a d
c d e
d f g
S:
A C D
a c d
d f g
b d g
首先要对两个关系中相同属性组的分量进行相等比较,即比较R.A,R.C 和 S.A , S.C;
- 因 R中AC属性第一行元组分量a、c与S中AC属性第一行元组分量a、c相等 选取为结果之一
- 因 R中AC属性第二行元组分量b、d与S中AC属性第三行元组分量b、d相等 选取为结果之一
- 因 S中AC属性第三行元组分量d、f与R中AC属性各个元组分量均不等 不选取
- 其余属性不重复则保留,且保留的分量为选取的元组同组分量。
- 因此进行连接得到结果:
A B C D
a b c d
b a d g