第一章第三节 SQL的使用(三)子查询、联结与组合查询
子查询
SQL允许创建子查询,即嵌套在其他查询中的查询;
如列出订购物品RGAN01的所有客户,由物品RGAN01检索出所有的订单编号,再根据订单编号检索出客户ID,再根据客户ID获得客户信息。
使用子查询来获取
1 | SELECT cust_name, cust_contact FROM Customers |
作为计算字段使用子查询,如列出Customers表中每个客户的订单总数;
1 | SELECT cust_name, cust_state, |
联结表
分解数据为多个表能更有效地存储,更方便地处理,并具有更大的可伸缩性。
此时数据存储在多个表,如何用单条SELECT语句检索出数据——联结。
联结的创建非常简单,规定要联结的所有表以及它们如何关联即可。
1 | SELECT vend_name, prod_name, prod_price |
上述联结称为等值联结,它基于两个表之间的相等测试;这种联结也称为内部联结。
另一种指定联结的方式如下。
1 | SELECT vend_name, prod_name, prod_price |
SQL不限制SELECT语句中可以联结的列的数目,创建联结的基本规则也相同——列出所有表,再定义表之间的关系。
1 | SELECT prod_name, vend_name, prod_price, quantity |
另一种语法表示为
1 | SELECT prod_name, vend_name, prod_price, quantity |
创建高级联结
外部联结:为包含那些不符合关系的行,就需要外部联结。外部联结使用OUTER JOIN指定联结的类型,LEFT指定要包含所有行的表是OUTER JOIN左边的表——Customers。
1 | SELECT Customers.cust_id, Orders.order_num |
在联结时也可以使用聚集函数。
1 | SELECT Customers.cust_id, COUNT(Orders.order_num) AS num_ord |
组合查询
SQL支持执行多个查询并将结果以单个查询结果返回,这就是组合查询。实际就是对这些查询结果取并操作。
创建组合查询,使用UNION关键字将多个SELECT语句连接。
如查询位于Illinois、Indiana与Michigan以及Fun4All单位的客户。
1 | SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IN ('IL', 'IN', 'MI') UNION |
在WHERE语句过于复杂时,使用UNION语句将会是更好的办法。
使用UNION语句需要注意如下几条规则。
UNION语句默认会将重复的行合并,若不想其合并,可使用UNION ALL关键字;
若要对组合查询的结果排序,只能在最后一条SELECT语句之后使用ORDER BY语句。