博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sql 子查询的一些例子
阅读量:4197 次
发布时间:2019-05-26

本文共 3019 字,大约阅读时间需要 10 分钟。

1、单行子查询

        select ename,deptno,sal
        from emp
        where deptno=(select deptno from dept where loc='NEW YORK');

     2、多行子查询

        SELECT ename,job,sal
        FROM EMP
        WHERE deptno in ( SELECT deptno FROM dept WHERE dname LIKE 'A%');

     3、多列子查询

        SELECT deptno,ename,job,sal
        FROM EMP
        WHERE (deptno,sal) IN (SELECT deptno,MAX(sal) FROM EMP GROUP BY deptno);

     4、内联视图子查询

       (1)SELECT ename,job,sal,rownum
          FROM (SELECT ename,job,sal FROM EMP ORDER BY sal);
       (2)SELECT ename,job,sal,rownum
          FROM ( SELECT ename,job,sal FROM EMP ORDER BY sal)
          WHERE rownum<=5;
  
     5、在HAVING子句中使用子查询
        SELECT deptno,job,AVG(sal) FROM EMP GROUP BY deptno,job HAVING AVG(sal)>(SELECT sal FROM EMP WHERE ename='MARTIN');

有三种基本的子查询。它们是: 

●在通过 IN 或由 ANY 或 ALL 修改的比较运算符引入的列表上操作。
●通过未修改的比较运算符引入且必须返回单个值。
●通过 EXISTS 引入的存在测试。
1.带in的嵌套查询
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal in (select sal from scott.emp where ename=’’WARD’’); 
上述语句完成的是查询薪水和WARD相等的员工,也可以使用not in来进行查询。
2.带any的嵌套查询
通过比较运算符将一个表达式的值或列值与子查询返回的一列值中的每一个进行比较,只要有一次比较的结果为TRUE,则ANY测试返回TRUE。

select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >any(select sal from scott.emp where job=’’MANAGER’’); 
等价于下边两步的执行过程:
(1)执行“select sal from scott.emp where job=’’MANAGER’’”
(2)查询到3个薪水值2975、2850和2450,父查询执行下列语句:
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >2975 or sal>2850 or sal>2450;

3.带some的嵌套查询
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal =some(select sal from scott.emp where job=’’MANAGER’’);
等价于下边两步的执行过程:
(1)子查询,执行“select sal from scott.emp where job=’’MANAGER’’”。
(2)父查询执行下列语句。
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal =2975 or   sal=2850 or sal=2450; 
带【any】的嵌套查询和【some】的嵌套查询功能是一样的。早期的SQL仅仅允许使用【any】,后来的版本为了和英语的【any】相区分,引入了【some】,同时还保留了【any】关键词。
4.带all的嵌套查询
通过比较运算符将一个表达式的值或列值与子查询返回的一列值中的每一个进行比较,只要有一次比较的结果为FALSE,则ALL测试返回FALSE。 
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >all(select sal from scott.emp where job=’’MANAGER’’); 
等价于下边两步的执行过程:
(1)子查询,执行“select sal from scott.emp where job=’’MANAGER’’”。
(2)父查询执行下列语句。
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >2975 and sal>2850 and sal>2450;
5.带exists的嵌套查询 
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp,scott.dept where exists (select * from scott.emp where scott.emp.deptno=scott.dept.deptno);
6.并操作的嵌套查询
并操作就是集合中并集的概念。属于集合A或集合B的元素总和就是并集。 
(select deptno from scott.emp) union (select deptno from scott.dept); 
7.交操作的嵌套查询
交操作就是集合中交集的概念。属于集合A且属于集合B的元素总和就是交集。 
(select deptno from scott.emp) intersect (select deptno from scott.dept); 
8.差操作的嵌套查询
差操作就是集合中差集的概念。属于集合A且不属于集合B的元素总和就是差集。
(select deptno from scott.dept) minus (select deptno from scott.emp);
注意:并、交和差操作的嵌套查询要求属性具有相同的定义,包括类型和取值范围。
左手边是一个标量表达式列表.右手边可以是一个等长的标量表达式的列表, 或者一个圆括弧括起来的子查询,该查询必须返回很左手边表达式书目完全 一样的字段.另外,该子查询不能返回超过一行的数量.(如果它返回零行, 那么结果就是 NULL.)左手边逐行与右手边的子查询结果行,或者右手边 表达式列表进行比较.目前,只允许使用 = 和 <> 操作符进行逐行比较. 如果两行分别是相等或者不等,那么结果为真. 
通常,表达式或者子查询行里的 NULL 是按照 SQL 布尔表达式的一般规则 进行组合的.如果两个行对应的成员都是非空并且相等,那么认为这两行 相等;如果任意对应成员为非空且不等,那么该两行不等; 否则这样的行比较的结果是未知(NULL)

参考:

转载地址:http://tzkli.baihongyu.com/

你可能感兴趣的文章
Redis源码剖析--动态字符串SDS
查看>>
Redis源码剖析--双端链表Sdlist
查看>>
Redis源码剖析--字典dict
查看>>
Redis源码剖析--跳跃表zskiplist
查看>>
Redis源码剖析--整数集合Intset
查看>>
Redis源码剖析--对象object
查看>>
Redis源码剖析--字符串t_string
查看>>
Redis源码剖析--快速列表quicklist
查看>>
Redis源码剖析--列表list
查看>>
领悟 JavaScript 中的面向对象
查看>>
post和get的区别?
查看>>
Ajax中的get和post两种请求方式的用法
查看>>
7种流行PHP集成开发工具(IDE)的比较和环境培植
查看>>
给图片链接加边框,时,ff和chrome的bug问题
查看>>
关于HTML语言中的width和height属性的百分比表示
查看>>
Android开发学习 之 五、基本界面控件-4时间控件
查看>>
详细解读Jquery的$.get(),$.post(),$.ajax(),$.getJSON()用法
查看>>
同步与异步的区别
查看>>
Python定时任务框架apscheduler,定时执行多个固定任务
查看>>
python定义一个装饰器自动测量函数的运行时间
查看>>