sql Subquery(子查询)

2018年01月18日 13:38 | 2992次浏览

sql Subquery(子查询)

一个select...FROM是一个基本查询,如果在一个SELECT...FROM中嵌套着另外一个SELECT...FROM语句,就称之为子查询,其中被嵌套在里面的查询语句为子查询

示例

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');

 


概念详解

我们可以在一个 SQL 语句中放入另一个 SQL 语句。当我们在 WHERE 子句或 HAVING 子句中插入另一个 SQL 语句时,我们就有一个 subquery 的架构。 Subquery(子查询) 的作用是什么呢?第一,它可以被用来连接表格。另外,有的时候 subquery 是唯一能够连接两个表格的方式。

Subquery(子查询) 的语法如下:

SELECT "列1" 
FROM "表格" 
WHERE "列2" [比较运算素] 
(SELECT "列1" 
FROM "表格"
WHERE "条件");

[比较运算素] 可以是相等的运算素,例如 =, >, <, >=, <=. 这也可以是一个对文字的运算素,例如 "LIKE"。

我们就用刚刚在阐述 SQL 连接时用过的例子:

我们要运用 subquery(子查询) 来找出所有在西部的店的营业额。我们可以用下面的 SQL 来达到我们的目的:

SELECT SUM(Sales) FROM Store_Information
WHERE Store_name IN
(SELECT store_name FROM Geography 
WHERE region_name = 'West');

结果:

SUM(Sales)
2050

在这个例子中,我们并没有直接将两个表格连接起来,然后由此直接算出每一间西区店面的营业额。我们做的是先找出哪些店是在西区的,然后再算出这些店的营业额总共是多少。 

“exists的效率比in的高”的说法不完全正确,要视情况而定。

“exists”和“in”是Oracle中,都是查询某集合的值是否存在在另一个集合,但对不同的数据有不同的用法,主要是在效率问题上存在很大的差别,以下有两个简单例子,以说明 “exists”和“in”的效率问题。

1、 select * from Table1 where exists(select 1 from Table2 where Table1.a=Table2.a) ;

Table1数据量小而Table2数据量非常大时,Table1<<Table2 时,exists的查询效率高。

2、 select * from Table1 where Table1.a in (select Table2.a from Table2) ;

Table1数据量非常大而Table2数据量小时,Table1>>Table2 时,in的查询效率高。
 
通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,
这就节省了时间。

Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。



小说《我是全球混乱的源头》

感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程