[疯狂Java]SQL:子查询

来源:互联网 发布:手机xls软件 编辑:程序博客网 时间:2024/05/15 23:52

1. SQL标准对子查询的定义:

    1) 简单的讲就是嵌套select查询,SQL都支持多层嵌套查询;

    2) 要求内存的查询必须用括号()包起来;

    3) 子查询可以出现的位置:

         i. from之后:查询的实质就是一个临时的视图,因此可以将一个子查询的结果当做一个表进行另外一个查询;

!!既然是当成临时视图使用,最好是给该子查询起一个别名,这样方便在select后以及where中利用别名前缀访问临时视图的属性列;

!!像这种子查询也叫做行内视图;

         ii. where之后:作为过滤条件的范围(集合),由于子查询的结果是一张视图,而视图中包含很多行,也就是说子查询的结果就是返回了一些记录的集合,而这个集合可以作为过滤的条件(范围来使用),比如检查当前记录中的某个字段的值是否落在子查询得到的结果集合中,如果落在集合中就将该记录筛选出来,否则就过滤掉;


2. 最典型的行内视图的用法示例:

select t.col1, t.col2from (select * from tableX) as t;

3. 作为过滤条件:

    1) 特殊情况:子查询的结果刚好是一个单行单列的视图,那么视图中那个唯一的值可以被当做一个标量处理,例如

select * from student_tablewhere id > (select count(*) from tableX);
!由于子查询(select count(*) from tableX)得到的就是一个统计值(单行单列),因此可以当做一个标量来处理

    2) 搭配in检查是否落在子查询范围内,例如:

select *from student_tablewhere id in(select id from stuff_table);
!这里子查询的结果是一个标量集合,因此可以直接检查id是否落在该集合中;

        ***考虑子查询的结果是一个多值集合(向量集合,即子查询结果的记录有多列),那么where的过滤对象必须也是多列的,例如:

select *from student_tablewhere (id, name) in(select id, name from stuff_table);
!子查询返回结果是向量(id, name)的集合,那么where检查的对象也必须是列数、类型对应相等的向量,SQL中可以直接用括号()构造元组,而元组就是向量了;

!!这个检查的就是列的组合了,而不是单独的每一列了!!

    3) 比较符+any/all:

         i. 一般一个值和一个集合具有以下几种关系:

           a. 该值是否在这个集合中;

           b. 该值是否大于(小于等等)该集合中任意一个值;

           c. 该值是否比集合中任意一个值都(大、小、等于等于等等);

         ii. SQL中的语法为:

             a. value =any(集合)   // value是否落在集合中,相当于in

             b. value <>any(集合)   // value不在集合中,相当于not in

             c. value >any(集合)   // value大于集合中任意一个值即可,即大于集合中的最小值

             d. value < any(集合)   // value小于集合中任意一个值即可,即小于集合中的最大值

             e. value >all(集合)   // value大于集合中的所有值,即大于集合中的最大值

             f.  value <all(集合)   // value小于集合中的所有值,即小于集合中的最小值

         iii. 因此上述的集合就可以是子查询,例如:

select * from t1where val1 =any(select val1 from t2); // val1 in 子查询
select * from t1where val1 >all(select val2 from t2);  // t1中的val1要大于t2中val2的最大值
select * from t1where (col1, col2) =any(select val1, val2 from t2);   // 向量的情形







0 0
原创粉丝点击