51.Oracle数据库SQL开发之 子查询——编写关联子查询
来源:互联网 发布:网络嗅探器用哪个好 编辑:程序博客网 时间:2024/05/19 13:14
51.Oracle数据库SQL开发之 子查询——编写关联子查询
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/49805713
关联子查询会引用外部SQL语句中的一列或多列。这种子查询之所以被称为关联子查询,是因为它们通过相同的列与外部的SQL语句关联。
1. 关联子查询的例子
关联子查询检索那些价格高于同类产品平均价格的产品:
store@PDB1> selectproduct_id,product_type_id,name,price from products outer where price >(select avg(price) from products inner whereinner.product_type_id=outer.product_type_id);
PRODUCT_ID PRODUCT_TYPE_ID NAME PRICE
---------- --------------------------------------------- ----------
2 1 Chemistry 30
5 2 Z Files 49.99
7 3 Space Force 9 13.49
10 4 Pop 3 15.99
11 4 Creative Yell 14.99
其中其中outer用来标记外部查询,inner用来标记内部子查询。内部子查询和外部查询通过product_type_id列关联起来。
关联子查询子查询中,外部查询中的每一行都被一次一行的传递给子查询。子查询依次读取外部查询中的每一行的值,并将其应用到子查询上,直到外部查询中的所有行都被处理完为止,然后返回整个查询的结果。
2. 在关联子查询中使用EXIST和NOT EXIST
EXISTS操作符用于检查子查询返回行的存在性。
2.1 在关联子查询中使用EXISTS
执行如下:
store@PDB1> select employee_id,last_namefrom employees outer where exists (select employee_id from employees innerwhere inner.manager_id=outer.employee_id);
EMPLOYEE_ID LAST_NAME
----------- ----------
1 Smith
2 Johnson
2.2 在关联子查询中使用NOT EXISTS
执行如下:
store@PDB1> select product_id,name from productsouter where not exists (select 1 from purchases inner whereinner.product_id=outer.product_id);
PRODUCT_ID NAME
---------- ------------------------------
4 Tank War
5 Z Files
6 2412: The Return
7 Space Force 9
8 From Another Planet
9 Classical Music
10Pop 3
11Creative Yell
12My Front Line
9 rows selected.
2.3 EXISTS和NOT EXISTS与IN和NOT IN 的比较
EXISTS与IN不同:EXISTS只是检查行的存在性,而IN则要检查实际值的存在性。通常EXISTS性能都比IN高。
当包含一个空值时,NOTEXISTS返回true,而NOT IN则返回false.
store@PDB1> select product_type_id,name fromproduct_types outer where not exists( select 1 from products inner whereinner.product_type_id=outer.product_type_id);
PRODUCT_TYPE_ID NAME
--------------- ----------
5 Magazine
然后执行如下:
store@PDB1> select product_type_id,name fromproduct_types where product_type_id not in ( select product_type_id fromproducts);
no rows selected
因为子查询返回中包含了一个空值。所以NOT IN 返回为FALSE。
可以通过如下解决:
store@PDB1> select product_type_id,name fromproduct_types where product_type_id not in ( select NVL(product_type_id,0) fromproducts);
PRODUCT_TYPE_ID NAME
--------------- ----------
5 Magazine
- 51.Oracle数据库SQL开发之 子查询——编写关联子查询
- 48.Oracle数据库SQL开发之 子查询——编写单行子查询
- 52.Oracle数据库SQL开发之 子查询——编写嵌套子查询
- 49.Oracle数据库SQL开发之 子查询——编写多行子查询
- 50.Oracle数据库SQL开发之 子查询——编写多列子查询
- 53.Oracle数据库SQL开发之 子查询——编写包含子查询的UPDATE和DELETE
- 47.Oracle数据库SQL开发之 子查询——子查询的类型
- Oracle数据库之SQL子查询详解
- Oracle数据库之SQL语句子查询
- Oracle数据库之SQL子查询详解
- oracle 之 sql 子查询
- Oracle之SQL子查询
- Oracle之SQL子查询
- Oracle SQL子查询
- Oracle中关联子查询
- 精通数据库SQL——子查询
- ORACLE数据库---子查询
- 【Oracle数据库】子查询
- 49.Oracle数据库SQL开发之 子查询——编写多行子查询
- 50.Oracle数据库SQL开发之 子查询——编写多列子查询
- AndroidStudio使用gradle打包并实现多渠道打包
- Codeforces 595B Pasha and Phone 【数学计数】
- Reverse Nodes in k-Group
- 51.Oracle数据库SQL开发之 子查询——编写关联子查询
- Android-在 GreenDao 数据库中添加默认值
- 求最大子序列问题
- 赫夫曼树-c语言实现
- (重点)为一个新用户在Oracle中创建新数据库步骤 2012-10-25 10:27:02
- 52.Oracle数据库SQL开发之 子查询——编写嵌套子查询
- 机智的偶数求和
- UVa 10935 Throwing cards away I【队列模拟】
- 关于C++子类在继承父类的构造函数时的一些情况