面试官常问的 数据库 问题(一)

面试官常问的 数据库 问题 1-10

1. 触发器的作用?

特殊的存储过程。可强化约束,维护数据完整性与统一性。

何为触发器?
在SQLServer里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。
触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的。
它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化,可以联级运算。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。

如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

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

自创建一次可调用多次!
如果需要执行多次SQL语句,存储过程比单纯的SQL要快。

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

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

3. 索引的作用及优缺点是什么?

索引的作用:创建索引可提高系统的性能
优:加快数据检索;可保证数据唯一;
缺:创建和维护索引需要时间;占空间;

索引的作用:创建索引能够大大的提高系统的性能

优点:

①通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

②大大加快数据的检索速度,这也是创建索引的最主要原因

③保证了表与表之间的连接,在实现数据的参考完整性方面特别有意义

④在使用分组和排序,子句进行数据检索时,同样可以显著减少查询中分组和排序的时间

⑤通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:

①创建索引和维护索引需要时间,这种时间随着数据量的增加而增加

②索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占物理空间,如果要建立聚簇索引,需要的空间更大

③当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这就降低了数据的维护速度。

索引是创建在数据库的表中的列上。因此,在创建索引的时候,要考虑哪些列上适合加索引,那些列上不适合加索引。
搜索引擎技术es

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

视图:一种虚拟的表,具有和物理表相同的功能,我们一般做查询(视图查询相较于多表查询更容易获取数据)。

视图是一种虚拟的表,具有和物理表相同的功能,可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列
的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

游标:是对查询出来的结果集作为一个单元来有效的处理。可定在该单元中的特定行,从结果集的当前行检索一行或多行;可对结果集当前行做修改。
一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

5. delete、drop、truncate 区别

delete 删除后可恢复,一般删除部分数据(删全部太慢了)
truncate、delete 只删除数据,不删除表结构,drop 删除表结构,且释放所占的空间;
删除数据的速度,drop>truncate>delete ;
delete 属于 DML 语言,需要事务管理,commit 之后才能生效,drop 和 truncate 属于 DDL 语言,操作立刻生效,不可回滚;
使用场合:
不再需要该表时, 用drop;删除所有记录但保留该表时, 用truncate;删除部分记录时用delete。

6. 如何进行 SQL 优化?

(1)选择正确的存储引擎
以 MySQL 为例,包括有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。 MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要 update 一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECTCOUNT(*) 这类的计算是超快无比的。 InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。但是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。

(2)优化字段的数据类型
记住一个原则,越小的列会越快。如果一个表只会有几列罢了(比如说字典表,配置表),那么,我们就没有理由使用 INT 来做主键,使用 MEDIUMINT,SMALLINT 或是更小的 TINYINT 会更经济一些。
如果你不需要记录时间,使用 DATE 要比 DATETIME 好得多。 当然,你也需要留够足够的扩展空间。

(3)为搜索字段添加索引,索引并不一定就是给主键或是唯一的字段
如果在你的表中,有某个字段你总要会经常用来做搜索,那么最好是为其建立索引,
除非你要搜索的字段是大的文本字段,那应该建立全文索引。

(4)避免使用 Select *
从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和 WEB 服务器是两台独 立的服务器的话,这还会增加网络传输的负载。即使你要查询数据表的所有字段,也尽量不要用*通配符,善用内置提供的字段排除定 义也许能给带来更多的便利。

(5)使用 ENUM 而不是 VARCHAR
ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选 项列表变得相当的完美。例如,性别、民族、部门和状态之类的这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。

(6)尽可能的使用 NOTNULL
除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOTNULL。 NULL 其实需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂。 当然,这里并不是说你就不能使用 NULL 了,现实情况是很复杂的,依然会有些情况下,你需要 使用 NULL 值。

(7)固定长度的表会更快
如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。 例如,表中没有如下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理。
固定长度的表会提高性能,因为 MySQL 搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。
并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你
用不用,他都是要分配那么多的空间。

7. MySQL 中的 varchar 和 char 有什么区别?(重点)

char:定长字段;varchar:可变字段;
检索效率:char>varchar(确定某字段值的长度时,用char);

char 是一个定长字段,假如申请了 char(10)的空间,那么无论实际存储多少内容,该字段都占用 10 个字符;
而 varchar 是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间。

在检索效率上来讲,char>varchar;
因此在使用中,如果确定某个字段的值的长度(shiro 盐加密),可以使用char,否则应该尽量使用varchar。例如存储用 户 MD5 加密后的密码,则应该使用 char。

8. 在哪些情况下会发生针对该列创建了索引,但是在查询的时候并没有使用呢?

使用不等于查询;
列参与了数学运算或者函数;
使用 like 时 ,左边是通配符,类似于’%aaa’;
当mysql分析全表扫描比使用索引快的时候不使用索引;
当使用联合索引,前面一个条件为范围查询,后面的即使符合最左前缀原则,也无法使用索引;

以上情况,MySQL无法使用索引!

9. 为什么要尽量设定一个主键?

保证数据的唯一性

主键是数据库确保数据行在整张表唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增长的 ID 列作为主键,设定了主键 之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全。

10.Mysql 数据库与 Oracle 数据库有什么区别?

MySql:中小型数据库;可自动增长(有自动增长的=数据类型);group by 方法可随意用;可用单引号、双引号包起字符串;
Oracle:大型数据库;无自动增长(需要创建自增序列);当查询语句中有组函数,则其他列必须是组函数处理过的或者是 group by 子句中的列,否则会报错;只可用单引号包起字符串;

  1. 应用方面,Mysql 是中小型应用的数据库。一般用于个人和中小型企业。Oracle 属于大型数据库,一般用于具有相当规模的企 业应用。
  2. 自动增长的数据类型方面: MySQL 有自动增长的数据类型。Oracle 没有自动增长的数据类型。需要建立一个自增序列。
  3. group by 用法: Mysql 中 group by 在 SELECT 语句中可以随意使用,但在 ORACLE 中如果查询语句中有组函数,那么其他列必须是组函数处理过的或者是 group by 子句中的列,否则会报错。
  4. 引导方面: MySQL 中可以用单引号、双引号包起字符串,Oracle 中只可以用单引号包起字符串
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值