网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > SQL语法 > 正文

SQL经典制作

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
/*
    标题:一个项目涉及到的50个Sql语句(整理版)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2010-05-10
    地点:重庆航天职业
    说明:以下五十个语句都按照测试数据进行过测试,最好每次只单独运行一个语句。
    问题及描述:
    --1.学生表
    Student(S#,Sname,Sage,Ssex)--S#学生编号,Sname学生,Sage出生年月,Ssex学生性别
    --2.课程表
    Course(C#,Cname,T#)--C#--课程编号,Cname课程名称,T#教师编号
    --3.教师表
    Teacher(T#,Tname)--T#教师编号,Tname教师
    --4.成绩表
    SC(S#,C#,score)--S#学生编号,C#课程编号,score分数
    */
    --创建测试数据
    createtableStudent(S#varchar(10),Snamenvarchar(10),Sagedatetime,Ssexnvarchar(10))
    insertintoStudentvalues('01',N'赵雷','1990-01-01',N'男')
    insertintoStudentvalues('02',N'钱电','1990-12-21',N'男')
    insertintoStudentvalues('03',N'孙风','1990-05-20',N'男')
    insertintoStudentvalues('04',N'李云','1990-08-06',N'男')
    insertintoStudentvalues('05',N'周梅','1991-12-01',N'女')
    insertintoStudentvalues('06',N'吴兰','1992-03-01',N'女')
    insertintoStudentvalues('07',N'郑竹','1989-07-01',N'女')
    insertintoStudentvalues('08',N'王菊','1990-01-20',N'女')
    createtableCourse(C#varchar(10),Cnamenvarchar(10),T#varchar(10))
    insertintoCoursevalues('01',N'语文','02')
    insertintoCoursevalues('02',N'数学','01')
    insertintoCoursevalues('03',N'英语','03')
    createtableTeacher(T#varchar(10),Tnamenvarchar(10))
    insertintoTeachervalues('01',N'张三')
    insertintoTeachervalues('02',N'李四')
    insertintoTeachervalues('03',N'王五')
    createtableSC(S#varchar(10),C#varchar(10),scoredecimal(18,1))
    insertintoSCvalues('01','01',80)
    insertintoSCvalues('01','02',90)
    insertintoSCvalues('01','03',99)
    insertintoSCvalues('02','01',70)
    insertintoSCvalues('02','02',60)
    insertintoSCvalues('02','03',80)
    insertintoSCvalues('03','01',80)
    insertintoSCvalues('03','02',80)
    insertintoSCvalues('03','03',80)
    insertintoSCvalues('04','01',50)
    insertintoSCvalues('04','02',30)
    insertintoSCvalues('04','03',20)
    insertintoSCvalues('05','01',76)
    insertintoSCvalues('05','02',87)
    insertintoSCvalues('06','01',31)
    insertintoSCvalues('06','03',34)
    insertintoSCvalues('07','02',89)
    insertintoSCvalues('07','03',98)
    go
    --1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数
    --1.1、查询同时存在"01"课程和"02"课程的情况
    selecta.*,b.score[课程'01'的分数],c.score[课程'02'的分数]fromStudenta,SCb,SCc
    wherea.S#=b.S#anda.S#=c.S#andb.C#='01'andc.C#='02'andb.score>c.score
    --1.2、查询同时存在"01"课程和"02"课程的情况和存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)(以下存在相同内容时不再解释)
    selecta.*,b.score[课程"01"的分数],c.score[课程"02"的分数]fromStudenta
    leftjoinSCbona.S#=b.S#andb.C#='01'
    leftjoinSCcona.S#=c.S#andc.C#='02'
    whereb.score>isnull(c.score,0)
    --2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数
    --2.1、查询同时存在"01"课程和"02"课程的情况
    selecta.*,b.score[课程'01'的分数],c.score[课程'02'的分数]fromStudenta,SCb,SCc
    wherea.S#=b.S#anda.S#=c.S#andb.C#='01'andc.C#='02'andb.score    --2.2、查询同时存在"01"课程和"02"课程的情况和不存在"01"课程但存在"02"课程的情况
    selecta.*,b.score[课程"01"的分数],c.score[课程"02"的分数]fromStudenta
    leftjoinSCbona.S#=b.S#andb.C#='01'
    leftjoinSCcona.S#=c.S#andc.C#='02'
    whereisnull(b.score,0)    --3、查询平均成绩大于等于60分的同学的学生编号和学生和平均成绩
    selecta.S#,a.Sname,cast(avg(b.score)asdecimal(18,2))avg_score
    fromStudenta,scb
    wherea.S#=b.S#
    groupbya.S#,a.Sname
    havingcast(avg(b.score)asdecimal(18,2))>=60
    orderbya.S#
    --4、查询平均成绩小于60分的同学的学生编号和学生和平均成绩
    --4.1、查询在sc表存在成绩的学生信息的SQL语句。
    selecta.S#,a.Sname,cast(avg(b.score)asdecimal(18,2))avg_score
    fromStudenta,scb
    wherea.S#=b.S#
    groupbya.S#,a.Sname
    havingcast(avg(b.score)asdecimal(18,2))<60
    orderbya.S#
    --4.2、查询在sc表中不存在成绩的学生信息的SQL语句。
    selecta.S#,a.Sname,isnull(cast(avg(b.score)asdecimal(18,2)),0)avg_score
    fromStudentaleftjoinscb
    ona.S#=b.S#
    groupbya.S#,a.Sname
    havingisnull(cast(avg(b.score)asdecimal(18,2)),0)<60
    orderbya.S#
    --5、查询所有同学的学生编号、学生、选课总数、所有课程的总成绩
    --5.1、查询所有有成绩的SQL。
    selecta.S#[学生编号],a.Sname[学生],count(b.C#)选课总数,sum(score)[所有课程的总成绩]
    fromStudenta,SCb
    wherea.S#=b.S#
    groupbya.S#,a.Sname
    orderbya.S#
    --5.2、查询所有(包括有成绩和无成绩)的SQL。
    selecta.S#[学生编号],a.Sname[学生],count(b.C#)选课总数,sum(score)[所有课程的总成绩]
    fromStudentaleftjoinSCb
    ona.S#=b.S#
    groupbya.S#,a.Sname
    orderbya.S#
    --6、查询"李"姓老师的数量
    --方法1
    selectcount(Tname)["李"姓老师的数量]fromTeacherwhereTnamelikeN'李%'
    --方法2
    selectcount(Tname)["李"姓老师的数量]fromTeacherwhereleft(Tname,1)=N'李'
    /*
    "李"姓老师的数量
    -----------
    1
    */
    --7、查询学过"张三"老师授课的同学的信息
    selectdistinctStudent.*fromStudent,SC,Course,Teacher
    whereStudent.S#=SC.S#andSC.C#=Course.C#andCourse.T#=Teacher.T#andTeacher.Tname=N'张三'
    orderbyStudent.S#
    --8、查询没学过"张三"老师授课的同学的信息
    selectm.*fromStudentmwhereS#notin(selectdistinctSC.S#fromSC,Course,TeacherwhereSC.C#=Course.C#andCourse.T#=Teacher.T#andTeacher.Tname=N'张三')orderbym.S#
    --9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
    --方法1
    selectStudent.*fromStudent,SCwhereStudent.S#=SC.S#andSC.C#='01'andexists(Select1fromSCSC_2whereSC_2.S#=SC.S#andSC_2.C#='02')orderbyStudent.S#
    --方法2
    selectStudent.*fromStudent,SCwhereStudent.S#=SC.S#andSC.C#='02'andexists(Select1fromSCSC_2whereSC_2.S#=SC.S#andSC_2.C#='01')orderbyStudent.S#
    --方法3
    selectm.*fromStudentmwhereS#in
    (
    selectS#from
    (
    selectdistinctS#fromSCwhereC#='01'
    unionall
    selectdistinctS#fromSCwhereC#='02'
    )tgroupbyS#havingcount(1)=2
    )
    orderbym.S#
    --10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
    --方法1
    selectStudent.*fromStudent,SCwhereStudent.S#=SC.S#andSC.C#='01'andnotexists(Select1fromSCSC_2whereSC_2.S#=SC.S#andSC_2.C#='02')orderbyStudent.S#
    --方法2
    selectStudent.*fromStudent,SCwhereStudent.S#=SC.S#andSC.C#='01'andStudent.S#notin(SelectSC_2.S#fromSCSC_2whereSC_2.S#=SC.S#andSC_2.C#='02')orderbyStudent.S#
    --11、查询没有学全所有课程的同学的信息
    --11.1、
    selectStudent.*
    fromStudent,SC
    whereStudent.S#=SC.S#
    groupbyStudent.S#,Student.Sname,Student.Sage,Student.Ssexhavingcount(C#)<(selectcount(C#)fromCourse)
    --11.2
    selectStudent.*
    fromStudentleftjoinSC
    onStudent.S#=SC.S#
    groupbyStudent.S#,Student.Sname,Student.Sage,Student.Ssexhavingcount(C#)<(selectcount(C#)fromCourse)
    --12、查询至少有一门课与为"01"的同学所学相同的同学的信息
    selectdistinctStudent.*fromStudent,SCwhereStudent.S#=SC.S#andSC.C#in(selectC#fromSCwhereS#='01')andStudent.S#<>'01'
    --13、查询和"01"号的同学学习的课程完全相同的其他同学的信息
    selectStudent.*fromStudentwhereS#in
    (selectdistinctSC.S#fromSCwhereS#<>'01'andSC.C#in(selectdistinctC#fromSCwhereS#='01')
    groupbySC.S#havingcount(1)=(selectcount(1)fromSCwhereS#='01'))
    --14、查询没学过"张三"老师讲授的任一门课程的学生
    selectstudent.*fromstudentwherestudent.S#notin
    (selectdistinctsc.S#fromsc,course,teacherwheresc.C#=course.C#andcourse.T#=teacher.T#andteacher.tname=N'张三')
    orderbystudent.S#
    --15、查询两门及其以上不及格课程的同学的,及其平均成绩
    selectstudent.S#,student.sname,cast(avg(score)asdecimal(18,2))avg_scorefromstudent,sc
    wherestudent.S#=SC.S#andstudent.S#in(selectS#fromSCwherescore<60groupbyS#havingcount(1)>=2)
    groupbystudent.S#,student.sname
    --16、检索"01"课程分数小于60,按分数降序排列的学生信息
    selectstudent.*,sc.C#,sc.scorefromstudent,sc
    wherestudent.S#=SC.S#andsc.score<60andsc.C#='01'
    orderbysc.scoredesc
    --17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
    --17.1SQL2000静态
    selecta.S#学生编号,a.Sname学生,
    max(casec.CnamewhenN'语文'thenb.scoreelsenullend)[语文],
    max(casec.CnamewhenN'数学'thenb.scoreelsenullend)[数学],
    max(casec.CnamewhenN'英语'thenb.scoreelsenullend)[英语],
    cast(avg(b.score)asdecimal(18,2))平均分
    fromStudenta
    leftjoinSCbona.S#=b.S#
    leftjoinCourseconb.C#=c.C#
    groupbya.S#,a.Sname
    orderby平均分desc
    --17.2SQL2000动态
    declare@sqlnvarchar(4000)
    set@sql='selecta.S#'+N'学生编号'+',a.Sname'+N'学生'
    select@sql=@sql+',max(casec.CnamewhenN'''+Cname+'''thenb.scoreelsenullend)['+Cname+']'
    from(selectdistinctCnamefromCourse)ast
    set@sql=@sql+',cast(avg(b.score)asdecimal(18,2))'+N'平均分'+'fromStudentaleftjoinSCbona.S#=b.S#leftjoinCourseconb.C#=c.C#
    groupbya.S#,a.Snameorderby'+N'平均分'+'desc'
    exec(@sql)
    --17.3有关sql2005的动静态写法参见我的文章《普通行列转换(version2.0)》或《普通行列转换(version3.0)》。
    18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
    --及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
    --方法1
    selectm.C#[课程编号],m.Cname[课程名称],
    max(n.score)[最高分],
    min(n.score)[最低分],
    cast(avg(n.score)asdecimal(18,2))[平均分],
    cast((selectcount(1)fromSCwhereC#=m.C#andscore>=60)*100.0/(selectcount(1)fromSCwhereC#=m.C#)asdecimal(18,2))[及格率(%)],
    cast((selectcount(1)fromSCwhereC#=m.C#andscore>=70andscore<80)*100.0/(selectcount(1)fromSCwhereC#=m.C#)asdecimal(18,2))[中等率(%)],
    cast((selectcount(1)fromSCwhereC#=m.C#andscore>=80andscore<90)*100.0/(selectcount(1)fromSCwhereC#=m.C#)asdecimal(18,2))[优良率(%)],
    cast((selectcount(1)fromSCwhereC#=m.C#andscore>=90)*100.0/(selectcount(1)fromSCwhereC#=m.C#)asdecimal(18,2))[优秀率(%)]
    fromCoursem,SCn
    wherem.C#=n.C#
    groupbym.C#,m.Cname
    orderbym.C#
    --方法2
    selectm.C#[课程编号],m.Cname[课程名称],
    (selectmax(score)fromSCwhereC#=m.C#)[最高分],
    (selectmin(score)fromSCwhereC#=m.C#)[最低分],
    (selectcast(avg(score)asdecimal(18,2))fromSCwhereC#=m.C#)[平均分],
    cast((selectcount(1)fromSCwhereC#=m.C#andscore>=60)*100.0/(selectcount(1)fromSCwhereC#=m.C#)asdecimal(18,2))[及格率(%)],
    cast((selectcount(1)fromSCwhereC#=m.C#andscore>=70andscore<80)*100.0/(selectcount(1)fromSCwhereC#=m.C#)asdecimal(18,2))[中等率(%)],
    cast((selectcount(1)fromSCwhereC#=m.C#andscore>=80andscore<90)*100.0/(selectcount(1)fromSCwhereC#=m.C#)asdecimal(18,2))[优良率(%)],
    cast((selectcount(1)fromSCwhereC#=m.C#andscore>=90)*100.0/(selectcount(1)fromSCwhereC#=m.C#)asdecimal(18,2))[优秀率(%)]
    fromCoursem
    orderbym.C#
    --19、按各科成绩进行排序,并显示排名
    --19.1sql2000用子查询完成
    --Score重复时保留名次空缺
    selectt.*,px=(selectcount(1)fromSCwhereC#=t.C#andscore>t.score)+1fromsctorderbyt.c#,px
    --Score重复时合并名次
    selectt.*,px=(selectcount(distinctscore)fromSCwhereC#=t.C#andscore>=t.score)fromsctorderbyt.c#,px
    --19.2sql2005用rank,DENSE_RANK完成
    --Score重复时保留名次空缺(rank完成)
    selectt.*,px=rank()over(partitionbyc#orderbyscoredesc)fromsctorderbyt.C#,px
    --Score重复时合并名次(DENSE_RANK完成)
    selectt.*,px=DENSE_RANK()over(partitionbyc#orderbyscoredesc)fromsctorderbyt.C#,px
    --20、查询学生的总成绩并进行排名
    --20.1查询学生的总成绩
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(sum(score),0)[总成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    orderby[总成绩]desc
    --20.2查询学生的总成绩并进行排名,sql2000用子查询完成,分总分重复时保留名次空缺和不保留名次空缺两种。
    selectt1.*,px=(selectcount(1)from
    (
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(sum(score),0)[总成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    )t2where总成绩>t1.总成绩)+1from
    (
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(sum(score),0)[总成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    )t1
    orderbypx
    selectt1.*,px=(selectcount(distinct总成绩)from
    (
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(sum(score),0)[总成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    )t2where总成绩>=t1.总成绩)from
    (
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(sum(score),0)[总成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    )t1
    orderbypx
    --20.3查询学生的总成绩并进行排名,sql2005用rank,DENSE_RANK完成,分总分重复时保留名次空缺和不保留名次空缺两种。
    selectt.*,px=rank()over(orderby[总成绩]desc)from
    (
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(sum(score),0)[总成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    )t
    orderbypx
    selectt.*,px=DENSE_RANK()over(orderby[总成绩]desc)from
    (
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(sum(score),0)[总成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    )t
    orderbypx
    --21、查询不同老师所教不同课程平均分从高到低显示
    selectm.T#,m.Tname,cast(avg(o.score)asdecimal(18,2))avg_score
    fromTeacherm,Coursen,SCo
    wherem.T#=n.T#andn.C#=o.C#
    groupbym.T#,m.Tname
    orderbyavg_scoredesc
    --22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
    --22.1sql2000用子查询完成
    --Score重复时保留名次空缺
    select*from(selectt.*,px=(selectcount(1)fromSCwhereC#=t.C#andscore>t.score)+1fromsct)mwherepxbetween2and3orderbym.c#,m.px
    --Score重复时合并名次
    select*from(selectt.*,px=(selectcount(distinctscore)fromSCwhereC#=t.C#andscore>=t.score)fromsct)mwherepxbetween2and3orderbym.c#,m.px
    --22.2sql2005用rank,DENSE_RANK完成
    --Score重复时保留名次空缺(rank完成)
    select*from(selectt.*,px=rank()over(partitionbyc#orderbyscoredesc)fromsct)mwherepxbetween2and3orderbym.C#,m.px
    --Score重复时合并名次(DENSE_RANK完成)
    select*from(selectt.*,px=DENSE_RANK()over(partitionbyc#orderbyscoredesc)fromsct)mwherepxbetween2and3orderbym.C#,m.px
    --23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比
    --23.1统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]
    --横向显示
    selectCourse.C#[课程编号],Cnameas[课程名称],
    sum(casewhenscore>=85then1else0end)[85-100],
    sum(casewhenscore>=70andscore<85then1else0end)[70-85],
    sum(casewhenscore>=60andscore<70then1else0end)[60-70],
    sum(casewhenscore<60then1else0end)[0-60]
    fromsc,Course
    whereSC.C#=Course.C#
    groupbyCourse.C#,Course.Cname
    orderbyCourse.C#
    --纵向显示1(显示存在的分数段)
    selectm.C#[课程编号],m.Cname[课程名称],分数段=(
    casewhenn.score>=85then'85-100'
    whenn.score>=70andn.score<85then'70-85'
    whenn.score>=60andn.score<70then'60-70'
    else'0-60'
    end),
    count(1)数量
    fromCoursem,scn
    wherem.C#=n.C#
    groupbym.C#,m.Cname,(
    casewhenn.score>=85then'85-100'
    whenn.score>=70andn.score<85then'70-85'
    whenn.score>=60andn.score<70then'60-70'
    else'0-60'
    end)
    orderbym.C#,m.Cname,分数段
    --纵向显示2(显示存在的分数段,不存在的分数段用0显示)
    selectm.C#[课程编号],m.Cname[课程名称],分数段=(
    casewhenn.score>=85then'85-100'
    whenn.score>=70andn.score<85then'70-85'
    whenn.score>=60andn.score<70then'60-70'
    else'0-60'
    end),
    count(1)数量
    fromCoursem,scn
    wherem.C#=n.C#
    groupbyallm.C#,m.Cname,(
    casewhenn.score>=85then'85-100'
    whenn.score>=70andn.score<85then'70-85'
    whenn.score>=60andn.score<70then'60-70'
    else'0-60'
    end)
    orderbym.C#,m.Cname,分数段
    --23.2统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[<60]及所占百分比
    --横向显示
    selectm.C#课程编号,m.Cname课程名称,
    (selectcount(1)fromSCwhereC#=m.C#andscore<60)[0-60],
    cast((selectcount(1)fromSCwhereC#=m.C#andscore<60)*100.0/(selectcount(1)fromSCwhereC#=m.C#)asdecimal(18,2))[百分比(%)],
    (selectcount(1)fromSCwhereC#=m.C#andscore>=60andscore<70)[60-70],
    cast((selectcount(1)fromSCwhereC#=m.C#andscore>=60andscore<70)*100.0/(selectcount(1)fromSCwhereC#=m.C#)asdecimal(18,2))[百分比(%)],
    (selectcount(1)fromSCwhereC#=m.C#andscore>=70andscore<85)[70-85],
    cast((selectcount(1)fromSCwhereC#=m.C#andscore>=70andscore<85)*100.0/(selectcount(1)fromSCwhereC#=m.C#)asdecimal(18,2))[百分比(%)],
    (selectcount(1)fromSCwhereC#=m.C#andscore>=85)[85-100],
    cast((selectcount(1)fromSCwhereC#=m.C#andscore>=85)*100.0/(selectcount(1)fromSCwhereC#=m.C#)asdecimal(18,2))[百分比(%)]
    fromCoursem
    orderbym.C#
    --纵向显示1(显示存在的分数段)
    selectm.C#[课程编号],m.Cname[课程名称],分数段=(
    casewhenn.score>=85then'85-100'
    whenn.score>=70andn.score<85then'70-85'
    whenn.score>=60andn.score<70then'60-70'
    else'0-60'
    end),
    count(1)数量,
    cast(count(1)*100.0/(selectcount(1)fromscwhereC#=m.C#)asdecimal(18,2))[百分比(%)]
    fromCoursem,scn
    wherem.C#=n.C#
    groupbym.C#,m.Cname,(
    casewhenn.score>=85then'85-100'
    whenn.score>=70andn.score<85then'70-85'
    whenn.score>=60andn.score<70then'60-70'
    else'0-60'
    end)
    orderbym.C#,m.Cname,分数段
    --纵向显示2(显示存在的分数段,不存在的分数段用0显示)
    selectm.C#[课程编号],m.Cname[课程名称],分数段=(
    casewhenn.score>=85then'85-100'
    whenn.score>=70andn.score<85then'70-85'
    whenn.score>=60andn.score<70then'60-70'
    else'0-60'
    end),
    count(1)数量,
    cast(count(1)*100.0/(selectcount(1)fromscwhereC#=m.C#)asdecimal(18,2))[百分比(%)]
    fromCoursem,scn
    wherem.C#=n.C#
    groupbyallm.C#,m.Cname,(
    casewhenn.score>=85then'85-100'
    whenn.score>=70andn.score<85then'70-85'
    whenn.score>=60andn.score<70then'60-70'
    else'0-60'
    end)
    orderbym.C#,m.Cname,分数段
    --24、查询学生平均成绩及其名次
    --24.1查询学生的平均成绩并进行排名,sql2000用子查询完成,分平均成绩重复时保留名次空缺和不保留名次空缺两种。
    selectt1.*,px=(selectcount(1)from
    (
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(cast(avg(score)asdecimal(18,2)),0)[平均成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    )t2where平均成绩>t1.平均成绩)+1from
    (
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(cast(avg(score)asdecimal(18,2)),0)[平均成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    )t1
    orderbypx
    selectt1.*,px=(selectcount(distinct平均成绩)from
    (
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(cast(avg(score)asdecimal(18,2)),0)[平均成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    )t2where平均成绩>=t1.平均成绩)from
    (
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(cast(avg(score)asdecimal(18,2)),0)[平均成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    )t1
    orderbypx
    --24.2查询学生的平均成绩并进行排名,sql2005用rank,DENSE_RANK完成,分平均成绩重复时保留名次空缺和不保留名次空缺两种。
    selectt.*,px=rank()over(orderby[平均成绩]desc)from
    (
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(cast(avg(score)asdecimal(18,2)),0)[平均成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    )t
    orderbypx
    selectt.*,px=DENSE_RANK()over(orderby[平均成绩]desc)from
    (
    selectm.S#[学生编号],
    m.Sname[学生],
    isnull(cast(avg(score)asdecimal(18,2)),0)[平均成绩]
    fromStudentmleftjoinSCnonm.S#=n.S#
    groupbym.S#,m.Sname
    )t
    orderbypx
    
    --25、查询各科成绩前三名的记录
    --25.1分数重复时保留名次空缺
    selectm.*,n.C#,n.scorefromStudentm,SCnwherem.S#=n.S#andn.scorein
    (selecttop3scorefromscwhereC#=n.C#orderbyscoredesc)orderbyn.C#,n.scoredesc
    --25.2分数重复时不保留名次空缺,合并名次
    --sql2000用子查询实现
    select*from(selectt.*,px=(selectcount(distinctscore)fromSCwhereC#=t.C#andscore>=t.score)fromsct)mwherepxbetween1and3orderbym.c#,m.px
    --sql2005用DENSE_RANK实现
    select*from(selectt.*,px=DENSE_RANK()over(partitionbyc#orderbyscoredesc)fromsct)mwherepxbetween1and3orderbym.C#,m.px
    --26、查询每门课程被选修的学生数
    selectc#,count(S#)[学生数]fromscgroupbyC#
    --27、查询出只有两门课程的全部学生的和
    selectStudent.S#,Student.Sname
    fromStudent,SC
    whereStudent.S#=SC.S#
    groupbyStudent.S#,Student.Sname
    havingcount(SC.C#)=2
    orderbyStudent.S#
    
    --28、查询男生、女生人数
    selectcount(Ssex)as男生人数fromStudentwhereSsex=N'男'
    selectcount(Ssex)as女生人数fromStudentwhereSsex=N'女'
    selectsum(casewhenSsex=N'男'then1else0end)[男生人数],sum(casewhenSsex=N'女'then1else0end)[女生人数]fromstudent
    selectcasewhenSsex=N'男'thenN'男生人数'elseN'女生人数'end[男女情况],count(1)[人数]fromstudentgroupbycasewhenSsex=N'男'thenN'男生人数'elseN'女生人数'end
    --29、查询名字中含有"风"字的学生信息
    select*fromstudentwheresnamelikeN'%风%'
    select*fromstudentwherecharindex(N'风',sname)>0
    --30、查询同名同性学生名单,并统计同名人数
    selectSname[学生],count(*)[人数]fromStudentgroupbySnamehavingcount(*)>1
    
    --31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime)
    select*fromStudentwhereyear(sage)=1990
    select*fromStudentwheredatediff(yy,sage,'1990-01-01')=0
    select*fromStudentwheredatepart(yy,sage)=1990
    select*fromStudentwhereconvert(varchar(4),sage,120)='1990'
    --32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
    selectm.C#,m.Cname,cast(avg(n.score)asdecimal(18,2))avg_score
    fromCoursem,SCn
    wherem.C#=n.C#
    groupbym.C#,m.Cname
    orderbyavg_scoredesc,m.C#asc
    --33、查询平均成绩大于等于85的所有学生的、和平均成绩
    selecta.S#,a.Sname,cast(avg(b.score)asdecimal(18,2))avg_score
    fromStudenta,scb
    wherea.S#=b.S#
    groupbya.S#,a.Sname
    havingcast(avg(b.score)asdecimal(18,2))>=85
    orderbya.S#
    --34、查询课程名称为"数学",且分数低于60的学生和分数
    selectsname,score
    fromStudent,SC,Course
    whereSC.S#=Student.S#andSC.C#=Course.C#andCourse.Cname=N'数学'andscore<60
    --35、查询所有学生的课程及分数情况;
    selectStudent.*,Course.Cname,SC.C#,SC.score
    fromStudent,SC,Course
    whereStudent.S#=SC.S#andSC.C#=Course.C#
    orderbyStudent.S#,SC.C#
    --36、查询任何一门课程成绩在70分以上的、课程名称和分数;
    selectStudent.*,Course.Cname,SC.C#,SC.score
    fromStudent,SC,Course
    whereStudent.S#=SC.S#andSC.C#=Course.C#andSC.score>=70
    orderbyStudent.S#,SC.C#
    --37、查询不及格的课程
    selectStudent.*,Course.Cname,SC.C#,SC.score
    fromStudent,SC,Course
    whereStudent.S#=SC.S#andSC.C#=Course.C#andSC.score<60
    orderbyStudent.S#,SC.C#
    --38、查询课程编号为01且课程成绩在80分以上的学生的和;
    selectStudent.*,Course.Cname,SC.C#,SC.score
    fromStudent,SC,Course
    whereStudent.S#=SC.S#andSC.C#=Course.C#andSC.C#='01'andSC.score>=80
    orderbyStudent.S#,SC.C#
    --39、求每门课程的学生人数
    selectCourse.C#,Course.Cname,count(*)[学生人数]
    fromCourse,SC
    whereCourse.C#=SC.C#
    groupbyCourse.C#,Course.Cname
    orderbyCourse.C#,Course.Cname
    --40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩
    --40.1当最高分只有一个时
    selecttop1Student.*,Course.Cname,SC.C#,SC.score
    fromStudent,SC,Course,Teacher
    whereStudent.S#=SC.S#andSC.C#=Course.C#andCourse.T#=Teacher.T#andTeacher.Tname=N'张三'
    orderbySC.scoredesc
    --40.2当最高分出现多个时
    selectStudent.*,Course.Cname,SC.C#,SC.score
    fromStudent,SC,Course,Teacher
    whereStudent.S#=SC.S#andSC.C#=Course.C#andCourse.T#=Teacher.T#andTeacher.Tname=N'张三'and
    SC.score=(selectmax(SC.score)fromSC,Course,TeacherwhereSC.C#=Course.C#andCourse.T#=Teacher.T#andTeacher.Tname=N'张三')
    --41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
    --方法1
    selectm.*fromSCm,(selectC#,scorefromSCgroupbyC#,scorehavingcount(1)>1)n
    wherem.C#=n.C#andm.score=n.scoreorderbym.C#,m.score,m.S#
    --方法2
    selectm.*fromSCmwhereexists(select1from(selectC#,scorefromSCgroupbyC#,scorehavingcount(1)>1)n
    wherem.C#=n.C#andm.score=n.score)orderbym.C#,m.score,m.S#
    --42、查询每门功成绩最好的前两名
    selectt.*fromsctwherescorein(selecttop2scorefromscwhereC#=T.C#orderbyscoredesc)orderbyt.C#,t.scoredesc
    --43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
    selectCourse.C#,Course.Cname,count(*)[学生人数]
    fromCourse,SC
    whereCourse.C#=SC.C#
    groupbyCourse.C#,Course.Cname
    havingcount(*)>=5
    orderby[学生人数]desc,Course.C#
    --44、检索至少选修两门课程的学生
    selectstudent.S#,student.Sname
    fromstudent,SC
    wherestudent.S#=SC.S#
    groupbystudent.S#,student.Sname
    havingcount(1)>=2
    orderbystudent.S#
    --45、查询选修了全部课程的学生信息
    --方法1根据数量来完成
    selectstudent.*fromstudentwhereS#in
    (selectS#fromscgroupbyS#havingcount(1)=(selectcount(1)fromcourse))
    --方法2使用双重否定来完成
    selectt.*fromstudenttwheret.S#notin
    (
    selectdistinctm.S#from
    (
    selectS#,C#fromstudent,course
    )mwherenotexists(select1fromscnwheren.S#=m.S#andn.C#=m.C#)
    )
    --方法3使用双重否定来完成
    selectt.*fromstudenttwherenotexists(select1from
    (
    selectdistinctm.S#from
    (
    selectS#,C#fromstudent,course
    )mwherenotexists(select1fromscnwheren.S#=m.S#andn.C#=m.C#)
    )kwherek.S#=t.S#
    )
    --46、查询各学生的年龄
    --46.1只按照年份来算
    select*,datediff(yy,sage,getdate())[年龄]fromstudent
    --46.2按照出生日期来算,当前月日<出生年月的月日则,年龄减一
    select*,casewhenright(convert(varchar(10),getdate(),120),5)    --47、查询本周过生日的学生
    select*fromstudentwheredatediff(week,datename(yy,getdate())+right(convert(varchar(10),sage,120),6),getdate())=0
    --48、查询下周过生日的学生
    select*fromstudentwheredatediff(week,datename(yy,getdate())+right(convert(varchar(10),sage,120),6),getdate())=-1
    --49、查询本月过生日的学生
    select*fromstudentwheredatediff(mm,datename(yy,getdate())+right(convert(varchar(10),sage,120),6),getdate())=0
    --50、查询下月过生日的学生
    select*fromstudentwheredatediff(mm,datename(yy,getdate())+right(convert(varchar(10),sage,120),6),getdate())=-1
    droptableStudent,Course,Teacher,SC
    
  • 下一篇资讯: SQL经典制作(1)
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师