创建高级联结

使用表别名

别名除了用于列名和计算字段外,SQL还允许给表名起别名
这样做有两个主要理由
- 缩短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 = 'TNT2';
此例中,表别名只用于WHERE子句
但是表别名不仅能用于WHERE子句,还可用于SELECT的列表,ORDER BY子句及语句的其他部分
表别名只在查询执行中使用

使用不同类型的联结

内部联结/等值联结
自联结
自然联结
外部联结

自联结

假如你发现某物品[ID为DTNTR]存在问题
故,想知道生产该物品的供应商生产的其他物品是否也存在这些问题
- 找到生产ID为DINTR的物品的供应商
- 找出这个供应商生产的其他物品
SELECT prod_id, prod_name
FROM products
WHERE vend_id = (SELECT vend_id
								FROM products
								WHERE prod_id = 'DTNTR');

使用联结的相同查询
SELECT p1.prod_id, p1.prod_name
FROM products AS p1, products AS p2
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = 'DTNTR';

如果不使用别名,后续重复出现表中列的引用将具有二义性

自然联结

无论何时对表进行联结,
应至少有一个列出现在不止一个表中[被联结的列]

标准的联结[内部联结]返回所有数据,甚至完全相同的列多次出现
自然联结排除多次出现,使每个列只返回一次
自然联结是这样一种联结,
其中你只能选择哪些唯一的列,
对所有其他表的列使用明确的子集来完成的

SELECT c.*, o.order_num, o_order_date,
	oi.prod_id, oi.quantity, oi.item_price
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 = 'FB';

外部联结

许多联结将一个表中的行与另一个表中的行相关联
有时,需包含没有关联行的那些行
可能需使用联结完成以下工作
- 对每个客户下了多少订单进行计数
包括尚未下订单的客户
- 列出所有产品及订购数量
包括没人订购的产品
- 计算平均销售规模
包括至今尚未下订单的客户

上述例子,联结包含了那些在相关表中没有关联行的行
这种类型的联结称为外部联结
一个简单的内部联结
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;

与内部联结关联两个表中行不同的是,
外部联结还包括没关联行的行

使用带聚集函数的联结

检索所有客户及每个客户所下订单数
SELECT customers.cust_name, customers.cust_id, COUNT(orders.order_num) AS num_ord
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;

猜你喜欢

转载自blog.csdn.net/x13262608581/article/details/109001387