当前位置:首页 » 编程语言 » sql50道面试题知乎
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql50道面试题知乎

发布时间: 2022-06-06 18:54:43

‘壹’ 求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语句 面试题

A.创建表格CODE省略

注明:学生表PK stu_id 课程表pk cos_id 分数表PK enrollment_id FK stu_id,cos_id

B.插入数据code省略

C.Query

  1. 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;

  2. 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%';

  3. 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

  4. 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;

  5. update student

    set avg_grade =(select avg(grade) X from enrollments group by stu_id

    having student.stu_id = enrollments.stu_id);

  6. 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数据库面试题 急急急

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面试题,请大神解答,急!!!

第一题,最高的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面试题

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行)

‘陆’ 数据库SQL查询语句面试题

5.1
select a.username,b.deptname from users a,dept b where a.dept_id=b.id;

5.2
update users set dept_id='9' where dept_id='2';

5.3
select a.deptname,b.count_id from dept a,(select dept_id,count(id) as count_id from users group by dept_id having count(id)>1) b where a.id=b.dept_id;

5.4
select a.deptname,b.count_man,c.count_woman from dept a,(select dept_id,count(sex) as count_man from users where sex='男' group by dept_id) b,(select dept_id,count(sex) as count_woman from users where sex='女' group by dept_id) c where a.id=b.dept_id and a.id=c.dept_id;

5.5
添加历史记录表
create table history(
id number(8), -- 记录编号
dept_id varchar2(5), -- 部门ID
user_id varchar2(5), -- 用户ID
change_date date -- 变动日期
);

‘柒’ sql语句的面试题目

select (sum(id)+sum(no)) from table1