首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请问个SQL语句的写法

2012-08-15 
请教个SQL语句的写法学生表S 学号SID 名称SN1王2李课程表C 编号CID 课程名CN1C12C2成绩表SC 学号SID 课程

请教个SQL语句的写法
学生表S 学号SID 名称SN
  1 王
  2 李

课程表C 编号CID 课程名CN
  1 C1
  2 C2

成绩表SC 学号SID 课程编号CID 成绩G
  1 1 100
  1 2 100
  1 1 90
  2 1 100
  2 2 90
  2 2 80

1)查每一个学生最好成绩的课程名和成绩
结果 王 C1 100
  王 C2 100
  李 C1 100

2)查学生考过两次的课程名和成绩
结果 王 C1 100
  王 C1 90
  李 C2 90
  李 C2 80

请各位大大指教下SQL语句的写法。


[解决办法]

SQL code
--> 测试数据: @学生表Sdeclare @学生表S table (学号SID int,名称SN varchar(2))insert into @学生表Sselect 1,'王' union allselect 2,'李'--> 测试数据: @课程表Cdeclare @课程表C table (编号CID int,课程名CN varchar(2))insert into @课程表Cselect 1,'C1' union allselect 2,'C2'--> 测试数据: @成绩表SCdeclare @成绩表SC table (学号SID int,课程编号CID int,成绩G int)insert into @成绩表SCselect 1,1,100 union allselect 1,2,100 union allselect 1,1,90 union allselect 2,1,100 union allselect 2,2,90 union allselect 2,2,80--1)查每一个学生最好成绩的课程名和成绩select b.名称SN,c.课程名CN,max(成绩G) from (select * from @成绩表SC twhere 成绩G=(select max(成绩G) from @成绩表SC where 学号SID=t.学号SID)) a ,@学生表S b,@课程表C c where a.学号SID=b.学号SID and a.课程编号CID=c.编号CIDgroup by b.名称SN,c.课程名CN/*名称SN 课程名CN ---- ----- -----------李    C1    100王    C1    100王    C2    100*/--2)查学生考过两次的课程名和成绩select d.名称SN,c.课程名CN,a.成绩G from @成绩表SC a right join (select 学号SID,课程编号CID from @成绩表SC group by 学号SID,课程编号CID having count(1)=2) b on a.学号SID=b.学号SID and a.课程编号CID=b.课程编号CIDleft join @课程表C c on a.课程编号CID=c.编号CIDleft join @学生表S d on a.学号SID=d.学号SID/*名称SN 课程名CN 成绩G---- ----- -----------王    C1    100王    C1    90李    C2    90李    C2    80*/
[解决办法]
s(sno int,sname varchar);
c(cno int,cname varchar);
sc(sno int,cno int,g int);
---------------------
select c.cname,d.sno from c join (select cno,sno from sc a join (select max(g) g,sno from sc) b on a.sno=b.sno and a.g=b.g) d on c.cno=d.cno 

-----
select c.name,d.g from c ,sc d,(
select 
sno,cno
from sc 
group by sno,cno 
having count(1)>=2) e
where c.cno=d.cno and d.cno=e.cno
[解决办法]
SQL code
goif object_id('TBL') is not null drop table TBLgocreate table TBL([SID] int,[SN] varchar(2))insert TBLselect 1,'王' union allselect 2,'李'select *from TBL            GOif object_id('[C1]') is not null drop table [C1]GOcreate table [C1]([编号CID] int,[课程名CN] varchar(2))GOinsert [C1]select 1,'C1' union allselect 2,'C2'         --> 测试数据:[SC]GOif object_id('[SC]') is not null drop table [SC]GOcreate table [SC]([学号SID] int,[课程编号CID] int,[成绩G] int)GOinsert [SC]select 1,1,100 union allselect 1,2,100 union allselect 1,1,90 union allselect 2,1,100 union allselect 2,2,90 union allselect 2,2,80;with TAS(SELECT *FROM TBL INNER JOIN( SELECT [SC].*,[C1].* FROM [SC] LEFT JOIN [C1]  ON [SC].[课程编号CID]=[C1].[编号CID])A ON TBL.[SID]=A.学号SID)SELECT SN,[课程名CN],[成绩G] FROM TWHERE [成绩G]=(SELECT MAX([成绩G])FROM [SC] WHERE T.[SID]=[SC].学号SID)/*SN    课程名CN    成绩G李    C1    100王    C1    100王    C2    100*//*2)查学生考过两次的课程名和成绩结果 王 C1 100  王 C1 90  李 C2 90  李 C2 80*/;with TAS(SELECT *FROM TBL INNER JOIN( SELECT [SC].*,[C1].* FROM [SC] LEFT JOIN [C1]  ON [SC].[课程编号CID]=[C1].[编号CID])A ON TBL.[SID]=A.学号SID)SELECT SN,[课程名CN],[成绩G] FROM T WHERE [课程名CN] IN(SELECT [课程名CN] FROM (SELECT SN,[课程名CN],COUNT(*) AS NUM FROM T GROUP BY SN,[课程名CN])A WHERE NUM=2 AND A.SN=T.SN)/*SN    课程名CN    成绩G王    C1    100王    C1    90李    C2    90李    C2    80*/ 


[解决办法]

SQL code
/*学生表S 学号SID 名称SN  1 王  2 李*/CREATE TABLE S(    SID INT NOT NULL,    SN VARCHAR(100) NOT NULL)INSERT INTO SSELECT 1,'王' UNION SELECT 2,'李'/*课程表C 编号CID 课程名CN  1 C1  2 C2*/CREATE TABLE C(    CID INT NOT NULL,    CN VARCHAR(100) NOT NULL)INSERT INTO CSELECT 1,'C1' UNION SELECT 2,'C2'/*成绩表SC 学号SID 课程编号CID 成绩G  1 1 100  1 2 100  1 1 90  2 1 100  2 2 90  2 2 80*/CREATE TABLE SC(    SID INT NOT NULL,    CID INT NOT NULL,    G INT NOT NULL)INSERT INTO SCselect  1, 1, 100 UNIONSELECT  1, 2, 100 UNIONSELECT  1, 1, 90 UNIONSELECT  2, 1, 100 UNIONSELECT  2, 2, 90 UNIONSELECT  2, 2, 80 /*1)查每一个学生最好成绩的课程名和成绩结果 王 C1 100  王 C2 100  李 C1 100*/SELECT SN,CN,GFROM S,C,SC,(    SELECT SID,MAX(G) AS grade                FROM SC                 GROUP BY SID) AS AWHERE S.SID = SC.SID AND C.CID = SC.CID AND SC.SID = A.SID AND SC.G = A.grade/*2)查学生考过两次的课程名和成绩结果 王 C1 100  王 C1 90  李 C2 90  李 C2 80*/SELECT SN,CN,GFROM S,C,SC,(    SELECT SID,CID,COUNT(G) AS Num                FROM SC                GROUP BY SID,CID                HAVING COUNT(G) = 2) AS AWHERE S.SID = A.SID AND SC.SID = A.SID AND C.CID = A.CID AND A.CID = SC.CID 

热点排行
Bad Request.