日期:2014-05-19  浏览次数:20484 次

请教这个语句的具体处理过程含exists和相关子查询
select   姓名
from   xs   where     not   exists
(
select   *   from   kc    
  where   not   exists
      (
        select   *   from   xs_kc
where   学号=xs.学号   and   课程号=kc.课程号
      )
)
/*查找选修全部课程的学生姓名   */

有3个表   xs,   kc,xs_kc
 
请问具体的处理过程是怎么样的呢   谢谢   可以的话请说出开始到结束的过程

------解决方案--------------------
相关子查询(也称为重复子查询)

许多查询都可以通过执行一次子查询并将结果值代入外部查询的 WHERE 子句进行评估。
在包括相关子查询(也称为重复子查询)的查询中,子查询依靠外部查询获得值。
这意味着子查询是重复执行的,为外部查询可能选择的每一行均执行一次。

下面的查询查找获得某本书 100 % 共享版税 (royaltyper) 的所有作者名。

USE pubs
SELECT au_lname, au_fname
FROM authors a
WHERE 100 IN
(SELECT royaltyper
FROM titleauthor
WHERE titleauthor.au_ID = a.au_id)

下面是结果集:

au_lname au_fname
---------------------------------------- --------------------
White Johnson
Green Marjorie
Carson Cheryl
Straight Dean
Locksley Charlene
Blotchet-Halls Reginald
del Castillo Innes
Panteley Sylvia
Ringer Albert

(9 row(s) affected)

与以前提到的大多数子查询不同,该语句中的子查询无法独立于主查询而得到解决。
该子查询需要一个 authors.au_id 值,而该值是个变量,随 Microsoft SQL Server
检查 authors 表中的不同行而更改。

下面准确说明如何评估该查询:SQL Server 考虑 authors 表中的每一行是否都包括在结果中,
方法是将每一行的值都代入内部查询中。例如,如果 SQL Server 首先检查 Cheryl Carson 行,
那么变量 authors.au_id 将取值 238-95-7766,SQL Server 将该值代入到内部查询中。

USE pubs
SELECT royaltyper
FROM titleauthor
WHERE au_id = '238-95-7766 '

结果为 100,所以外部查询评估为:

USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE 100 IN (100)

由于这是真的,因此 Cheryl Carson 行包括在结果中。对 Abraham Bennet 行运行相同的过程,会发现该行没有包括在结果中。
---------------------------------------------------------------

举个例子;
SELECT t1.type
FROM titles t1
GROUP BY t1.type
HAVING MAX(t1.advance) > =ALL
(SELECT 2 * AVG(t2.advance)
FROM titles t2
WHERE t1.type = t2.type)
这个结果返回最高预付款超过给定组中平均预付款两倍的书籍类型。
-----------------------------------

再举个例子:
要求返回每一个编号的最大值(列出id,name,score)
ID Name(编号) Score(分数)
1 a 88
2 b 76
3 c 66
4 c 90
5 b 77
6 a 56
7 b 77
8 c 67
9 a 44
select * from t a where score=
(select Max(Score) from t b where a.name=b.name)
------------------------------

再给一个排位的sql语句
SELECT
( SELECT count(*)+1 as dd FROM [Test ] as a where a.[F2] <b.[F2] ) AS ord,
b.[F1], b.[F2]
FROM [Test ] as b
order by b.[F2];

相关子查询与普通子查询的区别在于:相关子查询引用了外部查询中的列!这种用外部查询来限制子查询的方法使
SQL查询变得更加强大和灵活。因为相关子查询能够引用外部查询,所以它们尤其适合编写复杂的where条件!
相关子查询不能自己单独运行,其执行顺序如下:
1.首先执行一次外部查询
2.对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当前行的值。
3.使用子查询的结果来确定外部查询的结果集
------解决方案--------------------
此语句使用了双重否定为肯定式,可以这样理解:
1.选择学生姓名
2.不存在一个学生