22.1、什么是子查询:

1、子查询就是在一条sql语句中嵌入select语句;


2、子查询可区分为关联子查询和非关联子查询,他们和主查询之间的执行顺序和关系是不同的;


22.2、关联子查询:

1、说明:

在关联子查询中,对于主查询返回的每一行数据,子查询都要执行一次。另外,关联子查询的信息流是双向的,

主查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录,之后主查询根据

返回的记录做出决策。


2、特点:

子查询引用主查询表的列,先执行主查询,再执行子查询,子查询和主查询都执行多遍。


3、示例:

update damsup.BHL_SUP_SEARCHREGISTER up

set up.sreg_date=(select down.sreg_date from dams.BHL_SUP_SEARCHREGISTER down where down.id=up.id)

where up.id<'7000';


22.3、非关联子查询:

1、说明:

非关联子查询是独立于主查询的子查询,先执行子查询,子查询的返回结果作为主查询的条件,再执行主

查询,子查询只执行一遍。


2、非关联子查询的注意事项:

(1)若子查询返回结果为多个值,oracle会去掉重复值之后再将结果返回给主查询

(2)若子查询的返回结果仅为一个值,可以用单值运算符如 =、 >、 <、 <> 等;

(3)若子查询的返回结果可能为多值,必须用多值运算符如 IN、not in、any、all等;


3、特点:

子查询不引用主查询表的列,先执行子查询,再执行主查询,子查询只执行一遍,主查询执行多遍。


4、示例:

(1)where型子查询:

1)查询id最大的一件商品:

SELECT goods_id,goods_name,shop_price FROM goods WHERE goods_id = (SELECT MAX(goods_id) FROM goods);

2)查询每个类别下id最大的商品:

SELECT goods_id,goods_name,cat_id,shop_price FROM goods WHERE goods_id IN (SELECT MAX(goods_id) FROM goods GROUP BY cat_id);

3)从类别表中取出其类别下有商品的类别(如果该类别下没有商品,则不取出):

SELECT c.cat_id,c.cat_name FROM category c WHERE c.cat_id IN (SELECT g.cat_id FROM goods g GROUP BY g.cat_id);

# 子查询能查出数据,则表示存在;为空则不存在;


(2)from型子查询:

把子查询的查询结果当成临时表,供主查询sql再次查询。查询结果集可以当成表看待,临时表要使用一个别名。

1)查询id小于10的商品:

SELECT goods_id,goods_name,shop_price FROM (SELECT goods_id,goods_name,shop_price FROM goods ORDER BY goods_id DESC) as tmp where goods_id<'10' ;

#子查询查出的结果使每个类别的第一条的商品id都为该类别下的最大值。然后将这个结果集作为一张临时表,然后使用where语句,即为每个类别下商品id小于10

#的商品;


22.4、ANY和ALL:

1、ANY:

(1)ANY关键字必须接在一个比较操作符的后面,ANY关键词的意思是,对于在子查询返回的列中的任一数值,如果比较结果为TRUE的话,则返回TRUE。

(2)in 的效果 和 =any 的效果是一样的。

(3)示例:

1)使用 any 查出类别大于任何一个num值的类别:

SELECT cat_id,cat_name FROM category WHERE cat_id > ANY (SELECT num FROM nums);

2)使用 in 查出cat_id 等于num的类别:

SELECT cat_id,cat_name FROM category WHERE cat_id IN (SELECT num FROM nums);


2、ALL:

(1)ALL关键字必须接在一个比较操作符的后面,ALL关键词的意思是“对于子查询返回的列中的所有值,如果比较结果为TRUE,则返回TRUE”。

(2)NOT IN 的效果和 <> ALL 的效果是一样的。


3、小结:

(1)any/in 可以理解为"或",all/not in可以理解为"且"。

(2)null永远不等于null,任何值和null进行四则运算结果都是null,任何值和null进行比较都不会返回任何的结果。