您的位置:首页 > 职场人生

sql面试-1

2011-09-15 18:34 148 查看
--student info table

create table S (

S# int not NULL,

SN varchar(20),

SD varchar(20)

);

--course table infoma

create table C(

C# int not null,

CN varchar(50),

);

--relation table

create table SC(

S# int not null,

C# int not null,

Score int default 0

);

insert into S values(1,'张三','计算机');

insert into S values(2,'李四','软件');

insert into S values(3,'王五','数据库');

insert into S values(4,'赵六','计算机');

insert into C values(1,'课程1');

insert into C values(2,'课程2');

insert into C values(3,'课程3');

insert into C values(4,'课程4');

insert into C values(5,'课程5');

insert into C values(6,'课程6');

--delete from sc

insert into SC values(1,1,60);

insert into SC values(1,2,20);

insert into SC values(1,3,60);

insert into SC values(1,4,80);

insert into SC values(1,5,60);

insert into SC values(1,6,60);

insert into SC values(2,1,60);

insert into SC values(2,2,60);

insert into SC values(2,3,40);

insert into SC values(2,4,30);

insert into SC values(2,5,60);

insert into SC values(3,3,60);

--1.查询出 学了 ‘课程3 ’ 的 学生

--1.1

SELECT * FROM S WHERE S# IN

(

SELECT S# FROM SC WHERE C#=(SELECT C# FROM C WHERE CN='课程3')

)

--1.2

select S.* from S,C,SC

where S.S#=SC.S# and SC.C#=C.C# and C.CN='课程3';

--1.3

select * from S;

select * from SC;

select * from C;

select s.*

from s

inner join sc

on s.s#=sc.s#

inner join c

on sc.c#=c.c# and c.cn='课程3'

option(force order)

select s.*

from s

inner join sc

on s.s#=sc.s#

inner join c

on sc.c#=c.c# and c.cn='课程3'

/*select s.*

from sc

inner join c

on sc.c#=c.c# --and c.cn='课程3';

inner join s

on s.s#=sc.s#*/

--1.4

Select S# , SN , SD

From S

Where Exists(Select 1

From SC

Inner Join C On C.C#=SC.C#

Where SC.S#=S.S#

)

--2.查询学了所有课程的学生

--2.1

use d5

SELECT * FROM S

INNER JOIN

(SELECT S#,COUNT(1) _SUM FROM SC GROUP BY S#) AS T1

ON S.S#=T1.S# AND T1._SUM = (SELECT COUNT(1) FROM C)

--2.2

select count(C#) as num from C ;

--MySql

--select S1 ,count(C1) as num from SC group by S1 having num=(select count(C1) from C);

select * from S

inner join

(select S# ,count(C#) as num from SC group by S# having count(C#)=(select count(C#) from C)) as t1

on S.S#= t1.S#;

--2.3最优

Select S.S# , S.SN , S.SD

From S

Where Not Exists(Select 1

From C

Where Not Exists(Select 1

From SC

Where SC.C#=C.C#

And S#=S.S#

)

)

--3.查询学了5门以上课程的学生

--3

--最优

Select S.S# , S.SN , S.SD

From S

Inner Join SC On SC.S#=S.S#

Group By S.S# ,S.SN , S.SD

Having Count(1)>=5

--mysql

Select S.S1 , S.SN , S.SD

From S

Inner Join SC On SC.S1=S.S1

Group By S.S1

Having Count(1)>=5

--2.查询有两门以上不及格的成绩的学生,学好,姓名,

-- <60的学生

select * from sc

select S# ,C#, Score,count(S#) ss from SC

group by S#,C# ,Score having Score<60

--注意count(S#) 统计的是 group by S#,C# 后的信息,只显示一行

SELECT S.S# ,S.SN FROM S

, ( select S# ,C#,Score ss from SC

group by S#,C# ,Score having Score<60 ) AS T1

where S.S#= T1.S# group by S.S#,S.SN having count(ss)>=2

--group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面

--mysql

select S1 ,C1,Score from SC

where Score<60 group by S1,C1 ,Score having count(S1)>=2

select S.S#,S.SN,S.SD

from S

inner join SC On SC.S#=S.S# group by S.S#

having count(SC.C#)

--3.如果让你建索引,你会在哪建

--4.统计一个学生成绩报表的思路

--表报格式如下

--学号 课程1 课程2 课程3 ...

--001 100 100 100

--002 100 100 100

--... 【 学号和课程都可变 】

--method 1 固定死的,如果需求一变动,就需要改代码。

select SC.S# as 学号 ,

S.SN as 姓名,

max(case when SC.C#=1 then SC.Score end ) as 课程1,

max(case when SC.C#=2 then SC.Score end) as 课程2,

max(case when SC.C#=3 then SC.Score end) as 课程3,

max(case when SC.C#=4 then SC.Score end) as 课程4

from SC,S where SC.S#=S.S# group by SC.s#,S.SN

--method 2

DECLARE @sql varchar(8000)

set @sql=''

select @sql=@sql+',max(case when sc.c#='''+Convert(varchar,sc.C#)+''' then sc.score end) ['+Convert(varchar,c.cn)+']'

from sc,c WHERE sc.C# = c.c# group by sc.c#,c.cn

set @sql=stuff(@sql,1,1,'')

PRINT @sql

exec ('select max(s.sn) as [Name],'+@sql+' from sc,s where sc.s# = s.s# group by sc.s#')

DECLARE @s varchar(8000)

set @s=''

select @s=@s+',max(case when sc.c#='+Convert(varchar,sc.C#)+' then sc.score end) as '+convert(varchar,c.cn)

from sc,c where sc.c#=c.c# group by sc.c#,c.cn

set @s=stuff(@s,1,1,'')

PRINT @s

exec('select max(s.sn) as name ,'+@s+' from sc,s where sc.s#=s.s# group by sc.s#')

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息