1.子查询的规则:
子查询必须位于圆括号里;
除非主查询里有多个字段让子查询进行比较,否则子查询的SELECT子句里只能有一个字段;
子查询里不能有ORDER BY,但可以使用GROUP BY子句;
返回多条记录的子查询只能与多值操作符(例如IN)配合使用;
SELECT列表里不能引用任何BLOB,ARRAY,CLOB或NCLOB类型的值;
子查询不能被直接包围在函数里;
操作符BETEWEEN不能用于子查询,但子查询内部可以使用它。
2.子查询的基本语法:
SELECT COLUMN_NAME
FROM TABLE
WHERE COLUMN_NAME = (SELECT COLUMN_NAME
FROM TABLE
WHERE CONDITIONS);
举一个现实一点例子:
SELECT E.NAME,EP.PAY_RATE
FROM EMPLOYEE_TBL E, EMPLOYEE_PAY_TBL EP
WHERE E.EMP_ID = EP.EMP_ID
AND EP.PAY_RATE < (SELECT PAY_RATE
FROM EMPLOYEE_PAY_TBL
WHERE EMP_ID = '4436464543')
上例的意思是:返回小时工资低于雇员4436464543的所有雇员的姓名和工资,我们不关心这个特定雇员的工资。
3.子查询结合DML
1>INSERT结合子查询:
INSERT INTO RITCH_EMPLOYEES
SELECT E.EMP_ID, E.LAST_NAME,E.FIRST_NAME, EP.PAY_RATE
FROM EMPLOYEE_TBL E, EMPLOYEE_PAY_TBL EP
WHERE E.EMP_ID = EP.EMP_ID
AND EP.PAY_RATE > (SELECT PAY_RATE
FROM EMPLOYEE_PAY_TBL
WHERE EMP_ID = '220984332')
这个INSERT语句把小时工资高于雇员220984332的所有雇员的EMP_ID, LAST_NAME,FIRST_NAME, PAY_RATE插入
到一个名为RICH_EMPLOYEES的表里。
2>同理UPDATE,DELETE语句也支持子查询。
4.嵌套子查询
这里只介绍基本语法:
SELECT COLUMN_NAME {,COLUMN_NAME}
FROM TABLE1 {,TABLE2}
WHERE COLUMN_NAME OPERATOR (SELECT COLUMN_NAME
FROM TABLE
WHERE COLUMN_NAME OPERATOR
(SELECT COLUMN_NAME
FROM TABLE
WHERE COLUMN_NAME OPERATOR VALUE))
5.关联子查询
举个例子来说明:返回订购超过10件物品的顾客姓名:
SELECT C.CUST_NAME
FROM CUSTOMER_TBL C
WHERE 10 < (SELECT SUM(O.QTY)
FROM ORDERS_TBL O
WHERE O.CUST_ID = C.CUST_ID)
在举个例子,来理解上面的例子:
SELECT C.CUST_NAME, SUM(O.QTY)
FROM CUSTOMER_TBL C,
ORDERS_TBL O
WHERE C.CUST_ID = O.CUST_ID
GROUP BY C.CUST_NAME;
这个语句的意思是:显示每个顾客订购物品的数量。