数据库面试题

1. 谈谈你对Oracle的理解。

     Oracle是一系列产品的总和,也可以说是一个平台,它包含Oracle数据库、Oracle中间件Oracle管理软件等,我简单的描述一下对于Oracle数据库的理解。它是一种基于网络访问的可跨平台的关系型数据库,具有较强的可移植性;通过连接存储池(connection polling)和多路复用(multiplexing)机制来实现动态可伸缩性;它通过并行服务器(Parallel Server Option )来提高系统的可用性Oracle自动备份和恢复功能,提供了对大规模和更加细化的分布式操作系统的支持等等。

 

2. 主键的作用有哪些?

1) 保证数据的唯一性,避免发生数据重复的情况。

2) 因为主键可以唯一标识某一行记录,所以确保执行数据更新、删除的时候不会出现张冠李戴的错误

3) 主键常常与外键构成参照完整性约束,防止出现数据不一致

3. 索引对数据并发会有影响吗?

     索引能大大提高对于数据查询的访问速度,但当有大量基于数据插入的并发操作时,索引反而会降低并发操作的执行速度;当然如果有行级锁的话,情况又会有变化。

  

   4. 查询数据库中的某一个到某一个段之间的SQL语句?(比如查询第2030条的数据)

Oracle:

select  * from (select rownum r, a.* from table a where rownum <= 30)  where  r >= 20

SQL Server:

 select * from( select top 21 * from  (select top 30 * from test1 order by _id )  t  order by _id desc)   t order by _id

 

5. SQL Server中的内置函数有哪些?

字符串函数,如:LOWER(),UPPER() , REPLACE(), STUFF(),SUBSTRING()

日期函数,如:GETDATE(), DATEADD(), DATEDIFF(), DATENAME(), DATEPART()..

数学函数,如:CEILING(), FLOOR(), ROUND(), SIGN()

系统函数,如:CONVERT(), DATALENGTH(), CURRENT_USER()

聚合函数,如:SUM()MAX()STDEV()……

 

6. 数据库的设计原理。

1) 原始单据与实体之间的关系

2) 主键与外键

3) 范式标准

4) 完整性约束

 

7. 存储过程的理解。

存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。

存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。

可以出于任何使用SQL语句的目的来使用存储过程,它具有以下优点

1) 可以在单个存储过程中执行一系列   SQL   语句。   

2) 可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。   

3) 存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL语句快。

 

8. Oracle大数据量下的分页解决方法

type refCursorType is REF CURSOR;  --游标类型定义,用于返回数据集

procedure sp_Page(p_PageSize int,          --每页记录数

                  p_PageNo int,            --当前页码,从 开始

                  p_SqlSelect varchar2,    --查询语句,含排序部分

                  p_SqlCount varchar2,     --获取记录总数的查询语句

                  p_OutRecordCount out int,--返回总记录数

                  p_OutCursor out refCursorType)

as

    v_sql varchar2(3000);

    v_count int;

    v_heiRownum int;

    v_lowRownum int;

begin

  ----取记录总数

  execute immediate p_SqlCount into v_count;

  p_OutRecordCount := v_count;

  ----执行分页查询

  v_heiRownum := p_PageNo * p_PageSize;

  v_lowRownum := v_heiRownum - p_PageSize + 1;

  v_sql := 'SELECT * 

            FROM (

                  SELECT A.*, rownum rn 

                  FROM  ('|| p_SqlSelect ||') A

                  WHERE rownum <= '|| to_char(v_heiRownum) || '

                 ) B

            WHERE rn >= ' || to_char(v_lowRownum) ;

            --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用 别名rn

  

  OPEN p_OutCursor FOR  v_sql;

end sp_Page;

 

9. 存储过程和函数的区别

存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。

 

10. 事务是什么?

事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:原子性事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。一致性事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。隔离性由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。持久性事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持

 

11. 游标的作用?如何知道游标已经到了最后?

游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。

 

12. 触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。

事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。

 

13. 你在数据库编程过程中,面临的数据量有多大?如果有一个项目中每天有三张结构完全相同的表,一个365天天天如此,每张表记录在100万条以上,现需要分页查询,根据这样的项目,采用你用过的分页原理,行吗?

这是考的是性能,一般的分页方式不行,遇到这样的题,你可以说,你需要了解更详细的业务,认真的研究一下,是可以的,当然,如果你认为你的方法可以,可以对这样的问题进行交流,等等。这样的题,说不好也行,不影响你的面试,主要是看一下你对问题的态度

 

14. 写出从数据库表Custom中查询No、Name、Num1、Num2并将Name以姓名显示、计算出的和以总和显示的SQL。

SELECT No, Name AS ‘姓名Num1 Num2(Num1+Num2) AS ‘总和 FROM Custom

 

15. 何为“事务处理”,谈谈你对它的理解。

事务处理是指一个单元的工作,这些工作要么全做,要么全部不做。作为一个逻辑单元,必须具备四个属性:原子性、一致性、隔离性和持久性。自动性是指事务必须是一个自动的单元工作,要么执行全部数据的修改,要么全部数据的修改都不执行。一致性是指当事务完成时,必须使所有数据都具有一致的状态。在关系型数据库中,所有的规则必须应用到事务的修改上,以便维护所有数据的完整性。所有的内部数据结构,在事务结束之后,必须保证正确。独立性是指并行事务的修改必须与其他并行事务的修改相互独立。一个事务看到的数据要么是另外一个事务修改这些事务之前的状态,要么是第二个事务已经修改完成的数据,但是这个事务不能看到正在修改的数据。

 

16. 数据库名词解析

 

处理是包含一个或多个 Transact-SQL 语句的组,从应用程序一次性地发送到 Microsoft SQL Server 执行。批作为一个整体执行,以GO命令结束。批处理是客户端作为一个单元发出的一个或多个 SQL 语句的集合。每个批处理编译为一个执行计划。

 

触发器:触发器是在对表进行插入、更新或删除操作时自动执行的存储过程,触发器通常用于强制业务规则,触发器可以确保数据的完整性和一致性。

事务:是用户定义的一个操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位(构成单一逻辑工作单元的操作集合)如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据更改均被清除

锁:是在多用户环境中对数据访问的限制封锁就是事务 T 在对某个数据对象(如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务 T 就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。(锁蕴含的基本概念是用户需要对表的排它访问)从程序员的角度看:分为乐观锁和悲观锁。乐观锁:完全依靠数据库来管理锁的工作。悲观锁:程序员自己管理数据或对象上的锁处理。

子查询一个 SELECT 语句嵌套在另一个 SELECT 语句中。

索引:是一个数据库对象,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单,然后根据指定的排序次序排列这些指针 优点:提高查询执行的速度,强制实施数据的唯一性,提高表之间联接的速度。缺点:存储索引要占用磁盘空间,数据修改需要更长的时间,因为索引也要更新。

视图:是一种虚拟表,通常是作为来自一个或多个表的行或列的子集创建的。视图本质上讲,就是保存在数据库中的select查询,视图并不是数据库中存储的数据值的集合。对最终用户的好处结果更容易理解获得数据更容易。对开发人员的好处限制数据检索更容易维护应用程序更方便

存储过程:使用一个名称存储的预编译T-SQL语句和流程控制语句的集合?由数据库开发人员或数据库管理员编写用来执行管理任务或应用复杂的业务规则  优点?执行速度更快?首次运行时,进行优化和编译得到执行计划并将该计划存储在系统表中,以后直接运行。?实现多个程序共享应用程序逻辑?组件式编程?能够屏蔽数据库的结构,实现更高的安全性减少网络流通量。

数据模型:是一种标识实体类型及其实体间联系的模型。典型的数据模型有网状模型、层次模型和关系模型。

 

17. 数据库设计和建模必要性

        好的数据库结构有利于:节省数据的存储空间,能够保证数据的完整性,方便进行数据库应用系统的开发。设计不好的数据库结构将导致:数据冗余、存储空间浪费,内存空间浪费。

 

   18. 数据库设计步骤

收集信息 ?> 标识对象 ?> 设计数据模型 ?> 标识每个对象存储的信息类型 ?> 标识对象之间的关系

 

   19. 什么是规范化

     从关系数据库的表中,除去冗余数据的过程称为规范化。包括:精简数据库的结构,从表中删除冗余的列,标识所有依赖于其它数据的数据。

20. 范式的定义

第一范式的定义:如果一个表中没有重复组(即行与列的交叉点上只有一个值,而不是一组值),则这个表属于第一范式(常记成1NF)。简而言之:"每一字段只存储一个值"。例如:职工号,姓名,电话号码组成一个表(一个人可能有一个办公室电话和一个家里电话号码)

第二范式的定义:如果一个表属于1NF,任何属性只依赖于关键字,则这个表属于第二范式(常记成2NF )。简而言之:必须先符合1NF的条件,且每一行都能被唯一的识别。 1NF转换成2NF的方法是添加主键。学号,课程名,成绩

第三范式的定义:如果一个表属于2NF,且不包含传递依赖性,则这个表是第三范式(常记成3NF)。满足3NF的表中不包含传递依赖。简而言之:没有一个非关键属性依赖于另一个非关键属性。学号,课程号,成绩,学分学号,姓名,所在系,系名称,系地址。

21. SQL Server服务器中,给定表table1中有两个字段ID、LastUpdateDate,ID表示更新的事务号,LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号。

SELECT ID FROM TABLE1 WHERE LASTUPDATEDATE = (SELECT MAX (LASTUPDATEDATE) FROM TABLE1)

22. 写出一条SQL语句:取出表A中第31到第40记录(SQL Server, 以自动增长的ID作为主键, 注意:ID可能不是连续的。)

方式一:SELECT TOP 10 * FROM A WHERE ID NOT IN (SELECT TOP 30 ID FROM A)

方式二:SELECT TOP 10 * FROM A WHERE ID > (SELECT MAX (IDFROM (SELECT TOP 30 ID FROM A) AS A)

23. 数据库中,表a和表b具有完全相同的结构,主键为 id。写出一个SQL语句把表b中不存在而表a中存在的数据查询出来

SELECT * FROM A WHERE A.ID NOT IN (SELECT ID FROM B)

24. 写一个SQL语句把表b不存在而表a中存在的数据插入到表b中去

INSERT INTO B (SELECT * FROM A WHERE A.ID NOT IN (SELECT ID FROM B))

25. 请根据以下的要求写出SQL

网站的访问日志表,浏览器每发送一个请求,都会在表中记录,其表结构如下所示:

表名

T_Access_Log

字段名称

数据类型

是否为空

是否主键

字段描述

Id

varchar(32)

TRUE

TRUE

数据库编号

access_ip

varchar(20)

TRUE

FALSE

访问IP

access_time

datetime

TRUE

FALSE

访问时间

access_url

varchar(255)

TRUE

FALSE

访问URL

session_id

varchar(50)

TRUE

FALSE

浏览器SESSION编号

1) 请统计每一个IP登录的次数与点击的次数!(输出列:ip,登录数,点击数)

SELECT ACCESS_IP IP, COUNT(SESSION_ID) "登录数", COUNT(*) "点击数FROM T_ACCESS_LOG GROUP BY IP, COUNT(SESSION_ID)

2) 请找出登录次数超过10次的IP地址!(输出列:ip,点击数)

SELECT ACCESS_IP IP, COUNT(*) "点击数FROM T_ACCESS_LOG GROUP BY IP HAVING COUNT(SESSION_ID)>10

26. 定单表Orders的列OrderID的类型是小整数(smallint),根据业务的发展需要改为整型(integer),应该使用下面哪条语句?  ()

A. ALTER COLUMN OrderID integer FROM Orders

B. ALTER TABLE Orders (OrderID integer)

C. ALTER TABLE Orders modify COLUMN OrderID integer

D. ALTER COLUMN Orders.OrderID integer

C

27. 执行下面脚本,共有多少条记录插入到表tblTemp中? ( )

CREATE TABLE tblTemp(TempID integer not nullTempDate datetime not null)

go

DECLARE @count integer

SET @count=1

WHILE @count<=10

  BEGIN

   IF(SELECT COUNT(*) FROM tblTemp)>8

     BEGIN BREAK END

   ELSE

     INSERT tblTemp VALUES(@countGETDATE())

     SET @count=@count+1

END

A、0 B、8 C、9 D10

C

28. 你需要获得定单信息列表,包括雇员代号、销售金额和定单日期。你想按日期从近到早的顺序显示,并且对于每一天的定单,按销售金额从大到小的顺序排序。假设列销售日期的时间部分的值都是0,下面哪条语句能够准确地完成该任务?

A.SELECT 雇员代号销售金额定单日期 FROM 定单表 ORDER BY销售金额定单日期 DESC

B.SELECT雇员代号销售金额定单日期 FROM 定单表 ORDER BY 定单日期销售金额DESC

C.SELECT 雇员代号, 销售金额, 定单日期 FROM 定单表 ORDER BY 定单日期 DESC, 销售金额 DESC

D.SELECT 雇员代号, 销售金额, 定单日期 FROM 定单表 ORDER BY 销售金额 DESC, 定单日期 DES

C

29. 表一列出了数据库:供货商-商品-项目数据库的部分资料表。供货商资料表(S

商品资料表(P)、项目资料表(J)分别以S#P#J#字段为数据表的关键词。出货资料表(SPJ)的一笔资料表示一个特定的项目所涉及到的特定的供货商、特定的商品及其数量(用S#P#J#共同标识其中的每一笔记录)。

表一

供货商资料[S]

S#

SNAME

STATUS

CITY

S1

Smith

20

London

S2

Jones

10

Paris

S3

Blake

30

Paris

S4

Clark

20

London

商品资料[P]

P#

PNAME

COLOR

WEIGHT

CITY

P1

Nut

Red

12

London

P2

Bolt

Green

17

Paris

P3

Screw

Blue

17

Rome

P4

Screw

Red

14

London

项目资料[J]

J#

JNAME

 CITY

J1

Sorter

Paris

J2

Puncn

Rome

J3

Reader

Athens

J4

Console

Athens

出货资料[SPJ]

S#

P#

J#

QTY

S1

P1

J1

200

S1

P1

J4

700

S2

P3

J1

400

S2

P3

J2

200

S3

P3

J1

300

S3

P4

J2

500

 请用SQL语句回答下列问题:

1) 取得以下条件()及()的所有信息及为“同一城市”且级别不为“20

题目不全

2) 取得商品名称第一个字母为“C”的全部商品信息

SELECT * FROM P WHERE PNAME LIKE 'C%'

3) 根据提供的商品供应关系资料,取得各商品的商品裹足不前工名称统计其出货数量

题目有问题

Select pname,sum(qty) from spj,p where spj.p#=p.p# group by p.p#,pname 

4) 取得供应的商品中至少有一种商品颜色为“Red”的供货商名称

SELECT SNAME FROM S, (SELECT DISTINCT S# FROM SPJ, (SELECT P# FROM P WHERE COLOR='Red') A WHERE SPJ.P#=A.P#) AA WHERE S.S#=AA.S#

select distinct Sname from s,p,spj

where s.S#=spj.s# and spj.P#=p.p#

and color='RED'

30. 2张表,有字段 [CustomerID]; B也有字段 [CustomerID]

1) 写出SQL语句: 读取表A[CustomerID]不为空,且在表B中没有对应[CustomerID]的所有记录,即表B中不存在表A中的[CustomerID]

SELECT * FROM A WHERE A.CUSTOMID 

NOT IN (SELECT CUSTOMID FROM B)

(and customid is not null)

B表中有NULL的时候,not选择不出来

select * from a left join

(select customId from a where customid

in (select  customid from b)) c

on a.customid=c.customid

where a.customid is not null and c.customid is null

2) 写出SQL语句: 合并表A和表B,列出所有不重复的[CustomerID],列出的结果为1

SELECT DISTINCT CUSTOMID FROM ((SELECT CUSTOMID FROM A) UNION (SELECT CUSTOMID FROM B)) BB

select customid from a

union

select customid from b

31. 设有关系EMPENOENAMESALARYDNO),其中各属性的含义依次为职工号、姓名、工资和所在部门号,以及关系DEPTDNODNAMEMANAGER),其中各属性含义依次为部门号、部门名称、部门经理的职工号。请用SQL语句将“销售部”的那些工资数额低于600的职工的工资上调10%

UPDATE EMP SET SALARY=SALARY*1.1 WHERE ID IN (SELECT ENO FROM EMP WHERE SALARY<600 AND DNO IN(SELECT DNO FROM DEPT WHERE DNAME='销售部'))

update emp set sal=sal*1.1 where salary<600 and deptno=(select dno from dept  where  dname='销售部');

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值