1、查询(query):任何SQL语句都是查询。但此属于一般指SELECT语句。
2、子查询(subquery):嵌套在其他查询中的查询。
目标:查询订购物品TNT2的用户信息。
前提:有三个表,orderitems表存储物品的订单编号和物品信息,orders表存储订单编号和客户ID,customers表存储客户ID和客户信息。
分解:
1、检索包含物品TNT2的所有订单编号。
2、检索步骤1返回的订单编号的关联的客户ID。
3、检索步骤2返回的客户ID的客户信息。
分步查询:
输入:
SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2';
输出:
order_num
201
205
输入:
SELECTcust_id
FROMorders
WHEREorder_num IN (201,205);
输出:
cust_id
101
103
输入:
SELECTcust_name,cust_contact
FROMcustomers
WHEREcust_id IN (101,103);
输出:
cust_namecust_conctact
Coy PeterY Lee
New KetterY Sam
嵌套查询:
输入:
SELECTcust_name,cust_contact
FROMcustomers
WHEREcust_id IN (SELECTcust_id
FROMorders
WHEREorder_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2'));
输出:
cust_namecust_conctact
Coy PeterY Lee
New KetterY Sam
注:在WHERE子句中使用子查询,应保证SELECT语句和WHERE子句中列的数目相同。
3、作为计算字段使用子查询
输入:
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROMorders
WHEREorders.cust_id=customers.cust_id) AS orders
FROM custmers
ORDER BY cust_name;
输出:
cust_namecust_stateorders
R FuddMI3
Wascals AZ2
分析:orders是一个计算字段,由圆括号里的子查询建立,该子查询调用了2次,每检索到一个客户调用一次。可以看到子查询中的WHERE子句使用了全限定名,因为此处要区分字段的来源。
4、相关子查询(correlated subquery):涉及外部查询的子查询。
任何时候,只要列名具有多意性,就要必须使用这种语法(表名和列名由一个句点分隔)。上面再customers表中使用了orders表就是相关子查询,须用全限定名。