关系型数据库与非关系型数据库都有哪些?有什么区别?
SQL - 主要代表:SQL Server,Oracle,MySQL(开源),PostgreSQL(开源)。
NoSQL - 主要代表:MongoDB,Redis,CouchDB,HBase。
区别:
- NoSQL没有主键外键的概念
- SQL存在二维表中;而NoSQL则更加灵活,存储方式可以是JSON文档、哈希表或者其他方式。
- NoSQL不支持事务,不支持锁
- ...(很多)
InnoDB 和 MyISAM 的比较?
-
前者适合写操作和更新操作,后者适合读操作。
MyISAM读快的原因:索引在内存中;而InnoDB在磁盘上需要I/O
InnoDB写快的原因:默认是行锁,粒度小;而MyISAM默认是表锁,更新一条数据会锁住整个表,拉低并发效率
-
关于count()函数,InnoDB需要逐行扫描计数;MyISAM 自身记录了这个属性,可以直接返回
什么是视图
它充当的是虚拟表的角色。可以理解为存储的查询语句,当下一步要调用的时候,就会产生结果集。
范式
对象拆分的好,基本上就满足三大范式了。简单来说,三大范式如下,
- 第一范式,字段不可拆分,原子性。
- 第二范式,字段都应该与主键有关联。
- 第三范式,表中不应该包含多余属性。
MySQL 问题排查都有哪些手段?
- 使用
show processlist;命令查看当前所有连接信息; - 在sql语句前加
explain,查询 SQL 语句执行计划; - 开启慢查询日志,查看慢查询的 SQL。
MySQL 数据库 CPU 飙升到 500% 的话他怎么处理?
先用 show processlist 命令查看正在运行的线程,分析 state 字段,如果一个线程在给定状态中停留了许多秒,那么可能存在问题。定位到线程后用kill命令杀死,在后台调整,比如加索引,优化sql语句等。
varchar和char的使用场景
- char字符固定长度
- varchar长度可变,但是不能超过设置的长度
一般设置登录名可以使用varchar,而
加密后的密码一般设置为char,因为加密算法的结果是固定长度的。
内连接与外连接
在where中用 join 将两个表连接。
内连接分为等值连接和自然连接:
- 等值连接:取两者笛卡尔积中属性值相等的元组
- 自然连接是一种特殊的等值连接。它要求去除重复列。
外连接分为左连接、右连接和全连接:
- 左连接:查询A表中所有数据以及B表中符合联结条件的数据
- 右连接:查询B表中所有数据以及A表中符合联结条件的数据
- 全连接:返回左右表的所有行。哪个表中没有的就用null填充。(MySQL不支持全外连接,所以只能采取关键字UNION来联合左、右连接)
如果没有用where做连接,返回的结果就是笛卡儿积,检索出的数量就是两表行数的成绩,其中有很多记录都是不存在的。
UNION 与 UNION ALL 的区别
- UNION ALL:把来自多个 SELECT 语句的结果组合到一个结果集合中
- UNION :在前者的基础上去重
count和sum的区别,以及count(*)和count(列名)的区别
Count和sum区别:求和用累加sum();求行的个数用累计count
Count(*)包括了所有的列,在统计结果的时候不会忽略列值为null的行
Count(列名)只包括列名那一项,会忽略值为null的行
什么是候选键、主键、外键
-
候选键:能唯一标识一条数据的属性或属性集合(列或多个列),称为候选键。 表中可以有多个候选键。
-
主键:从候选键中选择出主键。每张表最多只能有一个主键,主键的取值不能为空值,也不能重复。数据库可以没有主键,但MySQL这个数据库
要求要有主键。 -
外键:一个表中存在的另一个表的主键,就是此表的外键,外键的取值可以为空值,也可以重复。
关系模型中的三类约束
- 实体完整性:要求主键唯一且不能为空。
- 参照完整性:要求外键的取值或者为空,或者等于参照表中某个主键的值。并给外键设置四个动作约束条件,即restrict等四个。
- 用户定义完整性:给属性列设置约束条件:
not null非空约束、unique约束、check约束(MySQL不支持,可设置但无效果)等
MySQL外键更新与删除不同设置的区别
-
restrict(默认):当父表更新删除某记录时,子表检查是否有相关记录,如果有,则不允许父表操作
-
no action:与restrict相同
-
cascade:级联,当父表更新删除某记录时,子表会自动更新删除相关记录
-
set null:当父表更新删除某记录时时,子表会把相关字段设为null (所以设计子表时该字段要允许为null)
请你写一些基本的SQL语句
- 选择:select * from table1 where 范围
- 插入:insert into table1(field1,field2) values(value1,value2),(value1,value2)
- 删除:delete from table1 where 范围
- 更新:update table1 set field1=value1 where 范围
- 查找:select * from table1 where field1 like '%value1%'
- 排序:select * from table1 order by field1,field2 [desc]
- 总数:select count as totalcount from table1
- 求和:select sum(field1) as sumvalue from table1
- 平均:select avg(field1) as avgvalue from table1
- 最大:select max(field1) as maxvalue from table1
- 最小:select min(field1) as minvalue from table1
判断相等:【A = B】
判断不相等:【A != B】
判断奇偶数,可以用:【A%2】 ,不能用【A mod 2】