9.子查询

我这些学习笔记,记录的都是我自己认为的知识点,可能以后再看的时候还要翻书,但是可以用来定位到准确的书中示例的位置,减少翻书重找的时间,利于自身知识体系的搭建。                   self-transcendence

第9章 子查询

9.1 单行子查询

实际应用中,如果知道使用的子查询返回的结果是一行数据,即返回的结果是一个值时,就可以使用算数比较运算符进行操作。> < =等等....

例:where money > (select money from a where name=’老王’)

如上的子查询返回一个值,才能用比较运算符,否则不能用。

9.2 多行子查询

子查询返回的结果集中有多行数据,就要使用多行运算符inanyall等。

9.2.1 使用in运算符

In运算符,将满指定列表中满足表达式的所有值都查询出来。

例:where dept in (select dept from dept_tab)

也可以使用not in,查出所有不满足的值。

9.2.2 使用any运算符

Any把与子查询中任一结果匹配的值返回,使用any时要和比较运算符(< >等)一起使用。

Any和比较运算符结合

意义

=any

等于查询结果中的任一值。相当于in

>any

大于查询结果中的任一值。即大于查询结果中的min

<any

小于查询结果中的任一值。即小于查询结果中的max

>=any

大于等于查询结果中的任一值。即大于等于查询结果中的min

<=any

小于等于查询结果中的任一值。即小于等于查询结果中的max

<>any(!=any)

不等于查询结果中的任一值。

例:where money >any (select money from a)

9.2.3 使用all运算符

All把跟子查询中的匹配的结果全部返回,使用all时要和比较运算符(< >等)一起使用。

all和比较运算符结合

意义

=all

等于查询结果中的所有值

>all

大于查询结果中的所有值。即大于查询结果中的max

<all

小于查询结果中的所有值。即小于查询结果中的min

>=all

大于等于查询结果中的所有值。即大于等于查询结果中的max

<=all

小于等于查询结果中的所有值。即小于等于查询结果中的min

<>all(!=all)

不等于查询结果中的所有值。相当于not in运算符

例:where money >all(select money from a)

9.3 多列子查询

返回多个数据列的子查询语句。在where中也可以使用将多个属性值用括号括起来的方式实现多列子查询。多列子查询中,where中需要用括号将属性括起来,用逗号分隔。

例:where (dept,pro) = (select dept,pro from t_tab where dept=’60’)

在多列子查询中,如果是多个列成对比较,则外层查询的where中数据列属性要和子查询中的数据列的属性相同。如果dept=’60’有多条,那么就不能使用=要使用in

9.4 相关子查询

相关子查询中,子查询会重复执行。没处理一行外部的查询语句,子查询都会被执行一次。使用existsnot exists关键字实现。

带有exists关键字的子查询执行后只会返回truefalse,不会返回数据。

如果exists的子查询中有返回的结果,那么外层查询的where就返回true,然后该结果就会作为最后的结果集显示出来;如果子查询中没有返回的结果,那么外层的where就会返回false,这个过程会反复执行,直到外层查询出来的数据全部检测完毕。

例:select * from s_tab s where exists (select * from t_tab t where s.id=t.id)

使用exists子查询时,子查询select后面一般都用*,因为返回的只会是truefalse所以用列名没有意义。

由于相关子查询会反复执行,因此数据库的负担会较大,如果子查询中嵌套层数过多,就会影响查询效率,这时候就要考虑用连接查询来做。

Not exists exists相反。Not exists子查询中没有返回的结果,外层where就返回true,然后该结果就会作为最后的结果集显示出来;如果子查询中有返回的结果,那么外层的where就会返回false

例:select * from s_tab s where not exists (select * from t_tab t where s.id=t.id)

相关子查询中,外部查询和子查询是有关联的,子查询的查询条件要依赖于外层查询中的属性值。

9.5 sql语句中使用子查询

子查询除了在where中使用,还可以在selectfromorder byhavingcreate tablecreate viewinsertupdatedelete等语句中使用。

9.5.1 select中使用子查询

例:select a.stuId,(select stuName from t_tab where stuId=a.stuId) as stuName from t1_tab

9.5.2 from中使用子查询

例:from t_tab,(select id,name,age from b_tab)b_tab where t_tab.id=b_tab.id

9.5.3 having中使用子查询

例:having a.id in (select stuId from b)

9.6 多重子查询

多重子查询允许查询条件中有多个子查询语句

例:where name in (select name from a) and age in (select age from b)

子查询中嵌套的层次过多,会影响查询效率,首先要选择避免。如果一定要用,应该在子查询中尽量将无用的数据过滤掉。Oracle中最多允许子查询嵌套16层。

9.7 create table语句中使用子查询实现数据表的复制

回头再仔细看,暂时感觉没有作用

猜你喜欢

转载自blog.csdn.net/selftranscendence/article/details/79970041