子查询

来源:互联网 发布:纳税申报软件下载 编辑:程序博客网 时间:2024/04/29 03:15


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;
 这个语句的意思是:显示每个顾客订购物品的数量。
  

0 0