子查询与连接查询

如果需要查询的字段列表属于多张表,则使用连接查询(INNER JOIN、LEFT JOIN、RIGHT JOIN)
如果需要查询的字段列表属于一张表,但筛选条件跨多张表,可以层层嵌套子查询

Demo 01:
方式一:

DECLARE @stuAge INT;
SELECT @stuAge=DATEDIFF(YYYY,birthday,GETDATE()) FROM Students WHERE stuName='刘德华'
SELECT stuNo,stuName,C.ClassName,sex,age=DATEDIFF(YYYY,birthday,GETDATE()),telephone FROM Students S
INNER JOIN ClassInfos C
ON(S.classId=C.ClassId)
WHERE DATEDIFF(YYYY,birthday,GETDATE())<@stuAge

子查询:
SELECT …FROM 表1 比较运算符(子查询)

SELECT S.stuNo,stuName,age=DATEDIFF(YYYY,birthday,GETDATE()),sex,C.ClassName,CU.courseName,R.score,telephone FROM Students S
INNER JOIN ClassInfos C
ON(S.classId=C.ClassId)
INNER JOIN Results R
ON(S.stuNo=R.stuno)
INNER JOIN Course CU
ON (R.courseId=CU.courseId)
WHERE DATEDIFF(YYYY,birthday,GETDATE())<
(SELECT stuAge=DATEDIFF(YYYY,birthday,GETDATE()) FROM Students WHERE stuName='刘德华')
--执行顺序:
--先执行小括号里的子查询,返回子查询结果,然后执行外层的父查询,返回最终的结果

--查询'C#基础'课程至少一次考试刚好等于60的学生
--IN:包含 NOT IN:不包含
SELECT S.stuNo,S.stuName,S.sex,S.telephone FROM Students  S
WHERE S.stuNo IN(
 SELECT stuNo FROM Results R WHERE R.courseId
 IN(
   SELECT courseId FROM Course WHERE courseName='C#基础'
 ) AND R.score=60
);


---根据性别分组统计男女同学人数
--分组后,使用聚合函数分别对各组人数(男女组)进行统计
--先分组,再使用聚合函数
SELECT sex ,COUNT(stuNo)AS '人数'  FROM Students
GROUP BY sex
UNION 
SELECT '总人数',COUNT(stuNo) FROM Students

SELECT StuNo,StuName,ClassId,sex FROM Students 
WHERE EXISTS(SELECT * FROM Students WHERE Students.classId=3 AND Students.sex='男')

-合并班级,判断如果’JAVA实战班’有人,Update到’Java+大数据’

IF EXISTS(
 SELECT stuNo FROM Students S 
 INNER JOIN ClassInfos CI
 ON(S.classId=CI.ClassId)
 WHERE CI.ClassName='JAVA实战班'
)
BEGIN 
 UPDATE Students SET classId =(SELECT classId FROM ClassInfos WHERE ClassName='Java+大数据')
 WHERE stuNo IN(SELECT stuNo FROM Students S 
 INNER JOIN ClassInfos CI
 ON(S.classId=CI.ClassId)
 WHERE CI.ClassName='JAVA实战班')
END

发布了98 篇原创文章 · 获赞 1 · 访问量 854

猜你喜欢

转载自blog.csdn.net/qq_34550459/article/details/105587299