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 达到目的。
关于连接可以参考 图文并茂