免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3982 | 回复: 0
打印 上一主题 下一主题

SQL 经典面试题集 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-16 01:36 |只看该作者 |倒序浏览

1,现有表bill和表payment结构如下,两表通过pay_id关联:
bill表――bill_id是帐单标识,charge为帐单金额,pay_id为付款编号,PK:bill_id
bill_id INTEGER
charge INTEGER
pay_id INTEGER
payment表――pay_id为付款编号,charge为付款金额,PK:pay_id
pay_id INTEGER
charge INTEGER
要求更新payment使charge=bill表中同一pay_id的charge之和。
2、表A定义如下:
属性 类型
Year Integer
Quarter Varchar(30)
Amount float
Year Quarter Amount
2000 1 1.1
2000 2 1.2
2000 3 1.3
2000 4 1.4
2001 1 2.1
2001 2 2.2
2001 3 2.3
2001 4 2.4
其中每行表表示一个季度的数据。
如果处理表A中的数据,得到如下的结果。
Year Quarter1 Quarter2 Quarter3 Quarter4
2000 1.1 1.2 1.3 1.4
2001 2.1 2.2 2.3 2.4
请用SQL写一段代码实现。
3、有如下信息:
起始地 目的地 距离(公里)
A B 1000
A C 1100
A D 900
A E 400
B D 300
D F 600
E A 400
F G 1000
C B 600
请用SQL语句或一段代码写出从A出发,可达到的目的地(包括间接方式)。
4.表A定义如下:
属性 类型 备注
Id Integer PK
Name Varchar(30)
State char(3)
表A中现有1000万条记录,如果客户端要通过分页的方式从表A中取数据,其中每页20条
记录,有几种方法?描述每种方法如何处理,有什么优缺点?用SQL写出实现代码。



scmail81 发表于 2006-2-12 14:17:25
不错吗!
CSDN上的经典问题阿!
scmail81 发表于 2006-2-12 14:27:45
2.
create table A
(
year int,
Quarter varchar(30),
amount float
)
insert A select 2000,'1',1.1
insert A select 2000,'2',1.2
insert A select 2000,'3',1.3
insert A select 2000,'4',1.4
insert A select 2001,'1',2.1
insert A select 2001,'2',2.2
insert A select 2001,'3',2.3
insert A select 2001,'4',2.4
declare @T_SQL varchar(8000)
set @T_SQL=''
select @T_SQL=@T_SQL + ' sum(case when Quarter=''' + T.Quarter + ''' then amount else 0 end) as Quarter' + T.Quarter +','
from (select Quarter from A group by Quarter) T
set @T_SQL='select year ,' + left(@T_SQL,len(@T_SQL)-1) + ' from A group by year'
exec (@T_SQL)
scmail81 发表于 2006-2-12 14:46:32
3.
create table A
(
起始地 varchar(5),
目的地 varchar(5),
距离 int
)
insert A select 'A','B',1000
insert A select 'A','C',1100
insert A select 'A','D',900
insert A select 'A','E',400
insert A select 'B','D',300
insert A select 'D','F',600
insert A select 'E','A',400
insert A select 'F','G',1000
insert A select 'C','B',600
declare @Q varchar(5)
declare @T table ( 起始地 varchar(5),目的地 varchar(5),路 varchar(8000),lev int)
declare @lev int
set @Q='A'
set @lev=1
insert @T select 起始地,目的地,起始地+'->'+目的地 as 路,@lev as lev from A where 起始地=@Q
while @@rowcount>0
begin
set @lev=@lev+1
insert @T select A.起始地,A.目的地,T.路+'->'+A.目的地 ,@lev as lev from (select * from @T where lev=@lev-1) T,(select * from A where A.目的地 not in (select 起始地 from @T)) A where A.起始地=T.目的地
end
select 路 from @T
scmail81 发表于 2006-2-12 14:56:03
1.
update payment set charge=(select sum(charge) from bill where pay_id=T.pay_id)
from payment p
samfeng_2003 发表于 2006-2-12 15:48:20
我晕,这是哪个公司的面视题?怎么有那么多公司都用这题来考人啊
shiqing8899 发表于 2006-2-12 17:05:36
不是吧?有这么多公司用啊!
gerrylc 发表于 2006-2-13 8:32:02
是啊,我也碰过第二题
select year,sum(case Quarter when '1' then Amount else 0 end) as Quarter1,
Quarter2=sum(case Quarter when '2' then Amount else 0 end),
Quarter3=sum(case Quarter when '3' then Amount else 0 end),
Quarter4=sum(case Quarter when '4' then Amount else 0 end),
Amount=sum(Amount)
from 表 group by year order by year
mm2love2zz 发表于 2006-2-13 14:04:48
看过了~~
mm2love2zz 发表于 2006-2-13 14:17:33
select year,sum(case Quarter when '1' then Amount end) as Quarter1,
sum(case Quarter when '2' then Amount end) as Quarter2,
sum(case Quarter when '3' then Amount end) as Quarter3,
sum(case Quarter when '4' then Amount end) as Quarter4
from A order by year group by year
chenyuandxm 发表于 2006-2-13 16:59:15
1、
select pay_id,charge=sum(charge) into #temp from bill group by pay_id
update payment set payment.charge=#temp.charge from payment,#temp where payment.pay_id=#temp.pay_id


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/71471/showart_1002406.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP