招聘时的sql试题
第一题
表:A01(人员基本情况表)和A32(职务信息表)
A01(主表)结构
字段名称 数据类型 备注
========================================
Z0001 int 主关键字
a0101 varchar 姓名
a0102 varchar 地址
a0103 int 性别
a0104 char 出生年月
A32(子表)结构
Z0001 int 关键字(外键)
a0105 varchar 所在职务
a0106 char 上任日期
b0001 varchar 职务单位
问题(3)查询出职务变更最频繁的人,显示出此人的姓名
提示:例如A01和A32中有如下数据时,职务变更最频繁的是人是“魏新”
A01表中数据
z0001 a0101 a0102 a0103 a0104
10000 魏新 男 黑龙江 19800110
10001 林强 男 内蒙古 19801221
a32表中数据
z0001 a0105 a0106 b0001
10000 科长 19990110 A单位
10000 处长 20000123 B单位
10001 科长 19980213 E单位
10000 局长 20021104 C单位
**********************************************************************
**********************************************************************
第二题、现有一个表table1只有一个字段F1,表中数据如下:
Z0001
0
1
2
3
4
5
6
7
8
9
问题:用现有的数据用一个SQL语句构造出一个1-9999的结果集,类似如下:
1
2
... ...
9999
**********************************************************************
**********************************************************************
第三题
如下表(T2)为某班级某一学期的数学成绩:
学号 成绩
199801001 85
199801002 76
199801003 98
199801004 54
199801005 39
199801006 61
问题:请根据t2表的内容输出如下两行数据,要求SQL语句最简。(60分以上为及格)
类别 人数
============
及格 4
不及格 2
问题点数:20、回复次数:25Top
1 楼playyuer(退休干部 卧鼠藏虫)回复于 2003-11-02 12:26:58 得分 5
select *
from A01
where (select count(*) from A32 where A01.Z0001 = Z0001)
=
select max(f)
from
(
select count(*) as f
from A32
group by Z0001
) TTop
2 楼playyuer(退休干部 卧鼠藏虫)回复于 2003-11-02 12:47:46 得分 0
select (case when 成绩 >= 60 then '及格'
else '不及格' end)
,count(*)
from t2
group by (case when 成绩 >= 60 then '及格'
else '不及格' end)Top
3 楼raymond323(raymond)回复于 2003-11-02 12:49:30 得分 0
upTop
4 楼pengdali()回复于 2003-11-02 12:52:30 得分 5
第一题
select * from a01 where z0001=(select top 1 z0001 from a32 group by z0001 order by count(*) desc)
第二题
select a.a+b.a*10+c.a*100+d.a*1000 from z0001 a,z0001 b,z0001 c,z0001 d order by a.a+b.a*10+c.a*100+d.a*1000
第三题
select case when 成绩<60 then '不及格' else '及格' end 类别,count(*) 人数 from t2 group by case when 成绩<60 then '不及格' else '及格' endTop
5 楼playyuer(退休干部 卧鼠藏虫)回复于 2003-11-02 12:53:32 得分 0
select table1.Z0001*1000 + a.Z0001 *100 + b.Z0001 *10 + c.Z0001
from table1,table1 as a,table1 as b,table1 as c
order by #table1.Z0001*1000 + a.Z0001 *100 + b.Z0001 *10 + c.Z0001Top
6 楼xhggg(xh)回复于 2003-11-02 15:34:22 得分 0
各位的功底真是了得!还有1题,不过我对这道题题目不理解?!
第四题
有如下表T记录人员的情况:
/*create table t
(RenID INT PRTMARY KEY,
RenMing CHAR(8),
RenParentID INT REFERENCES T(RenID))*/
=======================================
RenID RenMing RenParentID
2 张一 10
3 张二 10
5 王一 11
8 王二 11
10 张_父 15
11 王_父 NULL
15 张_父_父 16
16 NULL
问题:
1、选择出所有没有父的人,注意查询性能。
2、选择出所有人名中含有“_”的人。
3、选择出“张父”的子。
4、选择出有“孙子”的人。
5、选择出如下结果:
项目 张 王
人数 4 3
6、选择出如下结果:
项目 人数
王 3
张 4
7、将T表中的RenID从1~8排列,不要打乱现有表中数据的关系。
8、选择出“张父”的子(一列一行),两个人名中用“,”相隔。
9、编写一存储过程可以列出给定RenID的所有子(包括子的子)。Top
7 楼wzh1215(懒猫)回复于 2003-11-02 15:39:03 得分 5
第一题:(满足职务变更最频繁为多个人的情况)
select a0101 from A01 where z0001 in(select z0001 from a32 group by z0001 having count(z0001)=(select max(count(z0001)) from a32 group by z0001))
第二题:
select top 9999 convert(int,convert(char(1),a.id)+convert(char(1),b.id)+convert(char(1),c.id)+convert(char(1),d.id))+1 as cc from aaa a,aaa b,aaa c,aaa d order by cc
第三题:
select '及格' as 类别,count(cont) as 人数 from ccc where cont>=60
union all
select '不及格' as 类别,count(cont) as 人数 from ccc where cont<60Top
8 楼wzh1215(懒猫)回复于 2003-11-02 16:07:57 得分 0
1.
select * from t where RenParentID is NULL
2.
select * from t where RenMing like '%[_]%'
3.
select * from t where RenParentID in (select RenId from t where RenMing='张_父')
4.
select * from t where RenID in (select RenParentID from (select * from t where RenID in(select distinct RenParentID from t)) as tmp where RenParentID is not NULL)
Top
9 楼wzh1215(懒猫)回复于 2003-11-02 16:30:50 得分 0
5.
select '人数' as 项目,(select count(*) from t where RenMing like '张%') as 张,(select count(*) from t where RenMing like '王%') as 王
6.
select '王' as 项目,count(*) as 人数 from t where RenMing like '王%'
union all
select '张' as 项目,count(*) as 人数 from t where RenMing like '张%'
7.
select tt.RenID,tt.RenMing,tt.RenParentID,(select count(*)+1 from t where RenID<tt.RenID) as ID from t tt order by tt.RenID
8.
9.
create procedure RenIDS
@RenID as int
AS
select * from t where RenParentID in(select RenID from t where RenID=@RenID)
Go
exec RenIDS '张_父'Top
10 楼pengdali()回复于 2003-11-02 16:38:26 得分 0
--考虑了半天,不知道该不该贴,我贴出来不知道是害你还是帮你。你这样即使应聘上又有什么意义呢?
1、选择出所有没有父的人,注意查询性能。
select * from t where RenParentID is null
2、选择出所有人名中含有“_”的人。
select * from t where RenMing like '%[_]%'
3、选择出“张父”的子。
select * from t where RenParentID in(select renid from t where RenMing='张父')
4、选择出有“孙子”的人。
select * from t a where exists(select 1 from t b where RenParentID=a.renid and exists(select 1 from t where RenParentID=b.renid))
5、选择出如下结果:
项目 张 王
人数 4 3
select '人数' 项目,sum(case when RenMing like '张%' then 1 else 0 end) 张,sum(case when RenMing like '王%' then 1 else 0 end) 王 from t
6、选择出如下结果:
项目 人数
王 3
张 4
select left(RenMing,1) 项目,count(*) 人数 from t group by left(RenMing,1)
7、将T表中的RenID从1~8排列,不要打乱现有表中数据的关系。
select (select count(*) from t where RenID<=tem.RenID) rowid,* from t tem
8、选择出“张父”的子(一列一行),两个人名中用“,”相隔。
declare @a varchar(8000)
set @a=''
select @a=@a+','+RenMing from t where RenParentID in(select renid from t where RenMing='张父')
select right(@a,len(@a)-1) 张父的子
9、编写一存储过程可以列出给定RenID的所有子(包括子的子)。
create proc 存储过程
@renid int
as
begin
declare @a table (RenID int,RenMing varchar(10),RenParentID int)
insert @a select * from t where RenParentID=@RenID
while @@rowcount>0
insert @a select * from t where RenParentID in (select RenID from @a) and RenID not in (select RenID from @a)
select * from @a
end
goTop
11 楼realgz(realgz)回复于 2003-11-02 16:47:44 得分 0
还可以边考边问吗?
哪个公司这么好?我也去^_^!!Top
12 楼southdoor(南门)回复于 2003-11-02 18:12:14 得分 0
学习!Top
13 楼benxie(结婚是幸福的!为了老婆努力赚钱!)回复于 2003-11-02 19:31:33 得分 0
学习!
Top
14 楼19191919(小楼别筑)回复于 2003-11-02 21:47:38 得分 0
----4
select renming from t where renming like '%父!_父'escape'!'
----9
create proc p_getson (@renid int)
as
declare @sql varchar(200)
set @sql=''
select @sql=renid from t where renid in ( select renparentid from t where renparentid=@renid)
if @sql=''
select renming from t where renid=@sql
else
select reming from t where reparentid=@sql or renid=@sqlTop
15 楼coffee_black(黑咖啡)回复于 2003-11-02 21:47:59 得分 0
gzTop
16 楼perfwell(我就是我)回复于 2003-11-03 09:31:55 得分 0
GZTop
17 楼xhggg(xh)回复于 2003-11-03 10:38:50 得分 0
各位大虾,这是我去年的应聘材料,我当时就没搞懂,本就没应聘上。贴上的目的有两个,其一就是看看别人解题的思路,找到效率最高的方法,俺好学习学习。其二也可以让和我一样的sql菜鸟也学学公司招聘一般都考什么难度的试题,其实大家如果有好题也不防共享出来。分两次写出来是因为我打字很慢,中间喝了杯茶洗了个澡外带换件衣服。不妙这两天降温,俺感冒了!最后感谢大虾辛苦解题。Top
18 楼xhggg(xh)回复于 2003-11-03 10:51:47 得分 0
另外俺还有一个埋藏心底很久的问题不知道问了多少人就是没有答案:
在access或sqlserver表的记录编辑中怎么插入记录(非程序)
access中好像只能在修改表结构时插入字段,我该怎么插入一条记录?Top
19 楼guanhua8(奋斗)回复于 2003-11-03 10:55:22 得分 5
呵呵,给你写一个存储过程可以列出给定RenID的所有子(包括子的子)。适用于sql server
create procedure pd @parentID varchar(8),@rm varchar(16)
as
begin
declare @i int,@tid varchar(8),@trm varvhar(16)
set @i = 0
create table #t(t_id varchar(8),t_rm varchar(16))
insert into #t values (@parentID,@rm)
while 1=1
begin
set @i = @i + 1
declare cur cursor for select t_id from #t
open cur
fetch ABSOLUTE @i from cur into @tid
if @@FETCH_STATUS <> 0
begin
break
end
insert into #t select t.renid,t.renming from t where t.renparentid = @tid
CLOSE cur
DEALLOCATE cur
end
CLOSE cur
DEALLOCATE cur
select * from #t
drop table #t
end
Top
20 楼samuelpan(欧乐)回复于 2003-11-03 12:32:31 得分 0
第九题答案应该给出包括递归程序段的答案。Top
21 楼cp07(cp07)回复于 2003-11-03 16:27:11 得分 0
UPTop
22 楼xhggg(xh)回复于 2003-11-03 22:18:59 得分 0
up up up 同志们Top
23 楼cgsun(colin)回复于 2003-11-04 08:29:36 得分 0
markTop
24 楼xhggg(xh)回复于 2003-11-04 11:19:02 得分 0
总是带着问题结贴!如愿回答,下面地址给分,本人结贴及时,最快:3分钟。最慢:1星期。
http://expert.csdn.net/Expert/topic/2425/2425077.xml?temp=.4892542Top
25 楼vileboy(郭海宸_追星族_傻子)回复于 2003-11-04 14:40:56 得分 0
学习中。Top




