1.SQL语句查询出每门课都大于80分的学生姓名
namekechengfenshu张三语文81张三数学75李四语文76李四数学90王五语文81王五数学100王五英语90
SQL1:selectdistinctnamefromtablewherenamein(selectdistinctnamefromtablewherefenshu>80)
SQL2:selectnamefromtablegroupbynamehavingmin(fenshu)>80
2.学生表如下:自动编号学号姓名课程编号课程名称分数12005001张三0001数学6922005002李四0001数学8932005001张三0001数学69
删除除了自动编号不同,其他都相同的学生冗余信息
SQL:deletetablenamewhere自动编号notin(selectmin(自动编号)fromtablenamegroupby学号,姓名,课程编号,课程名称,分数)
3.请用SQL语句实现:从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。请注意:TestDB中有很多科目,都有1-12月份的发生额。AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。数据库名:JcyAudit,数据集:Select*fromTestDB
SQL:selecta.*fromTestDBa,(selectOccmonth,max(DebitOccur)Debit101ccurfromTestDBwhereAccID='101'groupbyOccmonth)bwherea.Occmonth=b.Occmonthanda.DebitOccur>b.Debit101ccur
4.怎么把这样一个表yearmonthamount199111.1199121.2199131.3199141.4199212.1199222.2199232.3199242.4查成这样一个结果yearm1m2m3m419911.11.21.31.419922.12.22.32.4
SQL:selectyear,(selectamountfromaaamwheremonth=1andm.year=aaa.year)asm1,(selectamountfromaaamwheremonth=2andm.year=aaa.year)asm2,(selectamountfromaaamwheremonth=3andm.year=aaa.year)asm3,(selectamountfromaaamwheremonth=4andm.year=aaa.year)asm4fromaaagroupbyyear
5.复制表(只复制结构,源表名:a新表名:b)
SQL:select*intobfromawhere1<>1
6.拷贝表(拷贝数据,源表名:a目标表名:b)
SQL:insertintob(a,b,c)selectd,e,ffromb;
SQL:selecta.title,a.username,b.adddatefromtablea,(selectmax(adddate)adddatefromtablewheretable.title=a.title)b
8.外连接查询(表名1:a表名2:b)
SQL:selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOINbONa.a=b.c
9.日程安排提前五分钟提醒
10.两张关联表,删除主表中已经在副表中没有的信息
SQL:deletefrominfowherenotexists(select*frominfobzwhereinfo.infid=infobz.infid)
SQL:
SELECTa.userper,a.tel,a.standfee,TO_CHAR(a.telfeedate,'yyyy')AStelyear,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'01',a.factration))ASJAN,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'02',a.factration))ASFRI,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'03',a.factration))ASMAR,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'04',a.factration))ASAPR,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'05',a.factration))ASMAY,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'06',a.factration))ASJUE,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'07',a.factration))ASJUL,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'08',a.factration))ASAGU,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'09',a.factration))ASSEP,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'10',a.factration))ASOCT,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'11',a.factration))ASNOV,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'12',a.factration))ASDEC
FROM(SELECTa.userper,a.tel,a.standfee,b.telfeedate,b.factration
FROMTELFEESTANDa,TELFEEb
WHEREa.tel=b.telfax)a
GROUPBYa.userper,a.tel,a.standfee,TO_CHAR(a.telfeedate,'yyyy')
12.四表联查问题:
SQL:select*fromaleftinnerjoinbona.a=b.brightinnerjoincona.a=c.cinnerjoindona.a=d.dwhere.....
13.得到表中最小的未使用的ID号
SELECT(CASEWHENEXISTS(SELECT*FROMHandlebWHEREb.HandleID=1)THENMIN(HandleID)+1ELSE1END)asHandleID
FROMHandle
WHERENOTHandleIDIN(SELECTa.HandleID-1FROMHandlea)
14.表数据如下IDstuidstatus11001320014234315523642573331想得到下面结果stuid总数100,200,2343,3334
SQL:
SELECTstuff(Select','+convert(nvarchar(100),stuid)fromtableawherestatus=1orderbystuidFORXMLPATH('')),1,1,'')
ASstuid,count(*)as总数fromtableaasawherestatus=1
15.原表:courseidcoursenamescore-------------------------------------1java702oracle903xml404jsp305servlet80-------------------------------------为了便于阅读,查询此表后的结果显式如下(及格分数为60):courseidcoursenamescoremark---------------------------------------------------1java70pass2oracle90pass3xml40fail4jsp30fail5servlet80pass---------------------------------------------------写出此查询语句。
selectcourseid,coursename,score,
'mark'=CASEWHENscore>=60THEN'pass'WHENscore<60THEN'fail'
ENDfromtablea
16.原表:idproidproname11M12F21N22G31B32A
查询后的表:idpro1pro21MF2NG3BA
selectdistinctid,
(selectpronamefromtableaawhereproid=1anda.id=tablea.id)aspro1,
(selectpronamefromtableaawhereproid=2anda.id=tablea.id)aspro2
fromtablea
17.原表a:a1a21a1b2x2y2z查询后的表:ida31ab2xyzSQL用FORXMLPATH()实现
selectdistinct(select''+a2fromawherea1=1FORXMLPATH(''))as'1',(select''+a2fromawherea1=2FORXMLPATH(''))as'2'froma
18.行转列
姓名课程分数
-------------------------------
张三语文74
张三数学83
张三物理93
李四语文74
李四数学84
李四物理94
变成
姓名语文数学物理
-------------------------------------------
李四748494
张三748393
SQL1:
select姓名,
max(case课程when'语文'then分数else0end)语文,
max(case课程when'数学'then分数else0end)数学,
max(case课程when'物理'then分数else0end)物理
fromtb
groupby姓名
SQL2:select*fromtbpivot(max(分数)for课程in(语文,数学,物理))a
19.行转列结果加上总分、平均分
姓名语文数学物理总分平均分
------------------------------------------------------
李四74849425284.00
张三74839325083.33
max(case课程when'物理'then分数else0end)物理,
sum(分数)总分,
cast(avg(分数*1.0)asdecimal(18,2))平均分
20.列转行
-------------------------
select*from
(
select姓名,课程='语文',分数=语文fromtb
unionall
select姓名,课程='数学',分数=数学fromtb
select姓名,课程='物理',分数=物理fromtb
)t
orderby姓名,case课程when'语文'then1when'数学'then2when'物理'then3end
21.获取不同name的最小的year和最小的month的其中的id字段
yearmonthidname2014101a201492a2013123a201314a201325a2014106b201597b2012128b201219b2012210b20141011b20151112b20131213c2013114c2013215c
结果:
yearmonthidname201314a201219b2013114c
select*from(select*,row_number()over(partitionbynameorderbyyears)asnfromtablesa)twheret.n=1
22.如图,如何将表A和表B合并成表C。记得sql有一个关键字可以实现,可怎么就是想不起来了。(不使用ISNULL()来设定固定值)
selectb.Cate_no,a.Size_no,a.Size_name,isnull(c.Qty,0)'Qty'from(selectdistinctCate_nofrom表B)bcrossjoin表Aaleftjoin表Bconb.Cate_no=c.Cate_noanda.Size_no=c.Size_no
23.题为:有两个表,t1,t2,Tablet1:
SELLER|NON_SELLER----------
ABACADBABCBDCACBCDDADBDC
Tablet2:
SELLER|COUPON|BAL-----------------------A9100B9200C9300D9400A9.5100B9.520A1080
要求用SELECT语句列出如下结果:
------如A的SUM(BAL)为B,C,D的和,B的SUM(BAL)为A,C,D的和.......且用的方法不要增加数据库负担,如用临时表等.
NON-SELLER|COUPON|SUM(BAL)---------------A9900B9800C9700D9600A9.520B9.5100C9.5120D9.5120A100B1080C1080D1080
SQL:未找到
***********************************************************************************
24.问题:
一百个账户各有100$,某个账户某天如有支出则添加一条新记录,记录其余额。一百天后,请输出每天所有账户的余额信息
这个问题的难点在于每个用户在某天可能有多条纪录,也可能一条纪录也没有(不包括第一天)
返回的记录集是一个100天*100个用户的纪录集
思路:
1.创建表并插入测试数据:我们要求username从1-100CREATETABLE[dbo].[TABLE2]([username][varchar](50)NOTNULL,--用户名[outdate][datetime]NOTNULL,--日期[cash][float]NOTNULL--余额)ON[PRIMARY
declare@iintset@i=1while@i<=100begininserttable2values(convert(varchar(50),@i),'2001-10-1',100)inserttable2values(convert(varchar(50),@i),'2001-11-1',50)set@i=@i+1endinserttable2values(convert(varchar(50),@i),'2001-10-1',90)
select*fromtable2orderbyoutdate,convert(int,username)
2.组合查询语句:a.我们必须返回一个从第一天开始到100天的纪录集:如:2001-10-1(这个日期是任意的)到2002-1-8由于第一天是任意一天,所以我们需要下面的SQL语句:selecttop100dateadd(d,convert(int,username)-1,min(outdate))asoutdatefromtable2groupbyusernameorderbyconvert(int,username)这里的奥妙在于:convert(int,username)-1(记得我们指定用户名从1-100:-))groupbyusername,min(outdate):第一天就可能每个用户有多个纪录。返回的结果:outdate------------------------------------------------------2001-10-0100:00:00.000.........2002-01-0800:00:00.000
b.返回一个所有用户名的纪录集:selectdistinctusernamefromtable2返回结果:username--------------------------------------------------110100......99
c.返回一个100天记录集和100个用户记录集的笛卡尔集合:select*from(selecttop100dateadd(d,convert(int,username)-1,min(outdate))asoutdatefromtable2groupbyusernameorderbyconvert(int,username)
)asACROSSjoin(selectdistinctusernamefromtable2)asBorderbyoutdate,convert(int,username)返回结果100*100条纪录:outdateusername2001-10-0100:00:00.0001......2002-01-0800:00:00.000100
d.返回当前所有用户在数据库的有的纪录:selectoutdate,username,min(cash)ascashfromtable2groupbyoutdate,username
orderbyoutdate,convert(int,username)返回纪录:outdateusernamecash2001-10-0100:00:00.000190......2002-01-0800:00:00.00010050
e.将c中返回的笛卡尔集和d中返回的纪录做leftjoin:selectC.outdate,C.username,D.cashfrom(select*from(selecttop100dateadd(d,convert(int,username)-1,min(outdate))asoutdatefromtable2groupbyusernameorderbyconvert(int,username))asACROSSjoin(selectdistinctusernamefromtable2)asB)asCleftjoin(selectoutdate,username,min(cash)ascashfromtable2groupbyoutdate,username)asDon(C.username=D.usernameanddatediff(d,C.outdate,D.outdate)=0)
orderbyC.outdate,convert(int,C.username)注意:用户在当天如果没有纪录,cash字段返回NULL,否则cash返回每个用户当天的余额outdateusernamecash2001-10-0100:00:00.0001902001-10-0100:00:00.0002100......2001-10-0200:00:00.000190
2001-10-0200:00:00.0002NULL<--注意这里......
2002-01-0800:00:00.00010050
f.好了,现在我们最后要做的就是,如果cash为NULL,我们要返回小于当前纪录日期的第一个用户余额(由于我们使用orderbycash,所以返回top1纪录即可,使用min应该也可以),这个余额即为当前的余额:caseisnull(D.cash,0)when0then(selecttop1cashfromtable2wheretable2.username=C.usernameanddatediff(d,C.outdate,table2.outdate)<0orderbytable2.cash)elseD.cashendascash
g.最后组合的完整语句就是selectC.outdate,C.username,caseisnull(D.cash,0)when0then(selecttop1cashfromtable2wheretable2.username=C.usernameanddatediff(d,C.outdate,table2.outdate)<0orderbytable2.cash)elseD.cashendascashfrom(select*from(selecttop100dateadd(d,convert(int,username)-1,min(outdate))asoutdatefromtable2groupbyusernameorderbyconvert(int,username))asACROSSjoin(selectdistinctusernamefromtable2)asB)asCleftjoin(selectoutdate,username,min(cash)ascashfromtable2groupbyoutdate,username)asDon(C.username=D.usernameanddatediff(d,C.outdate,D.outdate)=0)
orderbyC.outdate,convert(int,C.username)
返回结果:outdateusernamecash2001-10-0100:00:00.0001902001-10-0100:00:00.0002100......2002-01-0800:00:00.00010050
25.取出sql表中第31到40的记录(以自动增长ID为主键)
SQL1:selecttop10*fromtwhereidnotin(selecttop30idfromtorderbyid)ordebyid
SQL2:selecttop10*fromtwhereidin(selecttop40idfromtorderbyid)orderbyiddesc
26.有表a存储二叉树的节点,要用一条sql语句查出所有节点及节点所在的层.表ac1c2A----------1--------/\ABBC--------2AC//\BDDNE------3CE/\\DFFKI---4EIDKCN
所要得到的结果如下
jdcs---------A1B2C2D3N3E3F4K4I4有高手指导一下,我只能用pl/sql写出来,请教用一条sql语句的写法
SQL:selectc2,level+1lv
fromteststart
withc1='A'connectbyc1=priorc2
union
select'A',1fromdual
orderbylv;
C2LV------------A1B2C2D3E3N3F4I4K4
已选择9行。
27.表内容:2005-05-09胜2005-05-09胜2005-05-09负2005-05-09负2005-05-10胜2005-05-10负2005-05-10负
如果要生成下列结果,该如何写sql语句
日期胜负2005-05-09222005-05-1012
SQL1:selectrq,sum(casewhenshengfu='胜'then1else0end)'胜',sum(casewhenshengfu='负'then1else0end)'负'from#tmpgroupbyrq
SQL2:selectN.rq,N.勝,M.負from(selectrq,勝=count(*)from#tmpwhereshengfu='胜'groupbyrq)Ninnerjoin(selectrq,負=count(*)from#tmpwhereshengfu='负'groupbyrq)MonN.rq=M.rq
SQL3:selecta.col001,a.a1胜,b.b1负from(selectcol001,count(col001)a1fromtemp1wherecol002='胜'groupbycol001)a,(selectcol001,count(col001)b1fromtemp1wherecol002='负'groupbycol001)bwherea.col001=b.col001
28.表中有ABC三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
SQL:select(casewhena>bthenaelsebend),(casewhenb>cthenbeslecend)fromtable_name
SQL:select*fromtbwheredatediff(dd,SendTime,getdate())=0
30.一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。显示格式:语文数学英语及格优秀不及格
select(casewhen语文>=80then'优秀'when语文>=60then'及格'else'不及格')as语文,(casewhen数学>=80then'优秀'when数学>=60then'及格'else'不及格')as数学,(casewhen英语>=80then'优秀'when英语>=60then'及格'else'不及格')as英语,fromtable
31.在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型,并解释下两者的区别
用户临时表:createtable#xx(IDint,IDValuesint)系统临时表:createtable##xx(IDint,IDValuesint)
区别:用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的.当创建它的进程消失时这个临时表就自动删除.
全局临时表对整个SQLServer实例都可见,但是所有访问它的Session都消失的时候,它也自动删除
32.Sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。
它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQLServer的存储容量是可以扩大的.
SQLServer2000数据库有三种类型的文件:
主要数据文件主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是.mdf。
次要数据文件次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是.ndf。
日志文件日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是.ldf。
33.从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。如使用存储过程也可以。
table1
月份mon部门dep业绩yj-------------------------------一月份0110一月份0210一月份035二月份028二月份049三月份038
table2
部门dep部门名称dname--------------------------------01国内业务一部02国内业务二部03国内业务三部04国际业务部
table3(result)
部门dep一月份二月份三月份--------------------------------------0110nullnull02108null03null5804nullnull9
SQL1:selecta.部门名称dname,b.业绩yjas'一月份',c.业绩yjas'二月份',d.业绩yjas'三月份'fromtable1a,table2b,table2c,table2dwherea.部门dep=b.部门depandb.月份mon='一月份'anda.部门dep=c.部门depandc.月份mon='二月份'anda.部门dep=d.部门depandd.月份mon='三月份'and
SQL2:selecta.dep,sum(casewhenb.mon=1thenb.yjelse0end)as'一月份',sum(casewhenb.mon=2thenb.yjelse0end)as'二月份',sum(casewhenb.mon=3thenb.yjelse0end)as'三月份',sum(casewhenb.mon=4thenb.yjelse0end)as'四月份',sum(casewhenb.mon=5thenb.yjelse0end)as'五月份',sum(casewhenb.mon=6thenb.yjelse0end)as'六月份',sum(casewhenb.mon=7thenb.yjelse0end)as'七月份',sum(casewhenb.mon=8thenb.yjelse0end)as'八月份',sum(casewhenb.mon=9thenb.yjelse0end)as'九月份',sum(casewhenb.mon=10thenb.yjelse0end)as'十月份',sum(casewhenb.mon=11thenb.yjelse0end)as'十一月份',sum(casewhenb.mon=12thenb.yjelse0end)as'十二月份',fromtable2aleftjointable1bona.dep=b.dep
34.一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。
selectid,Count(*)fromtbgroupbyidhavingcount(*)>1select*from(selectcount(ID)ascountfromtablegroupbyID)TwhereT.count>1
35.drop,delete,truncate区别drop隐式提交,不能回滚,删除表结构及所有从数据,将表所占空间全部释放。删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。delete逐行删除,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作。truncate删除所有数据,TRUNCATE不记录日志,表结构及其列、约束、索引等保持不变。
36.select1,count(1)两个用法?select1fromtable增加临时列,每行的列值是写在select后的数,这条sql语句中是1count(1)表的行数
37.exists介绍1.子查询与外表的字段有关系时select字段1,字段2from表1whereexists(select字段1,字段2from表2where表2.字段2=表1.字段2)这时候,此SQL语句相当于一个关联查询。它先执行表1的查询,然后把表1中的每一条记录放到表2的条件中去查询,如果存在,则显示此条记录2.子查询与外表的字段没有任何关联Select字段1,字段2from表1whereexists(select*from表2where表2.字段=‘条件‘)在这种情况下,只要子查询的条件成立,就会查询出表1中的所有记录,反之,如果子查询中没有查询到记录,则表1不会查询出任何的记录。当子查询与主表不存在关联关系时,简单认为只要exists为一个条件判断,如果为true,就输出所有记录。如果为false则不输出任何的记录。
38.exists与in区别?in是在内存里遍历比较,而exists需要查询数据库,所以当B表数据量较大时,exists效率优于in。exists()会执行A.length次,它并不缓存exists()结果集,因为exists()结果集的内容并不重要,重要的是其内查询语句的结果集空或者非空,空则返回false,非空则返回true。外表大,用IN;内表大,用EXISTSnotin和notexists如果查询语句使用了notin那么内外表都进行全表扫描,没有用到索引;而notextsts的子查询依然能用到表上的索引。所以无论那个表大,用notexists都比notin要快。
39.on与where区别?on条件是在生成临时表时使用的条件where条件是在临时表生成好后,再对临时表进行过滤的条件on后的条件用来生成左右表关联的临时表,where后的条件对临时表中的记录进行过滤。
41.优化修改删除语句如果你同时修改或删除过多数据,会造成cpu利用率过高从而影响别人对数据库的访问。
42.根据如下三张表查询
S(SNO,SNAME)学生关系。SNO为学号,SNAME为姓名C(CNO,CNAME,CTEACHER)课程关系。CNO为课程号,CNAME为课程名,CTEACHER为任课教师SC(SNO,CNO,SCGRADE)选课关系。SCGRADE为成绩
1).找出没有选修过“李明”老师讲授课程的所有学生姓名
SelectSNAMEFROMSWhereNOTEXISTS(Select*FROMSC,CWhereSC.CNO=C.CNOANDCNAME='李明'ANDSC.SNO=S.SNO)
2).列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩
SelectS.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)FROMS,SC,(SelectSNOFROMSCWhereSCGRADE<60GROUPBYSNOHAVINGCOUNT(DISTINCTCNO)>=2)AWhereS.SNO=A.SNOANDSC.SNO=A.SNOGROUPBYS.SNO,S.SNAME
3).列出既学过“1”号课程,又学过“2”号课程的所有学生姓名
SelectS.SNO,S.SNAMEFROMS,(SelectSC.SNOFROMSC,CWhereSC.CNO=C.CNOANDC.CNAMEIN('1','2')GROUPBYSNOHAVINGCOUNT(DISTINCTCNO)=2)SCWhereS.SNO=SC.SNO
4).列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号
SelectS.SNO,S.SNAMEFROMS,(SelectSC1.SNOFROMSCSC1,CC1,SCSC2,CC2WhereSC1.CNO=C1.CNOANDC1.NAME='1'ANDSC2.CNO=C2.CNOANDC2.NAME='2'ANDSC1.SCGRADE>SC2.SCGRADE)SCWhereS.SNO=SC.SNO
5).列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩
SelectS.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩]FROMS,(SelectSC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADEFROMSCSC1,CC1,SCSC2,CC2WhereSC1.CNO=C1.CNOANDC1.NAME='1'ANDSC2.CNO=C2.CNOANDC2.NAME='2'ANDSC1.SCGRADE>SC2.SCGRADE)SCWhereS.SNO=SC.SNO
6).求其中同一个号码的两次通话之间间隔大于10秒的通话记录ID
selectsum(销售金额),datename(week,销售日期-1)fromsaleswhere销售日期betweebegindateandenddategroupbydatename(week,销售日期-1)
8).使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名
selects#,snfromswhereS#in(selectS#fromc,scwherec.c#=sc.c#andcn=’税收基础’)
9).使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位
selectsn,sdfroms,scwheres.s#=sc.s#andsc.c#=’c2’
10).使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位
selectsn,sdfromswheres#notin(selects#fromscwherec#=’c5’)
11).查询选修了课程的学员人数
select学员人数=count(distincts#)fromsc
12).查询选修课程超过5门的学员学号和所属单位
selectsn,sdfromswheres#in(selects#fromscgroupbys#havingcount(distinctc#)>5)
13).查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不是连续增长的列
selecttop10*fromAwhereID>(selectmax(ID)from(selecttop30IDfromAorderbyA)T)orderbyA
14).查询表A中存在ID重复三次以上的记录
SELECT*fromAWHEREIDin(selectIDfromAgroupbyIDhavingCOUNT(ID)>3)
43.testtable1和testtable2表联合查询testtable1:iddepartment1设计2市场3售后
testtable2:iddptIDname11张三21李四32王五43彭六54陈七
iddptIDdepartmentname11设计张三21设计李四32市场王五43售后彭六54黑人陈七
SELECTtesttable2.*,ISNULL(department,'黑人')FROMtesttable1rightjointesttable2ontesttable2.dptID=testtable1.ID
44.有表A,结构如下:A:p_IDp_Nums_id11001112022801311013803其中:p_ID为产品ID,p_Num为产品库存量,s_id为仓库ID。请用SQL语句实现将上表中的数据合并,合并后的数据为:p_IDs1_ids2_ids3_id110120280031108其中:s1_id为仓库1的库存量,s2_id为仓库2的库存量,s3_id为仓库3的库存量。如果该产品在某仓库中无库存量,那么就是0代替。
selectp_id,sum(casewhens_id=1thenp_numelse0end)ass1_id,sum(casewhens_id=2thenp_numelse0end)ass2_id,sum(casewhens_id=3thenp_numelse0end)ass3_idfrommyProgroupbyp_id
1.在cpxs数据库的产品表中增加”产品简介“列,之后在删除该列。
ALTERTABLE[dbo].[product]ADD[产品简介]textALTERTABLE[dbo].[product]DROPCOLUMN[产品简介]2.将产品数据库的产品表中每种商品的价格打8UPDATE[dbo].[product]SET[价格]=[价格]*0.83.将产品数据库的产品表中价格打8折后低于50元的商品删除DELETE[dbo].[product]WHERE[价格]<504.查找价格在2000~2900元之间的商品名。SELECT[产品名称]FROM[dbo].[product]WHERE[价格]BETWEEN2000AND29005.计算所有商品的总价格。
SELECTSUM([价格]*[库存量])FROM[dbo].[product]6.在产品销售数据库上创建电冰箱产品表的视图bxcp。
CREATEVIEW[dbo].[bxcp]ASSELECTdbo.product.*FROMdbo.productWHERE[产品名称]='电冰箱'7.在bxcp视图中查询库存量在100台以下的产品编号。SELECT*FROM[dbo].[bxcp]WHERE[库存量]<1008.使用EXISTS关键字引入的子查询与使用IN关键字引入的子查询在语法上有哪些不同?//EXISTS方式SELECT*FROMAWHEREEXISTS(SELECT*FROMBWHEREB.id=A.uid);//in方式SELECT*FROMAWHEREidIN(SELECTidFROMB);46.删除姓名、年龄重复的记录Idnameagesalary
1yzk801000
2yzk802000
3tom2020000
4tom2020000
5im2020000
//取得不重复的数据
select*fromPersonswhereIdin(SELECTMAX(Id)ASExpr1FROMPersonsGROUPBYName,Age)
根据姓名、年龄分组,取出每组的Id最大值,然后将Id最大值之外的排除。
删除重复的数据:
deletefromPersonswhereIdnotin(SELECTMAX(Id)ASExpr1FROMPersonsGROUPBYName,Age)
题目:
条件查询:
1、在GRADE表中查找80-90份的学生学号和分数
select学号,分数fromgradewhere分数between80and90
2、在GRADE表中查找课程编号为003学生的平均分
selectavg(分数)fromgradewhere课程编号='003'
3、在GRADE表中查询学习各门课程的人数
select课程编号,count(学号)as人数fromgradegroupby课程编号
4、查询所有姓张的学生的学号和姓名
select姓名,学号fromstudent_infowhere姓名like'张%'
嵌套查询:
1、查询和学号’0001’的这位同学性别相同的所有同学的姓名和出生年月
select姓名,出生年月fromstudent_infowhere性别in(select性别fromstudent_infowheresno='0001')
2、查询所有选修课程编号为0002和0003的学生的学号、姓名和性别
select学号,姓名,性别fromstudent_infowhere学号in(select学号fromgradewhere课程编号='0002'and学号in(select学号fromgradewhere课程编号='0001'))
3、查询出学号为0001的学生的分数比0002号学生最低分高的课程编号的课程编号和分数
select课程编号,分数fromgradewhere学号='0001'and分数>(selectmin(分数)fromgradewhere学号='0002')
多表查询:
1、查询分数在80-90分的学生的学号、姓名、分数
selectstudent_info.学号,student_info.姓名,grade.分数fromstudent_info,gradewheregrade.分数between80and90
2、查询学习了’C语言’课程的学生学号、姓名和分数
selectstudent_info.学号,student_info.姓名,grade.成绩fromstudent_info,grade,curriculumwherestudent_info.学号=grade.学号andgrade.课程号=curriculum.课程号andcurriculum.课程名='C语言'
3、查询所有学生的总成绩,要求列出学号、姓名、总成绩,没有选课的学生总成绩为空。
selectgrade.学号,student_info.姓名,sum(grade.成绩)as总成绩fromstudent_info,gradewheregrade.学号=student_info.学号groupbygrade.学号,student_info.姓名
48.本题用到下面三个关系表:
CARD借书卡:(CNO卡号,NAME姓名,CLASS班级)
BOOKS图书:(BNO书号,BNAME书名,AUTHOR作者,PRICE单价,QUANTITY库存册数)
BORROW借书记录:(CNO借书卡号,BNO书号,RDATE还书日期
备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。
1、要求实现如下处理:
写出自定义函数,要求输入借书卡号能得到该卡号所借书金额的总和:
CREATEFUNCTIONgetSUM
@CNOint
)
RETURNSint
AS
BEGIN
declare@sumint
select@sum=sum(price)fromBOOKSwherebnoin(selectbnofromBORROWwherecno=@CNO)
return@sum
END
GO
2、找出借书超过5本的读者,输出借书卡号及所借图书册数。
selectCNO,count(BNO)as借书数量fromBORROWgroupbyCNOhavingcount(BNO)>3
3、查询借阅了"水浒"一书的读者,输出姓名及班级。
selectname,classfromcardwherecnoin(selectcnofromborrowwherebnoin(selectbnofromBOOKSwherebname='水浒'))
4、查询过期未还图书,输出借阅者(卡号)、书号及还书日期。
selectCNO,BNO,RDATEfromborrowwheregetdate()>RDATE
5、查询书名包括"网络"关键词的图书,输出书号、书名、作者。
selectbno,bname,authorfrombookswherebnamelike'网络%'
6、查询现有图书中价格最高的图书,输出书名及作者。
selectbname,authorfrombookswherepricein(selectmax(price)frombooks)
7、查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。
selectcnofromborrowwherebnoin(selectbnofrombookswherebname='计算方法')andcnonotin(selectcnofromborrowwherebnoin(selectbnofrombookswherebname='计算方法习题集'))orderbycnodesc
或
SELECTa.CNO
FROMBORROWa,BOOKSb
WHEREa.BNO=b.BNOANDb.BNAME=N'计算方法'
ANDNOTEXISTS(
SELECT*FROMBORROWaa,BOOKSbb
WHEREaa.BNO=bb.BNO
ANDbb.BNAME=N'计算方法习题集'
ANDaa.CNO=a.CNO)
ORDERBYa.CNODESC
8、将"C01"班同学所借图书的还期都延长一周。
updateborrowsetrdate=dateadd(day,7,rdate)fromBORROWwherecnoin(selectcnofromcardwhereclass='一班')
9、从BOOKS表中删除当前无人借阅的图书记录。
DELETEAFROMBOOKSa
WHERENOTEXISTS(
SELECT*FROMBORROW
WHEREBNO=a.BNO)
10、如果经常按书名查询图书信息,请建立合适的索引。
CREATECLUSTEREDINDEXIDX_BOOKS_BNAMEONBOOKS(BNAME)
11、在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)
CREATETRIGGERTR_SAVEONBORROW
FORINSERT,UPDATE
IF@@ROWCOUNT>0
INSERTBORROW_SAVESELECTi.*
FROMINSERTEDi,BOOKSb
WHEREi.BNO=b.BNO
ANDb.BNAME=N'数据库技术及应用'
12、建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)。
CREATEVIEWV_VIEW
selectname,bname
frombooks,card,borrow
whereborrow.cno=card.cnoandborrow.bno=books.bnoandclass='一班'
13、查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出。
selecta.cnofromborrowa,borrowb
wherea.cno=b.cnoand
a.bnoin(selectbnofrombookswherebname='计算方法')and
b.bnoin(selectbnofrombookswherebname='组合数学')
orderbya.cnoasc
WHEREa.BNO=b.BNO
ANDb.BNAMEIN('计算方法','组合数学')
GROUPBYa.CNO
HAVINGCOUNT(*)=2
ORDERBYa.CNOasc
14、用事务实现如下功能:一个借书卡号借走某书号的书,则该书的库存量减少1,当某书的库存量不够1本的时候,该卡号不能借该书
alterPROCEDUREpro_jieshu
@cnoint,
@bnoint,
@datedatetime
begintran
declare@quantityint
select@quantity=quantityfrombookswherebno=@bno
insertintoborrowvalues(@cno,@bno,@date)
updatebookssetquantity=@quantity-1wherebno=@bno
if(@quantity>0)
begin
committran
end
else
print'已无库存'
rollback
Student(S#,Sname,Sage,Ssex)学生表
Course(C#,Cname,T#)课程表
SC(S#,C#,score)成绩表
Teacher(T#,Tname)教师表
1)查询“001”课程比“002”课程成绩高的所有学生的学号;
selecta.S#from(selects#,scorefromSCwhereC#='001')a,(selects#,score
fromSCwhereC#='002')b
wherea.score>b.scoreanda.s#=b.s#;
2)查询平均成绩大于60分的同学的学号和平均成绩;
selectS#,avg(score)fromscgroupbyS#havingavg(score)>60;
3)查询所有同学的学号、姓名、选课数、总成绩;
selectStudent.S#,Student.Sname,count(SC.C#),sum(score)fromStudentleftOuterjoinSConStudent.S#=SC.S#groupbyStudent.S#,Sname
4)查询姓“李”的老师的个数;
selectcount(distinct(Tname))fromTeacherwhereTnamelike'李%';
5)查询没学过“叶平”老师课的同学的学号、姓名;
selectStudent.S#,Student.SnamefromStudent
whereS#notin(selectdistinct(SC.S#)fromSC,Course,TeacherwhereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname='叶平');
6)查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
selectStudent.S#,Student.SnamefromStudent,SCwhereStudent.S#=SC.S#andSC.C#='001'andexists(Select*fromSCasSC_2whereSC_2.S#=SC.S#andSC_2.C#='002');
7)查询学过“叶平”老师所教的所有课的同学的学号、姓名;
selectS#,SnamefromStudentwhereS#in(selectS#fromSC,Course,TeacherwhereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname='叶平'
groupbyS#havingcount(SC.C#)=(selectcount(C#)fromCourse,TeacherwhereTeacher.T#=Course.T#andTname='叶平'));
8)查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
SelectS#,Snamefrom(selectStudent.S#,Student.Sname,score,(selectscorefromSCSC_2whereSC_2.S#=Student.S#andSC_2.C#='002')score2
fromStudent,SCwhereStudent.S#=SC.S#andC#='001')S_2wherescore2 9)查询所有课程成绩小于60分的同学的学号、姓名; selectS#,SnamefromStudentwhereS#notin(selectStudent.S#fromStudent,SCwhereS.S#=SC.S#andscore>60); 10)查询没有学全所有课的同学的学号、姓名; selectStudent.S#,Student.SnamefromStudent,SC whereStudent.S#=SC.S#groupbyStudent.S#,Student.Snamehavingcount(C#)<(selectcount(C#)fromCourse); 11)查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名; selectS#,SnamefromStudent,SCwhereStudent.S#=SC.S#andC#inselectC#fromSCwhereS#='1001'; 12)查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名; selectdistinctSC.S#,SnamefromStudent,SCwhereStudent.S#=SC.S#andC#in(selectC#fromSCwhereS#='001'); 13)把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩; updateSCsetscore=(selectavg(SC_2.score)fromSCSC_2whereSC_2.C#=SC.C#)fromCourse,TeacherwhereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTeacher.Tname='叶平'); 14)查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名; selectS#fromSCwhereC#in(selectC#fromSCwhereS#='1002') groupbyS#havingcount(*)=(selectcount(*)fromSCwhereS#='1002'); 15)删除学习“叶平”老师课的SC表记录; DeleteSCfromcourse,Teacher whereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTname='叶平'; 16)向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、号课的平均成绩; InsertSCselectS#,'002',(Selectavg(score) fromSCwhereC#='002')fromStudentwhereS#notin(SelectS#fromSCwhereC#='002'); 17)按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示:学生ID,,数据库,企业管理,英语,有效课程数,有效平均分 SELECTS#as学生ID ,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#='004')AS数据库 ,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#='001')AS企业管理 ,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#='006')AS英语 ,COUNT(*)AS有效课程数,AVG(t.score)AS平均成绩 FROMSCASt GROUPBYS# ORDERBYavg(t.score) 18)查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分 SELECTL.C#As课程ID,L.scoreAS最高分,R.scoreAS最低分 FROMSCL,SCASR WHEREL.C#=R.C#and L.score=(SELECTMAX(IL.score) FROMSCASIL,StudentASIM WHEREL.C#=IL.C#andIM.S#=IL.S# GROUPBYIL.C#) AND R.Score=(SELECTMIN(IR.score) FROMSCASIR WHERER.C#=IR.C# GROUPBYIR.C# ); 19)按各科平均成绩从低到高和及格率的百分数从高到低顺序 SELECTt.C#AS课程号,max(course.Cname)AS课程名,isnull(AVG(score),0)AS平均成绩 ,100*SUM(CASEWHENisnull(score,0)>=60THEN1ELSE0END)/COUNT(*)AS及格百分数 FROMSCT,Course wheret.C#=course.C# GROUPBYt.C# ORDERBY100*SUM(CASEWHENisnull(score,0)>=60THEN1ELSE0END)/COUNT(*)DESC 20)查询如下课程平均成绩和及格率的百分数(用"1行"显示):企业管理(001),马克(002),OO&UML(003),数据库(004) SELECTSUM(CASEWHENC#='001'THENscoreELSE0END)/SUM(CASEC#WHEN'001'THEN1ELSE0END)AS企业管理平均分 ,100*SUM(CASEWHENC#='001'ANDscore>=60THEN1ELSE0END)/SUM(CASEWHENC#='001'THEN1ELSE0END)AS企业管理及格百分数 ,SUM(CASEWHENC#='002'THENscoreELSE0END)/SUM(CASEC#WHEN'002'THEN1ELSE0END)AS马克思平均分 ,100*SUM(CASEWHENC#='002'ANDscore>=60THEN1ELSE0END)/SUM(CASEWHENC#='002'THEN1ELSE0END)AS马克思及格百分数 ,SUM(CASEWHENC#='003'THENscoreELSE0END)/SUM(CASEC#WHEN'003'THEN1ELSE0END)ASUML平均分 ,100*SUM(CASEWHENC#='003'ANDscore>=60THEN1ELSE0END)/SUM(CASEWHENC#='003'THEN1ELSE0END)ASUML及格百分数 ,SUM(CASEWHENC#='004'THENscoreELSE0END)/SUM(CASEC#WHEN'004'THEN1ELSE0END)AS数据库平均分 ,100*SUM(CASEWHENC#='004'ANDscore>=60THEN1ELSE0END)/SUM(CASEWHENC#='004'THEN1ELSE0END)AS数据库及格百分数 FROMSC 21)查询不同老师所教不同课程平均分从高到低显示 SELECTmax(Z.T#)AS教师ID,MAX(Z.Tname)AS教师姓名,C.C#AS课程ID,MAX(C.Cname)AS课程名称,AVG(Score)AS平均成绩 FROMSCAST,CourseASC,TeacherASZ whereT.C#=C.C#andC.T#=Z.T# GROUPBYC.C# ORDERBYAVG(Score)DESC 22)查询如下课程成绩第3名到第6名的学生成绩单:企业管理(001),马克思(002),UML(003),数据库(004)[学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩 SELECTDISTINCTtop3 SC.S#As学生学号, Student.SnameAS学生姓名 T1.scoreAS企业管理, T2.scoreAS马克思, T3.scoreASUML, T4.scoreAS数据库, ISNULL(T1.score,0)+ISNULL(T2.score,0)+ISNULL(T3.score,0)+ISNULL(T4.score,0)as总分 FROMStudent,SCLEFTJOINSCAST1 ONSC.S#=T1.S#ANDT1.C#='001' LEFTJOINSCAST2 ONSC.S#=T2.S#ANDT2.C#='002' LEFTJOINSCAST3 ONSC.S#=T3.S#ANDT3.C#='003' LEFTJOINSCAST4 ONSC.S#=T4.S#ANDT4.C#='004' WHEREstudent.S#=SC.S#and ISNULL(T1.score,0)+ISNULL(T2.score,0)+ISNULL(T3.score,0)+ISNULL(T4.score,0) NOTIN (SELECT DISTINCT TOP15WITHTIES FROMsc LEFTJOINscAST1 ONsc.S#=T1.S#ANDT1.C#='k1' LEFTJOINscAST2 ONsc.S#=T2.S#ANDT2.C#='k2' LEFTJOINscAST3 ONsc.S#=T3.S#ANDT3.C#='k3' LEFTJOINscAST4 ONsc.S#=T4.S#ANDT4.C#='k4' ORDERBYISNULL(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] SELECTSC.C#as课程ID,Cnameas课程名称 ,SUM(CASEWHENscoreBETWEEN85AND100THEN1ELSE0END)AS[100-85] ,SUM(CASEWHENscoreBETWEEN70AND85THEN1ELSE0END)AS[85-70] ,SUM(CASEWHENscoreBETWEEN60AND70THEN1ELSE0END)AS[70-60] ,SUM(CASEWHENscore<60THEN1ELSE0END)AS[60-] FROMSC,Course whereSC.C#=Course.C# GROUPBYSC.C#,Cname; 24)查询学生平均成绩及其名次 SELECT1+(SELECTCOUNT(distinct平均成绩) FROM(SELECTS#,AVG(score)AS平均成绩 )AST1 WHERE平均成绩>T2.平均成绩)as名次, S#as学生学号,平均成绩 FROM(SELECTS#,AVG(score)平均成绩 )AST2 ORDERBY平均成绩desc; 25)查询各科成绩前三名的记录:(不考虑成绩并列情况) SELECTt1.S#as学生ID,t1.C#as课程ID,Scoreas分数 FROMSCt1 WHEREscoreIN(SELECTTOP3score WHEREt1.C#=C# ORDERBYscoreDESC ORDERBYt1.C#; 26)查询每门课程被选修的学生数 selectc#,count(S#)fromscgroupbyC#; 27)查询出只选修了一门课程的全部学生的学号和姓名 selectSC.S#,Student.Sname,count(C#)AS选课数 fromSC,Student whereSC.S#=Student.S#groupbySC.S#,Student.Snamehavingcount(C#)=1; 28)查询男生、女生人数 Selectcount(Ssex)as男生人数fromStudentgroupbySsexhavingSsex='男'; Selectcount(Ssex)as女生人数fromStudentgroupbySsexhavingSsex='女'; 29)查询姓“张”的学生名单 SELECTSnameFROMStudentWHERESnamelike'张%'; 查30)询同名同性学生名单,并统计同名人数 selectSname,count(*)fromStudentgroupbySnamehavingcount(*)>1; 32)1981年出生的学生名单(注:Student表中Sage列的类型是datetime) selectSname,CONVERT(char(11),DATEPART(year,Sage))asage fromstudent whereCONVERT(char(11),DATEPART(year,Sage))='1981'; 32)查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列 SelectC#,Avg(score)fromSCgroupbyC#orderbyAvg(score),C#DESC; 33)查询平均成绩大于85的所有学生的学号、姓名和平均成绩 selectSname,SC.S#,avg(score) fromStudent,SC whereStudent.S#=SC.S#groupbySC.S#,Snamehavingavg(score)>85; 34)查询课程名称为“数据库”,且分数低于60的学生姓名和分数 SelectSname,isnull(score,0) fromStudent,SC,Course whereSC.S#=Student.S#andSC.C#=Course.C#andCourse.Cname='数据库'andscore<60; 35)查询所有学生的选课情况; SELECTSC.S#,SC.C#,Sname,Cname FROMSC,Student,Course whereSC.S#=Student.S#andSC.C#=Course.C#; 36)查询任何一门课程成绩在70分以上的姓名、课程名称和分数; SELECTdistinctstudent.S#,student.Sname,SC.C#,SC.score FROMstudent,Sc WHERESC.score>=70ANDSC.S#=student.S#; 37)查询不及格的课程,并按课程号从大到小排列 selectc#fromscwherescore<60orderbyC#; 38)查询课程编号为003且课程成绩在80分以上的学生的学号和姓名; selectSC.S#,Student.SnamefromSC,StudentwhereSC.S#=Student.S#andScore>80andC#='003'; 39)求选了课程的学生人数 selectcount(*)fromsc; 40)查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩 selectStudent.Sname,scorefromStudent,SC,CourseC,Teacher whereStudent.S#=SC.S#andSC.C#=C.C#andC.T#=Teacher.T#andTeacher.Tname='叶平'andSC.score=(selectmax(score)fromSCwhereC#=C.C#); 41)查询各个课程及相应的选修人数 selectcount(*)fromscgroupbyC#; 42)查询不同课程成绩相同的学生的学号、课程号、学生成绩 selectdistinctA.S#,B.scorefromSCA,SCBwhereA.Score=B.ScoreandA.C#<>B.C#; 43)查询每门功成绩最好的前两名 WHEREscoreIN(SELECTTOP2score 44)统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列 selectC#as课程号,count(*)as人数 fromsc groupbyC# orderbycount(*)desc,c# 45)检索至少选修两门课程的学生学号 selectS# groupbys# havingcount(*)>=2 46)查询全部学生都选修的课程的课程号和课程名 selectC#,Cname fromCourse whereC#in(selectc#fromscgroupbyc#) 47)查询没学过“叶平”老师讲授的任一门课程的学生姓名 selectSnamefromStudentwhereS#notin(selectS#fromCourse,Teacher,SCwhereCourse.T#=Teacher.T#andSC.C#=course.C#andTname='叶平'); 48)查询两门以上不及格课程的同学的学号及其平均成绩 selectS#,avg(isnull(score,0))fromSCwhereS#in(selectS#fromSCwherescore<60groupbyS#havingcount(*)>2)groupbyS#; 49)检索“004”课程分数小于60,按分数降序排列的同学学号 selectS#fromSCwhereC#='004'andscore<60orderbyscoredesc;