数据库基础
-
什么是死锁?如何减少死锁?
- 死锁:两个或者多个事务锁定了同一个资源,并且需要锁定对方占有的资源时发生死锁
- 减少死锁的方法有:
- 对于多个事务并发存区一个表中的数据,尽量按照约定的顺序进行存储
- 在同一个事务中,尽量一次性锁定所有需要的资源
- 对于很容易发生死锁的业务,可以升级锁的粒度,比如加上表级锁
-
说一下数据库中的并发控制
- 数据库中的并发控制,是保证在两个或者多个事务访问数据库时,保持事务的隔离性和数据和数据库的一致性、完整性。事务的并发控制机制主要有乐观并发控制(乐观锁)和悲观并发控制(悲观锁)
- 乐观锁:假设冲突不会发生,在事务提交的时候检查事务的完整性。乐观锁适用于多读少写的场景,可以实现高吞吐量,实现的机制通常使用版本控制机制和CAS算法
- 悲观锁:假设冲突一定会发生,屏蔽一切违背数据完整性的操作,当事务查询了数据之后,就会将数据锁定,直到事务提交。悲观锁在长事务场景下会比较低效。实现的机制是锁机制。
-
数据库语言有哪几种?
- 数据库语言有DDL(数据定义语言)DQL(数据查询语言)DML(数据操纵语言)DCL(数据控制语言)
- DDL是指对数据库逻辑结构进行定义的语言,比如CREATE, ALTER, DROP等,是用于修改或者增加表、视图、索引的语言
- DQL是数据库查询语言,主要的是SELECT等查询语言
- DML是数据操纵语言,只要是INSERT, DELETE,TRUNCATE,UPDATE的删除,修改语句
- DCL是数据控制语言,比如GRANT, REVOKE,COMMIT,ROLLBACK等实现数据库完整性和一致性的语言
-
什么是主键、超键、外键?
- 超键就是能够表示数据表元组的属性集,超键包含候选键和主键
- 候选键:就是最小的,没有冗余的超键
- 主键就是在数据表中对于数据对象予以唯一和并且完整标识的数据列或属性,每一个属性列只有一个主键,并且主键不能为空
- 外键:当前表包含一个外表的主键时,这个外表的主键就是当前表的外键,外键可以为空,可以重复,用于与其他表连接
-
说一说数据库的约束
- 约束是对数据表中的一列或者多列属性进行限制,从而保证数据库的完整性和一致性
- 主键约束(PRIMARY KEY):被限制的列属性必须确保唯一性,并且不能为空
- 外键约束(FOREIGN KEY):被限制的列属性必须被包含在外表的外键中
- 唯一约束(UNIQUE):被限制的列属性的值在表中时唯一的
- 非空约束(NOT NULL):被限制的列属性不能为空
- 检查约束(CHECK):被限制的列属性取值在某个范围中
-
char和varchar的区别
- char的长度时固定的,varchar的长度是可变的
- 使用char的读取速度大于varchar,使用varchar的空间使用率大于char
-
说一说sql中有哪些关联查询方式?
- 交叉连接(CROSS JOIN):可以使用逗号或者cross join关键字实现交叉连接,交叉连接的结果是表的笛卡尔积,返回的行数为表行数之积
- 内连接(INNER JOIN):等值连接,不等值连接和自连接三种(取决于on后面的连接条件)
- 外连接(OUTER JOIN):
- 左外连接(LEFT OUTER JOIN):以左表为基准,首先查询出左表中的所有数据,然后根据连接条件查询出匹配的右表数据,如果没有匹配,则填充null
- 右外连接(RIGHT OUTER JOIN): 以右表为基准
- 查询联合(UNION):将多个查询结果合并到一起,结果集和列数必须相等,重复的列数将被合并(UNION ALL不会合并重复的结果,因此速度比UNION更快)
- 全连接(FULL OUTER JOIN):可以通过左外连接和右外连接以及查询联合来实现
-
什么是子查询
- 子查询就是嵌套在其他sql语句中的SELECT查询,比如嵌套在SELECT,INSERT INTO ,UPDATE,DELETE语句中,子查询是多表查询的重要组成部分,通常和连接查询一同使用。
- 标量子查询返回的是一个标量(一个整数或者字符串等),列子查询返回的是表中的字段的查询,行子查询返回的是对表中的某一行数据的查询,表子查询返回的是整个数据表
-
DROP,DELETE.TRUNCATE之间的区别是什么?
- DROP是DDL数据定义语言,作用是删除整个表,不支持回滚
- DELETE是DML数据操纵语言,作用是删除表中的某一行数据,支持回滚
- TRUNCATE是DDL数据定义语言,作用是删除表中的所有数据,但是不删除表结构。不支持回滚
-
UNION和UNION ALL 之间的区别是什么?
- UNION是将多个查询语句的结果集合并,其中重复的结果将被删除,而UNION ALL 不会删除重复的数据,直接返回合并结果,因此速度更快
-
增加索引的方式
- ALTER TABLE table ADD PROMARY KEY(column_list)
- ALTER TABLE table ADD UNIQUE index_name(column_list)
- ALTER TABLE table ADD INDEX index_name(column_list)
- ALTER TABLE table DROP INDEX (column_list)
- SHOW INDEX FROM table