可伸缩(scale)
能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序 称为可伸缩性好(scale well)。
联结(JOIN)
联结(JOIN)是一种机制,用来在一条SELECT 语句中关联表,因此称为联结
创建联结
创建联结非常简单,指定要联结的所有表以及关联它们的方式即可:
1 SELECT vend_name, prod_name, prod_price 2 FROM Vendors, Products 3 WHERE Vendors.vend_id = Products.vend_id;
警告:完全限定列名
在引用的列可能出现歧义时,必须使用完全限定 列名(用一个句点分隔表名和列名)。如果引用一个没有用表名限制的 具有歧义的列名,大多数DBMS 会返回错误。
1. WHERE子句的重要性
使用WHERE 子句建立联结关系似乎有点奇怪,但实际上是有个很充分的 理由的。要记住,在一条SELECT 语句中联结几个表时,相应的关系是 在运行中构造的
笛卡儿积(cartesian product)
由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目 将是第一个表中的行数乘以第二个表中的行数。
注意:不要忘了WHERE 子句
要保证所有联结都有WHERE 子句,否则DBMS 将返回比想要的数据多 得多的数据。同理,要保证WHERE 子句的正确性。不正确的过滤条件 会导致DBMS 返回不正确的数据。
提示:叉联结
有时,返回笛卡儿积的联结,也称叉联结(cross join)。
2. 内联结
基于两个表之间的相等测试的等值联接。这种联结也称为内联结(inner join)
和之前简单等值语法相同的内联查询:
1 SELECT vend_name, prod_name, prod_price 2 FROM Vendors INNER JOIN Products 3 ON Vendors.vend_id = Products.vend_id;
3. 联结多个表
SQL 不限制一条SELECT 语句中可以联结的表的数目。创建联结的基本 规则也相同。首先列出所有表,然后定义表之间的关系。例如:
1 SELECT prod_name, vend_name, prod_price, quantity 2 FROM OrderItems, Products, Vendors 3 WHERE Products.vend_id = Vendors.vend_id 4 AND OrderItems.prod_id = Products.prod_id 5 AND order_num = 20007;
注意:性能考虑
DBMS 在运行时关联指定的每个表,以处理联结。这种处理可能非常 耗费资源,因此应该注意,不要联结不必要的表。联结的表越多,性 能下降越厉害。
提示:多做实验
可以看到,执行任一给定的SQL 操作一般不止一种方法。很少有绝对 正确或绝对错误的方法。性能可能会受操作类型、所使用的DBMS、 表中数据量、是否存在索引或键等条件的影响。因此,有必要试验不 同的选择机制,找出最适合具体情况的方法。