我们可以在一个 SQL 语句中放入另一个 SQL 语句。当我们在 WHERE 子句或 HAVING 子句中插入另一个 SQL 语句时,我们就有一个 subquery 的架构。 Subquery 的作用是什么呢?第一,它可以被用来连接表格。另外,有的时候 subquery 是唯一能够连接两个表格的方式。
Subquery 的语法如下:
SELECT "栏位1"
FROM "表格"
WHERE "栏位2" [比较运算素]
(SELECT "栏位1"
FROM "表格"
WHERE "条件");
FROM "表格"
WHERE "栏位2" [比较运算素]
(SELECT "栏位1"
FROM "表格"
WHERE "条件");
[比较运算素] 可以是相等的运算素,例如 =, >, <, >=, <=. 这也可以是一个对文字的运算素,例如 "LIKE"。
我们就用刚刚在阐述 SQL 连接时用过的例子:
Store_Information 表格
Store_Name | Sales | Txn_Date |
Los Angeles | 1500 | 05-Jan-1999 |
San Diego | 250 | 07-Jan-1999 |
Los Angeles | 300 | 08-Jan-1999 |
Boston | 700 | 08-Jan-1999 |
Geography 表格
Region_Name | Store_Name |
East | Boston |
East | New York |
West | Los Angeles |
West | San Diego |
我们要运用 subquery 来找出所有在西部的店的营业额。我们可以用下面的 SQL 来达到我们的目的:
SELECT SUM(Sales) FROM Store_Information
WHERE Store_name IN
(SELECT store_name FROM Geography
WHERE region_name = 'West');
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子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。
本文来源:http://www.1keydata.com/cn/sql/sql-subquery.php
SQL组的同学都可以看一遍,是一个很好的入门资料。做SQL的人不懂SQL的基础概念是很难做好SQL的。基础概念,从SQL认知做起,要知道SQL中每一种语法!