1、查询部分分为主查询和子查询;
2、根据返回值的记录多少分为单行子查询和多行子查询;单行子查询用单行比较符=连接;多行子查询用多行比较符in连接;
3、子查询的内容可以放在FROM后面,也可以放在WHERE后面,也可以放在HAVING后面;
4、完整的SELECT语句可以拥有GROUP BY,HAVING子句,也可以使用组函数;也可以从多个表中查询;
5、子查询的内容必须用小括号来界定;
6、例子1:子查询(子句)在FROM后面的:
SELECT first_name,last_name FROM (SELECT first_name,last_name FROM s_emp WHERE 1=1 AND first_name='国藩' ) WHERE 1=1 AND last_name='曾';
精简一下就是:
SELECT first_name,last_name FROM (子查询) WHERE 1=1 AND last_name='曾';
这里就像是一个定语从句,这里的(子查询)就替换成了另一个select语句;这里要注意,子查询语句里没有表示结束的分号;并且主查询的范围必须小于子查询,否则会因查不到数据而报错;
7、例子2:子查询(子句)在WHERE后面的
SELECT first_name,last_name FROM s_emp WHERE dept_id= ( SELECT dept_id FROM s_emp WHERE last_name='曾' );
这里查询的是姓是和‘曾’的所在的部门ID相同(只有一个姓曾)的所有人的姓名;
这里,有人问了,如果有好几个姓曾的人怎么办,我要把所有姓曾人所在部门的人的姓名都查出来怎么办,这里就是多行子查询;把等号换成in即可;
Oracle数据库SQL开发之 子查询——子查询的类型
子查询有两种基本的类型:
单行子查询:不向外部的SQL语句返回结果,或者只返回一行。
多行子查询:向外部的SQL语句返回一行或多行。
还有3种子类型,可以返回一行或多行:
多列子查询:向外部的SQL语句返回多列
关联子查询:引用外部的SQL语句中的一列或多列。通过相同的列与外部的SQL语句相关联。
嵌套子查询:位于另外一个自查中。子查询最多可以嵌套255层。
子查询的分类
子查询可以返回的数据类型一共分以下4种:
单行单列:返回的是一个具体列的内容,可以理解为一个单值数据。
单行多列:返回一行数据中多个列的内容。
多行单列:返回多行记录中同一列的内容,相当于给出一个操作范围。
多行多列:查询返回的结果是一张临时表。
子查询几乎可以出现在一条查询语句的任意位置上,不过在from、where、having子句中出现较多,而且在子查中一定要使用“()”声明。
子查询返回的结果:
where子句:此时子查询返回的结果一般都是单行单列、单行多列、多行单列(即不是一张表)。
having子句:此时子查询返回的都是单行单列数据(即一个数据),同时为了使用统计函数操作。
from子句:此时子查询返回的结果一般都是多行多列,可以按照一张数据表(即临时表)的形式操作。