您的位置:首页 > 数据库 > Oracle

《Oracle Database 11g SQL 开发指南》学习笔记——第六章__子查询

2012-08-23 15:20 489 查看
6.1、子查询类型:

单行子查询、多行子查询、多列子查询、关联子查询、嵌套子查询

6.2、编写单行子查询: 不向外部SQL语句返回结果,或者值返回一行。

可放在where、having、from子句中。

6.2.1、where子句中一般使用“=”操作符,也可以使用<>、>、<、>=、<=等单行操作符。

6.2.2、在having子句中使用子查询; 可以基于子查询返回结果对行组进行过滤。

select product_id AVG(price) from products

group by product_id

having AVG(price) < (select MAX(AVG(price)) from products group by product_id )

order by product_id;

6.2.3、在from子句中使用子查询(内联视图)如:

在外部查询中从products表中检索product_id和price列,在子查询中检索一种产品已经被购买的次数:

SELECT prds.product_id , price , purchases_data.pri=product_count

FROM products prds , ( SELECT product_id , COUNT( product_id ) product_count

FROM purchases

GROUP BY product_id ) purchases_data

WHERE prds.product_id = purchases_data.product_id ;

6.2.4、可能遇到的错误;

1、单行子查询最多返回一行 2、子查询不能包含ORDER BY 子句

6.3、编写多行子查询:可以向外部的SQL语句返回一行或多行记录。

外部查询可以使用IN、 ANY 、ALL操作符

SELECT employee_id ,name FROM employees

WHERE salary < ANY ( SELECT low_salary FROM salary_grades )

6.4、编写多列子查询:

SELECT product_id ,product_type_id, name, price

FROM products

WHERE ( product_type_id, price ) IN

( SELECT product_type_id, MIN(price)

FROM products GROUP BY product_type_id );

6.5、编写关联子查询: 引用外部SQL语句中的一列或者多列。

关联子查询对于外部查询的每一行都会运行一次,和可以解决空值问题,

而非关联子查询只在运行外部查询之前运行一次

6.5.1、EXISTS操作符用于检查子查询返回的行的存在性。

虽然它也可以用在非关联子查询,但是EXISTS通常用于关联子查询。

由于EXISTS只检查子查询返回行的存在性,因此子查询不必返回一列,

可以只返回一个常量;这样可以提高查询性能。

例如:SELECT employee_id , name FROM employees outer

Where EXISTS ( SELECT 1 FROM employees inner

WHERE inner.manager_id = outer.employee_id );

6.5.2、EXISTS 与IN 不同:EXISTS只检查行的存在性,而IN则要检查实际值的存在性。

1、通常来讲,EXISTS的性能高于IN,因此尽可能使用EXISTS。

2、当一个值列表包含一个空值时NOT EXISTS返回TRUE,而 NOT IN则返回FALSE。

6.6、编写嵌套子查询:

在子查询内部可以嵌套其他子查询,嵌套层次做多为255;但编程时应尽量避免使用。

6.7、编写包含子查询的UPDATE 和DELETE 语句;

UPDATE employees

SET salary = ( SELECT AVG(high_salary) FROM salary_grades )

WHERE employee_id = 4;

删除工资高于从子查询中返回的高工资级别平均值的员工记录:

DELETE FROM emplyees

WHERE salary > ( SELECT AVG(high_salary) FROM salary_grades )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐