-- 1、嵌套查询（注意使用ANY、ALL和EXISTS）
-- （1）使用IN运算的简单嵌套查询
USE 学生管理;
SELECT * FROM 课程表 WHERE 责任教师 IN ('T001','T002'); 

-- （2）使用NOT IN运算的简单嵌套查询
SELECT * FROM 课程表 WHERE 责任教师 NOT IN ('T001','T002');
 
-- （3）使用关系运算（如等于）的简单嵌套查询
SELECT * FROM 课程表 WHERE 学时 = 64; 

-- （4）使用ANY或SOME的简单嵌套查询
SELECT * FROM 课程表 WHERE 学时 = ANY(
SELECT MAX(学时) FROM 课程表
);

-- （5）使用ALL的简单嵌套查询
SELECT * FROM 教师表 WHERE 工资 > ALL(
SELECT AVG(工资) FROM 教师表
);

-- （6）使用连接查询院系名称含“计算机”、职称为教授、所负责教程为必修课的教师姓名、职称、课程名称和课程学时等信息
SELECT 教师表.姓名,教师表.职称,课程表.课程名称,课程表.学时
FROM 教师表
JOIN 院系表 ON 院系表.负责人=教师表.姓名
JOIN 课程表 ON 课程表.责任教师=教师表.教师编号
WHERE 院系表.名称 LIKE '%计算机%'
AND 教师表.职称='教授'
AND 课程表.课程性质='必修课';

-- （7）使用EXISTS的嵌套查询
SELECT * FROM 课程表 WHERE EXISTS(
SELECT 平均成绩 FROM 学生表 WHERE 平均成绩 > 90
);

-- （8）使用NOT EXISTS的嵌套查询
SELECT * FROM 课程表 WHERE NOT EXISTS(
SELECT 平均成绩 FROM 学生表 WHERE 平均成绩 < 60
);

-- 2、汇总和分组查询
-- （1）使用COUNT统计数目的查询
SELECT COUNT(*) FROM 学生表;

-- （2）使用SUM计算合计的查询
SELECT SUM(工资) FROM 教师表;

-- （3）一次完成求和、计数、计算平均值的查询
SELECT SUM(工资),COUNT(*),AVG(工资) FROM 教师表;

-- （4）查询所有课程的成绩都大于60分的学生的平均分最高的学生信息
SELECT TOP 1 学生表.*
FROM 学生表
JOIN (
    SELECT 学号, AVG(成绩) AS 平均分
    FROM 选课表
    GROUP BY 学号
    HAVING MIN(成绩) > 60
) AS 成绩表 ON 学生表.学号 = 成绩表.学号
ORDER BY 成绩表.平均分 DESC;

-- （5）查询数据库课程的成绩大于70分的、所有课程平均分最高的学生信息
SELECT TOP 1 学生表.*
FROM 学生表
JOIN (
    SELECT 学号, AVG(成绩) AS 平均分
    FROM 选课表
    WHERE 课程编号 = (
        SELECT 课程编号
        FROM 课程表
        WHERE 课程名称 LIKE '%数据库%'
    ) AND 成绩 > 70
    GROUP BY 学号
) AS 成绩表 ON 学生表.学号 = 成绩表.学号
ORDER BY 成绩表.平均分 DESC;

-- （6）查询每个学生的平均成绩
SELECT 学号, AVG(成绩) AS 平均成绩
FROM 选课表
GROUP BY 学号;

-- （7）查询每个学生的所有成绩的最高成绩、最低成绩、平均成绩和所考课程的门数
SELECT 学号,
       MAX(成绩) AS 最高成绩,
       MIN(成绩) AS 最低成绩,
       AVG(成绩) AS 平均成绩,
       COUNT(课程编号) AS 课程门数
FROM 选课表
GROUP BY 学号;
