1.联结
SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。
联结是利用SQL的SELECT能执行的最重要的操作,很好地理解联结及其语法是学习SQL的极为重要的部分。
在能够有效地使用联结前,必须了解关系表以及关系数据库设计的一些基础知识。
2.创建联结
创建联结非常简单,指定要联结的所有表以及关联它们的方式即可。
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)。其实,可以对这种联结使用稍微不同的语法,明确指定联结的类型。
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语句中可以联结的表的数目。
创建联结的基本规则也相同。
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操作的最有效方法
子查询:
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'))
联结查询:
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'