测试面试数据库面试题

3.1概念
1. 主键: 主关键字primary key
针对一个表来说的,主键修饰的列:唯一,不能重复,不能为空;一个表中只能只有一个主键

2. 外键:
针对两个表来说,加强表与表之间联系

3. 关系模型的规范化: 关系模式要满足的条件称为规范化形式,范式(NF)

目的:消除储存异常,减少数据冗余,保证数据完整性和存储效率
如果关系 R 的所有属性均为简单属性,每个属性是不可再分的(无重复的列),则 R 满足第一范式
第二范式(2NF):关系 R 满足第一范式,每一个非主键关键字段完全依赖于主键,则称 R 满足第二范式
第三范式(3NF):关系 R 满足第二范式,且非关键字段之间不存在依赖关系,则称满足第三范式。(从表只能引用主表中一个列)
总结:一个基本的关系型数据库,需要满足第一范式;一个完整的关系型数据库要满足第三范式
4. 唯一约束

特征:
不允许出现重复的值,但是可以为多个 null
同一个表中可以有多个唯一约束
如果不给唯一约束名称,就默认和列名相同
5. 非空约束

格式: 列名 数据类型 not null
一个表里面也可以有多个非空约束
6. 默认约束 default 一个表中可以有多个默认约束

7. 外键约束

表的外键值必须在主表中能找到
当主表记录被从表参照时,主表的记录将不允许删除
如果要删除数据,需要先删除表中依赖该记录的数据(删从表记录)
主表:被引用的表(被参照的表) zhu
从表:应用的表 外键约束建立在表里面 cong
被引用的列,要么主键约束,要么唯一约束
注意:在引用过程中,主表和从表的来个两个列的数据必须保持一致。(内容也要保持一致)
8. 检查约束
描述:限制某个列的取值范围 年龄 18-25 性别:要么男或女

9. 主键、外键作用,索引的优点与不足

主键
表中的唯一标示键
作用:保证实体的完整性,加快数据库的操作速度。
外键:主键的从属,表示两个表之间的联系
作用:作用外键可以建立数据之间的关联,避免冗余
索引:
优点
通过创建唯一性的索引,保证表中数据唯一性
加速数据的检索速度
加快表与表之间的连接
使用优化隐藏器,提供系统性能
缺点:
创建索引需要时间,
索引需要占用物理空间
当对表中数据进行修改时,索引也要动态维护,减低数据的维护速度。
3.2表结构操作
1. 表的创建语法

   create table 表名(
   属性名1 数据类型 [约束条件],
   属性名2 数据类型 [约束条件],
   属性名3 数据类型 [约束条件]
   );

2. 删除表
drop table 表名;

3. 删除多个表
drop table 表名 1,表名 2 ...

1.修改表结构
1. 添加列(属性)
alter table 表名 add 属性名 数据类型;

2. 删除表(属性)
alter table 表名 drop 属性名;

3. 修改属性:数据类型
alter table 表名 modify 属性名 数据类型;

4. 修改字段名
alter table 表名 change 旧字段名 新字段名 数据类型;

3.3数据库增删改查
create alter drop desc主要针对表结构来说的
insert delete update select 主要针对表中的数据来进行操作的
3.1.1 DML-INSERT
insert 插入 值和列一一对应关系

格式 1:
insert into 表名(列名 1,列名 2 ...) values(值 1,值 2 ...);
格式 2:
insert into 表名 values(值 1,值 2 ...);
格式 3:
insert into 表名 values(值 1,值 2,值 3 ...),(值 1,值 2,值 3 ...);
3.1.2. 删除 delete
格式 1:代表清空表内的数据
delete from 表名;
格式 2:
有条件的进行删除:delete from 表名 where 条件;
3.3.3 DML–UPDATE 更新
格式 1
update table_name set 字段=值;
格式 2
update table_name set 字段=值,字段=值;
格式 3
update table_name set 字段=值,字段=值 where 条件;
3.3.4. select 查询
1.基本格式:

select 列名 from 表名;
select 列名 1,列名 2,列名 3 ... form 表名;
1. 使用关键字 distinct 查询

在查询返回结果中删除重复行
语法:select distinct 列名称 from 表名称;
只针对一个列去重
2. 使用别名查询

根据需要对数据显示的标题进行修改
格式:select 列名1 '别名',列名2 '别名',... from 表名;
AS 关键字连接列表达式和指定的别名
select 列名 as '别名' from 表名;
3. 条件查询

格式:select 列名 from 表名 where 条件;
如果在查询过程中,有多个条件,可以使用 and 或 or 进行连接
and 连接 —》同时满足; or 连接 ------只满足其一
4. 范围搜索范围

在范围之内
select 列名 from where 列名 between 开始值 and 结束值
不在范围之内
select 列名 from 表名 where 列名 not between 开始值 and 结束值;
5. 列表搜索条件

in: 只要匹配到括号里任意一个值就会有查询结果;
格式:select 列名 from 表名 where 列名 in (值 1,值 2,值 3 ...)
not in:
格式: select 列名 from 表名 where 列名 not in(值 1,值 2,值 3);
3.4 数据库表连接查询:子查询、内连接、外连接
1. 多表查询

去重
显式
     select [distinct] A.列名,B.列名,C.列名,... from C 
     join A on A.key=C.FKeyA 
     join B on B.key=C.FKeyA and B.key=A.key
     [GROUP BY 字段名]

隐式
    select [distinct] A.列名,B.列名,C.列名,... from 表A,
    表B,
    表C
     where 表A.字段1 = 表B.字段1 and
     表B.字段2 = 表C.字段2 and ....
     [GROUP BY 表名.字段名]

排序
select  A.列名,B.列名,C.列名,... from C 
 join A on A.key=C.FKeyA 
 join B on B.key=C.FKeyA and B.key=A.key
[ORDER BY 表名.字段名]

2. 子查询

子查询只返回一个值
子查询首选使用in做匹配
子查询在其他查询结果的基础上提供了一种有效的方式来表示where字句的条件 。
子查询的selec查询总是使用圆括号括起来。
对于子查询来说,外查询条件要什么,子查询就查什么。 一一对应的关系。
子查询结果分类:
标量子查询(子查询结果为单个值):
子查询返回的结果是单个值〔数字、字符串、日期等)
常用操作符:= <> > >= <= <
列子查询(子查询结果为一列):子查询返回的结果是一列
常用操作符:in、not in、any、some、all
    select 列表名 from 表名 where 字段名 > all (子查询语句);
    select 列表名 from 表名 where 字段名 > any (子查询语句);

行子查询(子查询结果为一行):
常用操作符:=、<>、 in、not in
select 字段名,... from 表名A where (字段名1,字段名2,...) = (select 字段名1值,字段名2值,... from 表名B where 条件)
表子查询(子查询结果为多行多列):in
select 字段名,... from 表名A where (字段名1,字段名2,...) in (select 字段名1值,字段名2值,... from 表名B where 条件)
3. 内连接:只有匹配到的情况下才会返回结果值

格式一(隐式):
from * form 表名1,表名2where 表名1.列=表名2.列; //列为相同的列
格式二(显式):
select * from 表名1 inner join 表名2  on  表名1.列=表名2.列

4. 外连接

外部连接会返回from字句中提到的至少一个表或视图中的所有行
左连接:显示左边所有行。如果左表的某行在右表中没有找到匹配的行,则结果集中的右表相对应位置为null。
Select * from 表名1 left join 表名2on 表名1.列=表名2.列;

//列为大家共有的列
右连接:显示右边所有行
right outer join
select 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2
from 表名1 right outer join 表名2
on 表名1.列=表名2.列; 
区分是左连接还是右连接:左连接以左表为参考,左表没有则返回null,右连接以右表为参考,右表没有则返回null
5.联合查询

把多次查询的结果合并起来,形成一个新的查询结果集
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
union 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。
select 字段名 from 表A   UNION  select 字段名 from 表B ;
3.4数据库视图、索引、事务


3.4.1 事务处理
事务:一组操作的集合,由一系列语句构成的逻辑工作单元。是一个不可分割的工作单元,事务把所有操作作为一个整体一起向系统提交或撤销操作请求,这些请求要么同时成功,要么同时失败

1. 事务的四个属性

原子性:对数据库所做操作要么全部执行,要么全部取消
一致性:事务完成时候,必须使所有数据保持一致状态
隔离性:事务所作的修改必须和其他事务所作修改隔离
持久性:事务提交后,对数据库所做操作永久保存


2. 事务操作

查看事务提交方式:SELECT @@autocommit ;
设置事务提交方式:SET @@autocommit = 0 ;
开启事务:START TRANSACTION或BEGIN
提交事务: commit:
撤销语句:rollback:


3. 并发事务引发的问题

脏读:一个事务可以读到另一个事务未提交的数据
不可重复读:一个事务先后读取同一条记录,但读取的数据不一样
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据
已经存在,好像出现了 “幻影”


3.4.2 索引
1. 定义: 索引(index)是帮助MySQL高效获取数据的数据结构(有序)

2. 创建索引主要作用

加快数据索引
保证数据唯一性
表与表之间参照完整性
在使用group by、order by子句进行查询时,利用索引可以减少排序和分组时间。
3. 索引不足之处

建立索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引。
更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性。
4. 索引是否必须:

创建索引需要占用数据空间并花费一定时间
遍历索引会减慢数据修改速度
5. 索引结构分类

B+Tree索引:
相对于B-tree的区别:

  1. 所有数据都出现在叶子节点上;
  2. 叶子节点形成一个单向链表
    在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能
    Hash索引:
    采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中
    高性能,底层数据结构是用哈希表实现的, 只有精确匹配索引列的查询才有效, 不支持范围查询,只支持memory引擎
    如果两个(或多个)键值,映射到一个相同的槽位上,就产生了hash冲突(也称为hash碰撞),可以通过链表来解决
    特点:
    只能用于对等比较(==,in),不支持范围查询(between,>,<,…)
    无法利用索引完成排序操作
    查询效率高,通常只需要检索一次就可以了,效率通常高于B+tree
    R-tree索引(空间索引):主要用于地理空间数据类型,只支持MyISAM引擎
    Full-text(全文索引):是一种通过建立倒排索引,快速匹配文档的方式
    6.索引分类

主键索引:对于表中主键创建的索引,默认自动创建,有且只有一个
唯一索引:避免同一个表中某数据列中的值重复,可以有多个
常规索引:快速定位特定数据,可以有多个
全文索引:查找文本中的关键字,可以有多个


6. 选择创建索引的数据列

连接中频繁使用的列
定义有主键和外键的列
在指定范围中快速或频繁查询的列
需要按排序顺序快速或频繁检索的列
7.聚合索引和辅助索引的区别?

聚合索引:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据,必须有且只有一个
辅助索引:将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键(id),可以存多个
8. 创建索引

create [UNIQUE|FULLTEXT] index 索引的名字 on 表名(列名);
创建唯一索引:
create unique index 索引名字 on 表名(列名);
9. 删除索引

drop index index_name on table_name;
drop index 索引名字 on 表名;
10.sql索引优化

查看sql执行频次:show global STATUS like 'Com_______';
慢查询日志
show variables like ‘slow_query_log’; # 查询是否打开了慢查询开关
# find / -name -type f 'my.cnf'
vi /etc/mysql/my.cnf
# 开启慢查询日志查询开关
slow_qurey_log=1
# 设置慢日志时间
long_query_time=1

systemctl restart mysql; # 重启mysql
cd /var/lib/mysql
tail -f xxxslow.log

查看 sql耗时
select @@have_profiling;               # 是否支持profile操作
select @@profiling # profiling          # 开关是否已开启
set profiling=1;                       # 开启profiling
show profiles;                          # 查看执行耗时
show profile for query query_id;       # 查着指定query_id的SQL语句各个阶段的耗时情况
show profile cpu for query query_id;  # 查看指定query_id的SQL语句CPU的使用情况
3.4.3 视图
1.视图定义:基于某个查询结果的虚表,是从一个或多个表或视图导出的表,视图数据的修改也会影响原表的数据 insert update delete
2.视图优点

简化操作:使用数据库视图向最终用户和外部应用程序隐藏底层表的复杂性。通过数据库视图,只需要使用简单的 SQL 语句,不需要编写具有许多连接的复杂语句
安全性:
将基表中重要的字段信息/敏感数据,可以不通过视图给用户
允许创建只读视图以向特定用户公开只读数据,用户只能在只读视图中检索数据,但不能对其进行更新
独立性:视图可以使应用程序和数据库表在一定程度上独立
3.视图缺点

性能差:从数据库视图查询数据速度变慢,特别是如果视图是基于其他视图创建的
修改限制:
当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于比较复杂的试图,可能是不可修改的
每当更改与视图关联的基本表的结构时,也必须更改视图
4.视图语句

创建视图
create view 视图名字 as select 语句;

修改视图
alter view 视图名

在视图中插入一行数据
insert into 视图名字 vulues(值1,值2...);

修改视图数据
update 视图名字 set 列=值 where 条件;

删除视图中数据
delete from 视图名字 where 条件;

删除视图
drop view 视图名字;

删除多个视图"
drop view 视图名1,视图名2,视图名3;

3.4.4 存储过程
1.存储过程定义
事先经过编译并存储在数据库中的一段sql语句的集合。减少数据在数据库和应用服务器之间的传输,提高数据处理的效率

2.存储过程特点

封装、复用
可以接收参数,也可以返回参数
减少网络交互,效率提升
3.存储过程基本语法

创建存储过程:
create PROCEDURE 存储过程名称([参数列表])
BEGIN
        sql语句
END;
调用
call 存储过程名称([参数]);

查看存储过程
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = '数据库名称'; -- 查询指定数据库的存储过程及状态信息 
SHOW CREATE PROCEDURE 存储过程名称 ; -- 查询某个存储过程的定义

删除
DROP PROCEDURE [ IF EXISTS ] 存储过程名称 ;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值