SQL必知必会——创建高级联结(十三)

1、使用表别名

SELECT cust_name,cust_contact
FROM customer AS c,order AS o,orderItems AS OI
WHERE c.cust_id = o.cust_id
AND OI.order_num = o.order_num
AND prod_id='RGAN01';

注意:
1、缩短SQL语句
2、允许在一条SELEC语句中多次使用 相同的表
3、ORACLE不支持AS关键字。要在Oracle中使用别名,可以不用AS,简单的指定列名即可

2、使用不同类型的联结

2.1、自联结

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';

注意:
1、使用表别名可以在一条SELECT语句中不止一次引用相同的表
2、许多DBMS处理联结远比处理子查询快得多

2.2、自然联结

SELECT C.* ,order_num,o.order_data,OI.prod_id,OI.quantity,OI.item_price
FROM customers AS c,order AS o,orderitems AS OI
WHERE c.cust_id = o.cust_id
AND OI.order_num = o.order_num
AND prod_id 'RGAN01';
#自然联结要求你只能选择哪些唯一的列,一般通过对一个表使用通配符,而对其他表的列使用明确的子集来完成。

2.3、外联结

SELECT customers.cust_id,orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
#联结包含了那些在相关表中没有关联行的行,这种联结称为外联结

注意:
1、在使用OUTER JOIN语句时,必须使用RIGHT或LEFT关键字包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。
2、左外联结和右外联结可以相互转换

SELECT customers.cust_id,orders.order_num
FROM orders FULL OUTER JOIN customers
ON orders .cust_id = customers.cust_id;
#全外联结包含两个表的不关联的行

注意:
1、Access,MariaDB,MySQL,Open Office Base 和SQLite不支持FULL OUTER JOIN语法

3、使用聚集函数的联结

SELECT 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;
#检索所有顾客及每个顾客所下的订单数

4、使用联结和联结条件

1、一般我们使用内联结,但使用外联结也有效
2、关于确切的联结语法,应该查看具体的文档,看相应的DBMS支持何种语法
3、保证使用正确的联结条件
4、应该总提供联结条件,否则会得出笛卡儿积

你可能感兴趣的:(sql)