当前位置:文档之家› 博文雅集

博文雅集

博文雅集
IT 业聚集了众多世界上最聪明的人,它富有活力,充满了机遇,挑战。这就是为什么 IT 业如 此艰难,仍然有那么多人投身于其中的原因。 学生表、课程表、 成绩表、教师表 50 个常用 sql 语句
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
--Student(S#,Sname,Sage,Ssex) --学生表 --Course(C#,Cname,T#) --课程表 --SC(S#,C#,score) --成绩表 --Teacher(T#,Tname) --教师表 create table Student(S# varchar(20),Sname varchar(10),Sage int,Ssex varchar(2)) --前面加一列序号: if exists(select table_name from information_schema.tables where table_name='Temp_Table') drop table Temp_Table go select 排名=identity(int,1,1),* INTO Temp_Table from Student go select * from Temp_Table go drop database [ ] --删除空的没有名字的数据库 --问题: --1、查询“”课程比“”课程成绩高的所有学生的学号; 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、查询平均成绩大于分的同学的学号和平均成绩; select S#,avg(score) from sc

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
group by S# having avg(score) >60; --3、查询所有同学的学号、姓名、选课数、总成绩; select Student.S#,Student.Sname,count(SC.C#),sum(score) from Student left Outer join SC on Student.S#=SC.S# group by Student.S#,Sname --4、查询姓“李”的老师的个数; select count(distinct(Tname)) 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、查询学过“”并且也学过编号“”课程的同学的学号、姓名; select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * 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、查询课程编号“”的成绩比课程编号“”课程低的所有同学的学号、 姓名; 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') score2 from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2

74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 10 0 10 1 10 2 10 3 10 4 10 5 10 6 10 7 10 8
and 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、查询至少有一门课与学号为“”的同学所学相同的同学的学号和姓 名; select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001'; --12、查询至少学过学号为“”同学所有一门课的其他同学学号和姓名; select distinct SC.S#,Sname from Student,SC where Student.S#=SC.S# and C# in (select C# from SC where S#='001'); --13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成 绩; update SC set score=(select avg(SC_2.score) from SC SC_2 where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平'); --14、查询和“”号的同学学习的课程完全相同的其他同学学号和姓名; 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'); --15、删除学习“叶平”老师课的 SC 表记录; Delect SC from course ,Teacher where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平 '; --16、向 SC 表中插入一些记录,这些记录要求符合以下条件:没有上过编 号“”课程的同学学号、、 号课的平均成绩; Insert SC select S#,'002',(Select avg(score) from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');

10 9 11 0 11 1 11 2 11 3 11 4 11 5 11 6 11 7 11 8 11 9 12 0 12 1 12 2 12 3 12 4 12 5 12 6 12 7 12 8 12 9 13 0
--17、 按平均成绩从高到低显示所有学生的“数据库”、 “企业管理”、 “英 语”三门的课程成绩,按如下形式显示:学生 ID,,数据库,企业管理,英语, 有效课程数,有效平均分 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) --18、查询各科成绩最高和最低的分:以如下形式显示:课程 ID,最高分, 最低分 SELECT L.C# As 课程 ID,L.score AS 最高分,R.score AS 最低分 FROM SC L ,SC AS R WHERE L.C# = R.C# and L.score = (SELECT MAX(IL.score) FROM SC AS IL,Student AS IM WHERE L.C# = IL.C# and IM.S#=IL.S# GROUP BY IL.C#) AND R.Score = (SELECT MIN(IR.score) FROM SC AS IR WHERE R.C# = IR.C# GROUP BY IR.C# ); --19、按各科平均成绩从低到高和及格率的百分数从高到低顺序 SELECT t.C# AS 课程号,max(https://www.doczj.com/doc/1210662766.html,ame)AS 课程 名,isnull(AVG(score),0) AS 平均成绩 ,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数 FROM SC T,Course where t.C#=course.C# GROUP BY t.C# ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC --20、查询如下课程平均成绩和及格率的百分数(用"1 行"显示): 企业管理 (),马克思(),OO&UML (),数据库()

13 1 13 2 13 3 13 4 13 5 13 6 13 7 13 8 13 9 14 0 14 1 14 2 14 3 14 4 14 5 14 6 14 7 14 8 14 9 15 0 15 1 15 2
SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 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 企业管理及格百分 数 ,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 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 马克思及格百分数 ,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 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 及格百分数 ,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 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(https://www.doczj.com/doc/1210662766.html,ame) AS 课程名称,AVG(Score) AS 平均成绩 FROM SC AS T,Course AS C ,Teacher AS Z where T.C#=C.C# and C.T#=Z.T# GROUP BY C.C# ORDER BY AVG(Score) DESC --22、查询如下课程成绩第名到第名的学生成绩单:企业管理(),马克思 (),UML (),数据库() [学生 ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩 SELECT DISTINCT top 3 SC.S# As 学生学号, Student.Sname AS 学生姓名, T1.score AS 企业管理, T2.score AS 马克思, T3.score AS UML, T4.score AS 数据库, ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分 FROM Student,SC LEFT JOIN SC AS T1 ON SC.S# = T1.S# AND T1.C# = '001' LEFT JOIN SC AS T2 ON SC.S# = T2.S# AND T2.C# = '002' LEFT JOIN SC AS T3

15 3 15 4 15 5 15 6 15 7 15 8 15 9 16 0 16 1 16 2 16 3 16 4 16 5 16 6 16 7 16 8 16 9 17 0 17 1 17 2 17 3 17 4
ON SC.S# = T3.S# AND T3.C# = '003' LEFT JOIN SC AS T4 ON SC.S# = T4.S# AND T4.C# = '004' WHERE student.S#=SC.S# and ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) NOT IN (SELECT DISTINCT TOP 15 WITH TIES ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) FROM sc LEFT JOIN sc AS T1 ON sc.S# = T1.S# AND T1.C# = 'k1' LEFT JOIN sc AS T2 ON sc.S# = T2.S# AND T2.C# = 'k2' LEFT JOIN sc AS T3 ON sc.S# = T3.S# AND T3.C# = 'k3' LEFT JOIN sc AS T4 ON sc.S# = T4.S# AND T4.C# = 'k4' ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC); --23、统计列印各科成绩,各分数段人数:课程 ID,课程名 称,[100-85],[85-70],[70-60],[ <60] SELECT SC.C# as 课程 ID, Cname as 课程名称 ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85] ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70] ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60] ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -] FROM SC,Course where SC.C#=Course.C# GROUP BY SC.C#,Cname; --24、查询学生平均成绩及其名次 SELECT 1+(SELECT COUNT( distinct 平均成绩) FROM (SELECT S#,AVG(score) AS 平均成绩 FROM SC GROUP BY S# ) AS T1

17 5 17 6 17 7 17 8 17 9 18 0 18 1 18 2 18 3 18 4 18 5 18 6 18 7 18 8 18 9 19 0 19 1 19 2 19 3 19 4 19 5 19 6
WHERE 平均成绩> T2.平均成绩) as 名次, S# as 学生学号,平均成绩 FROM (SELECT S#,AVG(score) 平均成绩 FROM SC GROUP BY S# ) AS T2 ORDER BY 平均成绩 desc; --25、查询各科成绩前三名的记录:(不考虑成绩并列情况) SELECT t1.S# as 学生 ID,t1.C# as 课程 ID,Score as 分数 FROM SC t1 WHERE score IN (SELECT TOP 3 score FROM SC WHERE t1.C#= C# ORDER BY score DESC ) ORDER BY t1.C#; --26、查询每门课程被选修的学生数 select c#,count(S#) from sc group by C#; --27、查询出只选修了一门课程的全部学生的学号和姓名 select SC.S#,Student.Sname,count(C#) AS 选课数 from SC ,Student where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1; --28、查询男生、女生人数 Select count(Ssex) as 男生人数 from Student group by Ssex having Ssex='男'; Select count(Ssex) as 女生人数 from Student group by Ssex having Ssex='女'; --29、查询姓“张”的学生名单 SELECT Sname FROM Student WHERE Sname like '张%'; --30、查询同名同性学生名单,并统计同名人数 select Sname,count(*) from Student group by Sname having count(*)>1;; --31、年出生的学生名单(注:Student 表中 Sage 列的类型是 datetime) select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age from student where CONVERT(char(11),DATEPART(year,Sage))='1981';

19 7 19 8 19 9 20 0 20 1 20 2 20 3 20 4 20 5 20 6 20 7 20 8 20 9 21 0 21 1 21 2 21 3 21 4 21 5 21 6 21 7 21 8
--32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同 时,按课程号降序排列 Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ; --33、查询平均成绩大于的所有学生的学号、姓名和平均成绩 select Sname,SC.S# ,avg(score) from Student,SC where Student.S#=SC.S# group by SC.S#,Sname having avg(score)>85; --34、查询课程名称为“数据库”,且分数低于的学生姓名和分数 Select Sname,isnull(score,0) from Student,SC,Course where SC.S#=Student.S# and SC.C#=Course.C# and https://www.doczj.com/doc/1210662766.html,ame=' 数据库'and score <60; --35、查询所有学生的选课情况; SELECT SC.S#,SC.C#,Sname,Cname FROM SC,Student,Course where SC.S#=Student.S# and SC.C#=Course.C# ; --36、查询任何一门课程成绩在分以上的姓名、课程名称和分数; SELECT distinct student.S#,student.Sname,SC.C#,SC.score FROM student,Sc WHERE SC.score>=70 AND SC.S#=student.S#; --37、查询不及格的课程,并按课程号从大到小排列 select c# from sc where scor e <60 order by C# ; --38、查询课程编号为且课程成绩在分以上的学生的学号和姓名; select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003'; --39、求选了课程的学生人数 select count(*) from sc; --40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其 成绩 select Student.Sname,score from Student,SC,Course C,Teacher where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='叶平' and SC.score=(select max(score)from SC where

21 9 22 0 22 1 22 2 22 3 22 4 22 5 22 6 22 7 22 8 22 9 23 0 23 1 23 2 23 3 23 4 23 5 23 6 23 7 23 8 23 9 24 0
C#=C.C# ); --41、查询各个课程及相应的选修人数 select count(*) from sc group by C#; --42、查询不同课程成绩相同的学生的学号、课程号、学生成绩 select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# <>B.C# ; --43、查询每门功成绩最好的前两名 SELECT t1.S# as 学生 ID,t1.C# as 课程 ID,Score as 分数 FROM SC t1 WHERE score IN (SELECT TOP 2 score FROM SC WHERE t1.C#= C# ORDER BY score DESC ) ORDER BY t1.C#; --44、统计每门课程的学生选修人数(超过人的课程才统计)。要求输出课 程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若 人数相同,按课程号升序排列 select C# as 课程号,count(*) as 人数 from sc group by C# order by count(*) desc,c# --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#) --47、查询没学过“叶平”老师讲授的任一门课程的学生姓名 select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='叶平'); --48、查询两门以上不及格课程的同学的学号及其平均成绩

24 1 24 2 24 3 24 4 24 5 24 6 24 7 24 8 24 9 25 0 25 1 25 2 25 3 25 4 25 5 25 6 25 7 25 8 25 9 26 0 26 1 26 2
select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#; --49、检索“”课程分数小于,按分数降序排列的同学学号 select S# from SC where C#='004'and score <60 order by score desc; --50、删除“”同学的“”课程的成绩 delete from Sc where S#='001'and C#='001'; --学生表(学号、姓名、性别、年龄、所在系) --课程表(课程号、课程名、先修课号、学分) --学生选课表(学号、课程号、成绩) --1:查询全体学生的学号和姓名 --2:查询全体学生的姓名、学号和所在系 --3: 查询全体学生的详细记录
--4: 查询全体学生的姓名及其出生年份 --5:查询全体学生姓名、出生年份和所在系,要求用小写字母表示所有系 名 --6:查询选修了课程的学生学号 --7:查询计算机系(IS)所有学生的名单 --8:查询所有年龄在 20 以下学生的姓名和年龄 --9: 查询考试成绩有不及格的学生的学号
--10: 查询年龄在 20-23 (包括 20 和 23) 之间的学生的姓名、 系别和年龄 --11: 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名 和性别 --12: 查询学号为 95001 的学生的详细情况 --13: 查询所有姓林的学生的姓名、学号和性别 --14: 查询姓“欧阳”且全名为三个汉字的学生的姓名 --15:查询名字中第二个字为“燕”字的学生姓名和学号

26 3 26 4 26 5 26 6 26 7 26 8 26 9 27 0 27 1 27 2 27 3 27 4 27 5 27 6 27 7 27 8 27 9 28 0 28 1 28 2 28 3 28 4
--16:查询所有不姓“刘”的学生的姓名 --17:查询课程名为“DB_DESIGN”的课程号的学分 --18:查询缺少成绩的学生的学号和相应的课程号(成绩字段值为 Null) --19: 查询所有有成绩的学生的学号和课程号 --20: 查询所有计算机系年龄在 20 以下的学生姓名 --21: 查询选修了 3 号课程的学生的学号和成绩, 查询结果按分数降序排列 --22: 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的 学生按年龄降序排列 --23: 查询学生总人数 --24: 查询选修了课程的学生人数 --25: 计算 1 号课程的学生的平均成绩 --26: 计算 1 号课程的学生的最高成绩分数 --27:求各个课程号及相应的选课人数 --28: 查询选修了三门以上课程的学生学号
--29:查询每个学生及其选修课情况 --30:查询每一门课的间接先行课 --31:选修 2 号课程且成绩在 90 以上的学生的学号和姓名 --32:查询每个学生的学号、姓名、选修的课程名及成绩 --33:查询与’林燕芳’在同一个系学习的学生姓名 --34: 查询其他系中比信息系某一学生小的学生姓名和年龄 --35:查询所有选修了 1 号课程的学生的学生姓名 --36:查询选修了全部课程的学生姓名

28 5 28 6 28 7 28 8 28 9 29 0 29 1 29 2 29 3 29 4 29 5 29 6 29 7 29 8 29 9 30 0 30 1 30 2 30 3 30 4 30 5 30 6
--37:至少选修了学生 95002 选修全部课程的学生号码 select Sno,Sname from Student select Sno,Sname,Sdept from Student select * from Student /*也可以逐一列出列名并用逗号分隔*/ --其中 getdate 是获取当前系统时间。 这是一个获取到的结果 : 2008-12-11 16:02:17.967 --datepart 从获取到的系统时间中分离出需要的部分,这里是分离出年份, 更多信息请查看 SQL Server 联机帮助 --下面的 出生年 指定了别名来替代原来结果页出现的文字 select Sname , (datepart( year,getdate())- Sage) '出生年' from Student --该实例利用了小写转换函数 lower() 提示:通过查询分析器的 公用对象 的 字符串函数中你可以找到这个函数 select Sname '姓名' , (datepart( year,getdate())- Sage) '出生年 ',lower(Sdept) '所在系' from Student select Sno from sc --这里将返回全部结果,有重复的值
select distinct Sno from sc--加入关键字 distinct 就可以去除重复结 果,只留 1 个 --sql 中默认对字符串大小写不敏感的, 所以下面的 sdept=’IS’你也可以 写成 sdept=’is’。如果你要启用大小写敏感,可以用下面的方法 if 敏感 select * from table where field1="AAA" COLLATE Ch inese_PRC_CS_AS else select * from table where field1="AAA" COLLATE C hinese_PRC_CI_AS COLLATE 的中文排序规则参数可用下列方式查到 SELECT * FROM ::fn_helpcollations() where name like ' Chinese%' select Sname from student where sdept='IS'

30 7 30 8 30 9 31 0 31 1 31 2 31 3 31 4 31 5 31 6 31 7 31 8 31 9 32 0 32 1 32 2 32 3 32 4 32 5 32 6 32 7 32 8
select Sname,Sage from student where Sage<20 select Sno from sc where grade<60 --如果要查询不在这个区间的记录,那只要改成 not between 就可以了 select Sname,Sdept,Sage from student where Sage between 20 and 23 --如果要查询不属于信息系、数学系和计算机科学系的,可以在 in 前面加 上 NOT --也可以这样子写:select Sname,Ssex from student where Sdept='is' or sdept='ma' or sdept='cs' select Sname,Ssex from student where Sdept in('IS','MA','CS') --或者是 select * from student where sno = '95001' select * from student where sno like '95001':--like 用于字符串匹配 --百分号匹配多个字符,包括 0 个 select Sname,Sno,Sage from student where sname like '林%'
-- 一个下划线匹配单个字符 select sname from student where sname like '欧阳_' select sname,sno from student where sname like '_燕%' select sname from student where sname not like '刘%' select Ccredit from course where cname like 'DB\_DESIGN' escape'\' --注意:这里不用使用 = null select sno,cno from sc where grade is null
select sno,cno from sc where grade is not null select sname from student where sdept='CS' and sage<20 select sno,grade from sc where cno=3 order by grade desc

32 9 33 0 33 1 33 2 33 3 33 4 33 5 33 6 33 7 33 8 33 9 34 0 34 1 34 2 34 3 34 4 34 5 34 6 34 7 34 8 34 9 35 0
select * from student order by sdept,sage desc select count(*) from student select count(distinct sno) from sc select avg(grade) from sc where cno='1' select max(grade) from sc where cno='1' group by 按照它后面的列值进行分组,相同的值被分在一组 select cno,count(sno) from sc group by cno --having 后面的条件是根据 group by 分组后的结果再进行筛选,最后只给 出满足条件的分组 --where 筛选的对象是整个表,而 having 则是分组 select sno from sc group by sno having count(sno)>=3 select a.sname,https://www.doczj.com/doc/1210662766.html,o from student a ,sc b where a.sno=b.sno 或者 select a.sname,https://www.doczj.com/doc/1210662766.html,o from student a left outer join sc b on a.sno=b.sno where https://www.doczj.com/doc/1210662766.html,o is not null --自身连接 select https://www.doczj.com/doc/1210662766.html,o,b.Cpno from course a,course b where a.Cpno=https://www.doczj.com/doc/1210662766.html,o --31: select student.sno,student.sname from student,sc where student.sno=sc.sno and https://www.doczj.com/doc/1210662766.html,o='2' and

35 1 35 2 35 3 35 4 35 5 35 6 35 7 35 8 35 9 36 0 36 1 36 2 36 3 36 4 36 5 36 6 36 7 36 8 36 9 37 0 37 1 37 2
sc.grade>=90 --32: select student.sno,student.sname,https://www.doczj.com/doc/1210662766.html,ame,sc.grade from (student left join sc on student.sno=sc.sno) left join course on https://www.doczj.com/doc/1210662766.html,o=https://www.doczj.com/doc/1210662766.html,o --或者: --忽略 cname 和 grade 都为 null 的行 Select student.sno,sname,cname,grade From student,sc,course Where student.sno=sc.sno and https://www.doczj.com/doc/1210662766.html,o=https://www.doczj.com/doc/1210662766.html,o --33: select sname from student where sdept=(select sdept from student where sname='林燕芳') --34: select sname,sage from student where sage'IS' --35:利用 exists 的查询 --exists 根据是否存在行返回 true/false

37 3 37 4 37 5 37 6 37 7 37 8 37 9 38 0 38 1 38 2 38 3 38 4 38 5 38 6 38 7 38 8 38 9 39 0 39 1 39 2 39 3 39 4
--如果要查询没有选修 1 号课程的学生姓名,只要使用 NOT Exists 即可 select * from student where exists( select 1 from sc where student.sno=sc.sno and cno='1' ) --或者你可以使用连接查询 select * from student left join sc on student.sno=sc.sno where https://www.doczj.com/doc/1210662766.html,o='1' --36: declare @temp1 int declare @temp2 int select @temp1=count(*) from course select @temp2=sno from sc group by sno having count(sno)=@temp1 select sname from student where sno in (@temp2) --或者 --就是转换成查询没有一门课程没有选修的学生姓名 --如果把两个 not 都去掉就是查询所有有选修课程的学生 Select sname from student where not exists( Select 1 from course where not exists(

39 5 39 6 39 7 39 8 39 9 40 0 40 1 40 2 40 3 40 4 40 5 40 6 40 7 40 8 40 9 41 0 41 1 41 2 41 3 41 4 41 5 41 6
Select 1 from sc where student.sno=sc.sno and https://www.doczj.com/doc/1210662766.html,o=https://www.doczj.com/doc/1210662766.html,o ) ) --37: --同样要进行转换:查询这样的学生,没有 95002 选修的课程而学生 X 没有 选修的 Select distinct sno From sc scx Where not exists ( Select 1 from sc scy Where scy.sno='95002' and not exists ( Select 1 from sc scz Where scz.sno=scx.sno and https://www.doczj.com/doc/1210662766.html,o=https://www.doczj.com/doc/1210662766.html,o ) ) and sno!='95002' --插入语句: --对每一个系求平均年龄,并把结果存入数据库 --需要创建一个表用来存储结果 Create table Deptage (

41 7 41 8 41 9 42 0 42 1 42 2 42 3 42 4 42 5 42 6 42 7 42 8 42 9 43 0 43 1 43 2 43 3 43 4 43 5 43 6 43 7 43 8
Sdept char(15), Avgage smallint ); --插入子查询结果 insert into Deptage(Sdept,Avgage) select sdept,avg(sage) from student group by sdept --查看结果 select * from deptage --修改语句; --1:将学生 95001 的年龄改为 22 岁 Update student Set sage=22 Where sno='95001'--注意如果不带 where,则修改全部记录 --2:将所有的学生年龄加 1 岁(修改多个元组的值) Update student Set sage=sage+1; --3:将计算机系全体同学的成绩置零(带子查询的修改语句) Update sc Set grade=0

43 9 44 0 44 1 44 2 44 3 44 4 44 5 44 6 44 7 44 8 44 9 45 0 45 1 45 2 45 3 45 4 45 5 45 6 45 7 45 8 45 9 46 0
Where 'cs'=( Select sdept from student Where student.sno=sc.sno) --删除语句: --1:删除学号为 95009 的学生记录(删除后将无法回复) Delete from student Where sno='95009'--没有加 where 的话将删除该表全部记录 --2:删除计算机科学系所有学生的选课记录 Delete from sc Where 'cs'=( Select sdept From student Where student.sno=sc.sno ) --例 1:查询至少选秀 1 号课程和 3 号课程号的学生号码。 --答案 select a.学号 from sc a,sc b where a.学号=b.学号 and a.课程号='1' and b.课程号='3' --例 2:查询至少选修了一门直接先行课为 5 号课程的学生姓名。 --答案: select 姓名 from student where 学号 in( SELECT [学号] FROM [test].[dbo].[SC] where 课程号 in(SELECT 课程号 from Course where 先行课='5'))

46 1 46 2 46 3 46 4 46 5 46 6 46 7 46 8 46 9 47 0 47 1 47 2 47 3 47 4 47 5 47 6 47 7 47 8 47 9 48 0 48 1 48 2
--例子 3:查询选修了全部课程的学生号码和姓名。 declare @t1 int declare @t2 int select @t2=count(*) from Course select @t1=学号 from SC group by 学号 having count(学号)=@t2
--print '@t1='+cast(@t1 as varchar) Select 学号,姓名 from student where 学号=@t1
--例子 4:查询信息系年龄最大的三个学生的学号及其年龄,结果按年龄降 序排列。 select top 3 龄 desc 学号,年龄 from Student where 所在系='IS' order by 年
--例子 5:查询选修了 2 号课程的学生名字 select 姓名 from student where 学号 in( select 学号 from sc where 课 程号=2) --例子 6:查询成绩为 90 分以上的学生名字和课程名字 select st.姓名,c.课程名 from student st left join sc s on st.学号 =s.学号 left join Course c on s.课程号=c.课程号 where st.学号 in (select st.学号 from sc where s.成绩>=90)
sql 取中间几条记录(select top 表达式) --查询从第 M 条至 N 条的记录,写到存储过程中就是输入参数 declare @m int-declare @n int-declare @x int declare @y int

相关主题
文本预览
相关文档 最新文档