‘壹’ sql面试题,请大神解答,急!!!
第一题,最高的10-20。
1234select*from(selectcolD,colE,dense_rank()over(orderbycolGdesc)asrkfromtableb)whererkbetween10and20--当然面试的话这里可以注明dense_rank和rank区别等等。
第二题,2楼写的就可以了
第三题,注意题目是人数之和
12345selectcount(*)ascntfromtableBwherecolAin(=传入idconnectbypriorcolA=colB)
第四题
--测试数据
withtableAas(select1ascolA,0ascolB,'北京',0ascolB,'上海'fromal),tableBas(select1ascolD,'人员1'ascolE,1ascolA,2000ascolG,0ascolHfromalunionallselect2,'人员2',1,2000,0fromalunionallselect3,'人员3',1,2000,0fromalunionallselect4,'人员4',1,2000,0fromalunionallselect5,'人员5',1,2000,1fromalunionallselect6,'人员6',2,2000,1fromalunionallselect7,'人员7',1,2000,1fromal)--查询sqlselectdecode(t.colH,0,'女','男')asgender,max(decode(t.colC,'北京',t.cnt,0))as北京,max(decode(t.colC,'上海',t.cnt,0))as上海from(selecta.colC,b.colH,count(*).colA=b.colAgroupbycolC,colH)tgroupbyt.colH
这里可以解释下本sql的思路:--首先查出每个地区不同性别的人数,在行转列(由于题目很明显告诉你固定数据)
‘贰’ 求sql常考面试题
排序顺序会影响系统性能吗?
问:一些资料介绍说,在SQL Server 6.5中,排序方式会对系统性能造成影响,但是我并没有发现有针对SQL Server 2000或SQL Server 7.0的类似说法。我想知道二分法检索对SQL Server 2000程序到底有何意义。SQL Server 2000所支持的各种排序方式之间在执行性能上存在哪些差异呢?
答:请记住:各类排序方式间的性能差异受制于SQL Server在数据排序和数据比较上所花费的CPU周期数量。排序速度快并不代表性能就一定会得到改善。事实上,选择较为“快速”的排序方法(例如二分法)可能会导致应用程序在其它方面的性能降低。
例如,假设您有一个查询,该查询通过last_name字段进行搜索。二分法排序的规则规定:Smith 并不等于smith。您的应用程序开发人员可以通过要求所有数菥笮葱问交蛐⌒葱问嚼词迪终飧鲆滴衤呒5牵导实慕饩霭旆ㄊ嵌运阉鞅碇械乃惺菔褂肬PPER() 或者 LOWER() 函数。但不幸的是, 如果类似UPPER()这样的函数对一个经过索引的列进行了操作,SQL Server将不再能够使用索引搜索数据。在这种情况下,通过使用二分法所获得的所有性能提升都将被花费在全表扫描上的巨大性能降低所抵消。所以,您无需考虑不同排序方法间可能存在的微小性能差异,您也无需费神考虑何种排序方法最能满足程序开发人员和最终用户的需要。
— SQL Server MVPs
--------------------------------------------------------------------------
日志文件的增长和DBCC DBREINDEX
问:我有一个30GB的数据库,我使用完全恢复模式。无论什么时候,只要我使用数据库一致性检查程序(DBCC)语句DBCC DBREINDEX对特定的大型数据表进行重新索引,我都要将恢复模式改为Bulk_Logged,在重新索引过程完成后再改回完全模式。我希望这样做能够避免事务日志文件急剧增长,但是随后的日志文件备份工作量却非常大--有大约15GB。从逻辑上说,数据库中的数据在重新索引后同原先并没有什么不同,只是索引重新进行了组织,那么为什么日志文件还是那样大呢?我怎样才能避免日志文件出现这样的急剧增长呢?
答:是的,在重新索引前后的数据是完全一样的,但是索引却全面进行了更新。当您执行DBCC DBREINDEX命令的时候,SQL Server的日志仅仅记录了扩展盘区的分配情况(8页面单位),而不是记录了每一行或者每一页所发生的变化。这种类型的日志记录方式避免了物理文件由于系统故障而遭到破坏,并且将更详细的日志记录对系统吞吐量产生的影响降低到最小。
当您备份日志文件的时候,SQL Server必须对分配在扩展盘区中的页面进行备份,以便保持数据库备份和日志备份的一致性。如果SQL Server不备份这些页面,您将不能够切换回完全恢复模式,除非你进行一次完整的数据库备份。您必须能够从最近一次的完全备份、任何差异备份以及任何更新的事务日志备份中对数据库进行恢复。
——————————————————————————————————————————
再者,看你面试什么方面的啦!
要是DBA的话,层次更高一些!
‘叁’ SQL面试题
推荐的学习Java的学习顺序如下: 学习Java SE部分的内容,这部分是基础内容。掌握的越扎实,后面的内容学习起来就越容易。学习SQL和数据库的内容 ,这个也是非常基础的内容,举个例子:程序员的面试题中一定会有SQL部分的考试。学习HTML、css、JavaScript的内容。学习,JSP、Servlet、JavaBean、标记库、JSTL、MVC、JSP EL等Web编程的部分学习Struts 或者Spring MVC。二者取其一即可,推荐选Struts 学习Java与XML ,重点掌握使用Java技术对XML文件的解析学习Java EE的核心技术 ,例如:JNDI、EJB3等,同时还需要学习使用与配置应用服务器,例如:webLogic Server,Websphere,JBoss 学习Hibernate 等持久层的技术学习Spring 学习AJAX 学习ANT、Subversion等开发工具,熟悉常见的软件开发模型,例如:rup、XP 学习OOA与OOD,uml,设计模式学习Web Services、SOA的原理与应用开发 最后,现在很多公司都使用Linux系统做为服务器系统,并且使用Linux系统进行程序的开发(都是出于使用正版的考虑),所以Linux系统的安装、使用和简单管与配置,也是需要学习,这部分内容,跟其他内容没有关联,可以在任何时候学。推荐学习完SQL与数据库之后进行学习。 你要想找到一份不错的Java程序员工作,最基本的也要把1-12都学习了,当然有的内容需要深入掌握,有的内容可以慢慢的深入掌握的。
‘肆’ SQL数据库面试题 急急急
a)select pname as '商品名',avg(qty) as 平均销售量 from s,p,m where m.city='上海' and s.mno=m.mno and p.pno=s.pno,select p.Pno,p.pname,sum(s.qty)
from s left join p on s.pno=p.pno left join m on p.Mno=m.Mno
where m.city='上海市'
group by p.Pno,p.pname,p.city,p.color
b)、先删除Sale表的外键PNO,再删除gds表。
c)联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系
区别:1、视图是已经编译好的sql语句。而表不是
2、视图没有实际的物理记录。而表有。
3、表是内容,视图是窗口
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时四对它进行修改,但视图只能有创建的语句来修改
5、表是内模式,视图是外模式
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
‘伍’ 这个一个SQL面试题该怎么写
一、表设计(表只列主键和最少符合需求字段,字段类型省略):
员工表:id, 员工姓名
楼盘表:id, 楼盘名称, 员工id
出单表:id, 出单年月,员工id, 楼盘id, 出单价格
工资表:id, 工资年月, 员工id, 工资
楼盘分摊表:id, 分摊年月, 楼盘id, 员工id, 分摊成本
二、分摊成本记录(只查询楼盘分摊表的记录,如何插入根据数据库类型 select into或者insert into)
select 工资表.工资年月 as 分摊年月, 出单表.楼盘id, 出单表.员工id, 工资表.工资 / 员工出单数.出单合计 as 分摊成本
from 出单表 join 工资表 on (出单表.员工id = 工资表.员工id and 出单表.出单年月 = 工资表.工资年月)
join (select 员工id, 出单年月, count(1) as 出单合计 from 出单表 group by 员工id, 出单年月) 员工出单数 on (出单表.员工id = 员工出单数.员工id and 出单表.出单年月 = 员工出单数.出单年月)
where 工资表.工资年月 = '这个条件填最新的年月,如果不加这个条件,就是所有月份的'
union all
select 工资表.工资年月 as 分摊年月, 出单表.楼盘id, 出单表.员工id, 工资表.工资 / 员工出单数.出单合计 as 分摊成本
from 楼盘表 join 工资表 on 楼盘表.员工id = 工资表.员工id
join (select 员工id, count(1) as 楼盘合计 from 楼盘表 group by 员工id) 员工负责楼盘数 on 楼盘表.员工id = 员工负责楼盘数.员工id
left join (select 员工id, 出单年月, count(1) as 出单合计 from 出单表 group by 员工id, 出单年月) 员工出单数 on (工资表.员工id = 员工出单数.员工id and 工资表.工资年月 = 员工出单数.出单年月)
where 员工出单数.员工id is null and 工资表.工资年月 = '这个条件填最新的年月,如果不加这个条件,就是所有月份的'
‘陆’ 有关SQL的面试题。。。
1:
〔车辆〕、〔站台〕、〔行车路线〕最少3个表
〔车辆〕表字段〔ID〕,〔名称〕
〔站台〕表字段〔ID〕,〔名称〕,〔描述〕
〔行车路线〕表字段〔ID〕,〔车ID〕,〔站ID〕
查询:
SELECT 〔车辆〕.〔名称〕,〔站台〕.〔名称〕
FROM 〔车辆〕 INNER JOIN 〔行车路线〕
ON 〔车辆〕.〔ID〕=〔行车路线〕.〔车ID〕
INNER JOIN 〔站台〕
ON 〔站台〕.〔ID〕=〔行车路线〕.〔站ID〕
WHERE 〔站台〕.〔名称〕 = '车站1'
OR 〔站台〕.〔名称〕 = '车站2'
2:数据库设计
〔部门〕表:ID,父级ID,名称
〔员工〕表:ID,父级ID,名称,权限
〔员工所属部门〕表:ID,员工ID,部门ID
〔申请〕表:ID,内容,申请人ID,审核人ID,审核结果,备注
系统设计:
1 员工进入申请页面时,根据〔员工〕的权限来判断是否能进入
2 员工查询〔申请〕表,通过申请人ID过滤,只有申请权限
3 经理查询〔申请〕表,通过〔员工〕表查申请人的父级ID过滤,可以进行审批操作
‘柒’ SQL语句面试题
SELECT*,
(SELECTCOUNT(*)FROM(SELECTCOUNT(*),b.sidFROMscbLEFTJOINcoursecONb.Cid=c.CidGROUPBYb.sid,c.tid)owWHEREow.sid=a.sid)as'
选课数量',
(SELECTsum(Score)FROMScdWHEREa.sid=d.sid)as'总成绩'
FROMstudenta
;
SELECTd.sid,d.snamefromteachera
LEFTJOINcoursebona.tid=b.tid
LEFTJOINscconc.cid=b.cid
leftJOINstudentdONd.sid=c.sid
WHEREa.tname='叶萍';
SELECTsid,sname
FROMstudent
WHEREsidin(selecta.sid
FROMscAleftjoinscbona.sid=b.sid
WHEREa.cid=1andb.cid=2anda.score>b.score)
SELECTsc.Sid,sum(CASEWHENc.Cname='
数学'thensc.Scoreelse0end)数学,SUM(casewhenc.Cname='物理
'THENsc.ScoreELSE0END)物理,AVG(sc.Score)平均分
FROMsc
INNERJOINCourseconsc.Cid=c.Cid
WHEREc.Cnamein('数学','物理')
GROUPBYsc.Sid
ORDERBYAVG(sc.Score)DESC
insertintoSc(Sid,Cid,Score)values(003,3,85);
insertintoSc(Sid,Cid,Score)values(003,3,30);
首先这个不知道是你i写错了还是怎么一个人化学成绩有2个所以我在这里按照你这个上做的查询所以有一个人是选了单个课程
‘捌’ sql语句 面试题
A.创建表格CODE省略
注明:学生表PK stu_id 课程表pk cos_id 分数表PK enrollment_id FK stu_id,cos_id
B.插入数据code省略
C.Query
select s.stu_id,stu_name,count(cos_id) from student s,enrollments e where s.stu_id = e.stu_id and e.grade>60 group by s.stu_id,stu_name;
select e.stu_id,s.stu_name,c.cos_name from student s,enrollments e,course c
where s.stu_id = e.stu_id
and e.cos_id = c.cos_id
and c.cos_name = 'CHINESE'
and s.stu_name like 'W%';
select stu_id,stu_name from (select e.stu_id,stu_name,cos_name from enrollments e,student s,course c
where s.stu_id = e.stu_id
and e.cos_id = c.cos_id
and c.cos_name IN ('CHINESE','MUSIC'))
group by stu_id,stu_name
having count(cos_name) = 2
select distinct e.cos_id,c.cos_name,count(e.stu_id) stu_count,count(e.stu_id)-NVL(A.FAIL,0) upscore,(count(e.stu_id)-NVL(A.FAIL,0))/count(e.stu_id) rate from
(select cos_id,count(stu_id) fail from enrollments where grade<60 group by cos_id) a,enrollments e,course c
where e.cos_id = a.cos_id(+)
and e.cos_id = c.cos_id
group by e.cos_id,NVL(a.fail,0),c.cos_name;
update student
set avg_grade =(select avg(grade) X from enrollments group by stu_id
having student.stu_id = enrollments.stu_id);
select stu_id,avg(grade) from
(select stu_id,cos_id,grade,row_number() over(partition by stu_id order by grade ) X from enrollments)
group by stu_id
having count(*)<=2
UNION
select A.stu_id,avg(A.grade)from
(select stu_id,cos_id,grade,row_number() over(partition by stu_id order by grade ) X from enrollments) A,
(select stu_id,count(*) c from
(select stu_id,cos_id,grade,row_number() over(partition by stu_id order by grade ) X from enrollments)
group by stu_id) B
where A.stu_id = B.stu_id
and A.x>1 and x<B.c
group by A.stu_id,b.c
_________________________________________________
环境:oracle 10g/TOAD 以上代码均通过测试,如有问题,请联系,谢谢
‘玖’ 面试题目(sql)
1、忍不住想说一句,因为第一题中的字段类型是
【日期型】,而各种数据库操作日期型数据有不同的方法,没有一种共通的方法,所以脱离了数据库而言没有一种共通的sql。
2、select
ID,NAME,ADDRESS,PHONE,LOGDATE
from
T
where
ID
in(
select
ID
from
T
group
by
NAME
having
count(*)>1)
order
by
NAME;
3、delete
from
T
where
ID
not
in
(select
min(id)
from
T
group
by
name);
4、update
T
set
T.ADDRESS=(select
E.ADDRESS
from
E
where
E.NAME=T.NAME),
T.PHONE=(select
E.PHONE
from
E
where
E.NAME=T.NAME);
5、这个不同的数据库也有不同的处理方法,不能脱离数据库谈了。
如:SqlServer或者access可以使用
top
oracle可以使用
rownum
等
---
以上,希望对你有所帮助。
‘拾’ sql面试题
1.
select
s.title,
count(p.id)
from
书表
s
left
join
评论
p
on
s.id=p.书表中的id
group
by
s.title
(注意:左外连接的作用是将评价数为0的书显示出来.count(p.id)和count(*)的区别是count(p.id)不计入p.id为null的行)
2.
select
top
1
s.title,
count(p.id)
from
书表
s
left
join
评论
p
on
s.id=p.书表中的id
group
by
s.title
order
by
2
desc
(以第2列倒序排序,取第1行)