ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 一些sqll測試題

一些sqll測試題

原创 Linux操作系统 作者:keeking 时间:2009-08-04 16:18:13 0 删除 编辑

表: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单位  

 

create table  A01(Z0001 int primary key,a0101 varchar,a0102 varchar,a0103 int,
a0104 char)

create table A32(Z0001 int foreign key references A01(Z0001) ,a0105 varchar, a0106 char,b0001 varchar)

insert into A01 values(10000, '魏新' ,'黑龍江','1' ,'19800110')
insert into A01 values(10001, '林強' ,'内蒙古','1' ,'19801221')

insert into A32 values(10000, '科长' ,'19990110' ,'A单位')
insert into A32 values(10000, '处长' ,'20000123' ,'B单位')
insert into A32 values(10000, '科长' ,'19980213' ,'E单位')
insert into A32 values(10000, '局长' ,'20021104' ,'C单位')
---问题(3)查询出职务变更最频繁的人,显示出此人的姓名  

SELECT * FROM A01
WHERE Z0001=(
SELECT TOP 1 Z0001 FROM A32  GROUP BY Z0001 ORDER BY COUNT(*) DESC
)

 第二题、现有一个表table1只有一个字段F1,表中数据如下:  
  Z0001  
  0  
  1  
  2  
  3  
  4  
  5  
  6  
  7  
  8  
  9  
  问题:用现有的数据用一个SQL语句构造出一个1-9999的结果集,类似如下:  
  1  
  2  
   
  ...   ...  
  9999 


select   
convert(int,convert(char(1),a.name)+
convert(char(1),b.name)+
convert(char(1),c.name)+
convert(char(1),d.name))+1   as   cc 
 from   dbo.test   a,dbo.test   b,dbo.test   c,dbo.test   d   order   by   cc  
 
----------------------------------------------
WITH CTE AS(
SELECT Name+1 AS N  from  dbo.test
UNION all
SELECT N+10 AS N FROM CTE WHERE N+10<=9999)

SELECT * FROM CTE order by N OPTION (MAXrecursion 0)
第三题  
  如下表(T2)为某班级某一学期的数学成绩:  
  学号 成绩  
  199801001 85  
  199801002 76  
  199801003 98  
  199801004 54  
  199801005 39  
  199801006 61  
  问题:请根据t2表的内容输出如下两行数据,要求SQL语句最简。(60分以上为及格)  
  类别 人数  
  ============  
  及格 4  
  不及格 2  


-------------------

select '及格' as [類別],count(*)as [人數] from Student where [成績]>=60
union
select '不及格'as [類別],count(*)as [人數] from Student where [成績]<60
 第四题  
  有如下表T记录人员的情况:  
  /*create   table   t_t  
  (RenID   INT   PRiMARY   KEY,  
  RenMing   CHAR(8),  
  RenParentID   INT   REFERENCES   t_t(RenID))*/  
  =======================================  
  RenID RenMing RenParentID  
  2 张一 10  
  3 张二 10  
  5 王一 11  
  8 王二 11  
  10 张_父 15  
  11 王_父 NULL  
  15 张_父_父 16  
  16 NULL  
  问题:  
  1、选择出所有没有父的人,注意查询性能。  
select * from dbo.bonuses where ParentID IS NULL
  2、选择出所有人名中含有“_”的人。  
SELECT * FROM dbo.bonuses WHERE NAME LIKE '%[_]%'
  3、选择出“张父”的子。 
SELECT * FROM  dbo.bonuses  WHERE ParentID=(SELECT EMPLOYEE_ID FROM dbo.bonuses WHERE NAME='張_父')
  4、选择出有“孙子”的人。  
WITH C(EMPLOYEE_ID,name,ParentID,LVL,sort) AS
(SELECT *,0 AS LVL,convert(nvarchar,NAME+'-->')  FROM dbo.bonuses WHERE ParentID IS NULL
 UNION ALL
SELECT A.*,LVL+1 ,convert(nvarchar,(C.sort + A.name+'-->')) as sort FROM dbo.bonuses A JOIN  C ON C.EMPLOYEE_ID=A.ParentID
)
SELECT DISTINCT left(sort,charindex('-',sort)-1) AS NAME FROM C WHERE LVL=2
-------------
select  * from dbo.bonuses where EMPLOYEE_ID in
(select ParentID FROM dbo.bonuses WHERE  EMPLOYEE_ID IN (SELECT ParentID FROM dbo.bonuses ))
----------------
SELECT * FROM dbo.bonuses WHERE NAME LIKE '%_父_父%'
  5、选择出如下结果:  
  项目 张 王  
  人数 4 3

select '人數' as [項目], sum(case  when name like '%張%' then 1 else 0 end) as [張],
sum(case  when name like '%王%' then 1 else 0 end) as [王]
 from  dbo.bonuses
-------
  6、选择出如下结果:  
  项目 人数  
  王 3  
  张 4
  

select '王' as [項目],count(*) as [人數] from dbo.bonuses  where name like '%王%'
union
select '張' as [項目],count(*) as [人數] from dbo.bonuses  where name like '%張%'
  7、将T表中的RenID从1~8排列,不要打乱现有表中数据的关系。 
  select   (select   count(*)   from  dbo.bonuses   where   EMPLOYEE_ID<=tem.EMPLOYEE_ID)   rowid,*   from   dbo.bonuses   tem  
-------------------
select row_number() over (order by EMPLOYEE_ID) AS NUM,* from dbo.bonuses
  8、选择出“张父”的子(一列一行),两个人名中用“,”相隔。
select name=
stuff(replace(replace((select name  from   dbo.bonuses  where ParentID=10 for xml auto),'',''),1,1,'')
  9、编写一存储过程可以列出给定RenID的所有子(包括子的子)。\
create proc getChildren
(@ID int)
AS
begin

select * from dbo.bonuses where ParentID=@ID
union
select B.* from dbo.bonuses  A join  dbo.bonuses  B ON A.EMPLOYEE_ID=B.ParentID
WHERE A.ParentID=@ID

end


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7899089/viewspace-611317/,如需转载,请注明出处,否则将追究法律责任。

下一篇: SQL題_20090805
请登录后发表评论 登录
全部评论

注册时间:2009-07-23

  • 博文量
    194
  • 访问量
    241468