子查询

1.  单行子查询最多只能返回一行;子查询不能包含ORDER BY子句,任何排序都必须在外部查询中完成。
 
2.  多行子查询
     要处理返回多行记录的子查询,外部查询可以使用IN、ANY或ALL操作符。
1) 在多行子查询中使用IN操作符
        含义:IN可以用来检查在一个值列表中是否包含指定的值。
        例: SELECT product_id,name FROM products
                  WHERE product_id IN
                  (SELECT product_id FROM products
                    WHERE name LIKE '%e%');
2)  在多行子查询中使用ANY操作符
        含义: ANY可以用来将一个值与一个列表中的任何值进行比较,在查询中ANY操作符之前必须使用一个=、<>、、<=或>=操作符。
        例: SELECT employee_id,last_name FROM employees
                  WHERE salary < ANY
                   (SELECT low_salary FROM salary_grades);
3) 在多行子查询中使用ALL操作符
        含义:ALL操作符可以用来将一个值与一个列表中的所有值进行比较。在查询中ALL操作符之前必须使用一个=、<>、、<=或>=操作符。
         例: SELECT employee_id,last_name FROM employees
                  WHERE salary > ALL
                   (SELECT high_salary FROM salary_grades);
 
3.   关联子查询
1) 注:当问题的答案需要依赖于外部查询中包含的每一行的值时,通常就需要使用关联子查询。关联子查询对于外部查询中的每一行都会运行一次,这与非关联子查询是不同的(非关联子查询只在运行外部查询之前运行一次);关联子查询可以解决空值问题。
例: 检索那些价格高于同类产品平均价格的产品。
          SELECT product_id,product_type_id,name,price
          FROM products outer
          WHERE price >
          (SELECT AVG(price)
          FROM products inner
          WHERE inner.product_type_id = outer.product_type_id);
2) 在关联子查询中使用EXISTS和NOT EXISTS
         1.  使用EXISTS
              注:EXISTS并不关心自查新返回多少行,而只关心子查询是否返回任何行。
              例: 检索那些负责管理其他员工的员工记录:
                        SELECT employee_id,last_name
                        FROM employees outer
                        WHERE EXISTS
                       (SELECT 1
                       FROM employees inner
                       WHERE inner.manager_id = outer.employee_id);
          2.  使用NOT EXISTS
              例: 检索从未卖出的产品:
                        SELECT product_id,name
                        FROM products outer
                        WHERE NOT EXISTS
                        (SELECT 1
                        FROM purchases inner
                       WHERE inner.product_id = outer.product_id);
3)  EXISTS和NOT EXISTS与IN和NOT IN的比较
        1. EXISTS只是检查行的存在性,而IN则要检查实际值的存在性。通常来讲,EXISTS的性能都比IN高,应尽可能地使用EXISTS,而不是IN。
         2. 当一个值列表包含一个空值时,NOT EXISTS返回true,而NOT IN则返回false。即关联子查询可以解决空值问题。
 
4.  嵌套子查询
     在子查询内部可以嵌套其它子查询,在编程时应尽量少用嵌套子查询的技术,因为使用表连接时,查询的性能可能会更高。
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17014649/viewspace-605078/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17014649/viewspace-605078/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值