面试题笔试题总结——数据库题库

触发器的作用?

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

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

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在改程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。调用:1)可以用一个命令对象来调用存储过程。2)可以供外部程序调用,比如:Java程序。

存储过程的优缺点?

优点:1)存储过程是预编译过的,执行效率高。2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。3)安全性高,执行存储过程需要有一定权限的用户。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)中可以调用函数
索引的作用?和它的优点缺点是什么?

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

什么样的字段适合索引

唯一、不为空、经常被查询的字段

索引类型有哪些?

逻辑上:
Single column 单行索引
Concatenated 多行索引
Unique 唯一索引
NonUnique 非唯一索引
Function-based 函数索引

Domain 域索引 物理上:
Partitioned 分区索引
NonPartitioned 非分区索引

B-tree :
Normal 正常型B树
Rever Key 反转型B树 Bitmap 位图索引

什么是事务?什么是锁?

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

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

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

视图的优缺点

优点:1)对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。2)用户通过简单的查询可以从复杂查询中得到结果。3)维护数据的独立性,视图可从多个表检索数据。4)对于相同的数据可产生不同的视图。
缺点:1)性能——查询视图时,必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么就无法更改数据。

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

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

主键和外键的区别?

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

在数据库中查询语句速度很慢,如何优化?
  1. 建索引
  2. 减少表之间的关联
  3. 优化SQL,尽量让SQL很快定位数据,不要让SQL做全表查询,应该走索引,把数据量大的表排在前面
  4. 简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
  5. 尽量用PreparedStatement来查询,不要用Statement
union和union all有什么不同?

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

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。

从数据库中随机取50条
select * from (select * from t_example order by dbms_random.random) where rownum <= 50
order by 与group by的区别

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

行转列、列转行怎么转

1)使用decode函数
2)使用case when语句

表和视图的关系

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

truncate与delete区别

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

SQL语言包括哪些类型

数据定义:create table,alter table,drop table,create/drop index
数据操纵:select,insert,update,delete
数据控制:grant,revoke

【GRANT】是授权语句,将对某个表的操作权限授予某个用户
举例:
将读学生表Student的插入权限授予用户U1:
Grant insert ON table Student to U1;

【REVOKE】就是收回权限,值得注意的是收回权限的时候注意是不是级联的收回
举例:
将U1对Student的插入权限收回
REVOKE insert ON table Student from U1;
其中,grant语句和revoke语句是相对的

内连接,外连接区别

内连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。

在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。分左连接、右连接、全连接三种。

等连接(内连接)、非等连接、自连接、外连接(左、右、全)OR hash join/merge join/nest loop(cluster join)/index join

数据库中的内连接、自然连接、外连接
数据库中的连接join分为内连接、自然连接、外连接,外连接,外连接又分为左外连接、右外连接、全外连接。

当然,这些分类都是在连接的基础上,是从两个表中记录的笛卡尔积中选取满足连接的记录。笛卡尔积简单的说就是一个表里的记录要分别和另外一个表的记录匹配为一条记录,即如果表1有2条记录,表2也有2条记录,经过笛卡尔运算之后就应该有2*2即4条记录。

自然连接(natural join)
自然连接是一种特殊的等值连接,他要求两个关系表中进行比较的必须是相同的属性列,无须添加连接条件,并且在结果中消除重复的属性列。
sql语句:Select …… from 表1 natural join 表2

内连接(inner join)
内连接基本与自然连接相同,不同之处在于自然连接奥球是同名属性列的比较,而内连接则不要求两属性列同名,可以用using或on来指定某两列字段相同的连接条件。
sql语句:Select …… from 表1 inner join 表 2 on 表1.A=表2.E

自然连接时某些属性值不同则会导致这些元组会被舍弃,那如何保存这些会被丢失的信息呢,外连接就解决了相应的问题。外连接分为左外连接、右外连接、全外连接。外连接必须用using或on指定连接条件。

左外连接(left outer join)
左外连接是在两表进行自然连接,只把左表要舍弃的保留在结果集中,右表对应的列上填null。
sql语句:Select …… from 表1 left outer join 表2 on 表1.C=表2.C

右外连接(rignt outer join)
右外连接是在两表进行自然连接,只把右表要舍弃的保留在结果集中,左表对应的列上填null。
Select …… from 表1 rignt outer join 表2 on 表1.C=表2.C

全外连接(full join)
全外连接是在两表进行自然连接,只把左表和右表要舍弃的都保留在结果集中,相对应的列上填null。
Select …… from 表1 full join 表2 on 表1.C=表2.C

1)内连接:只连接匹配的行 select A.c1,B.c2 from A join B on A.c3 = B.c3;

2)左外连接:包含左边表的全部行(不管右边的表中是否存在与它们匹配的行)以及右边表中全部匹配的行 select A.c1,B.c2 from A left join B on A.c3 = B.c3;

3)右外连接:包含右边表的全部行(不管左边的表中是否存在与它们匹配的行)以及左边表中全部匹配的行 select A.c1,B.c2 from A right join B on A.c3 = B.c3;

4)全外连接:包含左、右两个表的全部行,不管在另一边的表中是否存在与它们匹配的行 select A.c1,B.c2 from A full join B on A.c3 = B.c3;

5)(theta)连接:使用等值以外的条件来匹配左、右两个表中的行 select A.c1,B.c2 from A join B on A.c3 != B.c3;

6)交叉连接:生成笛卡尔积——它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行一一匹配 select A.c1,B.c2 from A,B;

什么是内存泄露?

一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

如何维护数据库的完整性和一致性?

尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整性和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。

什么是事务?什么是锁?

事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将一组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

锁:在所有的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。共享锁(只读不写)、排他锁(可读可写)

事务隔离级别有哪些?

事务隔离级别包括: 原子性,即不可分割性,事务要么全部被执行,要么就全部不被执行; 一致性或可串性,事务的执行使得数据库从一种正确状态转换成另一种正确状态; 隔离性,在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务; 持久性,事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑?

对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。

可以用什么来确保表格里的字段只接受特定范围里的值?

Check限制,它在数据库表格里被定义,用来限制输入该列的值。 触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。因此,微软建议使用Check限制而不是其他的方式来限制域的完整性。

什么是相关子查询?如何使用这些查询?

经验更加丰富的开发人员将能够准确地描述这种类型的查询。 相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会真正请求外部查询的值,从而形成一个类似于循环的状况。

使用索引查询一定能提该查询的性能吗?为什么?

通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况: 基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用; 基于非唯一性索引的检索 索引就是为了提高查询性能而存在的,如果在查询中索引没有提高性能,只能说是用错了索引,或者讲是场合不同

查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不连续增长的列,查询语句?
方法一:
select top 10 * 
from A 
where ID > (select max(ID) 
			from (select top 30 ID 
					from A order by ID) T)
order by ID

方法二:
select top 10 * 
from A 
where (id not in (select top 30 (id) rrom A as T order by id))
order by ID

方法三:
select top 10 *
from (select top 40 * from tableName order by ID desc) T
order by ID
分页查询语句
select o.* from (sql) o limit firstIndex,pageSize
如何优化数据库,如何提高数据库的性能?

1)给数据库做索引,合理的索引能立即显著地提高数据库整个系统的性能。

2)在适当的情况下,尽可能的用存储过程而不是SQL查询。因为前者已经过了预编译,运行速度更快。

3)优化查询语句,通过高性能的查询语句提高数据库的性能。

说出一些数据库优化方面的经验?

用PreparedStatement 一般来说比Statement性能高。

有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。

根据扫描的原理,第一条子查询语句要比第二条关联查询的效率高:

1)select e.name,e.salary where e.managerid=(select id from employee where name=‘zxx’);

2)select e.name,e.salary,m.name,m.salary from employees e,employees m where e.managerid = m.id and m.name=‘zxx’;

表中允许适当冗余。如,主题帖的回复数量和最后回复时间等

将姓名和密码单独从用户表中独立出来。这可以是非常好的一对一的案例。

sql语句全部大写,特别是列名和表名都大写。特别是sql命令的缓存功能,更加需要统一大小写,sql语句?发给oracle服务器?语法检查和编译成为内部指令?缓存和执行指令。根据缓存的特点,不要拼凑条件,而是用?和PreparedStatment

还有索引对查询性能的改进也是值得关注的。

内容来源:https://blog.csdn.net/lyfqyr/article/details/83351594?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159732754819725247621911%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159732754819725247621911&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-3-83351594.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E6%95%B0%E6%8D%AE%E5%BA%93%E9%9D%A2%E8%AF%95%E9%A2%98&spm=1018.2118.3001.4187#commentBox

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值