数据库常见的面试题

1.数据库三范式是什么?

      第一范式:表中每个字段都不能再分。

      第二范式:满足第一范式并且表中的非主键字段都依赖于主键字段。

      第三范式:满足第二范式并且表中的非主键字段必须不传递依赖于主键字段。

2.什么是数据库事务?

     事务具有四大特性:一致性、原子性、隔离性、持久性。

     数据库事务是指:几个SQL语句,要么全部执行成功,要么全部执行失败。比如银行转账就是事务的典型场景。

     数据库事务的三个常用命令:Begin Transaction、Commit Transaction、RollBack Transaction。

3.什么是视图?

     视图实际上是在数据库中通过Select查询语句从多张表中提取的多个表字段所组成的虚拟表。

  视图并不占据物理空间,所以通过视图查询出的记录并非保存在视图中,而是保存在原表中。

  通过视图可以对指定用户隐藏相应的表字段,起到保护数据的作用。

  在满足一定条件时,可以通过视图对原表中的记录进行增删改操作。

  创建视图时,只能使用单条select查询语句。

4.什么是索引?

   索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

  索引分为:聚集索引、非聚集索引、唯一索引等。

  一张表可以有多个唯一索引和非聚集索引,但最多只能有一个聚集索引。

  索引可以包含多列。

  合理的创建索引能够提升查询语句的执行效率,但降低了新增、删除操作的速度,同时也会消耗一定的数据库物理空间。

5.什么是存储过程?

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

6.什么是触发器?

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

7.写出一条Sql语句:取出表A中第31到第40记录 (MS-SQLServer)

    解1:select top 10 * from A where id not in (select top 30 id from A) 

        2:select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A) 

     解3:select * from (select *, Row_Number() OVER (ORDER BY id asc) rowid FROM A) as A where rowid between 31 and 40

8.写出一条Sql语句:取出表A中第31到第40记录 (Mysql)

     select * from A limit 30, 10

9.写出一条Sql语句:取出表A中第31到第40记录 (Oracle)

     select * 

      from (select A.*,

     row_number() over (order by id asc) rank 

    FROM A)   

    where rank >=31 AND rank<=40;

10.在关系型数据库中如何描述多对多的关系?

    在关系型数据库中描述多对多的关系,需要建立第三张数据表。比如学生选课,需要在学生信息表和课程信息表的基础上,再建立选课信息表,该表中存放学生Id和课程Id。

11.什么是数据库约束,常见的约束有哪几种?

      数据库约束用于保证数据库表数据的完整性(正确性和一致性)。可以通过定义约束\索引\触发器来保证数据的完整性。

总体来讲,约束可以分为:

主键约束:primary key;

外键约束:foreign key;

唯一约束:unique;

检查约束:check;

空值约束:not null;

默认值约束:default;

12.列举几种常用的聚合函数?

Sum:求和\Avg:求平均数\Max:求最大值\Min:求最小值\Count:求记录数

13.什么是内联接、左外联接、右外联接?

内联接(Inner Join):匹配2张表中相关联的记录。

左外联接(Left Outer Join):除了匹配2张表中相关联的记录外,还会匹配左表中剩余的记录,右表中未匹配到的字段用NULL表示。

右外联接(Right Outer Join):除了匹配2张表中相关联的记录外,还会匹配右表中剩余的记录,左表中未匹配到的字段用NULL表示。

在判定左表和右表时,要根据表名出现在Outer Join的左右位置关系。

14.如何在删除主表记录时,一并删除从表相关联的记录?

如果两张表存在主外键关系,那么在删除主键表的记录时,如果从表有相关联的记录,那么将导致删除失败。

在定义外键约束时,可以同时指定3种删除策略:一是将从表记录一并删除(级联删除);二是将从表记录外键字段设置为NULL;三是将从表记录外键字段设置为默认值。

级联删除示例:

 

       alter table 从表名

       add constraint 外键名

      foreign key(字段名) references 主表名(字段名)

      on delete cascade

15.什么是游标?

游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录进行处理的机制。

游标的使用步骤:

1.定义游标:declare cursor 游标名称 for  select查询语句 [for {readonly|update}]

2.打开游标:open cursor

3.从游标中操作数据:fetch... ...   current of cursor

4.关闭游标:close cursor

 

 

 

 

 

 

 

 

 

 

 

### 数据库常见面试题 #### SQL 数据模型 SQL 是一种用于管理和操作关系型数据库的语言。以下是常见的 SQL 面试题: - **SQL 语言分类**:SQL 可以分为 DDL(数据定义语言)、DML(数据操作语言)、DCL(数据控制语言)和 TCL(事务控制语言)。[^1] - **主键与外键的区别**:主键用于唯一标识表中的每一行记录,而外键用于建立和加强两个表数据之间的链接。[^1] - **CHAR 与 VARCHAR 的区别**:CHAR 是固定长度的字符类型,而 VARCHAR 是可变长度的字符类型。 #### 索引 索引是提高数据库查询性能的重要手段。以下是关于索引的常见问题: - **什么是索引**:索引是一种特殊的数据结构,用于快速定位表中的数据。 - **索引的优缺点**:优点包括提高查询速度和减少磁盘 I/O;缺点包括增加存储空间需求和降低插入、删除、更新操作的效率。[^1] - **添加索引的原则**:对于经常出现在查询条件中的字段,应考虑添加索引;但对于数据量较小的表,添加索引可能会适得其反。[^3] - **索引的类型**:包括 B+树索引、哈希索引等。MySQL InnoDB 默认使用 B+树作为索引结构,因为 B+树在范围查询和排序方面表现更优。[^4] - **聚簇索引与非聚簇索引**:聚簇索引将数据存储在叶子节点中,而非聚簇索引仅存储指向数据的指针。一个表只能有一个聚簇索引,但可以有多个非聚簇索引。[^4] - **索引失效的情况**:当查询条件中包含 `OR` 操作符时,即使部分条件带有索引也可能不被使用;如果 `LIKE` 查询以 `%` 开头,则索引也会失效。[^5] #### 事务 事务是数据库中一组逻辑操作单元,确保所有操作要么全部完成,要么全部不完成。以下是事务相关的常见问题: - **什么是事务**:事务是一组 SQL 语句,作为一个整体执行。[^1] - **事务的特性(ACID)**:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。[^1] - **事务的隔离级别**:包括读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。[^1] - **事务并发导致的问题**:如脏读、不可重复读和幻读。 #### 数据库锁 锁机制用于管理对共享资源的并发访问。以下是锁相关的常见问题: - **锁的级别**:包括行级锁、表级锁等。[^1] - **悲观锁与乐观锁**:悲观锁假设冲突不可避免,因此在访问资源时加锁;乐观锁则假设冲突较少发生,通常通过版本号或时间戳来实现。[^1] #### 其他 - **DROP、TRUNCATE、DELETE 的区别**:`DROP` 删除整个表结构,`TRUNCATE` 快速清空表数据但保留表结构,`DELETE` 逐行删除数据并支持条件过滤。 - **SUM、COUNT(*)、COUNT(1)、COUNT(column) 的区别**:`COUNT(*)` 和 `COUNT(1)` 统计所有行数,`COUNT(column)` 统计指定列非空的行数,`SUM` 计算数值列的总和。[^1] ```sql -- 示例:创建聚簇索引 CREATE TABLE example ( id INT PRIMARY KEY, name VARCHAR(100) ); -- 示例:创建非聚簇索引 CREATE INDEX idx_name ON example(name); -- 示例:使用全文索引 ALTER TABLE dynamic_201606 ADD FULLTEXT INDEX idx_user_name (user_name); SELECT id, fnum, fdst FROM dynamic_201606 WHERE MATCH(user_name) AGAINST('zhangsan' IN BOOLEAN MODE); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值