SQL Server数据库培训——子查询
上一篇 / 下一篇 2011-03-31 14:35:59 / 个人分类:数据库
1. 子查询(subquery)
SQL支持在查询语句中编写查询或者嵌套其它查询。外层查询返回结果给调用者,内层查询(也称子查询)返回数据供外部查询使用。
通俗点说子查询是嵌套在SELECT、INSERT、UPDATE和DELETE语句的WHERE子句和HAVING子句中的另一个SELECT语句。
1.1 子查询类型
子查询可以分成独立子查询(self-contained subquery)和相关子查询(correlated subquery)。
独立子查询的特点是不依赖于外部查询,可以独立运行。而相关子查询需要依赖于它的外部查询。
独立子查询又分为标量子查询(scalar subquery)和多值子查询(multi-valued wubquery)和表子查询(table wubquery)。
子查询又分单列子查询和多列子查询,这在后面会讲到。
1.1.1 独立子查询
独立子查询是独立与外部查询的子查询,它总是可以拿出来单独运行。这种语句的执行分两个步骤:首先执行内部子查询,然后根据子查询的结果再执行外层查询。外部查询返回所有结果有调用者。子查询只运行一次。
1.1.1.1 标量子查询
标量子查询,由比较运算符(=、>、<、<=、>=)引出的子查询。在使用单一比较操作符引出子查询时,必须保证子查询返回一个单值,否则将引起查询错误。
1.1.1.1.1 单行单列子查询
例子一:在where条件中使用子查询
SELECT *
FROM USER
WHERE user_id = (SELECT
ownerid
FROM dealers
WHERE ownerid > 0)
例子二:在delete条件中使用子查询
DELETE
FROM USER
WHERE user_id>=(SELECT
Avg(ownerid)
FROM dealers
WHERE ownerid > 0)
SELECT
d.DealerID,
d.DealerName,
(SELECT
u.login_name
FROM USER u
WHERE u.user_id = d.OwnerID) username
FROM dealers d
例四:在from子句中
SELECT
u.user_id,
d.DealerID,
d.ownerid
FROM USER u,
(SELECT
d.DealerID,
d.ownerid
FROM dealers d
WHERE d.DealerID = 1425) d
WHERE u.user_id = d.ownerid
上面所有例子中我们可能看到子查询
SELECT
ownerid
FROM dealers
WHERE ownerid > 0
是可以单独拿出来执行的。不会有语法错误。
1.1.1.1.2 单行多列子查询
当是单行多列的子查询时,外部查询语句的条件语句中引用子查询结果时也可用单行比较符号来进行比较(成对比较)。例如:
SELECT *
FROM USER u