马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
门生表
Student(S#,Sname,Sage,Ssex) 门生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
- -- 1、查询“001”课程比“002”课程成绩高的所有学生的学号
- SELECT a.S#
- FROM (SELECT S#, score FROM SC WHERE C# = '001') a,
- (SELECT S#, score FROM SC WHERE C# = '002') b
- WHERE a.score > b.score AND a.S# = b.S#;
- -- 2、查询平均成绩大于60分的同学的学号和平均成绩
- SELECT S#, AVG(score) AS avg_score
- FROM SC
- GROUP BY S#
- HAVING AVG(score) > 60;
- -- 3、查询所有同学的学号、姓名、选课数、总成绩
- SELECT Student.S#, Student.Sname, COUNT(SC.C#) AS course_count, SUM(score) AS total_score
- FROM Student
- LEFT JOIN SC ON Student.S# = SC.S#
- GROUP BY Student.S#, Student.Sname;
- -- 4、查询姓“李”的老师的个数
- SELECT COUNT(DISTINCT Tname) AS teacher_count
- FROM Teacher
- WHERE Tname LIKE '李%';
- -- 5、查询没学过“叶平”老师课的同学的学号、姓名
- SELECT Student.S#, Student.Sname
- FROM Student
- WHERE S# NOT IN (
- SELECT DISTINCT SC.S#
- FROM SC, Course, Teacher
- WHERE SC.C# = Course.C#
- AND Teacher.T# = Course.T#
- AND Teacher.Tname = '叶平'
- );
- -- 6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名
- SELECT Student.S#, Student.Sname
- FROM Student, SC
- WHERE Student.S# = SC.S#
- AND SC.C# = '001'
- AND EXISTS (
- SELECT 1
- FROM SC AS SC_2
- WHERE SC_2.S# = SC.S#
- AND SC_2.C# = '002'
- );
- -- 7、查询学过“叶平”老师所教的所有课的同学的学号、姓名
- SELECT S#, Sname
- FROM Student
- WHERE S# IN (
- SELECT S#
- FROM SC, Course, Teacher
- WHERE SC.C# = Course.C#
- AND Teacher.T# = Course.T#
- AND Teacher.Tname = '叶平'
- GROUP BY S#
- HAVING COUNT(SC.C#) = (
- SELECT COUNT(C#)
- FROM Course, Teacher
- WHERE Teacher.T# = Course.T#
- AND Tname = '叶平'
- )
- );
- -- 8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名
- SELECT S#, Sname
- FROM (
- SELECT Student.S#, Student.Sname, score,
- (SELECT score FROM SC SC_2 WHERE SC_2.S# = Student.S# AND SC_2.C# = '002') AS score2
- FROM Student, SC
- WHERE Student.S# = SC.S# AND C# = '001'
- ) AS S_2
- WHERE score2 < score;
- -- 9、查询所有课程成绩小于60分的同学的学号、姓名
- SELECT S#, Sname
- FROM Student
- WHERE S# NOT IN (
- SELECT S#
- FROM SC
- WHERE score > 60
- );
- -- 10、查询没有学全所有课的同学的学号、姓名
- SELECT Student.S#, Student.Sname
- FROM Student, SC
- WHERE Student.S# = SC.S#
- GROUP BY Student.S#, Student.Sname
- HAVING COUNT(C#) < (SELECT COUNT(C#) FROM Course);
- -- 11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名
- SELECT S#, Sname
- FROM Student, SC
- WHERE Student.S# = SC.S#
- AND C# IN (
- SELECT C#
- FROM SC
- WHERE S# = '1001'
- );
- -- 12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名
- SELECT DISTINCT SC.S#, Student.Sname
- FROM Student, SC
- WHERE Student.S# = SC.S#
- AND SC.C# IN (SELECT C# FROM SC WHERE S# = '001')
- AND Student.S# != '001';
- -- 13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩
- UPDATE SC
- SET score = (
- SELECT AVG(SC_2.score)
- FROM SC SC_2
- WHERE SC_2.C# = SC.C#
- )
- FROM SC, Course, Teacher
- WHERE SC.C# = Course.C#
- AND Course.T# = Teacher.T#
- AND Teacher.Tname = '叶平';
- -- 14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名
- SELECT S#
- FROM SC
- WHERE C# IN (SELECT C# FROM SC WHERE S# = '1002')
- GROUP BY S#
- HAVING COUNT(*) = (SELECT COUNT(*) FROM SC WHERE S# = '1002')
- AND S# != '1002';
- -- 15、删除学习“叶平”老师课的SC表记录
- DELETE FROM SC
- FROM SC, Course, Teacher
- WHERE SC.C# = Course.C#
- AND Course.T# = Teacher.T#
- AND Teacher.Tname = '叶平';
- -- 16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2号课的平均成绩
- INSERT INTO SC (S#, C#, score)
- SELECT S#, '002', (SELECT AVG(score) FROM SC WHERE C# = '002')
- FROM Student
- WHERE S# NOT IN (SELECT S# FROM SC WHERE C# = '003');
- -- 17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩
- SELECT
- S# AS 学生ID,
- (SELECT score FROM SC WHERE SC.S# = t.S# AND C# = '004') AS 数据库,
- (SELECT score FROM SC WHERE SC.S# = t.S# AND C# = '001') AS 企业管理,
- (SELECT score FROM SC WHERE SC.S# = t.S# AND C# = '006') AS 英语,
- COUNT(*) AS 有效课程数,
- AVG(t.score) AS 平均成绩
- FROM SC AS t
- GROUP BY S#
- ORDER BY AVG(t.score) DESC;
- -- 18、查询各科成绩最高和最低的分
- SELECT
- L.C# AS 课程ID,
- MAX(L.score) AS 最高分,
- MIN(R.score) AS 最低分
- FROM SC L
- JOIN SC R ON L.C# = R.C#
- GROUP BY L.C#
- HAVING MAX(L.score) = (SELECT MAX(IL.score) FROM SC IL WHERE IL.C# = L.C#)
- AND MIN(R.score) = (SELECT MIN(IR.score) FROM SC IR WHERE IR.C# = R.C#);
- -- 19、按各科平均成绩从低到高和及格率的百分数从高到低顺序
- SELECT
- t.C# AS 课程号,
- MAX(course.Cname) AS 课程名,
- ISNULL(AVG(score), 0) AS 平均成绩,
- 100 * SUM(CASE WHEN ISNULL(score, 0) >= 60 THEN 1 ELSE 0 END) / COUNT(*) AS 及格百分数
- FROM SC t
- JOIN Course ON t.C# = course.C#
- GROUP BY t.C#
- ORDER BY AVG(score) ASC, 100 * SUM(CASE WHEN ISNULL(score, 0) >= 60 THEN 1 ELSE 0 END) / COUNT(*) DESC;
- -- 20、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)
- SELECT
- AVG(CASE WHEN C# = '001' THEN score ELSE NULL END) AS 企业管理平均分,
- 100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END) / SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企业管理及格百分数,
- AVG(CASE WHEN C# = '002' THEN score ELSE NULL END) AS 马克思平均分,
- 100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END) / SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 马克思及格百分数,
- AVG(CASE WHEN C# = '003' THEN score ELSE NULL END) AS UML平均分,
- 100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END) / SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分数,
- AVG(CASE WHEN C# = '004' THEN score ELSE NULL END) AS 数据库平均分,
- 100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END) / SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 数据库及格百分数
- FROM SC;
- -- 21、查询不同老师所教不同课程平均分从高到低显示
- SELECT
- MAX(Z.T#) AS 教师ID,
- MAX(Z.Tname) AS 教师姓名,
- C.C# AS 课程ID,
- MAX(C.Cname) AS 课程名称,
- AVG(T.score) AS 平均成绩
- FROM SC AS T
- JOIN Course AS C ON T.C# = C.C#
- JOIN Teacher AS Z ON C.T# = Z.T#
- GROUP BY C.C#
- ORDER BY AVG(T.score) DESC;
- -- 22、查询如下课程成绩第3名到第6名的学生成绩单: 企业管理(001),马克思(002),UML (003),数据库(004)
- -- [学生ID], [学生姓名], 企业管理, 马克思, UML, 数据库, 平均成绩
- WITH StudentScores AS (
- SELECT
- SC.S# AS 学生学号,
- Student.Sname AS 学生姓名,
- SUM(CASE WHEN SC.C# = '001' THEN score ELSE 0 END) AS 企业管理,
- SUM(CASE WHEN SC.C# = '002' THEN score ELSE 0 END) AS 马克思,
- SUM(CASE WHEN SC.C# = '003' THEN score ELSE 0 END) AS UML,
- SUM(CASE WHEN SC.C# = '004' THEN score ELSE 0 END) AS 数据库,
- AVG(score) AS 平均成绩,
- ROW_NUMBER() OVER (ORDER BY AVG(score) DESC) AS 排名
- FROM Student
- JOIN SC ON Student.S# = SC.S#
- GROUP BY SC.S#, Student.Sname
- )
- SELECT
- 学生学号,
- 学生姓名,
- 企业管理,
- 马克思,
- UML,
- 数据库,
- 平均成绩
- FROM StudentScores
- WHERE 排名 BETWEEN 3 AND 6;
- -- 29、查询姓“张”的学生名单
- SELECT Sname
- FROM Student
- WHERE Sname LIKE '张%';
- -- 30、查询同名同性学生名单,并统计同名人数
- SELECT Sname, COUNT(*)
- FROM Student
- GROUP BY Sname
- HAVING COUNT(*) > 1;
- -- 31、1981年出生的学生名单 (注: Student 表中 Sage 列的类型是 datetime)
- SELECT Sname, CONVERT(CHAR(4), DATEPART(YEAR, Sage)) AS BirthYear
- FROM Student
- WHERE CONVERT(CHAR(4), DATEPART(YEAR, Sage)) = '1981';
- -- 32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
- SELECT C#, AVG(score) AS AvgScore
- FROM SC
- GROUP BY C#
- ORDER BY AvgScore, C# DESC;
- -- 33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
- SELECT Student.Sname, SC.S#, AVG(SC.score) AS AvgScore
- FROM Student
- JOIN SC ON Student.S# = SC.S#
- GROUP BY SC.S#, Student.Sname
- HAVING AVG(SC.score) > 85;
- -- 34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数
- SELECT Student.Sname, ISNULL(SC.score, 0) AS Score
- FROM Student
- JOIN SC ON Student.S# = SC.S#
- JOIN Course ON SC.C# = Course.C#
- WHERE Course.Cname = '数据库' AND SC.score < 60;
- -- 35、查询所有学生的选课情况
- SELECT SC.S#, SC.C#, Student.Sname, Course.Cname
- FROM SC
- JOIN Student ON SC.S# = Student.S#
- JOIN Course ON SC.C# = Course.C#;
- -- 36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数
- SELECT DISTINCT Student.Sname, Course.Cname, SC.score
- FROM Student
- JOIN SC ON Student.S# = SC.S#
- JOIN Course ON SC.C# = Course.C#
- WHERE SC.score >= 70;
- -- 37、查询不及格的课程,并按课程号从大到小排列
- SELECT C#
- FROM SC
- WHERE score < 60
- ORDER BY C# DESC;
- -- 38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名
- SELECT SC.S#, Student.Sname
- FROM SC
- JOIN Student ON SC.S# = Student.S#
- WHERE SC.score > 80 AND SC.C# = '003';
- -- 39、求选了课程的学生人数
- SELECT COUNT(DISTINCT S#)
- FROM SC;
- -- 40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
- SELECT Student.Sname, SC.score
- FROM Student
- JOIN SC ON Student.S# = SC.S#
- JOIN Course ON SC.C# = Course.C#
- JOIN Teacher ON Course.T# = Teacher.T#
- WHERE Teacher.Tname = '叶平'
- AND SC.score = (SELECT MAX(score) FROM SC SC_INNER WHERE SC_INNER.C# = Course.C#);
- -- 41、查询各个课程及相应的选修人数
- SELECT C#, COUNT(*) AS StudentCount
- FROM SC
- GROUP BY C#;
- -- 42、查询不同课程成绩相同的学生的学号、课程号、学生成绩
- SELECT DISTINCT A.S#, A.C# AS CourseA, B.C# AS CourseB, A.score
- FROM SC A
- JOIN SC B ON A.score = B.score AND A.C# <> B.C#;
- -- 43、查询每门课程成绩最好的前两名
- SELECT t1.S# AS 学生ID, t1.C# AS 课程ID, t1.score AS 分数
- FROM SC t1
- WHERE t1.score IN (
- SELECT TOP 2 score
- FROM SC
- WHERE C# = t1.C#
- ORDER BY score DESC
- )
- ORDER BY t1.C#, t1.score DESC;
- -- 44、统计每门课程的学生选修人数(超过10人的课程才统计)。
- -- 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
- SELECT
- C# AS 课程号,
- COUNT(*) AS 人数
- FROM
- SC
- GROUP BY
- C#
- HAVING
- COUNT(*) > 10
- ORDER BY
- 人数 DESC,
- 课程号;
- -- 45、检索至少选修两门课程的学生学号
- SELECT
- S#
- FROM
- SC
- GROUP BY
- S#
- HAVING
- COUNT(*) >= 2;
- -- 46、查询全部学生都选修的课程的课程号和课程名
- SELECT
- C#,
- Cname
- FROM
- Course
- WHERE
- C# IN (
- SELECT
- C#
- FROM
- SC
- GROUP BY
- C#
- HAVING
- COUNT(DISTINCT S#) = (SELECT COUNT(*) FROM Student)
- );
- -- 47、查询没学过“叶平”老师讲授的任一门课程的学生姓名
- SELECT
- Sname
- FROM
- Student
- WHERE
- S# NOT IN (
- SELECT
- SC.S#
- FROM
- Course,
- Teacher,
- SC
- WHERE
- Course.T# = Teacher.T#
- AND SC.C# = Course.C#
- AND Teacher.Tname = '叶平'
- );
- -- 48、查询两门以上不及格课程的同学的学号及其平均成绩
- SELECT
- S#,
- AVG(ISNULL(score, 0)) AS 平均成绩
- FROM
- SC
- WHERE
- S# IN (
- SELECT
- S#
- FROM
- SC
- WHERE
- score < 60
- GROUP BY
- S#
- HAVING
- COUNT(*) > 2
- )
- GROUP BY
- S#;
- -- 49、检索“004”课程分数小于60,按分数降序排列的同学学号
- SELECT
- S#
- FROM
- SC
- WHERE
- C# = '004'
- AND score < 60
- ORDER BY
- score DESC;
- -- 50、删除“002”同学的“001”课程的成绩
- DELETE FROM
- SC
- WHERE
- S# = '002'
- AND C# = '001';
复制代码 图书表
本题用到下面三个关系表:
CARD 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级
BOOKS 图书。 BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库 存册数
BORROW 借书记载。 CNO 借书卡号,BNO 书号,RDATE 还书日期 备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。
- -- 1. 建立 BORROW 表的 SQL 语句,定义主码完整性约束和引用完整性约束
- CREATE TABLE BORROW (
- CNO int,
- BNO int,
- RDATE datetime,
- FOREIGN KEY (CNO) REFERENCES CARD(CNO),
- FOREIGN KEY (BNO) REFERENCES BOOKS(BNO),
- PRIMARY KEY (CNO, BNO)
- );
- -- 2. 找出借书超过5本的读者,输出借书卡号及所借图书册数
- SELECT
- CNO,
- COUNT(*) AS 借图书册数
- FROM
- BORROW
- GROUP BY
- CNO
- HAVING
- COUNT(*) > 5;
- -- 3. 查询借阅了"水浒"一书的读者,输出姓名及班级
- SELECT
- c.NAME,
- c.CLASS
- FROM
- CARD c
- WHERE
- EXISTS (
- SELECT 1
- FROM
- BORROW a
- JOIN
- BOOKS b ON a.BNO = b.BNO
- WHERE
- b.BNAME = N'水浒'
- AND a.CNO = c.CNO
- );
- -- 4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期
- SELECT
- CNO AS 借阅者卡号,
- BNO AS 书号,
- RDATE AS 还书日期
- FROM
- BORROW
- WHERE
- RDATE < GETDATE();
- -- 5. 查询书名包括"网络"关键词的图书,输出书号、书名、作者
- SELECT
- BNO,
- BNAME,
- AUTHOR
- FROM
- BOOKS
- WHERE
- BNAME LIKE N'%网络%';
- -- 6. 查询现有图书中价格最高的图书,输出书名及作者
- SELECT
- BNAME,
- AUTHOR
- FROM
- BOOKS
- WHERE
- PRICE = (SELECT MAX(PRICE) FROM BOOKS);
- -- 7. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序
- SELECT
- a.CNO
- FROM
- BORROW a
- JOIN
- BOOKS b ON a.BNO = b.BNO
- WHERE
- b.BNAME = N'计算方法'
- AND NOT EXISTS (
- SELECT 1
- FROM
- BORROW aa
- JOIN
- BOOKS bb ON aa.BNO = bb.BNO
- WHERE
- bb.BNAME = N'计算方法习题集'
- AND aa.CNO = a.CNO
- )
- ORDER BY
- a.CNO DESC;
- -- 8. 将"C01"班同学所借图书的还期都延长一周
- UPDATE b
- SET
- RDATE = DATEADD(Day, 7, b.RDATE)
- FROM
- CARD a
- JOIN
- BORROW b ON a.CNO = b.CNO
- WHERE
- a.CLASS = N'C01';
- -- 9. 从 BOOKS 表中删除当前无人借阅的图书记录
- DELETE FROM BOOKS
- WHERE
- NOT EXISTS (
- SELECT 1
- FROM BORROW
- WHERE BNO = BOOKS.BNO
- );
- -- 10. 如果经常按书名查询图书信息,建立合适的索引
- CREATE CLUSTERED INDEX IDX_BOOKS_BNAME ON BOOKS (BNAME);
- -- 11. 在 BORROW 表上建立触发器,保存借阅"数据库技术及应用"的读者记录到 BORROW_SAVE 表
- CREATE TRIGGER TR_SAVE ON BORROW
- AFTER INSERT, UPDATE
- AS
- BEGIN
- IF @@ROWCOUNT > 0
- BEGIN
- INSERT INTO BORROW_SAVE
- SELECT
- i.*
- FROM
- INSERTED i
- JOIN
- BOOKS b ON i.BNO = b.BNO
- WHERE
- b.BNAME = N'数据库技术及应用';
- END
- END;
- -- 12. 建立视图,显示"力01"班学生的借书信息(姓名和书名)
- CREATE VIEW V_VIEW AS
- SELECT
- a.NAME,
- b.BNAME AS 书名
- FROM
- BORROW ab
- JOIN
- CARD a ON ab.CNO = a.CNO
- JOIN
- BOOKS b ON ab.BNO = b.BNO
- WHERE
- a.CLASS = N'力01';
- -- 13. 查询当前同时借有"计算方法"和"组合数学"的读者,输出其借书卡号,并按卡号升序排序
- SELECT
- a.CNO
- FROM
- BORROW a
- JOIN
- BOOKS b ON a.BNO = b.BNO
- WHERE
- b.BNAME IN (N'计算方法', N'组合数学')
- GROUP BY
- a.CNO
- HAVING
- COUNT(DISTINCT b.BNAME) = 2
- ORDER BY
- a.CNO;
- -- 14. 假定在建 BOOKS 表时没有定义主码,写出为 BOOKS 表追加定义主码的语句
- ALTER TABLE BOOKS
- ADD PRIMARY KEY (BNO);
- -- 15.1 将 NAME 最大列宽增加到10个字符(假定原为6个字符)
- ALTER TABLE CARD
- ALTER COLUMN NAME varchar(10);
- -- 15.2 为该表增加1列 NAME(系名),可变长,最大20个字符
- ALTER TABLE CARD
- ADD 系名 varchar(20);
复制代码 管理表
为管理岗位业务培训信息,创建3个表:
S (S#,SN,SD,SA)
C (C#,CN )
SC ( S#,C#,G )
S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年事 C#,CN 分别代表课程编号、课程名称
S#,C#,G 分别代表学号、所选修的课程编号、学习成绩
- -- 1. 查询选修课程名称为’税收基础’的学员学号和姓名
- SELECT
- S.SN,
- S.SD
- FROM
- S
- WHERE
- S.[S#] IN (
- SELECT
- SC.[S#]
- FROM
- C,
- SC
- WHERE
- C.[C#] = SC.[C#]
- AND C.CN = N'税收基础'
- );
- -- 2. 查询选修课程编号为’C2’的学员姓名和所属单位
- SELECT
- S.SN,
- S.SD
- FROM
- S,
- SC
- WHERE
- S.[S#] = SC.[S#]
- AND SC.[C#] = 'C2';
- -- 3. 查询不选修课程编号为’C5’的学员姓名和所属单位
- SELECT
- SN,
- SD
- FROM
- S
- WHERE
- [S#] NOT IN (
- SELECT
- [S#]
- FROM
- SC
- WHERE
- [C#] = 'C5'
- );
- -- 4. 查询选修全部课程的学员姓名和所属单位
- -- 注意:此查询逻辑可能需要根据实际数据库结构进行调整,因为RIGHT JOIN和COUNT(DISTINCT [S#])的使用可能不是最优解
- SELECT
- SN,
- SD
- FROM
- S
- WHERE
- [S#] IN (
- SELECT
- [S#]
- FROM
- SC
- RIGHT JOIN
- C ON SC.[C#] = C.[C#]
- GROUP BY
- [S#]
- HAVING
- COUNT(*) = (SELECT COUNT(*) FROM C) -- 这里应该确保统计的是所有课程的数量
- );
- -- 5. 查询选修了课程的学员人数
- SELECT
- COUNT(DISTINCT [S#]) AS 学员人数
- FROM
- SC;
- -- 6. 查询选修课程超过5门的学员学号和所属单位
- SELECT
- SN,
- SD
- FROM
- S
- WHERE
- [S#] IN (
- SELECT
- [S#]
- FROM
- SC
- GROUP BY
- [S#]
- HAVING
- COUNT(DISTINCT [C#]) > 5
- );
- -- 以下是关于cj表的创建、数据插入和查询语句
- -- 如果cj表已存在,则删除它
- IF OBJECT_ID('cj') IS NOT NULL
- DROP TABLE cj;
- -- 创建cj表
- CREATE TABLE cj (
- stuName nvarchar(10),
- KCM nvarchar(10),
- cj numeric(5,2)
- );
- -- 向cj表中插入数据
- INSERT INTO cj
- SELECT '张三', '语文', 98
- UNION
- SELECT '李四', '语文', 89
- UNION
- SELECT '王五', '语文', 67
- UNION
- SELECT '周攻', '语文', 56
- UNION
- SELECT '张三', '数学', 89
- UNION
- SELECT '李四', '数学', 78
- UNION
- SELECT '王五', '数学', 90
- UNION
- SELECT '周攻', '数学', 87;
- -- 方法一: 查询每门课程中成绩不是最低的学员姓名
- SELECT
- stuname
- FROM (
- SELECT
- stuName,
- kcm,
- (SELECT COUNT(*) FROM cj WHERE stuname != a.stuname AND kcm = a.kcm AND cj > a.cj) cnt
- FROM
- cj a
- ) x
- GROUP BY
- stuname
- HAVING
- MAX(cnt) <= 1;
- -- 方法二: 查询每门课程中成绩排名前二的学员姓名(如果有重复成绩,则可能返回多于两名)
- SELECT
- stuname
- FROM
- cj a
- WHERE
- cj IN (
- SELECT TOP 2 cj
- FROM
- cj
- WHERE
- kcm = a.kcm
- ORDER BY
- cj DESC
- )
- GROUP BY
- stuname
- HAVING
- (COUNT(1) > 1);
- -- 方法三: 查询每门课程中成绩不是最差的学员姓名(另一种实现方式)
- SELECT DISTINCT
- stuname
- FROM
- cj a
- WHERE
- NOT EXISTS (
- SELECT
- kcm
- FROM
- cj b
- WHERE
- a.stuname = b.stuname
- AND (SELECT COUNT(*) FROM cj WHERE kcm = b.kcm AND stuname != a.stuname AND cj > b.cj) > 1
- );
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |