软件工程师笔试题1

更新时间:2023-12-18 08:10:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

sql 相关的查询面试题收集及答案

一 //查询某表中的第30到40行的数据

select * from 表名 where 字段 in( select top 40 字段 from 表名 )and 字段 not in( select top 30 字段 from 表名) 或者

select top 10 * from 表名 where 字段 not in( select top 30 字段 from 表名)

二 //查询一个表中存在重复的字段“字段1”

select DISTINCT 字段1 from 表名 having count(字段1)>1 group by 字段1

(并显示可能重复的次数)

select DISTINCT 字段1, count(字段1) As 次数 from 表名 having count(字段1)>1 group by 字段1

某门户网站数据库职位笔试题 1、事务是什么?

2、oracle中truncate和delete命令有何区别?

3、Oracle中char和varchar2数据类型有什么区别?有数据”test”分别存放到char(10)和varchar2(10)

类型的字段中,其存储长度及类型有何区别?

4、参见如下表结构 出版社:

出版社代码 char(2),

出版社名称 varchar2(32)

图书:

图书编号 char(8),

图书名称 varchar2(128), 出版社代码 char(2),

作者代号 char(4),

图书简介 varchar2(128)

作者:

作者代号 char(4),

作者名称 varchar2(10), 性别 char(1), 年龄 number(3),

文学方向 varchar2(64)

获奖名单:

获奖日期 date, 获奖人员 char(4)

编写SQL语句,找出“作者”库中没有出现在“获奖名单”库中所有作者信息的SQL语句(提示:使用not

in、not exists以及外关联三种方法,并说明哪种方法最优。

5、Oracle数据库表存在伪列rowid,请利用rowid编写一个SQL语句,从以下记录中找到唯一记录,并将其

flag列更新为Y

No name sex flag

1 张三 1 N 1 张三 1 N 1 张三 1 N

6、Oracle中,需要在查询语句中把空值(NULL)输出为0,如何处理?

7、见第四题“获奖名单”表,写出SQL语句,查询出在上一个月获奖的人员。

8、见第四题“图书”表,在表上对图书名称、出版社代码、作者代号创建了组合索引,请问在执行如下

语句时会不会利用到索引。

Select * from 图书 where 图书名称=’xxxx’

Select * from 图书 where 图书名称=’xxxx’ and 出版社代码=’bb’ Select * from 图书 where 图书名称=’xxxx’ and 作者代号=’ddd’ Select * from 图书 where 出版社代码=’yyy’

9、编写一个简单的Oracle存储过程,输出参数必须有一个是结果集。

专家对本试卷的分析:

第一,这张笔试卷从题目的考点上来看,属于基础知识类的; 第二,从难度上分析属于中等; 第三,从题目的设置上来看,该公司的主要用意是考察笔试者的工作经验和项目经验,尽管是基础

知识,但是只要没做过开发工作,想回答上来并不容易; 第四,通篇只有第4题最后一问涉及到了“优化”的问题,因此判断该公司这张试题主要是面对开 发职位的。

请问在ASP中能否使用一条SQL语句同时操作两个表

有两表Tab1,Tab2;1和2中有两相同字段“代码”,‘名称’,现欲用Tab1中的“代码”和Tab2中‘代码’相关联查询得到‘名称’来填充Tab1中的“名称”字段,在查询分析器中该如何写此语句? update tab1 set 名称=tab2.名称 from tab1,tab2

where tab1.代码=tab2.代码

有两表Tab1,Tab2;1和2中有两相同字段“代码”,‘名称’,现欲用Tab1中的“代码”和Tab2中‘代码’相关联查询得到‘名称’来填充Tab1中的“名称”字段,在查询分析器中该如何写此语句?

update table1 set 名称=b.名

称 from table1 a inner join table2 b on a.代码=b.代码

1.磁盘柜上有14块73G的磁盘, 数据库为200G 大小包括日志文件,如何设置磁盘(要说明这14磁盘是怎么用的)? 2.有两服务器群集,分别为node1和node2 现在要打win200系统补丁,打完后,要重新启动,如何打补丁,不能影响用户使用(要用群集的术语详细说明)。 3.有一个A 数据库,分别复制到B和C B 要求 每次数据更新 也同时更新,C 每天更新一次就行,如何制定复制策略!

4.有一个order 表,有90个字段,20个索引,15个复合索引,其中有3个索引字段超过10个,如何进行优化 5.有一个数据库200G大小,每天增加50M 允许用户随时访问,制定备份策略(详细说明)。

6.管理50台数据库,日常工作是检查数据库作业是否完成,你该如何完成这项检查工作?

7.自定义函数和存储过程的区别是什么,什么情况下只能用自定义函数,什么情况下只能用存储过程

8.SQL 2005 的新特性是什么 ? 与oracle 有什么区别? 9.DBA 的品质应该有哪些,你有哪些, 有什么欠缺的? 10。如果想配置SQL Mail 应该在服务器安装哪些软件! 参考答案:

1.磁盘柜上有14块73G的磁盘, 数据库为200G 大小包括日志文件,如何设置磁盘(要说明这14磁盘是怎么用的)?

这个问题应该是考察硬件知识和数据库物理部署。

首先需要知道这些磁盘是否要用于存放数据库备份文件和数据库性能(读/写)要求。来决定raid的级别。

1)、如果偏重于性能考虑,而且不用存放数据库备份文件的话,考虑使用raid0+1,这样可使用的磁盘容量为:14*73*50%=511G。

2)、如果读/写性能要求不高,而且还比较抠门的话,可以考虑raid5,这样可使用的磁盘容量为:13*73=949G。

至于如何使用应该是说数据库物理文件的部署。注意说出将tempdb,data

file,log file分开存放以减少I/O竞争即可。其实现在的条带化磁盘一般都会自动将文件分存,人为的分布已经越来越不重要了。

2.有两服务器群集,分别为node1和node2 现在要打win200系统补丁,打完后,要重新启动,如何打补丁,不能影响用户使用(要用群集的术语详细说明)。

这个具体操作有点忘了。大致是:首先看哪个节点正在使用,通过节点IP(私有)访问另一个空闲节点,为其打上补丁,然后在群集管理器中停止该节点(也可以用命令行方式),重新启动。等到启动完毕,将切换使用节点,为另一个节点打补丁。然后重新启动。

3.有一个A 数据库,分别复制到B和C B 要求 每次数据更新 也同时更新,C 每天更新一次就行,如何制定复制策略! 这个应该考察的是复制知识。

a->b

1)、如果使用SQL Server复制功能,那么让a->b使用事务性复制方式(同步复制)。

2)、如果表不多,也可以自己写触发器,利用linkserver+distribute transaction。

a->c

1)、如果使用SQL Server复制功能,那么让a->b使用快照复制方式,在某一时间点进行一次性复制。

2)、也可以自己写bat,将a备份后,通过ftp传输备份介质,恢复c。(比较麻烦,不推荐)

4.有一个order 表,有90个字段,20个索引,15个复合索引,其中有3个索引字段超过10个,如何进行优化

这个问题问的比较没水平。你不详细说明这个表的使用方式(读写类的,还是几乎是静态表),就问人家怎么优化?!!还不如问问索引的分布访问原理更好。 看得出他就想让你说:那三个索引超过10个,B树遍例效率很低,适当减少字段数目。如果是SQL2005,可以将选择性不好的字段放在“索引附加字段”中,以保证索引覆盖。而且SQL Server由于有锁升级的毛病,可以考虑拆开表。

5.有一个数据库200G大小,每天增加50M 允许用户随时访问,制定备份策略(详细说明)。

这种情况可以采用增量备份方式。每周日做一次全备份,周一到周六作增量备份(由于数据量较少,可以考虑每30分钟增量备份一次)。这样可以尽量减少性能消耗,而且如果transaction log丢失的情况下,可以保证最多丢失30分钟数据。

6.管理50台数据库,日常工作是检查数据库作业是否完成,你该如何完成这项检查工作?

2005-05-09 负 2005-05-10 胜 2005-05-10 负 2005-05-10 负

如果要生成下列结果, 该如何写sql语句?

胜 负

2005-05-09 2 2 2005-05-10 1 2

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

create table #tmp(rq varchar(10),shengfu nchar(1))

insert into #tmp values('2005-05-09','胜') insert into #tmp values('2005-05-09','胜') insert into #tmp values('2005-05-09','负') insert into #tmp values('2005-05-09','负') insert into #tmp values('2005-05-10','胜') insert into #tmp values('2005-05-10','负') insert into #tmp values('2005-05-10','负')

1)select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',sum(case when shengfu='负' then 1 else 0 end)'负' from #tmp group by rq 2) select N.rq,N.勝,M.負 from (

select rq,勝=count(*) from #tmp where shengfu='胜'group by rq)N inner join

(select rq,負=count(*) from #tmp where shengfu='负'group by rq)M on N.rq=M.rq

3)select a.col001,a.a1 胜,b.b1 负 from

(select col001,count(col001) a1 from temp1 where col002='胜' group by col001) a,

(select col001,count(col001) b1 from temp1 where col002='负' group by col001) b

where a.col001=b.col001

2.请教一个面试中遇到的SQL语句的查询问题 表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。 ------------------------------------------ select (case when a>b then a else b end ), (case when b>c then b esle c end) from table_name

3.面试题:一个日期判断的sql语句?

请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期与时间)

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

select * from tb where datediff(dd,SendTime,getdate())=0

4.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):

大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。 显示格式:

语文 数学 英语 及格 优秀 不及格

------------------------------------------ select

(case when 语文>=80 then '优秀' when 语文>=60 then '及格' else '不及格') as 语文,

(case when 数学>=80 then '优秀' when 数学>=60 then '及格' else '不及格') as 数学,

(case when 英语>=80 then '优秀' when 英语>=60 then '及格' else '不及格') as 英语, from table

5.在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型,并解释下两者的区别? ------------------------------------------

用户临时表:create table #xx(ID int, IDValues int) 系统临时表:create table ##xx(ID int, IDValues int)

区别:

用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的. 当创建它的进程消失时这个临时表就自动删除.

全局临时表对整个SQL Server实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.

6.sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。 ------------------------------------------

它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQL Server的存储容量是可以扩大的.

SQL Server 2000 数据库有三种类型的文件:

主要数据文件

主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。

次要数据文件

次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。

日志文件

日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。

7.请用一个sql语句得出结果

从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。 如使用存储过程也可以。

table1

月份mon 部门dep 业绩yj

------------------------------- 一月份 01 10 一月份 02 10 一月份 03 5 二月份 02 8 二月份 04 9 三月份 03 8

table2

部门dep 部门名称dname

-------------------------------- 01 国内业务一部 02 国内业务二部 03 国内业务三部 04 国际业务部

table3 (result)

部门dep 一月份 二月份 三月份

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

01 10 null null 02 10 8 null 03 null 5 8 04 null null 9

------------------------------------------ 1)

select a.部门名称dname,b.业绩yj as '一月份',c.业绩yj as '二月份',d.业绩yj as '三月份'

from table1 a,table2 b,table2 c,table2 d

where a.部门dep = b.部门dep and b.月份mon = '一月份' and a.部门dep = c.部门dep and c.月份mon = '二月份' and a.部门dep = d.部门dep and d.月份mon = '三月份' and 2)

select a.dep,

sum(case when b.mon=1 then b.yj else 0 end) as '一月份', sum(case when b.mon=2 then b.yj else 0 end) as '二月份', sum(case when b.mon=3 then b.yj else 0 end) as '三月份', sum(case when b.mon=4 then b.yj else 0 end) as '四月份', sum(case when b.mon=5 then b.yj else 0 end) as '五月份', sum(case when b.mon=6 then b.yj else 0 end) as '六月份', sum(case when b.mon=7 then b.yj else 0 end) as '七月份', sum(case when b.mon=8 then b.yj else 0 end) as '八月份', sum(case when b.mon=9 then b.yj else 0 end) as '九月份', sum(case when b.mon=10 then b.yj else 0 end) as '十月份', sum(case when b.mon=11 then b.yj else 0 end) as '十一月份', sum(case when b.mon=12 then b.yj else 0 end) as '十二月份', from table2 a left join table1 b on a.dep=b.dep

8.华为一道面试题

一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。

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

select id, Count(*) from tb group by id having count(*)>1

select * from(select count(ID) as count from table group by ID)T where T.count>1

一道经典SQL面试题及答案

现在我们假设只有一个table,名为pages,有四个字段,id, url,title,body。里面储存了很多网页,网页的url地址,title和网页的内容,然后你用一个sql查询将url匹配的排在最前, title匹配的其次,body匹配最后,没有任何字段匹配的,不返回。

就是上面这道面试题,让我想了一个下午,在网上找资料,最后用下面方法实现

SELECT *

FROM page where url like 'oidu%' or title like 'oidu%' or like ''

ORDER BY CHARINDEX('baidu', url) DESC, CHARINDEX('baidu', title) DESC,

CHARINDEX('baidu', body) DESC

但我感觉这种方法并不是最简单的,后来把这个方法发给面试的人,他给我了一种更简单方法,只要用基本的Sql语句就可以实现。代码如下

select a.[id],a.mark from (

select [page].[id],100 as mark from [page] where [page].[url] like 'oidu%' union

select [page].[id],50 as mark from [page] where [page].[title] like 'oidu%' union

select [page].[id],10 as mark from [page] where [page].[body] like 'oidu%'

) as a order by mark desc

用union 实现联合查询,在每个查询语句中定义一个临时变量mark 并给mark赋值,在最后的输出时采用mark来排序,这样实现,非常简单,我感觉这题更多考研我们的编程思想。

select url,title,body from pages where url<>'' or title<>'' or body <>'' 1.一道SQL语句面试题,关于group by 表内容: 2005-05-09 胜 2005-05-09 胜

2005-05-09 负 2005-05-09 负 2005-05-10 胜 2005-05-10 负 2005-05-10 负

如果要生成下列结果, 该如何写sql语句?

胜 负

2005-05-09 2 2 2005-05-10 1 2

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

create table #tmp(rq varchar(10),shengfu nchar(1))

insert into #tmp values('2005-05-09','胜') insert into #tmp values('2005-05-09','胜') insert into #tmp values('2005-05-09','负') insert into #tmp values('2005-05-09','负') insert into #tmp values('2005-05-10','胜') insert into #tmp values('2005-05-10','负') insert into #tmp values('2005-05-10','负')

1)select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',sum(case when shengfu='负' then 1 else 0 end)'负' from #tmp group by rq

2) select N.rq,N.勝,M.負 from (

select rq,勝=count(*) from #tmp where shengfu='胜'group by rq)N inner join

(select rq,負=count(*) from #tmp where shengfu='负'group by rq)M on N.rq=M.rq

3)select a.col001,a.a1 胜,b.b1 负 from

(select col001,count(col001) a1 from temp1 where col002='胜' group by col001) a,

(select col001,count(col001) b1 from temp1 where col002='负' group by col001) b where a.col001=b.col001

2.请教一个面试中遇到的SQL语句的查询问题

表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。 ------------------------------------------ select (case when a>b then a else b end ), (case when b>c then b esle c end) from table_name

3.面试题:一个日期判断的sql语句?

请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期与时间)

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

select * from tb where datediff(dd,SendTime,getdate())=0 4.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):

大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。 显示格式:

语文 数学 英语 及格 优秀 不及格

------------------------------------------ select

(case when 语文>=80 then '优秀'

when 语文>=60 then '及格' else '不及格') as 语文,

(case when 数学>=80 then '优秀' when 数学>=60 then '及格' else '不及格') as 数学,

(case when 英语>=80 then '优秀' when 英语>=60 then '及格' else '不及格') as 英语, from table

5.在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型,并解释下两者的区别? ------------------------------------------ 用户临时表:create table #xx(ID int, IDValues int) 系统临时表:create table ##xx(ID int, IDValues int) 区别:

用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的. 当创建它的进程消失时这个临时表就自动删除.

全局临时表对整个SQL Server实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.

6.sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。

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

它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQL Server

的存储容量是可以扩大的.

SQL Server 2000 数据库有三种类型的文件:

主要数据文件

主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。

次要数据文件

次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。

日志文件

日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。 7.请用一个sql语句得出结果

从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。 如使用存储过程也可以。

table1

月份mon 部门dep 业绩yj

------------------------------- 一月份 01 10 一月份 02 10 一月份 03 5 二月份 02 8 二月份 04 9 三月份 03 8

table2

部门dep 部门名称dname

-------------------------------- 01 国内业务一部 02 国内业务二部 03 国内业务三部 04 国际业务部

table3 (result)

部门dep 一月份 二月份 三月份

-------------------------------------- 01 10 null null 02 10 8 null 03 null 5 8 04 null null 9

------------------------------------------ 1)

select a.部门名称dname,b.业绩yj as '一月份',c.业绩yj as '二月份',d.业绩yj as '三月份'

from table1 a,table2 b,table2 c,table2 d

where a.部门dep = b.部门dep and b.月份mon = '一月份' and a.部门dep = c.部门dep and c.月份mon = '二月份' and a.部门dep = d.部门dep and d.月份mon = '三月份' and 2)

select a.dep,

sum(case when b.mon=1 then b.yj else 0 end) as '一月份', sum(case when b.mon=2 then b.yj else 0 end) as '二月份',

sum(case when b.mon=3 then b.yj else 0 end) as '三月份', sum(case when b.mon=4 then b.yj else 0 end) as '四月份', sum(case when b.mon=5 then b.yj else 0 end) as '五月份', sum(case when b.mon=6 then b.yj else 0 end) as '六月份', sum(case when b.mon=7 then b.yj else 0 end) as '七月份', sum(case when b.mon=8 then b.yj else 0 end) as '八月份', sum(case when b.mon=9 then b.yj else 0 end) as '九月份', sum(case when b.mon=10 then b.yj else 0 end) as '十月份', sum(case when b.mon=11 then b.yj else 0 end) as '十一月份', sum(case when b.mon=12 then b.yj else 0 end) as '十二月份', from table2 a left join table1 b on a.dep=b.dep 8.华为一道面试题

一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。

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

select id, Count(*) from tb group by id having count(*)>1 select * from(select count(ID) as count from table group by ID)T where T.count>1

1、删除表中重复的记录(记录完全相同才算重复) select distinct * into #table_name from table_name delete from table_name

select * into table_name from #table_name drop table #table_name

2、学生表student,字段sID,sName,sAge;教师表teacher,字段tID,TName,tAge;教师-学生表ts,字段id,tID,sID。请统计每个教师有多少学生,要求教师年龄大于30,学生年龄大于12,并列出教师ID,教师姓名,学生人数答案:如果教师不同名,则语句如下

select teacher.tid,teacher.tname,count(*) as snum from ts,teacher,student

where teacher.tid=ts.tid and student.sid=ts.sid and teacher.tage>30 and student.sage>22

group by teacher.tid,teacher.tname 如果教师有同名,则语句如下

select temptable.tid,tname,temptable.snum from teacher,(select teacher.tid,count(*) as snum from ts,teacher,student where

teacher.tid=ts.tid and student.sid=ts.sid and teacher.tage>30 and student.sage>22 group by teacher.tid) temptable where teacher.tid=temptable.tid

问题描述:

本题用到下面三个关系表:

CARD 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级 BOOKS 图书。 BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数

BORROW 借书记录。 CNO 借书卡号,BNO 书号,RDATE 还书日期 备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。 要求实现如下15个处理: 1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束。

2. 找出借书超过5本的读者,输出借书卡号及所借图书册数。 3. 查询借阅了\水浒\一书的读者,输出姓名及班级。

4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期。 5. 查询书名包括\网络\关键词的图书,输出书号、书名、作者。 6. 查询现有图书中价格最高的图书,输出书名及作者。

7. 查询当前借了\计算方法\但没有借\计算方法习题集\的读者,输出其借书卡号,并按卡号降序排序输出。

8. 将\班同学所借图书的还期都延长一周。 9. 从BOOKS表中删除当前无人借阅的图书记录。

10.如果经常按书名查询图书信息,请建立合适的索引。

11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是\数据库技术及应用\,就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)。

12.建立一个视图,显示\力01\班学生的借书信息(只要求显示姓名和书名)。

13.查询当前同时借有\计算方法\和\组合数学\两本书的读者,输出其借书卡号,并按卡号升序排序输出。 14.假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句。 15.对CARD表做如下修改:

a. 将NAME最大列宽增加到10个字符(假定原为6个字符)。 b. 为该表增加1列NAME(系名),可变长,最大20个字符。

1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束

--实现代码:

CREATE TABLE BORROW(

CNO int FOREIGN KEY REFERENCES CARD(CNO), BNO int FOREIGN KEY REFERENCES BOOKS(BNO), RDATE datetime,

PRIMARY KEY(CNO,BNO))

2. 找出借书超过5本的读者,输出借书卡号及所借图书册数 --实现代码:

SELECT CNO,借图书册数=COUNT(*) FROM BORROW GROUP BY CNO

HAVING COUNT(*)>5

3. 查询借阅了\水浒\一书的读者,输出姓名及班级 --实现代码:

SELECT * FROM CARD c WHERE EXISTS(

SELECT * FROM BORROW a,BOOKS b WHERE a.BNO=b.BNO AND b.BNAME=N'水浒' AND a.CNO=c.CNO)

4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期 --实现代码:

SELECT * FROM BORROW WHERE RDATE

5. 查询书名包括\网络\关键词的图书,输出书号、书名、作者 --实现代码:

SELECT BNO,BNAME,AUTHOR FROM BOOKS WHERE BNAME LIKE N'%网络%'

6. 查询现有图书中价格最高的图书,输出书名及作者

--实现代码:

SELECT BNO,BNAME,AUTHOR FROM BOOKS WHERE PRICE=(

SELECT MAX(PRICE) FROM BOOKS)

7. 查询当前借了\计算方法\但没有借\计算方法习题集\的读者,输出其借书卡号,并按卡号降序排序输出 --实现代码: SELECT a.CNO

FROM BORROW a,BOOKS b

WHERE a.BNO=b.BNO AND b.BNAME=N'计算方法' AND NOT EXISTS(

SELECT * FROM BORROW aa,BOOKS bb WHERE aa.BNO=bb.BNO

AND bb.BNAME=N'计算方法习题集' AND aa.CNO=a.CNO) ORDER BY a.CNO DESC

8. 将\班同学所借图书的还期都延长一周 --实现代码:

UPDATE b SET RDATE=DATEADD(Day,7,b.RDATE) FROM CARD a,BORROW b WHERE a.CNO=b.CNO AND a.CLASS=N'C01'

9. 从BOOKS表中删除当前无人借阅的图书记录 --实现代码:

DELETE A FROM BOOKS a WHERE NOT EXISTS( SELECT * FROM BORROW WHERE BNO=a.BNO)

10. 如果经常按书名查询图书信息,请建立合适的索引 --实现代码:

CREATE CLUSTERED INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME)

11. 在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是\数据库技术及应用\,就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表) --实现代码:

CREATE TRIGGER TR_SAVE ON BORROW FOR INSERT,UPDATE AS

IF @@ROWCOUNT>0

INSERT BORROW_SAVE SELECT i.* FROM INSERTED i,BOOKS b WHERE i.BNO=b.BNO

AND b.BNAME=N'数据库技术及应用'

12. 建立一个视图,显示\力01\班学生的借书信息(只要求显示姓名和书名) --实现代码:

CREATE VIEW V_VIEW AS

SELECT a.NAME,b.BNAME

FROM BORROW ab,CARD a,BOOKS b WHERE ab.CNO=a.CNO AND ab.BNO=b.BNO AND a.CLASS=N'力01'

13. 查询当前同时借有\计算方法\和\组合数学\两本书的读者,输出其借书卡号,并按卡号升序排序输出 --实现代码: SELECT a.CNO

FROM BORROW a,BOOKS b WHERE a.BNO=b.BNO

AND b.BNAME IN(N'计算方法',N'组合数学') GROUP BY a.CNO HAVING COUNT(*)=2 ORDER BY a.CNO DESC

14. 假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句 --实现代码:

ALTER TABLE BOOKS ADD PRIMARY KEY(BNO)

15.1 将NAME最大列宽增加到10个字符(假定原为6个字符) --实现代码:

ALTER TABLE CARD ALTER COLUMN NAME varchar(10)

15.2 为该表增加1列NAME(系名),可变长,最大20个字符 --实现代码:

ALTER TABLE CARD ADD 系名 varchar(20)

个SQL 面试题

去年应聘一个职位未果,其间被考了一个看似简单的题,但我没有找到好的大案. 不知各位大虾有无好的解法?

题为:

有两个表, t1, t2, Table t1:

SELLER | NON_SELLER ----- ----- A B A C A D B A B C B D C A C B C D D A D B D C

Table t2:

SELLER | COUPON | BAL ----- --------- --------- A 9 100 B 9 200 C 9 300 D 9 400 A 9.5 100 B 9.5 20 A 10 80

要求用SELECT 语句列出如下结果:------如A的SUM(BAL)为B,C,D的和,B的SUM(BAL)为A,C,D的和.......

且用的方法不要增加数据库负担,如用临时表等.

NON-SELLER| COUPON | SUM(BAL) ------- --------

A 9 900 B 9 800 C 9 700 D 9 600 A 9.5 20 B 9.5 100 C 9.5 120 D 9.5 120 A 10 0 B 10 80 C 10 80 D 10 80

关于论坛上那个SQL微软面试题 问题:

一百个账户各有100$,某个账户某天如有支出则添加一条新记录,记录其余额。一百天后,请输出每天所有账户的余额信息

这个问题的难点在于每个用户在某天可能有多条纪录,也可能一条纪录也没有(不包括第一天)

返回的记录集是一个100天*100个用户的纪录集

下面是我的思路:

1.创建表并插入测试数据:我们要求username从1-100 CREATE TABLE [dbo].[TABLE2] (

[username] [varchar] (50) NOT NULL , --用户名 [outdate] [datetime] NOT NULL , --日期 [cash] [float] NOT NULL --余额 ) ON [PRIMARY

declare @i int set @i=1

while @i<=100 begin

insert table2 values(convert(varchar(50),@i),'2001-10-1',100) insert table2 values(convert(varchar(50),@i),'2001-11-1',50) set @i=@i+1 end

insert table2 values(convert(varchar(50),@i),'2001-10-1',90)

select * from table2 order by outdate,convert(int,username)

2.组合查询语句:

a.我们必须返回一个从第一天开始到100天的纪录集: 如:2001-10-1(这个日期是任意的)到 2002-1-8

由于第一天是任意一天,所以我们需要下面的SQL语句:

select top 100 dateadd(d,convert(int,username)-1,min(outdate)) as outdate from table2

group by username

order by convert(int,username) 这里的奥妙在于:

convert(int,username)-1(记得我们指定用户名从1-100 :-))

group by username,min(outdate):第一天就可能每个用户有多个纪录。 返回的结果: outdate

------------------------------------------------------ 2001-10-01 00:00:00.000 .........

2002-01-08 00:00:00.000

b.返回一个所有用户名的纪录集:

select distinct username from table2 返回结果: username

-------------------------------------------------- 1 10 100 ...... 99

c.返回一个100天记录集和100个用户记录集的笛卡尔集合: select * from (

select top 100 dateadd(d,convert(int,username)-1,min(outdate)) as outdate from table2

group by username

order by convert(int,username) ) as A

CROSS join (

select distinct username from table2

) as B

order by outdate,convert(int,username) 返回结果100*100条纪录: outdate username

2001-10-01 00:00:00.000 1 ......

2002-01-08 00:00:00.000 100

d.返回当前所有用户在数据库的有的纪录:

select outdate,username,min(cash) as cash from table2 group by outdate,username

order by outdate,convert(int,username) 返回纪录:

outdate username cash

2001-10-01 00:00:00.000 1 90 ......

2002-01-08 00:00:00.000 100 50

e.将c中返回的笛卡尔集和d中返回的纪录做left join: select C.outdate,C.username, D.cash from (

select * from (

select top 100 dateadd(d,convert(int,username)-1,min(outdate)) as outdate from table2

group by username

order by convert(int,username) ) as A

CROSS join (

select distinct username from table2 ) as B ) as C left join (

select outdate,username,min(cash) as cash from table2 group by outdate,username ) as D

on(C.username=D.username and datediff(d,C.outdate,D.outdate)=0)

order by C.outdate,convert(int,C.username)

注意:用户在当天如果没有纪录,cash字段返回NULL,否则cash返回每个用户当天的余额

outdate username cash

2001-10-01 00:00:00.000 1 90 2001-10-01 00:00:00.000 2 100 ......

2001-10-02 00:00:00.000 1 90

2001-10-02 00:00:00.000 2 NULL <--注意这里 ......

2002-01-08 00:00:00.000 100 50

f.好了,现在我们最后要做的就是,如果cash为NULL,我们要返回小于当前纪录日期的第一个用户余额(由于我们使用order by cash,所以返回top 1纪录即可,使用min应该也可以),这个余额即为当前的余额: case isnull(D.cash,0) when 0 then (

select top 1 cash from table2 where table2.username=C.username and datediff(d,C.outdate,table2.outdate)<0 order by table2.cash )

else D.cash end as cash

g.最后组合的完整语句就是 select C.outdate,C.username, case isnull(D.cash,0) when 0 then (

select top 1 cash from table2 where table2.username=C.username and datediff(d,C.outdate,table2.outdate)<0 order by table2.cash )

else D.cash end as cash from (

select * from (

select top 100 dateadd(d,convert(int,username)-1,min(outdate)) as outdate from table2

group by username

order by convert(int,username) ) as A

CROSS join (

select distinct username from table2 ) as B ) as C left join (

select outdate,username,min(cash) as cash from table2 group by outdate,username ) as D

on(C.username=D.username and datediff(d,C.outdate,D.outdate)=0)

order by C.outdate,convert(int,C.username)

返回结果:

outdate username cash 2001-10-01 00:00:00.000 1 90 2001-10-01 00:00:00.000 2 100 ......

2002-01-08 00:00:00.000 100 50

***********************************************************************************

取出sql表中第31到40的记录(以自动增长ID为主键) *从数据表中取出第n条到第m条的记录*/

declare @m int declare @n int

declare @sql varchar(800) set @m=40 set @n=31

set @sql='select top '+str(@m-@n+1) + '* from idetail where autoid not in(

select top '+ str(@n-1) + 'autoid from idetail)' exec(@sql)

select top 10 * from t where id not in (select top 30 id from t order by id ) orde by id

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

select top 10 * from t where id in (select top 40 id from t order by id) order by id desc

*******************************************************************************

一道面试题,写sql语句

有表a存储二叉树的节点,要用一条sql语句查出所有节点及节点所在的层. 表a

c1 c2 A ----------1 ---- ---- / \\ A B B C --------2 A C / / \\

B D D N E ------3 C E / \\ \\

D F F K I ---4 E I D K C N

所要得到的结果如下

jd cs

----- ---- A 1 B 2 C 2 D 3 N 3 E 3 F 4 K 4 I 4

有高手指导一下,我只能用pl/sql写出来,请教用一条sql语句的写法 SQL> select c2, level + 1 lv 2 from test start 3 with c1 = 'A'

4 connect by c1 = prior c2 5 union

6 select 'A', 1 from dual 7 order by lv;

C2 LV

-- ---------- A 1 B 2 C 2 D 3 E 3 N 3 F 4 I 4 K 4

已选择9行。

请教一道SQL面试题!!!

table_a:

id name val 1 aaa 30 2 aaa 40 3 aaa 50 1 bbb 35 2 bbb 45 3 bbb 55 table_b:

name val1 val2 val3 aaa 30 40 50 bbb 35 45 55

请用一个SQL语句实现table_a到table_b的转化。 select * from (

select lag(val, 1) over (

partition by name order by id ) pre, val,

lead(val, 1) over(

partition by name order by id ) post from table_a ) ir

where pre is not null and post is not null;

刚刚查了一下lead和lag的用法,发现即使有4个及以上值亦可采用改变offset

参数来实现,如四个值的时候可以: select * from ( select name,

lag(val, 3) over(partition by name order by id) val1, lag(val, 2) over(partition by name order by id) val2, lag(val, 1) over(partition by name order by id) val3, val val4 from table_a

) where val1 is not null and val2 is not null and val4 is not null; 但子查询的产生的垃圾数据会是最终结果的n-1倍,有没有不用子查询能得到结果的方法呢?求教!

金蝶面试,出了这样一道SQL题,共享之

给下面这样的一个表记录:

------------------------------------ 购物人 商品名称 数量 A 甲 2 B 乙 4 C 丙 1 A 丁 2 B 丙 5

给出所有购入商品为两种或两种以上的购物人记录

select 购物人 as 顾客,count(商品名称) as 商品种类数 from 表 group by 购物人 having count(商品名称)>=2

1.一道SQL语句面试题,关于group by 表内容: 2005-05-09 胜 2005-05-09 胜

2005-05-09 负 2005-05-09 负 2005-05-10 胜 2005-05-10 负 2005-05-10 负

如果要生成下列结果, 该如何写sql语句?

胜 负

2005-05-09 2 2 2005-05-10 1 2

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

create table #tmp(rq varchar(10),shengfu nchar(1))

insert into #tmp values('2005-05-09','胜') insert into #tmp values('2005-05-09','胜') insert into #tmp values('2005-05-09','负') insert into #tmp values('2005-05-09','负') insert into #tmp values('2005-05-10','胜') insert into #tmp values('2005-05-10','负') insert into #tmp values('2005-05-10','负')

1)select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',sum(case when shengfu='负' then 1 else 0 end)'负' from #tmp group by rq

2) select N.rq,N.勝,M.負 from (

select rq,勝=count(*) from #tmp where shengfu='胜'group by

rq)N inner join

(select rq,負=count(*) from #tmp where shengfu='负'group by rq)M on N.rq=M.rq

3)select a.col001,a.a1 胜,b.b1 负 from

(select col001,count(col001) a1 from temp1 where col002='胜' group by col001) a,

(select col001,count(col001) b1 from temp1 where col002='负' group by col001) b where a.col001=b.col001

2.请教一个面试中遇到的SQL语句的查询问题

表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。 ------------------------------------------ select (case when a>b then a else b end ), (case when b>c then b esle c end) from table_name

3.面试题:一个日期判断的sql语句?

请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期与时间)

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

select * from tb where datediff(dd,SendTime,getdate())=0 4.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):

大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。

显示格式:

语文 数学 英语 及格 优秀 不及格 ------------------------------------------ select

(case when 语文>=80 then '优秀' when 语文>=60 then '及格' else '不及格') as 语文,

(case when 数学>=80 then '优秀' when 数学>=60 then '及格' else '不及格') as 数学,

(case when 英语>=80 then '优秀' when 英语>=60 then '及格' else '不及格') as 英语, from table

5.在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型,并解释下两者的区别? ------------------------------------------ 用户临时表:create table #xx(ID int, IDValues int) 系统临时表:create table ##xx(ID int, IDValues int) 区别:

用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的. 当创建它的进程消失时这个临时表就自动删除.

全局临时表对整个SQL Server实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.

6.sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。

------------------------------------------ 它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQL Server的存储容量是可以扩大的.

SQL Server 2000 数据库有三种类型的文件:

主要数据文件

主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。

次要数据文件

次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。

日志文件

日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。

7.请用一个sql语句得出结果

从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。 如使用存储过程也可以。

table1

月份mon 部门dep 业绩yj

------------------------------- 一月份 01 10 一月份 02 10 一月份 03 5 二月份 02 8 二月份 04 9 三月份 03 8

table2

部门dep 部门名称dname

-------------------------------- 01 国内业务一部 02 国内业务二部 03 国内业务三部 04 国际业务部

table3 (result)

部门dep 一月份 二月份 三月份 -------------------------------------- 01 10 null null 02 10 8 null 03 null 5 8 04 null null 9

------------------------------------------ 1)

select a.部门名称dname,b.业绩yj as '一月份',c.业绩yj as '份',d.业绩yj as '三月份'

二月from table1 a,table2 b,table2 c,table2 d

where a.部门dep = b.部门dep and b.月份mon = '一月份' and a.部门dep = c.部门dep and c.月份mon = '二月份' and a.部门dep = d.部门dep and d.月份mon = '三月份' and 2)

select a.dep,

sum(case when b.mon=1 then b.yj else 0 end) as '一月份', sum(case when b.mon=2 then b.yj else 0 end) as '二月份', sum(case when b.mon=3 then b.yj else 0 end) as '三月份', sum(case when b.mon=4 then b.yj else 0 end) as '四月份', sum(case when b.mon=5 then b.yj else 0 end) as '五月份', sum(case when b.mon=6 then b.yj else 0 end) as '六月份', sum(case when b.mon=7 then b.yj else 0 end) as '七月份', sum(case when b.mon=8 then b.yj else 0 end) as '八月份', sum(case when b.mon=9 then b.yj else 0 end) as '九月份', sum(case when b.mon=10 then b.yj else 0 end) as '十月份', sum(case when b.mon=11 then b.yj else 0 end) as '十一月份', sum(case when b.mon=12 then b.yj else 0 end) as '十二月份', from table2 a left join table1 b on a.dep=b.dep 8.华为一道面试题

一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。

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

select id, Count(*) from tb group by id having count(*)>1

select * from(select count(ID) as count from table group by ID)T where T.count>1

1.用一条SQL语句 查询出每门课都大于80分的学生姓名

name kecheng fenshu 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 语文 81 王五 数学 100 王五 英语 90

A: select distinct name from table where name not in (select distinct name from table where fenshu<=80)

2.学生表 如下:

自动编号 学号 姓名 课程编号 课程名称 分数 1 2005001 张三 0001 数学 69 2 2005002 李四 0001 数学 89 3 2005001 张三 0001 数学 69 删除除了自动编号不同,其他都相同的学生冗余信息

A: delete tablename where 自动编号 not in(select min(自动编号) from tablename group by 学号,姓名,课程编号,课程名称,分数)

一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.

你先按你自己的想法做一下,看结果有我的这个简单吗? 答:select a.name, b.name from team a, team b where a.name < b.name

请用SQL语句实现:从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。请注意:TestDB中有很多科目,都有1-12月份的发生额。

AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。 数据库名:JcyAudit,数据集:Select * from TestDB 答:select a.* from TestDB a

,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group by Occmonth) b

where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur

************************************************************************************

面试题:怎么把这样一个表儿 year month amount 1991 1 1.1 1991 2 1.2 1991 3 1.3 1991 4 1.4 1992 1 2.1 1992 2 2.2 1992 3 2.3 1992 4 2.4 查成这样一个结果

year m1 m2 m3 m4 1991 1.1 1.2 1.3 1.4 1992 2.1 2.2 2.3 2.4

答案一、

select year,

(select amount from aaa m where month=1 and m.year=aaa.year) as m1, (select amount from aaa m where month=2 and m.year=aaa.year) as m2, (select amount from aaa m where month=3 and m.year=aaa.year) as m3, (select amount from aaa m where month=4 and m.year=aaa.year) as m4 from aaa group by year

这个是ORACLE 中做的:

select * from (select name, year b1, lead(year) over

(partition by name order by year) b2, lead(m,2) over(partition by name order by year) b3,rank()over(

partition by name order by year) rk from t) where rk=1;

************************************************************************************

精妙的SQL语句! 精妙SQL语句

作者:不详 发文时间:2003.05.29 10:55:05

说明:复制表(只复制结构,源表名:a 新表名:b)

SQL: select * into b from a where 1<>1

说明:拷贝表(拷贝数据,源表名:a 目标表名:b)

SQL: insert into b(a, b, c) select d,e,f from b;

说明:显示文章、提交人和最后回复时间

SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

说明:外连接查询(表名1:a 表名2:b)

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

说明:日程安排提前五分钟提醒

SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

说明:两张关联表,删除主表中已经在副表中没有的信息

SQL:

delete from info where not exists ( select * from infobz where info.infid=infobz.infid )

说明:--

SQL:

SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE

FROM TABLE1,

(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE

FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND

FROM TABLE2

WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,

(SELECT NUM, UPD_DATE, STOCK_ONHAND

FROM TABLE2

WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =

TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y,

WHERE X.NUM = Y.NUM (+)

AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B

WHERE A.NUM = B.NUM

说明:--

SQL:

select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='\and 专业名称='\性别,生源地,高考总成绩

说明:

从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)

SQL:

SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC

FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration

FROM TELFEESTAND a, TELFEE b

WHERE a.tel = b.telfax) a

GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')

说明:四表联查问题:

SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

说明:得到表中最小的未使用的ID号

SQL:

SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID

FROM Handle

WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)

*******************************************************************************

有两个表A和B,均有key和value两个字段,如果B的key在A中也有,就把B的value换为A中对应的value 这道题的SQL语句怎么写?

update b set b.value=(select a.value from a where a.key=b.key) where b.id in(select b.id from b,a where b.key=a.key);

***************************************************************************

高级sql面试题 原表:

courseid coursename score

------------------------------------- 1 java 70 2 oracle 90 3 xml 40 4 jsp 30

5 servlet 80

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

为了便于阅读,查询此表后的结果显式如下(及格分数为60): courseid coursename score mark

--------------------------------------------------- 1 java 70 pass 2 oracle 90 pass 3 xml 40 fail 4 jsp 30 fail 5 servlet 80 pass

--------------------------------------------------- 写出此查询语句

没有装ORACLE,没试过

select courseid, coursename ,score ,decode

(sign(score-60),-1,'fail','pass') as mark from course 完全正确

SQL> desc course_v Name Null? Type

----------------------------------------- -------- ---------------------------- COURSEID NUMBER

COURSENAME VARCHAR2(10) SCORE NUMBER

SQL> select * from course_v;

COURSEID COURSENAME SCORE

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

1 java 70 2 oracle 90 3 xml 40 4 jsp 30

5 servlet 80

SQL> select courseid,

coursename ,score ,decode(sign(score-60),-1,'fail','pass') as mark from course_v;

COURSEID COURSENAME SCORE MARK

---------- ---------- ---------- ---- 1 java 70 pass 2 oracle 90 pass 3 xml 40 fail 4 jsp 30 fail 5 servlet 80 pass

******************************************************************************* 原表:

id proid proname 1 1 M 1 2 F 2 1 N 2 2 G 3 1 B 3 2 A

查询后的表:

id pro1 pro2 1 M F 2 N G 3 B A

写出查询语句 解决方案

sql求解 表a

列 a1 a2 记录 1 a 1 b 2 x 2 y

2 z

用select能选成以下结果吗? 1 ab 2 xyz

使用pl/sql代码实现,但要求你组合后的长度不能超出oracle varchar2长度的限制。

下面是一个例子

create or replace type strings_table is table of varchar2(20); /

create or replace function merge (pv in strings_table) return varchar2 is

ls varchar2(4000); begin

for i in 1..pv.count loop ls := ls || pv(i); end loop; return ls; end; /

create table t (id number,name varchar2(10)); insert into t values(1,'Joan'); insert into t values(1,'Jack'); insert into t values(1,'Tom'); insert into t values(2,'Rose'); insert into t values(2,'Jenny');

column names format a80;

select t0.id,merge(cast(multiset(select name from t where t.id = t0.id) as strings_table)) names

from (select distinct id from t) t0;

drop type strings_table; drop function merge; drop table t;

用sql: Well if you have a thoretical maximum, which I would assume you would given the legibility of listing hundreds of employees in the way you describe then yes. But the SQL needs to use the LAG function for each employee, hence a hundred emps a hundred LAGs, so kind of bulky.

This example uses a max of 6, and would need more cut n pasting to do more than that.

SQL> select deptno, dname, emps 2 from (

3 select d.deptno, d.dname, rtrim(e.ename ||', '|| 4 lead(e.ename,1) over (partition by d.deptno 5 order by e.ename) ||', '||

6 lead(e.ename,2) over (partition by d.deptno 7 order by e.ename) ||', '||

8 lead(e.ename,3) over (partition by d.deptno 9 order by e.ename) ||', '||

10 lead(e.ename,4) over (partition by d.deptno 11 order by e.ename) ||', '||

12 lead(e.ename,5) over (partition by d.deptno 13 order by e.ename),', ') emps,

14 row_number () over (partition by d.deptno 15 order by e.ename) x 16 from emp e, dept d

17 where d.deptno = e.deptno 18 )

19 where x = 1 20 /

DEPTNO DNAME EMPS

------- ----------- ------------------------------------------ 10 ACCOUNTING CLARK, KING, MILLER

20 RESEARCH ADAMS, FORD, JONES, ROONEY, SCOTT, SMITH 30 SALES ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD

also

先create function get_a2;

create or replace function get_a2( tmp_a1 number) return varchar2 is

Col_a2 varchar2(4000); begin

Col_a2:='';

for cur in (select a2 from unite_a where a1=tmp_a1) loop

Col_a2=Col_a2||cur.a2; end loop;

return Col_a2;

end get_a2;

select distinct a1 ,get_a2(a1) from unite_a 1 ABC 2 EFG 3 KMN

题目一、 有两个表:

TableX有三个字段Code、 Name、 Age、 其中Code为主键;

TableY有三个字段Code、 Class、Score, 其中Code + Class 为主键。两表记录如下:

Code Name Age Code Class Score 97001 张三 22 97001 数学 80 97002 赵四 21 97002 计算机 59 97003 张飞 20 97003 计算机 60 97004 李五 22 97004 数学 55

1、请写出SQL,找出所有姓张的学生,并按年龄从小到大排列;

2、请写出SQL,取出计算机科考成绩不及格的学生;

3、通过等值联接,取出Name、Class、Score,请写出SQL即输出结果

4、通过外联接,取出每个学生的Name、Class、Score、请写SQL输出结果 5、请写SQL,在TableX 表中增加一条学生记录(学号:97005 姓名:赵六 年龄:20);

6、李五的年龄记录错了,应该是21,请写SQL,根据主键进行更新;

本文来源:https://www.bwwdw.com/article/b7v5.html

Top