描述主键、外键、超键是什么
- 超键(super key): 在关系中能唯一标识元组的属性集
- 候选键(candidate key): 不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不
是键了!
- 主键(primary key): 用户选作元组标识的一个候选程序主键
- 外键(foreign key):如果关系模式R中属性K是其它模式的主键,那么k在模式R中称为外键。
数据库设计的三大范式
1. 第一范式(确保每列保持原子性)
2. 第二范式(确保表中的每列都和主键相关)
3. 第三范式(确保每列都和主键列直接相关,而不是间接相关)
drop,delete与truncate的区别
1. delete和truncate都是只能删除表的内容而不能删除表的结构,而drop则是删除表的结构和内容(表将
不复存在);
2. delete可以删除整个表的数据也可以有选择性地删除某一条或多条数据,而truncate则是一次性删除整
个表的数据;
3. 使用delete删除的表数据并没有真正被删掉,数据占用的表空间还存在,日后有需要还可以恢复;
4. 使用truncate删除的表数据会连同其占用的表空间一起直接被删掉,无法恢复
SQL UNION 和 UNION ALL 区别
union: 对两个结果集进行并集操作, 不包括重复行,相当于distinct,会对获取的结果进行排序操作
union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示。
union all只是合并查询结果,并不会进行去重和排序操作,在没有去重的前提下,使用union all的执行效率要比union高
exists、in、any、all区别
- exists是表示子查询是否返回结果,而不管返回的具体内容
- in表示值是否存在子查询结果集中
- any是表示子查询结果中任意一个
- all表示子查询结果中的所有
sql语句的执行顺序
1. from 子句组装来自不同数据源的数据
2. where 子句基于指定的条件对记录行进行筛选
3. group by 子句将数据划分为多个分组
4. 使用聚集函数进行计算
5. 使用 having 子句筛选分组
6. 计算所有的表达式
7. select 的字段筛选
8. 使用 order by 对结果集进行排序。
count(*)和count(1)和count(id)区别
count(字段名称)
扫描全表,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加 。
count(1)
扫描全表,但不取值,收到的每一行都是1,判断不可能是null,按值累加。
count(*)
MySQL 执行count(*)在优化器做了专门优化。因为count(*)返回的行一定不是空。扫描全表,但是不取值,按行累加。
性能方面:
count(可空字段) < count(非空字段) = count(主键 id) < count(1) ≈ count(*)
SQL语句优化
1. 尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描
2. order by 条件要与where中条件一致,否则order by不会利用索引进行排序
3. 对where条件后的查询条件尽量添加索引
4. 多表关联查询时,小表在前,大表在后。
5. 避免在索引列上使用内置函数
6. 对于复杂的查询,可以使用中间临时表 暂存数据;
7.避免在where子句中使用 or 来连接条件
8.尽量使用数值替代字符串类型(例如性别(sex):0代表女,1代表男;【因为引擎在处理查询和连接时会逐个比较字符串中每一个字符;而对于数字型而言只需要比较一次就够了;字符会降低查询和连接的性能,并会增加存储开销】)
9.避免在where子句中使用!=或<>操作符
SQL常用函数有哪些?
- 数学函数
- 字符串函数
- 日期和时间函数
- 条件判断函数
- 系统信息函数
- 加密函数
- 格式化函数等
左连接 右连接 内连接的区别
三种连接如果结果相同,优先使用inner join,如果使用left join左边表尽量小
inner join 内连接,只保留两张表中完全匹配的结果集;
left join会返回左表所有的行,即使在右表中没有匹配的记录;
right join会返回右表所有的行,即使在左表中没有匹配的记录;
Mysql三种常见引擎的区别
MySQL常见的三种存储引擎为InnoDB、MyISAM和MEMORY。其区别体现在事务安全、存储限制、空间使用、
内存使用、插入数据的速度和对外键的支持。
1. 事务安全:InnoDB支持事务安全,MyISAM和MEMORY两个不支持。
2. 存储限制:InnoDB有64TB的存储限制,MyISAM和MEMORY要是具体情况而定。
3. 空间使用:InnoDB对空间使用程度较高,MyISAM和MEMORY对空间使用程度较低。
4. 内存使用:InnoDB和MEMORY对内存使用程度较高,MyISAM对内存使用程度较低。
5. 插入数据的速度:InnoDB插入数据的速度较低,MyISAM和MEMORY插入数据的速度较高。
6. 对外键的支持:InnoDB对外键支持情况较好,MyISAM和MEMORY两个不支持外键。