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
请问具体的处理过程是怎么样的呢 谢谢 可以的话请说出开始到结束的过程
from xs where not exists
(
select * from kc
where not exists
(
select * from xs_kc
where 学号=xs.学号 and 课程号=kc.课程号
)
)
/*查找选修全部课程的学生姓名 */有3个表 xs, kc,xs_kc
请问具体的处理过程是怎么样的呢 谢谢 可以的话请说出开始到结束的过程
在包括相关子查询(也称为重复子查询)的查询中,子查询依靠外部查询获得值。
这意味着子查询是重复执行的,为外部查询可能选择的每一行均执行一次。下面的查询查找获得某本书 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.不存在一个学生
3.有门课程没有选修的Select 姓名 -- 1
from xs where not existsv --2
( select * from kc
where not exists --3
( select * from xs_kc
where 学号=xs.学号 and 课程号=kc.课程号
)
)
然后再理解两层的刚才试着写了一下
发现很难表述清楚
张三
李四kc
数学
语文
英语xs_kc
张三 数学
张三 英语
李四 数学
李四 语文
李四 英语从xs表里查询的第一层exists ,我们可以这样理解:
对于xs表的每一条数据,都要来判断是否满足括弧里面的条件
假设先取张三
然后看里面这层,kc表也要进行筛选,那我们也可以认为是每条数据都要来判断
假设取数学那这个时候在xs_kc里查询,发现有一条数据满足学号=xs.学号(张三)、课程号=kc.课程号(数学)
那这个时候对于里面的这层查询来讲,数学就不符合条件了,
那再看语文
这个时候xs_kc 里不存在满足学号=xs.学号(张三)、课程号=kc.课程号(语文)的纪录
那语文就满足了内层连接的条件
实际上语文正是张三没有选的课程
当内层连接有数据返回的时候,第一层的数据就不符合条件了,因为是not exists ,
所以张三就不符合条件同理,李四是符合条件的
所以这个语句的结果是李四
where 学号 in
(
select 学号 from --3:符合的学号
(
select 学号,count(课程号) as 课程号数 from xs_kc --1:处理学号和科目的对应数
group by 学号
) tb
where 课程号数=(select count(1) from kc) --2:应该选择的科目数
)
为什么不用exists呢,因为要全部课程,用exists只能选择部分课程