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子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。
感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程