Oracle 创建高级连接
在Oracle中使用的数据库表连接包括:内连接,外连接(左外连接,右外连接),全连接等
1、使用表别名
SELECT RTrim(vend_name) || ', (' || RTrim(vend_country) || ')'
➥AS vend_title
FROM vendors
ORDER BY vend_name;
注:RTrim()函数用于截取字符串,详情见,|| 用于拼接字符串
除了为列名和计算字段使用别名外,SQL还允许为表名使用别名。这样做的两个主要原因是:
- 缩短SQL语法
- 允许在单个SELECT语句内多次使用同一个表
注意:不适用AS的情况
与大多数DBMS不同,Oracle没有使用AS关键字类命名表的别名;在Oracle中不能用As指定表的别名,但是可以用做指定列的别名,但在存储过程中,指定列的别名与与原有列的别名相同,会报错。
2、使用不同的连接类型
以下介绍除内连接(等值连接)外的3种连接(自连接、自然连接、外连接)。
1、自连接
所谓自连接就是表与表本身进行连接
示例:
SELECT p1.prod_id, p1.prod_name
FROM products p1
INNER JOIN products p2 ON p1.vend_id = p2.vend_id
WHERE p2.prod_id = 'DTNTR';
提示:用自连接代替子查询
自连接通常用于代替使用子查询的语句,从与外层语句相同的表中检索数据。尽管最终结果是相同的,但有时这些连接查询的执行速度要比子查询快得多。
2、自然连接
无论何时连接表,至少会有一列(要连接的列)出现在多个表中。标准连接会返回所有的数据,甚至会使同一个列出现多次。自然连接将会简单的消除多次出现的列,使得每一列只会返回一次。
下面给出一个示例:
SELECT c.*, o.order_num, o.order_date,
oi.prod_id, oi.quantity, OI.item_price
FROM customers c, orders o, orderitems oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id = 'FB';
3、其他连接
大多数连接都是把一个表中的一些行与另一个表中的一些行相关联,但是,偶尔你也想要包括一些行,它们没有相关的行,这类连接称为外连接。
下面的SELECT语句是一个简单的内连接,它用于检索所有顾客及其订单的列表:
SELECT customers.cust_id, orders.order_num
FROM customers
INNER JOIN orders ON customers.cust_id = orders.cust_id;
外连接的语法是类似的。
SELECT customers.cust_id, orders.order_num
FROM customers
LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;
提示:外连接类型
有两种基本的外连接形式:左外连接和右外连接,它们之间的唯一区别是相关联的表的顺序。
4、使用连接和连接条件
关于连接有以下关键点:
- 要特别注意使用的连接类型。你时常想要一个内连接,但是使用外连接通常也是有效的。
- 确保使用正确的连接条件,否则将返回错误数据
- 确保总是提供一个连接条件,否则最终得到一个笛卡尔积
- 可能在一个连接中包括多个表,甚至每个表可以具有不同的连接类型。尽管这是合法的并且通常是有用的,但是要确保先单独测试每个连接,然后把它们放在一起测试,这使得查错要简单得多。