|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
操作被同步到从库上后,则主从都“回天无力”。
8.统计列印各科成就,各分数段人数:
课程ID,课程称号,[100-85],[85-70],[70-60],[<60]
只管外表看上往不那末简单,实在用CASE能够很简单地完成:
SELECT课程ID,课程称号
,SUM(CASEWHEN成就BETWEEN85AND100THEN1ELSE0END)AS[100-85]
,SUM(CASEWHEN成就BETWEEN70AND85THEN1ELSE0END)AS[85-70]
,SUM(CASEWHEN成就BETWEEN60AND70THEN1ELSE0END)AS[70-60]
,SUM(CASEWHEN成就<60THEN1ELSE0END)AS[60-]
FROM成就表
GROUPBY课程ID,课程称号
注重这里的BETWEEN,固然字段名都是从高至低,可BETWEEN中仍是要从低到高,这里
假如不当心,会犯一个很难发明的逻辑毛病:在数学上,当a>b时,[a,b]是一个空集。
9.列印先生均匀成就及其名次
selectcount(distinctb.f)as名次,a.先生ID,max(a.先生姓名),max(a.f)
from(selectdistinctt.先生ID,t.先生姓名,(selectavg(成就)
fromtt1
wheret1.先生id=t.先生id)asF
fromT
)asa,
(selectdistinctt.先生ID,t.先生姓名,(selectavg(成就)
fromtt1
wheret1.先生id=t.先生id)asF
fromT
)asb
wherea.f<=b.f
groupbya.先生ID
orderbycount(b.f)
这里有良多值得一提的中央,先使用两个完整不异的自相干子查询天生两个派生表作
为基础表用于作小于或即是的毗连,如许就能够经由过程表中小于或即是每一个值的其他值
的COUNT(distinct)的计数会萃函数来表现名次了。
SELECT1+(SELECTCOUNT(distinct[均匀成就])
FROM(SELECT[先生ID],MAX([先生姓名])AS先生姓名,AVG([成就])AS[均匀成就]
FROMT
GROUPBY[先生ID]
)AST1
WHERE[均匀成就]>T2.[均匀成就])as名次,
[先生ID],[先生姓名],[均匀成就]
FROM(SELECT[先生ID],max([先生姓名])AS先生姓名,AVG([成就])AS[均匀成就]
FROMT
GROUPBY[先生ID]
)AST2
ORDERBYT2.[均匀成就]desc
办法二也利用了两个完整不异的自相干子查询天生两个派生表作为基础表,再使用它
们之间作年夜于的相干子查询取COUNT(distinct)+1的计数会萃函数一样完成了名
次的显现。
这道题从使用角度来看,查询了局是相称公道的,并列情形的名次也都一样。但假如想
完成相似主动序列的行号,该办理计划的范围性突显,不克不及处置并列相称的情形了,所
以有需要夸大:必定要选择不反复的毗连前提,能够依据实践情形使用字段组合的不等
毗连(T1.f1+...+T1.fn<=T2.f1+...+T2.fn)。持续引伸还能够经由过程判别
COUNT(distinct)%2是不是为0的HAVING或WHERE子句完成只显现偶数或奇数行:
HAVINGcount(distinctb.f)%2=1
或:
WHERE1+(SELECTCOUNT(distinct[均匀成就])
FROM(SELECT[先生ID],MAX([先生姓名])AS先生姓名,AVG([成就])AS[均匀成就]
FROMT
GROUPBY[先生ID]
)AST1
WHERE[均匀成就]>T2.[均匀成就])%2=1
再复杂说一下HAVING和WHERE在含有GROUPBY分组的查询中的区分,HAVING是
在数据分组后才选择纪录的,WHERE是先辈行选择在分组的,并且HAVING一样平常应与聚
集函数适用才有真正寄义。
两种办法再次表现了子查询与毗连能够异曲同工之妙,第二种子查询办法值得保举,因
为对照利于程序机关,便于为没有该功效的原有查询增加此项功效。本题仅仅是为了示
范一种对照新奇的解题思绪,躲避了效力的成绩。
10.列印各科成就前三名的纪录:(不思索成就并列情形)
先生ID,先生姓名,课程ID,课程称号,成就,教员ID,教员姓名
假如仅从成就思索前三名的人,使用相干子查询的常识:
SELECT*
FROM成就表t1
WHERE成就IN(SELECTTOP3成就
FROM成就表
WHEREt1.课程id=课程id
ORDERBY成就DESC
)
ORDERBYt1.课程id
如许查询的了局各科成就前三名的纪录数应当年夜于即是三,由于大概有并列情形,
假如小于三天然是该门课还没有那末多人测验!
假如不思索并列情形,严厉把持各科只列印三笔记录,则利用"先生id"机关相干
子查询前提亦可:
SELECT*
FROM成就表t1
WHERE先生idIN(SELECTTOP2先生id
FROM成就表
WHEREt1.课程id=课程id
ORDERBY成就DESC
)
ORDERBYt1.课程id
假如使用第10题的思绪也可完成该使用。
11.标准化
标准化的成绩能够说是仁者见仁,智者见智。并且不做一定欠好,但矫枉过正,弄到太
标准也纷歧定是功德。起首剖析信息的对应干系,这个表中有四种信息。先生、课程、教员、成就。个中前三个能够自力存在,最
后一个能够看作是基于前三个存在的。然后,我们按这四种分类,创建四个表:
关于先生的信息,有以下两个:先生ID,姓名;
教员则会有教员ID,姓名,课程ID这也就是为何我要把先生和教员会为两个表的缘故原由;
课程则有课程ID,课程称号两种;
而最初一个成就信息,就成了连接它们的一个部分,在这里,它要有先生ID,教员ID,课程ID,成就四项,相
对与别的表应属使用级别,除成就字段,别的都援用的别的的表。
如许一来,几个表的剧本也许是这个模样:
CREATETABLE"先生信息"
(
"ID"CHAR(4),
"姓名"CHAR(16),
PRIMARYKEY("ID")
)
CREATETABLE"课程信息"
(
"ID"CHAR(4),
"称号"CHAR(16),
PRIMARYKEY("ID"),
)
CREATETABLE"教员信息"
(
"ID"CHAR(4),
"姓名"CHAR(16),
"课程ID"CHAR(4),
PRIMARYKEY("ID"),
FOREIGNKEY("课程ID")REFERENCES"课程信息"("ID")
)
CREATETABLE"成就信息"
(
"先生ID"CHAR(4),
"教员ID"CHAR(4),
"课程ID"CHAR(4),
成就NUMERIC(5,2),
PRIMARYKEY("先生ID","教员ID","课程ID"),
FOREIGNKEY("先生ID")REFERENCES"先生信息"("ID"),
FOREIGNKEY("教员ID")REFERENCES"教员信息"("ID"),
FOREIGNKEY("课程ID")REFERENCES"课程信息"("ID")
)
如许建表很分明是为了尽量的细化信息的分类。它的优点在于各类信息分划明白,不
干涉题也很分明,好比,一个教员不克不及同时带两门分歧的课(固然,这大概恰是营业划定规矩所
请求的),并且,如许做分类过于精致了。
假如不必要对教员举行人事办理,那末,完整能够把教员信息和课程信息合为一表。也就是说,分歧教员带的同
一位称课程,视做分歧课程。如许做固然也有其使用背景,良多教员,出格是初等教导和名师,常常有他们自
己的作风,完整能够视做两种课程,信任一样传授C++,Lippman和Stroustrup教出的先生总会有所分歧。
要说成绩,那就是,假如想要限定先生不克不及反复修某一门课,就得用触发器了,没有太好的举措,不外这个成绩,
后面的第一种计划一样办理不了,就算针对教员和课程的干系单建一个表也纷歧定就能够,还把成绩庞大化了。
如今把第二种计划的剧本列出来:
CREATETABLE"先生信息"
(
"ID"CHAR(4),
"姓名"CHAR(16),
PRIMARYKEY("ID")
)
CREATETABLE"课程信息"
(
"ID"CHAR(4),
"课程分类"CHAR(4),
"称号"CHAR(16),
"教员ID"CHAR(4),
"教员姓名"CHAR(16),
PRIMARYKEY("ID")
)
CREATETABLE"成就信息"
(
"先生ID"CHAR(4),
"课程ID"CHAR(4),
成就NUMERIC(5,2),
PRIMARYKEY("先生ID","课程ID"),
FOREIGNKEY("先生ID")REFERENCES"先生信息"("ID"),
FOREIGNKEY("课程ID")REFERENCES"课程信息"("ID")-
)
如许是否是能清新一点?如许一来,假如不存在一个教员教分歧的课程的情形,而且我
们但愿简化办理,乃至都能够不必"课程分类"和"教员ID"字段。固然,视营业必要而定,
假如但愿在限定先生进修的课程分类的同时,不想带来分外的功能开支,利用第一种设
计,或将课程分类字段也列进成就信息表,是一个更好的举措。
关于数据库的计划和办理,有几条履历,拿出来在这里和人人交换一下:
对数据举行标准化时,最好要切合它的使用背景。如许易于了解和办理;
数据的标准化纷歧定是越细化越好,粒度得当地年夜一点,前面的编程一样平常会简单一点;
虽然说不是越细越好,不外如果不做标准化,却几近是必定要出成绩;
很主要的一点:万万不要滥用主动标识列!出格是,不要滥用主动标识列来做为一个表中独一的束缚前提,一般,
那和没有束缚没甚么分歧!
关于这些试题,我们的意见就到这里,但愿伴侣们能够拿出更多更好的定见,我们一同会商。
原题含谜底:
CREATETABLE[T](
[ID][int]IDENTITY(1,1)NOTNULL,
[先生ID][varchar](50)NULL,
[先生姓名][varchar](50)NULL,
[课程ID][varchar](50)NULL,
[课程称号][varchar](50)NULL,
[成就][real]NULL,
[教员ID][varchar](50)NULL,
[教员姓名][varchar](50)NULL,
CONSTRAINT[PK_T]PRIMARYKEYCLUSTERED
(
[ID]
)ON[PRIMARY]
)ON[PRIMARY]
GO
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(S3,王五,K2,语文,81,T2,王先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(S3,王五,K4,政治,53,T4,赵先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(S4,赵六,K1,数学,99,T1,张先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(S4,赵六,K2,语文,33,T2,王先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(S4,赵六,K4,政治,59,T4,赵先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(s1,张三,K4,政治,79,T4,赵先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(s1,张三,K1,数学,98,T1,张先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(s1,张三,K3,英语,69,T3,李先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(s7,peter,K1,数学,64,T1,张先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(s7,peter,K2,语文,81,T2,王先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(s7,peter,K4,政治,53,T4,赵先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(s2,mike,K1,数学,64,T1,张先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(s2,mike,K2,语文,81,T2,王先生)
INSERTINTOT([先生ID],[先生姓名],[课程ID],[课程称号],[成就],[教员ID],[教员姓名])
valueS(s2,mike,K4,政治,53,T4,赵先生)
二维表T(F1,F2,F3,F4,F5,F6,F7)暗示以下干系:
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│先生ID│先生姓名│课程ID│课程称号│成就│教员ID│教员姓名│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│S3│王五│K4│政治│53│T4│赵先生│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│S1│张三│K1│数学│61│T1│张先生│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│S2│李四│K3│英语│88│T3│李先生│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│S1│张三│K4│政治│77│T4│赵先生│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│S2│李四│K4│政治│67│T5│周先生│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│S3│王五│K2│语文│90│T2│王先生│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│S3│王五│K1│数学│55│T1│张先生│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│S1│张三│K2│语文│81│T2│王先生│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│S4│赵六│K2│语文│59│T1│王先生│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│S1│张三│K3│英语│37│T3│李先生│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│S2│李四│K1│数学│81│T1│张先生│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│....│││││││
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│....│││││││
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
二维表T(F1,F2,F3,F4,F5,F6,F7)暗示以下干系:
------------------------------------------------------------------------------
│先生ID│先生姓名│课程ID│课程称号│成就│教员ID│教员姓名│
│S3│王五│K4│政治│53│T4│赵先生│
│S1│张三│K1│数学│61│T1│张先生│
│S2│李四│K3│英语│88│T3│李先生│
│S1│张三│K4│政治│77│T4│赵先生│
│S2│李四│K4│政治│67│T5│周先生│
│S3│王五│K2│语文│90│T2│王先生│
│S3│王五│K1│数学│55│T1│张先生│
│S1│张三│K2│语文│81│T2│王先生│
│S4│赵六│K2│语文│59│T1│王先生│
│S1│张三│K3│英语│37│T3│李先生│
│S2│李四│K1│数学│81│T1│张先生│
│....│││││││
│....│││││││
------------------------------------------------------------------------------
1.标准化
请以一句T-SQL(MsSQLServer)或JetSQL(MsAccess)作答!
2.假如T表另有一字段F0数据范例为主动增量整型(独一,不会反复),
并且T表中含有除F0字段外,请删除别的字段完整不异的反复过剩的脏纪录数据(要保存个中的一条):
DeleteT
fromT,TAST1
whereT.先生ID=T1.先生IDandT.课程ID=T.课程IDandT.F0<T1.F0
DELETE
FROMT
WHERE[F0]NOTIN(SELECTMAX([F0])
FROM[T]
GROUPBYT.F1,T.F2,T.F3
HAVINGCOUNT(*)>1
)
ANDF0NOTIN(SELECTMAX([F0])
FROM[T]
GROUPBYT.F1,T.F2,T.F3
HAVINGCOUNT(*)=1
)
DELETE
FROMT
WHERE[F0]<(SELECTMAX([F0])
FROM[T]AST1
WHERET1.F1=T.F1
ANDT1.F2=T.F2
ANDT1.F3=T.F3
GROUPBYT1.F1,T1.F2,T1.F3
)
3.列印各科成就最高和最低的纪录:(就是各门课程的最高、最低分的先生和先生)
课程ID,课程称号,最高分,先生ID,先生姓名,教员ID,教员姓名,最低分,先生ID,先生姓名,教员ID,教员姓名
SELECTT.课程ID,T.课程称号,T.[成就]AS最高分,T.[先生ID],T.[先生姓名],T.[教员ID],T.[教员姓名]
,T1.[成就]AS最低分,T1.[先生ID],T1.[先生姓名],T1.[教员ID],T1.[教员姓名]
FROMT
LEFTJOINTAST1ONT.[课程ID]=T1.[课程ID]
WHERET.[成就]=(SELECTMAX(T2.[成就])
FROMTAS[T2]
WHERET.[课程ID]=T2.[课程ID]
GROUPBYT2.[课程ID])
ANDT1.[成就]=(SELECTMIN(T3.[成就])
FROMTAS[T3]
WHERET1.[课程ID]=T3.[课程ID]
GROUPBYT3.[课程ID])
4.按成就从高到低按次,列印一切先生四门(数学,语文,英语,政治)课程成就:(就是每一个先生的四门课程的成就单)
先生ID,先生姓名,数学,语文,英语,政治,无效课程数,无效均匀分
(注:无效课程即在T表中有该先生的成就纪录,如不分明可不列印"无效课程数"和"无效均匀分")
select先生ID,MAX(先生姓名)as先生姓名
,(select成就fromTwhere先生ID=T0.先生IDand课程ID=K1)as数学
,(select成就fromTwhere先生ID=T0.先生IDand课程ID=K2)as语文
,(select成就fromTwhere先生ID=T0.先生IDand课程ID=K3)as英语
,(select成就fromTwhere先生ID=T0.先生IDand课程ID=K4)as政治
,count(*),avg(t0.成就)
fromTasT0
groupby先生ID
select先生ID,MAX(先生姓名)as先生姓名
,(select成就fromTwhere先生ID=T0.先生IDand课程ID=K1)as数学
,(SELECTmax(class)
fromclasses,t
wheret.成就>=Classes.MinV
andt.成就<=Classes.MaxV
andt.先生ID=T0.先生IDandt.课程ID=K1
)as数学级别
,(select成就fromTwhere先生ID=T0.先生IDand课程ID=K2)as语文
,(SELECTmin(class)
fromclasses,t
wheret.成就>=Classes.MinV
andt.成就<=Classes.MaxV
andt.先生ID=T0.先生IDandt.课程ID=K2
)as语文级别
,(select成就fromTwhere先生ID=T0.先生IDand课程ID=K3)as英语
,(SELECTmax(class)
fromclasses,t
wheret.成就>=Classes.MinV
andt.成就<=Classes.MaxV
andt.先生ID=T0.先生IDandt.课程ID=K3
)as英语级别
,(select成就fromTwhere先生ID=T0.先生IDand课程ID=K4)as政治
,(SELECTmin(class)
fromclasses,t
wheret.成就>=Classes.MinV
andt.成就<=Classes.MaxV
andt.先生ID=T0.先生IDandt.课程ID=K4
)as政治级别
,count(*),avg(t0.成就)
,(SELECTmax(class)
fromclasses
whereAVG(T0.成就)>=Classes.MinV
andAVG(T0.成就)<=Classes.MaxV
)AS均匀级别
fromTasT0
groupby先生ID
SELECT[T].[先生ID],MAX([T].[先生姓名])AS先生姓名,MAX([T1].[成就])AS数学,MAX([T2].[成就])AS语文,MAX([T3].[成就])AS英语,MAX([T4].[成就])AS政治,COUNT([T].[课程ID])AS无效课程数,(ISNULL(MAX([T1].[成就]),0)+ISNULL(MAX([T2].[成就]),0)+ISNULL(MAX([T3].[成就]),0)+ISNULL(MAX([T4].[成就]),0))/COUNT([T].[课程ID])AS无效均匀分
FROM[T]
LEFTJOIN[T]AS[T1]
ON[T].[先生ID]=[T1].[先生ID]AND[T1].[课程ID]=k1
LEFTJOIN[T]AS[T2]
ON[T].[先生ID]=[T2].[先生ID]AND[T2].[课程ID]=k2
LEFTJOIN[T]AS[T3]
ON[T].[先生ID]=[T3].[先生ID]AND[T3].[课程ID]=k3
LEFTJOIN[T]AS[T4]
ON[T].[先生ID]=[T4].[先生ID]AND[T4].[课程ID]=k4
GROUPBY[T].[先生ID]
ORDERBY(ISNULL(MAX([T1].[成就]),0)+ISNULL(MAX([T2].[成就]),0)+ISNULL(MAX([T3].[成就]),0)+ISNULL(MAX([T4].[成就]),0))/COUNT([T].[课程ID])DESC
5.列印数学成就第10名到第15名的先生成就单
或列印均匀成就第10名到第15名的先生成就单
[先生ID],[先生姓名],数学,语文,英语,政治,均匀成就
SELECTDISTINCT
[T].[先生ID],
[T].[先生姓名]AS先生姓名,
[T1].[成就]AS数学,
[T2].[成就]AS语文,
[T3].[成就]AS英语,
[T4].[成就]AS政治,
ISNULL([T1].[成就],0)+ISNULL([T2].[成就],0)+ISNULL([T3].[成就],0)+ISNULL([T4].[成就],0)as总分
FROM[T]
LEFTJOIN[T]AS[T1]
ON[T].[先生ID]=[T1].[先生ID]AND[T1].[课程ID]=k1
LEFTJOIN[T]AS[T2]
ON[T].[先生ID]=[T2].[先生ID]AND[T2].[课程ID]=k2
LEFTJOIN[T]AS[T3]
ON[T].[先生ID]=[T3].[先生ID]AND[T3].[课程ID]=k3
LEFTJOIN[T]AS[T4]
ON[T].[先生ID]=[T4].[先生ID]AND[T4].[课程ID]=k4
WHEREISNULL([T1].[成就],0)+ISNULL([T2].[成就],0)+ISNULL([T3].[成就],0)+ISNULL([T4].[成就],0)
NOTIN
(SELECT
DISTINCT
TOP3WITHTIES
ISNULL([T1].[成就],0)+ISNULL([T2].[成就],0)+ISNULL([T3].[成就],0)+ISNULL([T4].[成就],0)
FROM[T]
LEFTJOIN[T]AS[T1]
ON[T].[先生ID]=[T1].[先生ID]AND[T1].[课程ID]=k1
LEFTJOIN[T]AS[T2]
ON[T].[先生ID]=[T2].[先生ID]AND[T2].[课程ID]=k2
LEFTJOIN[T]AS[T3]
ON[T].[先生ID]=[T3].[先生ID]AND[T3].[课程ID]=k3
LEFTJOIN[T]AS[T4]
ON[T].[先生ID]=[T4].[先生ID]AND[T4].[课程ID]=k4
ORDERBYISNULL([T1].[成就],0)+ISNULL([T2].[成就],0)+ISNULL([T3].[成就],0)+ISNULL([T4].[成就],0)DESC)
ANDISNULL([T1].[成就],0)+ISNULL([T2].[成就],0)+ISNULL([T3].[成就],0)+ISNULL([T4].[成就],0)
IN(SELECT
DISTINCT
TOP4WITHTIES
ISNULL([T1].[成就],0)+ISNULL([T2].[成就],0)+ISNULL([T3].[成就],0)+ISNULL([T4].[成就],0)
FROM[T]
LEFTJOIN[T]AS[T1]
ON[T].[先生ID]=[T1].[先生ID]AND[T1].[课程ID]=k1
LEFTJOIN[T]AS[T2]
ON[T].[先生ID]=[T2].[先生ID]AND[T2].[课程ID]=k2
LEFTJOIN[T]AS[T3]
ON[T].[先生ID]=[T3].[先生ID]AND[T3].[课程ID]=k3
LEFTJOIN[T]AS[T4]
ON[T].[先生ID]=[T4].[先生ID]AND[T4].[课程ID]=k4
ORDERBYISNULL([T1].[成就],0)+ISNULL([T2].[成就],0)+ISNULL([T3].[成就],0)+ISNULL([T4].[成就],0)DESC)
ORDERBYISNULL([T1].[成就],0)+ISNULL([T2].[成就],0)+ISNULL([T3].[成就],0)+ISNULL([T4].[成就],0)DESC
6.按各科不合格率的百分数从低到高战争均成就从高到低按次,统计并列印各科均匀成就和不合格率的百分数(用"N行"暗示):(就是剖析哪门课程难)
课程ID,课程称号,均匀成就,合格百分数
SELECT课程ID,MAX(课程称号)AS课程称号,AVG(成就)AS均匀成就,100*SUM(CASEWHEN成就>=60THEN1ELSE0END)/COUNT(*)AS合格百分数
FROMT
GROUPBY课程ID
ORDERBY合格百分数DESC
7.列印四门课程均匀成就和合格率的百分数(用"1行4列"暗示):(就是剖析哪门课程难)
数学均匀分,数学合格百分数,语文均匀分,语文合格百分数,英语均匀分,英语合格百分数,政治均匀分,政治合格百分数
SELECTSUM(CASEWHEN课程ID=K1THEN成就ELSE0END)/(SELECTCOUNT(*)FROMTWHERE课程ID=K1)AS数学均匀分
,100*SUM(CASEWHEN课程ID=K1AND成就>=60THEN1ELSE0END)/SUM(CASEWHEN课程ID=K1THEN1ELSE0END)AS数学合格百分数
,SUM(CASEWHEN课程ID=K2THEN成就ELSE0END)/(SELECTCOUNT(*)FROMTWHERE课程ID=K2)AS语文均匀分
,100*SUM(CASEWHEN课程ID=K2AND成就>=60THEN1ELSE0END)/SUM(CASEWHEN课程ID=K2THEN1ELSE0END)AS语文合格百分数
,SUM(CASEWHEN课程ID=K3THEN成就ELSE0END)/(SELECTCOUNT(*)FROMTWHERE课程ID=K3)AS英语均匀分
,100*SUM(CASEWHEN课程ID=K3AND成就>=60THEN1ELSE0END)/SUM(CASEWHEN课程ID=K3THEN1ELSE0END)AS英语合格百分数
,SUM(CASEWHEN课程ID=K4THEN成就ELSE0END)/(SELECTCOUNT(*)FROMTWHERE课程ID=K4)AS政治均匀分
,100*SUM(CASEWHEN课程ID=K4AND成就>=60THEN1ELSE0END)/SUM(CASEWHEN课程ID=K4THEN1ELSE0END)AS政治合格百分数
FROMT
8.按分歧先生所教分歧课程均匀分从高到低列印:(就是剖析哪一个先生的哪一个课程程度高)
教员ID,教员姓名,课程ID,课程称号,均匀分(均匀分按往失落一个最高分和一个最低分后取)
SELECT教员ID,MAX(教员姓名),课程ID,MAX(课程称号)AS课程称号,AVG(成就)AS均匀成就
FROMT
GROUPBY课程ID,教员ID
ORDERBYAVG(成就)
均匀分按往失落一个最高分和一个最低分后获得,则也不难写出:
SELECT教员ID,MAX(教员姓名),课程ID,MAX(课程称号)AS课程称号--,AVG(成就)AS均匀成就
,(SUM(成就)
-(SELECTMAX(成就)
FROM成就表
WHERE课程ID=T1.课程IDAND教员ID=T1.教员ID)
-(SELECTMIN(成就)
FROM成就表
WHERE课程ID=T1.课程IDand教员ID=T1.教员ID))
/CAST((SELECTCOUNT(*)-2
FROM成就表
WHERE课程ID=T1.课程IDAND教员ID=T1.教员ID)ASFLOAT)AS均匀分
FROM成就表AST1
WHERE(SELECTCOUNT(*)-2
FROM成就表
WHERE课程ID=T1.课程IDAND教员ID=T1.教员ID)>0
GROUPBY课程ID,教员ID
ORDERBY均匀分DESC
9.统计列印各科成就,各分数段人数:
课程ID,课程称号,[100-85],[85-70],[70-60],[<60]
SELECT课程ID,课程称号
,SUM(CASEWHEN成就BETWEEN85AND100THEN1ELSE0END)AS[100-85]
,SUM(CASEWHEN成就BETWEEN70AND85THEN1ELSE0END)AS[85-70]
,SUM(CASEWHEN成就BETWEEN60AND70THEN1ELSE0END)AS[70-60]
,SUM(CASEWHEN成就<60THEN1ELSE0END)AS[60-]
FROMT
GROUPBY课程ID,课程称号
11.列印先生均匀成就及其名次
selectcount(distinctb.f),a.先生ID,max(a.先生姓名),max(a.f)
from(selectdistinctt.先生ID,t.先生姓名,(selectavg(成就)
fromtt1
wheret1.先生id=t.先生id)asF
fromT
)asa,
(selectdistinctt.先生ID,t.先生姓名,(selectavg(成就)
fromtt1
wheret1.先生id=t.先生id)asF
fromT
)asb
wherea.f<=b.f
groupbya.先生ID
orderbycount(b.f)
SELECT1+(SELECTCOUNT(distinct[均匀成就])
FROM(SELECT[先生ID],MAX([先生姓名])AS先生姓名,AVG([成就])AS[均匀成就]
FROMT
GROUPBY[先生ID]
)AST1
WHERE[均匀成就]>T2.[均匀成就]),
[先生ID],[先生姓名],[均匀成就]
FROM
(
SELECT[先生ID],max([先生姓名])AS先生姓名,AVG([成就])AS[均匀成就]
FROMT
GROUPBY[先生ID]
)AST2
ORDERBYT2.[均匀成就]desc
其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。 |
|