数据库-常见面试问题整理

部分内容自百度,如有侵权请联系删除,如有错误或疏漏欢迎批评指正。



什么是主键、外键、超键、候选键?

  • 主键:能确定一条记录的唯一标识
  • 外键:用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。
  • 超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。
  • 候选键:是最小超键,即没有冗余元素的超键。

什么是约束?

约束是在表中定义的用于维护数据库完整性的一些规则通过为表中的列定义约束可以防止将错误的数据插入表中,也可以保持表之间数据的一致性
约束是表级的强制规定,有以下五中:not null,unique,primary key,foreign key,check 。


什么是事务?事务的特点?
  • 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
  • 数据库事务 transanction 正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离 性(Isolation)、持久性(Durability)。
  • 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
  • 隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆, 必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
  • 持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚

范式

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

  • 第一范式(1NF):属性不可分。
  • 第二范式(2NF):符合1NF,并且,非主属性完全依赖于码。
  • 第三范式(3NF):符合2NF,并且,消除传递依赖。
  • BC范式(BCNF):符合3NF,并且,主属性不依赖于主属性
  • 第四范式:要求把同一表内的多对多关系删除。
  • 第五范式:从最终结构重新建立原始结构。

视图

在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。


什么是存储过程?用什么调用?
  • 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
  • 调用:
    1)可以用一个命令对象来调用存储过程。
    2)可以供外部程序调用,比如:java程序。
优缺点
  • 优点:
    1)存储过程是预编译过的,执行效率高。
    2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
    3)安全性高,执行存储过程需要有一定权限的用户。
    4)存储过程可以重复使用,可减少数据库开发人员的工作量。
  • 缺点:移植性差

SQL语句分类 数据库语言分为几类,分别为每类编写完整1个完整的SQL语言

SQL选择语句

  • 数据操纵语言(DML):主要用来处理数据库中的数据内容。允许用户对数据库中的数据进行查询 ,插入,更新和删除等操作
  • 数据定义语言(DDL):是一组SQL命令,用于创建和定义数据库对象,并且将对这些对象的定义保存到数据字典中。通过DDL语句可以创建数据库对象,修改数据库对象和删除数据库对象等。
  • 数据控制语言(DCL):数据控制语言用于修改数据库结构的操作权限。DCL语句主要有2种

修改表结构 ALTER TABLE
  • 添加表字段
    alter table 表名 add 字段名 类型(值)
  • 删除表字段
    alter table 表名 drop 字段名
  • 字段名更名
    alter table 表名 rename 老字段名 to 新字段名
  • 更改字段类型
    alter table 表名 alter 字段 类型;

drop、truncate、 delete区别
  • drop直接删掉表。
  • truncate删除表中数据,再插入时自增长id又从1开始。
  • delete删除表中数据,可以加where字句。
    (1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
    (2) 表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
    (3) 一般而言,drop > truncate > delete
    (4) 应用范围。TRUNCATE 只能对TABLE;DELETE可以是table和view
    (5) TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。
    (6) truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
    (7) delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。
    (8) truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚。
    (9) 在没有备份情况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或老师想触发trigger,还是用delete。
    (10) Truncate table 表名 速度快,而且效率高,因为:?truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
    (11) TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
    (12) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

什么是临时表,临时表什么时候删除?
  • 临时表可以手动删除:
    DROP TEMPORARY TABLE IF EXISTS temp_tb;
    临时表只在当前连接可见,当关闭连接时,MySQL会自动删除表并释放所有空间。因此在不同的连接中可以创建同名的临时表,并且操作属于本连接的临时表。

  • 创建临时表的语法与创建表语法类似,不同之处是增加关键字TEMPORARY,
    如:
    CREATE TEMPORARY TABLE tmp_table (
    NAME VARCHAR (10) NOT NULL,
    time date NOT NULL
    );
    select * from tmp_table;


插入数据语句

NTER INTO TABLE_NAME (…) VALUES (…);


SQL 左连接

select a.X,b.X from a left join b on a.id=b.parent_id


索引原理,对索引的理解

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。


完整性
  • 实体完整性(实体完整性是对关系中的记录唯一性,也就是主键的约束。准确地说,实体完整性是指关系中的主属性值不能为Null且不能有相同值。定义表中的所有行能唯一的标识,一般用主键,唯一索引 unique关键字,及identity属性比如说我们的身份证号码,可以唯一标识一个人.。)
  • 域完整性(域完整性是对数据表中字段属性的约束,通常指数据的有效性,它包括字段的值域、字段的类型及字段的有效规则等约束,它是由确定关系结构时所定义的字段的属性决定的。限制数据类型,缺省值,规则,约束,是否可以为空,域完整性可以确保不会输入无效的值.。)
  • 参照完整性(参照完整性是对关系数据库中建立关联关系的数据表间数据参照引用的约束,也就是对外键的约束。准确地说,参照完整性是指关系中的外键必须是另一个关系的主键有效值,或者是NULL。参考完整性维护表间数据的有效性,完整性,通常通过建立外部键联系另一表的主键实现,还可以用触发器来维护参考完整性)
  • 用户定义的完整性。

数据库多表查询

如何创建数据表中多对多的关系

采用中间表的方式处理,将多对多转化为两个一对多。


如何建表(三大范式)
  • 第一范式(确保每列保持原子性)
    第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
  • 第二范式(确保表中的每列都和主键相关)
    第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
  • 第三范式(确保每列都和主键列直接相关,而不是间接相关)
    第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

SQL常用关键字
数据操作
SELECT   --从数据库表中检索数据行和列
INSERT   --向数据库表添加新数据行
DELETE   --从数据库表中删除数据行
UPDATE   --更新数据库表中的数据 
数据定义 
CREATE TABLE  --创建一个数据库表
DROP TABLE   --从数据库中删除表 
ALTER TABLE   --修改数据库表结构
CREATE VIEW   --创建一个视图 
DROP VIEW   --从数据库中删除视图
CREATE INDEX  --为数据库表创建一个索引
DROP INDEX   --从数据库中删除索引 
CREATE PROCEDURE  --创建一个存储过程 
DROP PROCEDURE  --从数据库中删除存储过程
CREATE TRIGGER  --创建一个触发器 
DROP TRIGGER  --从数据库中删除触发器
CREATE SCHEMA  --向数据库添加一个新模式
DROP SCHEMA   --从数据库中删除一个模式
CREATE DOMAIN  --创建一个数据值域
ALTER DOMAIN  --改变域定义
DROP DOMAIN   --从数据库中删除一个域
数据控制 
GRANT   --授予用户访问权限
DENY   --拒绝用户访问 
REVOKE   --解除用户访问权限
事务控制
COMMIT   --结束当前事务
ROLLBACK   --中止当前事务 
SET TRANSACTION  --定义当前事务数据访问特征
程序化SQL 
DECLARE   --为查询设定游标 
EXPLAN   --为查询描述数据访问计划
OPEN   --检索查询结果打开一个游标
FETCH   --检索一行查询结果 
CLOSE   --关闭游标
PREPARE   --为动态执行准备SQL 语句 
EXECUTE   --动态地执行SQL 语句
DESCRIBE   --描述准备好的查询 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值