转载: SQL面试题

转载自: http://blog.csdn.net/Leon110/archive/2009/07/20/4362436.aspx

 

 

 

 

题目1

问题描述:

管理 岗位业务培训 信息,建立3个表:

S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄

C (C#,CN ) C#,CN 分别代表课程编号、课程名称

SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习 成绩

1. 使用标准SQL 嵌套语句查 询选修课程名称为’税收基础’的学员学号和姓名

--实现代码 :

SELECT SN,SD FROM S

WHERE [S#] IN(

SELECT [S#] FROM C,SC

WHERE C.[C#]=SC.[C#]

AND CN=N'税收基础')

2. 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位

--实现代码:

SELECT S.SN,S.SD FROM S,SC

WHERE S.[S#]=SC.[S#]

AND SC.[C#]='C2'

3. 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位

--实现代码:

SELECT SN,SD FROM S

WHERE [S#] NOT IN(

SELECT [S#] FROM SC

WHERE [C#]='C5')

4. 使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位

--实现代码:

SELECT SN,SD FROM S

WHERE [S#] IN(

SELECT [S#] FROM SC

RIGHT JOIN

C ON SC.[C#]=C.[C#] GROUP BY [S#]

HAVING COUNT(*)=COUNT([S#]))

5. 查询选修了课程的学员人数

--实现代码:

SELECT 学员人数=COUNT(DISTINCT [S#]) FROM SC

6. 查询选修课程超过5门的学员学号和所属单位

--实现代码:

SELECT SN,SD FROM S

WHERE [S#] IN(

SELECT [S#] FROM SC

GROUP BY [S#]

HAVING COUNT(DISTINCT [C#])>5)

题目2

问题描述:

已知关系模式:

S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名

C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师

SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩

1. 找出没有选修过“李明”老师讲授课程的所有学生姓名

--实现代码:

SELECT SNAME FROM S

WHERE NOT EXISTS(

SELECT * FROM SC,C

WHERE SC.CNO=C.CNO

AND CNAME='李明'

AND SC.SNO=S.SNO)

2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩

--实现代码:

SELECT S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)

FROM S,SC,(

SELECT SNO

FROM SC

WHERE SCGRADE<60

GROUP BY SNO

HAVING COUNT(DISTINCT CNO)>=2

)A WHERE S.SNO=A.SNO AND SC.SNO=A.SNO

GROUP BY S.SNO,S.SNAME

3. 列出既学过“1”号课程,又学过“2”号课程的所有学生姓名

--实现代码:

SELECT S.SNO,S.SNAME

FROM S,(

SELECT SC.SNO

FROM SC,C

WHERE SC.CNO=C.CNO

AND C.CNAME IN('1','2')

GROUP BY SNO

HAVING COUNT(DISTINCT CNO)=2

)SC WHERE S.SNO=SC.SNO

4. 列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号

--实现代码:

SELECT S.SNO,S.SNAME

FROM S,(

SELECT SC1.SNO

FROM SC SC1,C C1,SC SC2,C C2

WHERE SC1.CNO=C1.CNO AND C1.NAME='1'

AND SC2.CNO=C2.CNO AND C2.NAME='2'

AND SC1.SCGRADE>SC2.SCGRADE

)SC WHERE S.SNO=SC.SNO

5. 列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩

--实现代码:

SELECT S.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩]

FROM S,(

SELECT SC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADE

FROM SC SC1,C C1,SC SC2,C C2

WHERE SC1.CNO=C1.CNO AND C1.NAME='1'

AND SC2.CNO=C2.CNO AND C2.NAME='2'

AND SC1.SCGRADE>SC2.SCGRADE

)SC WHERE S.SNO=SC.SNO


说明:有三个表,项目表、合同表、付款表

--下面是建立表的语句
create table 项目(项目编号 int,项目名称 varchar(50))
insert into 项目
select 1, '项目1' from dual
union all
select 2, '项目2' from dual
union all
select 3, '项目3' from dual;


create table 合同(合同编号 int,项目编号 int,合同金额 number(7,3))

insert into 合同
select 1,1,1000 from dual
union all
select 2,1,1500 from dual
union all
select 3,2,2000 from dual;

create table 付款(付款编号 int,合同编号 int,付款金额 number(7,3))

insert into 付款
select 1,1,100 from dual
union all
select 2,2,200 from dual
union all
select 3,2,800 from dual;

一个项目可能会有签署多个合同,每个合同会分几次付款,

问题(一)
设计一个查询,要求返回结果如下:
项目编 号        项目名称             项目所有合同的金额                               
----------- ----------------------- ------------------------
1           项目1                    2500
2           项目2                    2000
3           项目3                    NULL

解答:
SELECT L.项目编号,MAX(L.项目名称),SUM(R.合同金额) AS 合同金额
FROM 项目 L LEFT OUTER JOIN 合同 R
ON L.项目编号=R.项目编号
GROUP BY L.项目编号

问题(二)
设计一个查询,要求返回结果如下:
项目编 号        项目所有合同已付款金额                             
----------- -----------------------------
1            1100
2            NULL
-----------------------------------------

解答:
SELECT T2.项目编号,SUM(T3.付款金额) AS 项目所有合同已付款金额
FROM 合同 T2 LEFT OUTER JOIN 付款 T3
ON  T2.合同编号=T3.合同编号
GROUP BY T2.项目编号


问题(三)
设计一个查询,要求返回结果如下:
项 目编号    项目名称        项目所有合同已付款金额                             
----------- ----------------------------------------
1           项目1   1100
2           项目2   NULL
----------------------------------------------------

解答:
SELECT T1.项目编号
,MAX(T1.项 目名称)
,SUM(T3.付款金额) AS 项目所有合同已付款金额
FROM 项目 T1 JOIN 合同 T2
ON T1.项目编号=T2.项目编号
LEFT OUTER JOIN 付款 T3
ON  T2.合同编号=T3.合同编号
GROUP BY T1.项目编号

问题(四)
请您设计一个查询语句,检索的格式如下

------------------------------------------------------------------------
项 目编号    项目名称    项目所有合同的金额    项目所有合同已付款金额    
1           项目1        2500.000              1100.000
2           项目2        2000.000              NULL
------------------------------------------------------------------------

解答:
select L.项目编号,L.项目名称,L.项目所有合同的金额,R.项目所有合同已付款金额
from
(select A.项目编号,A.项目名称,sum(B.合同金额) 项目所有合同的金额
   from 项目 A LEFT JOIN 合同 B ON A.项目编号=B.项目编号
     group by A.项目编号,A.项目名称) L
JOIN
(select B.项目编号, sum(付款金额) 项目所有合同已付款金额
   from 合同 B LEFT JOIN  付款 C ON B.合同编号=C.合同编号
     group by B.项目编号) R
ON L.项目编号=R.项目编号

阅读更多
个人分类: Database
想对作者说点什么? 我来说一句

SQL全部分析面试题

2008年10月10日 1KB 下载

SQL面试题

2011年06月07日 23KB 下载

SQL面试题2

2018年05月02日 263KB 下载

SQL面试题SQL面试题SQL面试题

2010年07月21日 169KB 下载

sqlsqlSQL面试题

2011年05月26日 4KB 下载

sql面试题以及答案

2010年10月25日 229KB 下载

sql面试题,java面试题

2008年11月19日 42KB 下载

SQL经典面试题-很有用

2009年03月16日 39KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭