联结表

1.联结

SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。

联结是利用SQL的SELECT能执行的最重要的操作,很好地理解联结及其语法是学习SQL的极为重要的部分。

在能够有效地使用联结前,必须了解关系表以及关系数据库设计的一些基础知识。

2.创建联结

创建联结非常简单,指定要联结的所有表以及关联它们的方式即可。

SQL
SELECT vend_name,prod_name,prod_price
FROM Vendors,Products
WHERE Vendors.vend_id = Products.vend_id; //完全限定列名
"SELECT 
arist_id,
`language`,
Ds 
FROM songs,useractions
 WHERE songs.id = useractions.id
"

警告:完全限定列名

在引用的列可能出现歧义时,必须使用完全限定列名。

如果引用一个没有用表名限制的具有歧义的列名,大多数DBMS会返回错误

2.1WHERE子句的重要性

使用WHERE子句建立联结关系似乎有点奇怪,但实际上是有个很充分的理由的。

要记住在一条SELECT语句中联结几个表时,相应的关系是在运行中构造的。

在数据库表的定义中没有指示DBMS如何对表进行联结的内容。你必须自己做这件事情。

在联结两个表时,实际要做的是将第一个表中的第一行与第二个表中的每一行配对。

WHERE子句作为过滤条件,只包含那些匹配既定条件的行。

没有WHERE子句,每一个表中的每一行将与第二个表中的每一行配对,而不管它们逻辑上是否能配在一起。

笛卡尔积(cartesian product)

由没有联结条件的表关系返回的结果为笛卡尔积。

检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

注意:不要忘了WHERE子句

要保证所有联结都有WHERE子句,否则DBMS将返回比想要的数据多得多的数据。

同理,要保证WHERE子句的正确性。

不正确的过滤条件会导致DBMS返回不正确的数据。

2.2内联结

目前为止使用的联结称为等值联结(equijoin),它基于两个表之间的相等测试。

这种联结也称为内联结(inner join)。其实,可以对这种联结使用稍微不同的语法,明确指定联结的类型。

SQL
SELECT vend_name,prod_name,prod_price
FROM Vendors
INNER JOIN Products ON Vendors.vend_id = Products.vend_id;

说明:”正确的”语法

ANSI SQL 规范首选INNER JOIN语法,之前使用的是简单的等值语法。

其实,SQL语法纯正论者是用鄙视的眼光看待简单语法的。

这就是说,DBMS的确支持简单格式和标准格式

2.3联结多个表

SQL不限制一条SELECT语句中可以联结的表的数目。

创建联结的基本规则也相同。

SQL
SELECT prod_name,vend_name,prod_price,quantity
FROM OrderItems,Products,Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Product.prod_id
AND order_num = 200007;

注意:性能考虑

DBMS在运行时关联指定的每个表,以处理联结。

这种处理可能非常耗费资源,因此应该注意,不要联结不必要的表。

联结的表越多,性能下降越厉害。

2.4使用联结替代子查询

子查询并不总是执行复杂SELECT操作的最有效方法

子查询:
SQL
SELECT cust_name,cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
                   FROM Orders
                   WHERE order_num IN(SELECT order_num
                                       FROM OrderItems
                                       WHERE prod_id = 'RGAN01'))
联结查询:
SQL
SELECT cust_name,cust_contact
FROM Customers,Orders,OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num
AND prod_id = 'RGAN01'
订阅评论
提醒
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论
滚动至顶部