6-子查询理解

单行子查询

1.查询工资比200号员工工资高的员工
分析:
比200号员工工资高,首先需要知道的是200号员工的工资,可以通过sql语句
SELECT SALARY FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=200;得到
然后需要的是写一条SQL语句:查询工资大于?的数据
SELECT * FROM HR.EMPLOYEES WHERE SALARY > ?;
一般而言?可以添加一个数字:例如
SELECT * FROM HR.EMPLOYEES WHERE SALARY > 2000;
而现在?需要的是200号部门的员工的工资值.

理解:SELECT语句可以理解为Java中一个有Object返回值的函数,可以自动很多类型,可以为一个值,一个数组,一个集合
例如存在这样一个函数int getSalFromEmployees(int empId);
功能为根据员工ID从员工数据集合内获得某个员工的工资.最终返回的一个工资值
SELECT语句此时就可以理解为一个具有number类型返回值的函数.
?处此时可以理解为调用了一个函数得到了200号员工的数据.
最终这样一条SQL语句产生了,得到了想要的结果:
SELECT * FROM HR.EMPLOYEES WHERE SALARY >
       (SELECT SALARY FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=200);

多行子查询

2:了解多行子查询前需要知道的内容
> < = >= <= <>的使用:
在Java中,同样存在一些比较的运算符,例如>可以想到 1>2, 2<3, 2=2 此时是可以进行比较的,因为比较的都是数字,同样‘a‘==‘a‘,
之所以能够互相进行比较是因为运算符两遍的数据类型本质一致(‘a‘==20也可以进行比较,因为比较时字符比较的是其编码,本质上也是一个整数),
而‘a‘ 不能与"a"进行比较,因为一个是char类型一个是String类型,类型不一致;
再看1中的SQL语句:
SALARY > (SELECT SALARY FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=200);
之所以能够进行比较是因为SALARY是number类型,而后面的SELECT语句查询返回得到的结果也是一个number类型的数据;
假如改成了SALARY > (SELECT HIRE_DATE FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=200);
此时sql语句报错,ORA-00932:数据类型不一致: 应为NUMBER,但却获得DATE.>比较时两边的数据不一致.
由此引发出了另外一个问题:
与上面的SELECT语句相比,SELECT语句返回的可能不仅仅是一条记录,例如将上述的SQL语句改为
SELECT * FROM HR.EMPLOYEES WHERE SALARY > (SELECT SALARY FROM HR.EMPLOYEES);
再次执行会报错:ORA-01427: 单行子查询返回多个行.
我们可以这样理解:SALARY是一个number类型的数据,而SELECT SALARY FROM HR.EMPLOYEES返回的查询结果
是一个number[]类型的数据,number类型不能与number[]类型进行比较所以报错.

为此Oracle提供了in,any,all这样的运算符用于单个记录与记录集的比较.

例子:可能有这样一个需求:查询出比John薪水高的员工
分析:要比John薪水高,首先需要知道的是John的薪水,可通过查询得到
SELECT SALARY FROM HR.EMPLOYEES WHERE FIRST_NAME=‘John‘;
此时上面的结果返回的是多条记录;
而现在的需求是比John薪水高,而叫John不仅仅是一个人,此时需要进行的比较是将每个员工的工资
与其中一个John的比,只要比某一个叫John的薪水高,那么这个人就符合查询的条件.
这种情况是是一个数据一组数据的比较,在Java中可以举例为:
int a = 10;
int[] arr = {10, 20, 30, 40, 100};需要判断a数字是不是属于arr内的数据,我们需要进行的操作
是将数字a与arr中的每一个数字进行比较,在Java中使用循环进行遍历.
而在Oracle数据库中提供了更为遍历的比较方式:
in:表示某一个数据属于某一个数据集合(等于其中一个)
any,all用于别的运算符的比较,
例如:
=any 表示等于其中一个(等同于in);
>any 表示大于其中一个;等同关系: (a>arr[1] || a>arr[2] || a>arr[3] || ...)
>all 表示大于其中的所有数据;等同关系: (a>arr[1] && a>arr[2] && a>arr[3] && ...)

多列子查询

可以理解为
(单行子查询结果1, 单行子查询结果2, 单行子查询结果3, ...)
也可是如同单行子查询使用运算符=,如同多行子查询使用运算符 in, any, all
时间: 2024-10-11 21:03:07

6-子查询理解的相关文章

[Z]T-SQL查询进阶--深入理解子查询

原文链接: http://www.cnblogs.com/CareySon/archive/2011/07/18/2109406.html 引言 SQL有着非常强大且灵活的查询方式,而多表连接操作往往也可以用子查询进行替代,本篇文章将会讲述子查询的方方面面. 简介 子查询本质上是嵌套进其他SELECT,UPDATE,INSERT,DELETE语句的一个被限制的SELECT语句,在子查询中,只有下面几个子句可以使用 SELECT子句(必须) FROM子句(必选) WHERE子句(可选) GROUP

oracle子查询中not in后面不能为null值的理解

首先说说oracle中的null值吧. null在oracle中代表未知,表示可能有,也可能没有.任何与null值的普通运算都为null,但可以用一些函数来处理null值,oracle排序中默认null最大. 接着进入正文 这里in后面有null,能返回数据 但加了not后,就不能返回数据了 这里的in后面的句子可以理解为or拼接,即 id in (200,201,null)可以等价于id=200 or id=201or id=null, id not in (200,201,null)可以等价

理解 sql 的子查询

子查询 子查询 Table of Contents 总结: 相关阅读 来源: 网上的公开课 数据准备 create table goods ( goods_id mediumint(8) unsigned primary key auto_increment, goods_name varchar(120) not null default '', cat_id smallint(5) unsigned not null default '0', brand_id smallint(5) uns

java:Oracle(级联删除,左右内外交叉自然连接,子查询,all,any,in)

1.级联删除: -- 级联删除:裁员,公司倒闭 -- 级联删除(cascade),设置为null(setnull),放任不管(No action) -- cascade:(以一对多为例)如果删除多的一方,一的一方不受任何影响,但是如果删除一的一方,多的一方所有对应数据全部被删除 select * from staff s inner join department d on d.id = s.department_id; delete from staff s where s.id = 1; d

Oracle系列:(14)子查询

子查询的作用:查询条件未知的事物 查询条件已知的问题:例如:查询工资为800的员工信息 查询条件未知的问题:例如:查询工资为20号部门平均工资的员工信息 一个条件未知的问题,可以分解为多个条件已知的问题 查询工资比WARD高的员工信息 第一:查询WARD的工资?       select sal from emp where ename = 'WARD'; 第二:查询工资比1250高的员工信息?       select * from emp where sal > 1250; 子查询: sel

在SQL Server中为什么不建议使用Not In子查询

原文:在SQL Server中为什么不建议使用Not In子查询     在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In潜在会带来下面两种问题: 结果不准确 查询性能低下       下面我们来看一下为什么尽量不使用Not In子句.   结果不准确问题     在SQL Server中,Null值并不是一个值,而是表示特定含义,其所表示的含义是"Unknow",可以理解为未定义或者未知,因此任何与Null值

mysql概要(四)order by,group 的特点,子查询

1.order by 默认按升序排列(asc/desc),多字段排序 order by 字段 排序方式,字段2 排序方式,..:在分组排序中,排序是对分组后的结局进行排序,而不是在组中进行排序. 2.limit 在语句最好,截取记录的条数.一般和order by 配合使用 limit[offset][N] offset: 偏移量   N:条数: 如limit(2,2),即从第三记录开始取两条记录.当一个参数时:limit 2,即从第一条记录开始取2条 3关于分组和聚合函数的一个问题,当分组时会从

SQL语句汇总(三)——聚合函数、分组、子查询及组合查询 - Darly

–COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计算列的最小值 首先,创建数据表如下: 执行列.行计数(count): 标准格式 SELECT COUNT(<计数规范>) FROM <表名> 其中,计数规范包括: - * :计数所有选择的行,包括NULL值: - ALL 列名:计数指定列的所有非空值行,如果不写,默认为ALL: - DISTINCT 列名:计数指定列的唯一非空值行. 例,计算班里共有多少学生:

MySQL学习分享--&gt;查询--&gt;子查询

子查询是指在查询语句中嵌套另一个查询语句. 子查询外面的查询部分被称为外部查询. 子查询必须包含括号. any.in.some any关键字必须与一个比较操作符一起使用,它的意思是"与子查询中返回列的数值进行逐一对比,只要其中一个数值比较为true,则返回true",我们来看一个查询实例, select id_temp from t_user_collect where commodity_id > any (select id from t_commodity); 得到如下结果

子查询、集合查询

子查询.集合查询 1.子查询 1.1.子查询简介 1.2.WITH 子查询 2.集合查询 2.1.UNION 和 UNION ALL 2.2.MINUS 2.3.INTERSECT 2.4.集合运算与 ORDER BY 3.DISTINCT 子句 3.1.普通用法 3.2.做聚合函数的参数 4.总结 1.子查询 1.1.子查询简介 子查询是一个嵌套在 SELECT.INSERT.UPDATE 或 DELETE 语句或其他子查询中的查询.任何允许使用表达式的地方都可以使用子查询,换句话说,子查询几