一、子查詢:
子查询在WHERE语句中的一般用法:
SELECT … FROM 表1 WHERE 字段1 >(子查询)
外面的查询称为父查询,括号中嵌入的查询称为子查询
UPDATE、INSERT、DELETE一起使用,语法类似于SELECT语句
将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个
 
例如:
SELECT * FROM stuInfo
WHERE stuAge>( SELECT stuAge FROM stuInfo where stuName='李斯文')
GO
 
二、使用子查询替换表连接
一般来说,表连接都可以用子查询替换,但有的子查询却不能用表连接替换
子查询比较灵活、方便,常作为增删改查的筛选条件,适合于操纵一个表的数据
表连接更适合于查看多表的数据
 
例如:
SELECT stuName FROM stuInfo
    WHERE stuNo=(SELECT stuNo FROM stuMarks WHERE writtenExam=60)
GO
 
三、IN子查询
IN后面的子查询可以返回多条记录,常用IN替换等于(=)的比较子查询
 
例如:
SELECT stuName FROM stuInfo
   WHERE stuNo IN
     (SELECT stuNo FROM  stuMarks WHERE writtenExam=60)
GO
 
四、EXISTS子查询
如果子查询的结果非空,即记录条数1条以上,则EXISTS (子查询)将返回真(true),否则返回假(false)
EXISTS也可以作为WHERE 语句的子查询,但一般都能用IN子查询替换
 
EXISTS子查询的语法:
IF EXISTS (子查询)
    语句
例如:
/*--采用EXISTS子查询,进行酌情加分--*/
IF EXISTS (SELECT * FROM stuMarks WHERE writtenExam>80)
  BEGIN
    print '本班有人笔试成绩高于分,每人加分,加分后的成绩为:'
    UPDATE stuMarks SET writtenExam=writtenExam+2
    SELECT * FROM stumarks
  END
ELSE
  BEGIN
    print '本班无人笔试成绩高于分,每人可以加分,加分后的成绩:'
    UPDATE stuMarks SET writtenExam=writtenExam+5
    SELECT * FROM stumarks
  END
GO
 
相反:NOT EXISTS子查询
例如:
IF NOT EXISTS (SELECT * FROM stuMarks WHERE
                                writtenExam>60 AND labExam>60)
  BEGIN
    print '本班无人通过考试,试题偏难,每人加分,加分后的成绩为:'
    UPDATE stuMarks
         SET writtenExam=writtenExam+3,labExam=labExam+3
    SELECT * FROM stuMarks
  END
ELSE
  BEGIN
    print '本班考试成绩一般,每人只加分,加分后的成绩为:'
    UPDATE stuMarks
         SET writtenExam=writtenExam+1,labExam=labExam+1
    SELECT * FROM stuMarks
  END
GO