SELECT vend_name, prod_name, prod_price
FROM Vendors INNERJOIN Products
ON Vendors.vend_id = Products.vend_id;
联结多个表
SELECT prod_name, vend_name, prod_price, quantity
FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num = 20007;
不要联结不必要的表,以免造成性能下降
第13章 创建高级联结
使用表别名
缩短SQL语句
允许在单条SELECT语句中多次使用相同的表
SELECT cust_name, cust_contact
FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';
使用不同类型的联结
内部联结(等值联结)
自联结
自然联结
外部联结
自联结
自联结通常作为外部语句来代替从相同表中检索数据的使用子查询语句
许多DBMS处理联结远比处理子查询快得多
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM Customers AS c1, Customers AS c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';
自然联结
自然联结排除多次出现的列,每个列只返回一次
只能选择那些唯一的列
很可能我们永远都不会用到不是自然联结的内部联结
外部联结
联结包含了那些在相关表中没有关联行的行,这称为外部联结
SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFTOUTERJOIN Orders
ON Customers.cust_id = Orders.cust_id;
SELECT Customers.cust_id, Orders.order_num
FROM Customers, Orders
WHERE Customers.cust_id *= Orders.cust_id;
*=为左外部联结操作符,它从左边表中检索所有行
=*为右外部联结操作符,它从右边表中检索所有行
全外部联结
SELECT Customers.cust_id, Orders.order_num
FROM Customers FULLOUTERJOIN Orders
ON Customers.cust_id = Orders.cust_id;
使用带聚集函数的联结
SELECT Customers.cust_id, COUNT(Orders.order_num) AS num_ord
FROM Customers INNERJOIN Orders
ON Customers.cust_id = Orders.cust_id
GROUPBY Customers.cust_id;
使用联结和联结条件
注意所使用的联结类型,一般使用内部联结
注意相应的DBMS支持何种语法
应该总是提供联结条件,否则会得出笛卡尔积
第14章 组合查询
UNION操作符,将多条SELECT语句组合成一个结果集
组合查询
执行多条SELECT语句,并将结果作为单个查询结果集返回
这些组合查询通常称为并(union)或复合查询(compound query)
有两种基本情况需要使用组合查询:
在单个查询中从不同的表类似返回结构数据
对单个表执行多个查询,按单个查询返回数据
创建组合查询
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL', 'IN', 'MI')
UNIONSELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';