hello oracle III

表连接

表连接有多种不同的类型,被主流数据库系统支持的有交叉连接(CROSS JOIN)、内连接(INNER JOIN)、外连接(OUTTER JOIN),另外在有的数据库系统中还支持联合连接(UNION JOIN)。

内连接(inner join)

SELECT FNumber,FPrice 
FROM T_Order INNER JOIN T_Customer 
ON FCustomerId= T_Customer.FId 
WHERE T_Customer.FName='MIKE' 

为了避免列名歧义并且提高可读性,这里建议使用表连接的时候要显式列所属的表,如下

SELECT T_Order.FId,T_Order.FNumber,T_Order.FPrice, 
T_Customer.FId,T_Customer.FName,T_Customer.FAge 
FROM T_Order INNER JOIN T_Customer 
ON T_Order.FCustomerId= T_Customer.FId

为了明确指定字段所属的表,上面的SQL语句中多次出现了T_Order、T_Customer,当字段比较多的时候这样的SQL语句看起来非常繁杂,为此可以使用表别名来简化SQL语句的编写

SELECT o.FId,o.FNumber,o.FPrice, 
c.FId,c.FName,c .FAge 
FROM T_Order o JOIN T_Customer c 
ON o.FCustomerId= c.FId

不等值连接

还存在另外一种不等值连接,也就是在连接的条件中可以使用小于(<)、大于(>)、不等于(<>)等运算符,而且还可以使用LIKE、BETWEEN AND等运算符,甚至还可以使用函数。

SELECT T_Order.FNumber,T_Order.FPrice,
T_Customer.FName,T_Customer.FAge 
FROM T_Order  
INNER JOIN T_Customer 
ON T_Order.FPrice< T_Customer.FAge*5 

不等值连接产生了大量的查询结果,因为它是对被连接的两张表做了笛卡尔运算

 

交叉连接

与内连接比起来,交叉连接非常简单,因为它不存在ON子句。交叉连接会将涉及到的所有表中的所有记录都包含在结果集中。

隐式交叉连接

SELECT T_Customer.FId, T_Customer.FName, T_Customer.FAge, 
T_Order.FId, T_Order.FNumber, T_Order.FPrice 
FROM T_Customer, T_Order

交叉连接的显式定义方式为使用CROSS JOIN关键字

SELECT T_Customer.FId, T_Customer.FName, T_Customer.FAge, 
T_Order.FId, T_Order.FNumber, T_Order.FPrice 
FROM T_Customer 
CROSS JOIN T_Order

自连接

参与连接的表完全可以是同一样表,也就是表与其自身相连接,这样连接就被称为自连接

SELECT o1.FNumber,o1.FPrice,o1.FTypeId, 
o2.FNumber,o2.FPrice,o2.FTypeId 
FROM T_Order o1 
INNER JOIN T_Order o2 
ON o1.FTypeId=o2.FTypeId and o1.FId<>o2.FId

 内部连接要求组成连接的两个表必须具有匹配的记录

有时我们要求无法匹配的NULL值也要显示到结果集中,外部连接主要就是用来解决这种空值匹配问题的。

 

外连接

外部连接的语法与内部连接几乎是一样的,主要区别就是对于空值的处理。外部连接不需要两个表具有匹配记录,这样可以指定某个表中的记录总是放到结果集中。根据哪个表中的记录总是放到结果集中,外部连接分为三种类型:右外部连接(RIGHT OUTER JOIN)、左外部连接(LEFT OUTER JOIN)和全外部连接(FULL OUTER JOIN)。

左外部连接

在左外部连接中,左表中所有的记录都会被放到结果集中,无论是否在右表中存在匹配记录。

SELECT o.FNumber,o.FPrice,o.FCustomerId, 
c.FName,c.FAge 
FROM T_Order o 
LEFT OUTER JOIN T_Customer c 
ON o.FCustomerId=c.FId

右外部连接

在右外部连接中不管是否成功匹配连接条件都会返回右表中的所有记录。

SELECT o.FNumber,o.FPrice,o.FCustomerId, 
c.FName,c.FAge 
FROM T_Order o 
RIGHT OUTER JOIN T_Customer c 
ON o.FCustomerId=c.FId 

全外部连接

SELECT o.FNumber,o.FPrice,o.FCustomerId, 
c.FName,c.FAge 
FROM T_Order o 
FULL OUTER JOIN T_Customer c 
ON o.FCustomerId=c.FId

NB:

虽然MYSQL不支持FULL OUTER JOIN,我们可以UNION LEFT AND RIGHT 达到目的。

 

关于连接可以参考 图文并茂

 

posted on 2012-05-30 13:53  grep  阅读(162)  评论(0编辑  收藏  举报