初级子查询

一:简单子查询

1:例:查询比李斯文大的学生的信息:

select  *  from  student where  borndate>

(select brondate from student where studentname='李斯文')

执行顺序:先执行括号中的子查询,再以子查询返回的结果为条件执行父查询

注意:当子查询的结果返回单个值的时候可以使用比较运算符(如:=,>,<,>=,<=)

如果子查询返回多个值(两个以上)怎么办(筛选范围)?

2:使用 in 关键字

例:查询Java logic课程至少一次刚好等于60分的学生名单(所见即所得)

select studentname from Result where studentNo

(select studentNo from Result where subjectno=

(select subjectno from subject where subjectname='java logic')

and studentresult>=60

)

in关键字可以是父查询匹配子查询返回多个单列值

3:not in(不在筛选的范围中)关键字

例:如何查询没有参加java logic 课程的学生名单

select student name from student where studentNo not in

(select studentno from result where subjectno=

(select subjectno from subject where subjectname='Java Logic')

)

4:exists和not exists子查询

exists关键字能检索数据是否存在

语法:if exists(子查询)

语句

例:检查oop课程的最近一次考试记录,如果有成绩达到80分者则每人加2分,否则,每人加5分.最终成绩不得大于100分

--检查oop最近一次考试,如果成绩大于80分以上者加2分,
--否则,加5分,最终成绩不得大于100分
print '本次参加考试的学生的原始成绩'
select Examdate ,studentNo,studentResult from Result
where SubjectId=(select SubjectId from Subject where SubjectName='oop')
and ExamDate=
(select max(ExamDate) from Result where SubjectId=
(select SubjectId from Subject where SubjectName='oop'))
if exists(
select * from Result where SubjectId=
(select SubjectId from Subject where SubjectName='oop')
and ExamDate=
(select max(ExamDate) from Result where SubjectId=
(select SubjectId from Subject where SubjectName='oop'))
and StudentResult>80
)
begin
update Result set StudentResult+=2 where SubjectId=
(select SubjectId from Subject where SubjectName='oop')
and ExamDate=
(select max(ExamDate) from Result where SubjectId=
(select SubjectId from Subject where SubjectName='oop'))
and StudentResult<=98
print '加2分后的成绩'
select Examdate ,studentNo,studentResult from Result
where SubjectId=(select SubjectId from Subject where SubjectName='oop')
and ExamDate=
(select max(ExamDate) from Result where SubjectId=
(select SubjectId from Subject where SubjectName='oop'))
end
else
begin
update Result set StudentResult+=5 where SubjectId=
(select SubjectId from Subject where SubjectName='oop')
and ExamDate=
(select max(ExamDate) from Result where SubjectId=
(select SubjectId from Subject where SubjectName='oop'))
print '加5分后的成绩'
select Examdate ,studentNo,studentResult from Result
where SubjectId=(select SubjectId from Subject where SubjectName='oop')
and ExamDate=
(select max(ExamDate) from Result where SubjectId=
(select SubjectId from Subject where SubjectName='oop'))
end

效果图展示:

5:相关子查询:

相关子查询的执行依赖于外部查询。多数情况下是子查询的WHERE子句中引用了外部查询的表。执行过程:

1)从外层查询中取出一个元组,将元组相关列的值传给内层查询。

2)执行内层查询,得到子查询操作的值。

3)外查询根据子查询返回的结果或结果集得到满足条件的行。

4)然后外层查询取出下一个元组重复做步骤1-3,直到外层的元组全部处理完毕。 

例:查询Books表中大于该类图书价格平均值的图书信息

SElECT 图书名,出版社,类编号,价格
  FROM Books As a
  WHERE 价格 >
  (
    SELECT AVG(价格)
    FROM Books AS b
    WHERE b.类编号=a.类编号
  )
  GO

解析:外层查询查询的是书的价格(条件是这本书的价格大于这类书的平均价格),内层查询查询的是这类书的平均价格(条件是书是同一类的书),所使用的表也是同一张表,各自取不一样的表别名,比方说这类书的标号是2将a.类编号=2代入 内层查询同步将b.类编号=2(保证了书是同一类的书),执行内层循环查询到这类书的平均价格,同步执行外层查询查询筛选出哪本书的价格大于这类书的平均价格

6:分页查询:方法有二

1:双top双order by方法:

--查询学生表中第3到第5条的学生信息,哈哈
select top 3 * from Student
where StudentNo not in
(select top 2 StudentNo from Student order by StudentNo)
order by StudentNo

解析:跳过几条写几条,内层查询查询的是所要跳过的记录,外层查询查询的是所要记录的数目

2:row_number()over()函数:

--查询学生表中第3到第5条的学生信息,呵呵
select * from
(select *,ROW_NUMBER()over(order by studentNo)as myid from Student) as tmp
where myid between 3 and 5

解析:自己创造出一列行数序号值出来,名为myid 为了能让where 条件中的语句识别myid,在from语句中写(关键字执行顺序:1.from2.where3.select)并给表起一个别名,再使用between... and ...进行分页查询

效果完成图:

原文地址:https://www.cnblogs.com/chimingyang/p/5261529.html