小言_互联网的博客

数据库部分[面试题]

476人阅读  评论(0)

上一篇文章[jsp/servlet部分(面试题)]


1.触发器的作用

触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的.它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化.可以联机运算.如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发

2.什么是存储过程?用什么来调用

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次.如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快.
调用:

  • 1.可以用一个命令对象来调用存储过程
  • 2.可以供外部程序调用,比如:java程序

3.存储过程的有缺点

优点:

  • 1.存储过程是预编译过的,执行效率高
  • 2.存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯
  • 3.安全性高,执行存储过程需要有一定权限的用户
  • 4.存储过程可以重复使用,可减少数据库开发人员的工作量

缺点:
移植性差

4.存储过程与函数的区别

存储过程 函数
用于在数据库中完成特定的操作或者任务(如插入,删除等) 用于特定的数据(选择)
程序头部声明用procedure 程序头部声明用function
程序头部声明时不需要描述返回类型 程序头部声明时要描述返回类型,而且PL/SQL块中至少要包括一个有效的return语句
可以使用in/out/in out 三种模式的参数 可以使用in/out/in out 三种模式的参数
可作为一个独立的PL/SQL语句来执行 不能独立执行,必须作为表达式的一部分调用
可以通过out/in out 返回零个或多个值 通过return语句返回一个值,且改值要与声明部分一致,也可以是通过out类型的参数带出的变量
SQL语句(DML或select)中不可调用存储工程 SQL语句(DML或select)中可以调用函数

5.索引的作用?和它的优点缺点是什么

索引就是一种特殊的查询表,数据库的搜索可以利用它加速对数据的检索.它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据.索引可以是唯一的,创建索引允许指定单个列或者是多个列.缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小

6.什么样的字段适合建索引

  • 1.经常被查询的字段
  • 2.不为空且字段值不重复
  • 3.字段的值不经常被修改

7.索引类型有哪些

逻辑上:
Single column 单行索引
Concatenated 多行索引
Unique 唯一索引
NonUnique 非唯一索引
Function-based 函数索引
Domain 域索引
物理上:
Partitioned 分区索引
NonPartitioned 非分区索引
B-tree:
Normal 正常型B树
Bitmap 位图索引

8.什么是事务?什么是锁

事务就是被绑定在一起作为一个逻辑单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点.为了确保要么执行,要么不执行,就可以使用事务.要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性
:在所有的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性.与现实生活中锁一样,他可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构.当然锁还分级别的

9.什么叫视图?游标是什么

  • 视图:是一种虚拟的表,具有和物理表相同的功能.可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集.对视图的修改不影响基本表.它使得我们获取数据更容易,相比多表查询
  • 游标:是对查询出来的结果集作为一个单元来有效的处理.游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行.可以对结果集当前行做修改.一般不使用游标,但是需要逐条处理数据的时候,游标十分重要

10.视图的优缺点

优点:

  • 1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分
  • 2.用户通过简单的查询可以从复杂的查询中得到结果
  • 3.维护数据的独立性,视图可从多个表检索数据
  • 4.对于相同的数据可产生不同的视图

缺点:

  • 性能:查询视图时,必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,也把它变成一个复杂的结合体,需要花费一定的时间

11.列举几种表连接方式,有什么区别

内连接,自连接,外连接(左,右,全),交叉连接

  • 内连接:只有两个元素表相匹配的才能在结果集中显示
  • 外连接:
  • 左外连接:左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示
  • 右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示
  • 全外连接:连接的表中不匹配的数据全部会显示出来
  • 交叉连接:笛卡尔效应,显示的结果是链接表数的乘积

12.主键和外键的区别

主键在本表中是唯一的,不可为空的,外键可以重复可以为空;外键和另一张表的主键关联,不能创建对应表中不存在的外键

13.在数据库中查询语句速度很慢,如何优化

  • 1.建索引
  • 2.减少表之间的关联
  • 3.优化SQL,尽量让SQL很快定位数据,不要让SQL做全表查询,应该走索引,把数据量大的表排在前面
  • 4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
  • 5.尽量用PrepareStatenment来查询,不要用Statement

14.数据库三范式

  • 第一范式(1NF):字段具有原子性,不可再分.所有关系型数据库系统都满足第一范式
    数据库表中的字段都是单一属性的,不可再分.例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段
  • 第二范式(2NF):是在第一范式(1NF)的基础上建立起来的,既满足第二范式(2NF)必须先满足第一范式(1NF)
    要求数据库表中的每个实例或行必须可以被唯一地区分,通常需要为表加上一个列,以存储各个实例的唯一标识,这个唯一属性列被称为主关键字或主键
    第二范式(2NF)要求实体的属性完全依赖于主关键字.所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系.为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识.简而言之,第二范式就是非主属性非部分依赖于主关键字
  • 第三范式(3NF):必须先满足第二范式(2NF).简而言之,第三范式(3NF)要求一个数据库中不包含已在其它表中以包含的非主关键字信息
    所以第三范式具有以下特征:
    1.,每一列只有一个值
    2.每一行都能区分
    3.每一个表都不包含其他表已经包含的非主关键字信息
    例如:帖子表中只能出现发帖人的ID,而不能出现发帖人的ID,还同时出现发帖人的姓名,否则,只要出现同一发帖人ID的所有记录,他们中的姓名部分必须严格保持一致,这就是数据冗余

15.union和union all有什么不同

  • union在进行表连接后会筛选重复的记录,所以在表连接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果.实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表union
  • union all只是简单的将两个结果合并后就返回.这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了
    从效率上来说,union all要比union块很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用union all

16.char,varchar2,varchar有什么区别

  • char的长度是固定的,而varchar2的长度是可以变化的,比如,存储字符串"abc"对于char(20),表示你存储的字符将占20个字节,包含17个空,而同样的varchar2(20)只占了3个字节,20只是最大值,当你存储的字符小于20时,按实际长度存储.char的效率要比varchar2的效率高
  • 目前varchar是varchar2的同义词,工业标准的varchar类型可以存储空字符串,但是oracle不能这样做,尽管它保留以后这样做的权利.Oracle自己开发了一个数据类型varchar2,这个类型不是一个标准的varchar,它将在数据库中varchar列可以存储空字符串的特性改为存储null值,如果你想有向后兼容的能力,oracle建议使用varchar2而不是varchar

17.Oracle和MySQL的区别

  • 1.函数库不同
  • 2.Oracle是用表空间来管理的,MySQL不是
  • 3.显示当前所有的表,用户,改变连接用户,显示当前连接用户,执行外部脚本的语句不同
  • 4.分页查询不同,MySQL用limt oracle用rownum
  • 5.sql的语句不同

18.Oracle语句有多少类型

Oracle语句分为三类:DDL,DML,DQL,DCL

  • DDL(Data Definition Language)数据定义语言,包括:
    create语句:可以创建数据库和数据库的一些对象
    Drop语句:可以删除数据表,索引,触发程序,条件约束以及数据表的权限等
    Alter语句:修改数据表定义及属性
    Truncate语句:删除表中的所有记录,包括所有空间分配的记录被删除
  • DML(Date Manipulation Language)数据操控语言,包括:
    Insert语句:向数据表中插入一条记录
    Delete语句:删除数据表中的一条或多条记录,也可以删除数据表中的所有记录,但是它的操作对象仍是记录
    Update语句:用于修改已存在表中的记录的内容
  • DQL(Data Query Language)数据操控语言,包括:
    Select语句:用于查询已存在表中的记录的内容
  • DCL(Data Control Language)数据库控制语言,,包括:
    Grant语句:允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限
    Revoke语句:可以废除某用户或某组或所有用户访问权限
  • TCL(Transaction Control Language) 事务控制语言
    commit:提交事务
    rollback:回滚事务

19.Oracle分页语句

使用rownum,两种如下:

  • 第一种:
select * from (select t.*,rownum row_num from mytable t) b where  b.row_num between 1 and 10
  • 第二种:
select * form(select a.*,rownum rn from mytable a where rownum<=10) where rn>=1
  • 第三种,使用rowid
select * from  scott.emp where rowid in(select rd from (select rowid as rd,rownum as rn from scott.emp) where rn<=6 and rn>3)

20.从数据库中随机取50条

select * from (select * from t_example order by dbms_random.random) where rownum<=50

21.order by与group by 的区别

  • order by排序查询.asc升序,desc降序
  • group by分组查询,having只能用于group by子句,作用于组内,having条件子句可以直接跟函数表达式.使用group by子句的查询语句需要使用聚合函数

22.commit在哪里会运用

  • oracle的commit就是DML语句的提交数据(这里是释放锁不是锁表),在未提交前你前面的操作更新的都是内存,没有更新到物理文件中
  • 执行commit从用户角度讲就是更新到物理文件了,事实上commit时还没有写date file,而是记录了redo log file,要从内存写到data 物理文件,需要触发检查点,有DBWR这个后台进程来写,这里内容有点多,如果不深究的话你就理解成commit即为从内存更新到物理文件

23.行转列,列换行怎么转

行转列
1)使用decode函数

select name 
   sum(decode(course,'数学',score,0)) as 数学,
   sum(decode(course,'语文',score,0)) as 语文,
   sum(decode(course,'英语',score,0)) as 英语
   from GRADE group by name;

2)使用case when 语句

select name ,
  sum(case course when '语文' then score else 0 end) as 语文, 
  sum(case course when '数学' then score else 0 end) as 数学, 
  sum(case course when '英语' then score else 0 end) as 英语
  form GRADE group by name;
 
select name,
  sum(case when cours='语文' then score else 0 end) as 语文,
  sum(case when cours='英语' then score else 0 end) as 英语,
  sum(case when cours='数学' then score else 0 end) as 数学
  from GRADE group by name 

列转行

select name ,'语文' as course,cn_score as score from SC_GRADE
union all
select name,'数学' as course,math_score as score from SC_GRADE
union all
select name,'英语' as course ,en_score as score from SC_GRADE 
order by name;

24.什么是PL/SQL

PL/SQL是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是oracle数据库对SQL语句的扩展.在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断,循环等操作实现复杂的功能或者计算.PL/SQL只有Oracle数据库有.MySQL目前不支持PL/SQL的

25.序列的作用

Oracle使用序列来生成唯一编号,用来处理一个表中自增字段.Oracle序列是原子对象,并且是一致的.也就是说,一旦您访问一个序列号,Oracle将在处理下一个请求之前自动递增下一个编号,从而确保不会出现重复值

26.表和视图的关系

  • 视图其实就是一条查询SQL语句,用于显示一个或多个表或其他视图中的相关数据.
  • 表就是关系数据库中实际存储数据用的

27.Oracle基本数据类型

1.字符串类型
char,nchar,varchar,varchar2,nvarchar2
2.数字类型
number,integer
3.浮点类型
binary_float,binary_double,float
4.日期类型
date,timestamp
5.LOB类型
blob,clob,nclob,bfile

28.drop,truncate,delete区别

  • truncate table在功能上与不带where子句的delete语句相同;二者均删除表中的全部行.但truncate table 比delete速度快,且使用的系统和事务日志资源少.delete语句每次删除一行,并在事务日志中为所删除的每行记录一项
  • truncate table 用过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放
  • truncate,delete,drop 放在一起比较
    truncate table:删除内容,释放空间但不删除定义
    delete table:删除内容不删除定义,不释放空间
    drop table:删除内容和定义,释放空间

29.如何优化大数据量的访问

点这里看参考内容

30.Oracle怎么去除去重

使用distinct关键字

31.合并查询有哪些

union (并集去重复)
union all (并集不去重复)
intersect (交集)
minus (差集)

32.SQL语句执行顺序

关键字:select ,from ,join,on ,where ,group by,having,order by,distinct执行顺序:

  • 1.from
  • 2.join
  • 3.on
  • 4.where
  • group by 分组分段
  • having 表达式
  • select
  • distinct
  • order by

33.null的含义

在我们不知道具体有什么数据的时候,也即未知,可以用null,我们称它为空,ORacle中,含有空值的表列长度为零
Oracle允许任何一种数据类型的字段为空,除了以下两种情况:

  • 1.主键字段(primary key)
  • 2.定义时已经加了NOT NULl限制条件的字段

说明:

  • 1.等价于没有任何值,是未知数
  • 2.NUll与0,空字符串,空格都不同
  • 3.对空值做加,减,乘除,等运算操作,结果仍为空
  • 4.NULL的处理使用NVL函数
  • 5.比较时使用关键字用"is null" 和"is not null"
  • 6.空值不能被索引,所以查询时有些符合条件的数据可能查不出来,count(*)中,用nvl(列名,0)处理后再查
  • 7.排序时比其他数据都大(索引默认是降序排列,小->大),所以NULL值总是排在最后

34.MySQL分页

select * from 表名 limit 起始位置,查询数量

35.MySQL,Sqlserver,Oracle写出字符存储,字符串转时间

  • 1.在MySQL.Sqlserver,Oracle中两个单引号代表字符
  • 2.字符串转时间
    Oracle:使用to_date('字符串时间','yyyy-MM-dd HH24:mi:ss')函数
    Sqlserver:convert(数据类型,日期样式ID)
    MySQL:date_format(日期值,'%Y-%c-%d %h:%i:%s');

36.update语句可以修改结果集中的数据吗

在Oracle中是可以的,在MySQL中不可以
如下:

update(select * from table t1 left join table2 t2 on t1.字段=t2.字段) set 字段名=值 where 条件字段=条件值

37.Oracle如何设置主键自动增长

  • 1.创建一个自增序列
  • 2.创建一个insert触发器,触发器中将之前创建的序列的值赋值给ID;

创建序列:

create sequence seq_t_orginfo increment by 1

创建触发器:

create or replance trigger tagt_t_orginfo befor insert on t_orginfo for each row
declare next_auto_no number;
begin
 select  seq_t_orginfo.nextval into next_auto_no from dual;
 :new.tid:=next_auto_no;
 end;

38.表连接,子查询的区别是什么

  • 表连接查询是将要查询的表先根据连接运算符和连接条件关联起来之后再根据筛选条件进行筛选查询
  • 子查询是将表查询的结果代入到另外一个查询条件中去
  • 一般表连接查询和子查询都能够互相转换,但子查询更加灵活,而表连接查询性能相对更优
  • 一般情况下能用表连接查询做的就用表连接查询做,因为其效率更高,更加直观

39.Oracle数据库表的备份及还原

参考地址点这里

40.Oracle数据库表的备份及还原

数据库:

  • 关系型数据库:Oracle,MySQL,Sqlserver,DB2
  • Nosql数据库:redis,MongoliaDB
  • 国产数据库:达梦数据库,南大通用数据库

中间件:

  • Tomcat,Jboss,weblogic,websphere

国产中间件:

  • 东方通,金蝶
    在政府软件国产化的倡议下,政府单位使用国产数据库中间件的越来越多,

41.Oracle和MySQL的区别

MySQL属于中小型数据库,开源免费,Oracle属于大型数据库,收费

  • 1.MySQL主键支持自增长,而Oracle不支持,只能通过序列和触发器联合使用达到自增效果
  • 2.MySQL中可以使用双引号和单引号包起字符串,而Oracle中只能使用单引号
  • 3.MySQL和Oracle分页写法不一样
  • 4.blob字段插入方式不一样,Oracle需要先插入empty_blob然后再update
  • 5.Oracle和MySQL的函数有些差异,语法有些差别

42.简述MySQL的InnoDb

数据库的存储引擎是对表进行某种设置,存储引擎决定该表的数据存储方式,数据更新方式,数据查询性能以及是否支持索引,事务处理性能等.MySQL常用的几种引擎有:MyISAM,InnoDB,MEMORY,CSV,BLACKHOLE,ARCHIVE,PERFORMANCE_SCHEMA,Merge等

  • InnoDb引擎:
    优点:
    1.提供事务支持
    2.提供系统崩溃修复能力
    3.支持多版本并发控制(即MVCC Multi-Version concurrency Control)的行级锁,由于锁粒度小,写操作和更新操作并发高,速度快,适合更新频繁的表
    4.支持自增长列
    5.支持外键
    6.适合于大容量数据库系统,支持自动灾难恢复
    扩展阅读

43.删除重复数据只保留一条

  • 1.删除表中多余的重复记录,重复记录是根据单个字段(ID)来判断的,只留有rowid最小的记录
delete from 表 where (ID) Inselect id from 表 group by id having count(id)>1 ) and 
rowid not in(select min(rowid) from 表 group by id having count(*)>1);
  • 2.删除表中多余的重复记录(多个字段),只留rowid最小的记录
delete from 表 a where (a.id,a.seq) in (select id,seq from 表 group by id,seq having count(*)>1)
and rowid not in(select min(rowid) from  表 group by id,seq having count(*)>1)

扩展阅读

44.一个几千万的数据,发现数据查询很慢,怎么办

  • 1.查看对应得查询字段上是否建立索引,如果没有建立索引的话,建立索引,在查看效果
  • 2.如果已经建立了索引的话,分析对应的SQL语句是否存在问题,是否有走索引
  • 3.如果SQL语句没有问题,也走了索引的话,则考虑因为表的频繁的增删操作,导致表空间持续增大未得到释放,此时需要释放空间,重建索引
    扩展阅读

[简言]
你还好吗,听到你过的还不错,这是我听到关于你的全部的消息,也希望如此


转载:https://blog.csdn.net/weixin_40791361/article/details/101373782
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场