目录
什么数据库
存储数据,管理数据的仓库
数据库分为:
关系型数据库: Oracle、MySQL、SQLServer、Access 非关系型数据库:Redis、MongoDB、Solr、ElasticSearch、Hive、HBase
关系型和非关系型:
数据库建立在数据的紧密关系基础之上,称其为关系型数据库,也称为传统数据库 数据库建立在数据的松散关系基础之上,称其为非关系型数据库
MySQL数据库
mysql服务端,它来处理具体数据维护,保存磁盘 mysql客户端,CRUD新增,修改,删除,查询
什么是SQL语句:
SQL全称---Structured Query Language
-
结构化查询语言
-
是一种特殊目的的编程语言
-
是一种数据库查询和程序设计语言用于存取数据以及查询、更新和管理关系数据库系统
-
同时也是数据 库脚本文件的扩展名。
SQL语句的分类:
-
DML : 数据操纵语言,是指对数据进行CRUD
-
DDL: 数据定义语言,是指创建的SQL语法
-
DCL: 数据控制语言,是指权限的分配
-
DQL: 数据查询语言,是指对数据的各种查询语法
常用的操作:
-
对数据库的操作
-
对表的操作
-
对数据/记录的操作
数据类型:
命名规范:
-
字段名必须以字母开头,尽量不适用拼音
-
长度不能超过30个字符(不同数据库,不同版本会有不同)
-
不能使用SQL的保留字--->where、Order、group
-
只能使用如下字符az、AZ、0~9、$ 等
-
Oracle习惯全大写:USER_NAME,mysql习惯全小写:user_name
-
多个单词用下划线隔开,而非java语言的驼峰规则
分类:字符、数字、日期、图片
什么是字段约束:
约束是对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。
字段约束分为几类
主键约束:
如果为一个列添加了主键约束,那么这个列就是主键,主键的特点是唯一且不能为空。通常情况下,每张表都会有主键
-
primary key ------唯一、非空
-
auto_increment----自增
非空约束: not null
-
如果为一个列添加了非空约束,那么这个列的值就不能为空,但可以重复
唯一约束 :unique
-
如果为一个列添加了唯一约束,那么这个列的值就必须是唯一的(即不能重复),但可以为空
默认约束:default
检查约束:check
外键约束:
-
什么是外检约束:用于在两个表之间建立关系,需要指定引用主表的哪一列
-
设置外键约束
FOREIGN KEY (本表(子表)主键) REFERENCES 外表(主表)名(外表主键)
-
注意
-
子表主键不能自增
-
子表的主键值必须取自主表的主键值
-
想要删除主表数据,必须先删除子表中数据
-
基础函数有
-
全转小写:lower
-
全转大写:upper
-
获取长度:length
-
concat:拼接字符串
-
substr:截取字符串
-
replace:替换字符
-
ifnull:判断是否为空
-
round:四舍五入
-
ceil 向上取整
-
floor 向下取整
-
时间函数:
条件查询有
-
distinct:去重
-
where条件:
-
模糊查询:like
-
null操作空数据:
-
区间范围:between...and...是包含的关系
-
分页:limit
-
排序:order by
聚合函数:
-
max
-
mix
-
avg
-
sum
-
count
什么是分组
对于查询的结果进行分组,统计一组数据中的最大值与最小值
having:完成分组后过滤
什么是事务:
作为单个逻辑工作单位执行的一系列操作
事务的特性:ACID
ACID A--原子性 C---一致性 I---隔离性 D---持久性 原子性:事务的所有操作,要么都执行成功,要么都执行失败,不会结束在中间的某个环节。如果事务执行失败的话,事务 会回滚到事务执行之前的状态,就好像从未被执行过一样 一致性:事务执行之前和事务执行之后,不会破坏数据库的完整性。这表示写入的资料必须完成符合规则。其中包含了资料的精确度 、串联性以及数据库可以自发性的完成预定的工作 隔离性:数据库允许多个并发事务同时对数据有插入、修改的功能。隔离性可以防止多个并发事务时由于交叉执行而导致的数据不一致 持久性:事务处理完,对数据的修改是永久性的。系统故障也不会丢失
隔离级别
读未提交:安全性最差,可能发生并发数据问题性能最好 读提交:牺牲了效率,提高了安全性---Oracle数据的默认级别 可重复读:牺牲了效率,提高了安全性---MySQL数据的默认级别 串行化:安全性最高,但是效率太低
索引
什么是索引
索引是一种排好序的快速查找的数据结构,它可以帮助数据库高效的进行数据的检索。
索引的好处与坏处
好处是最大的作用就是提高查询效率
坏处是索引本身也是一张表不适合大量的添加
索引的(好坏处的具体)优缺点
-
索引的优点
-
索引是数据库优化
-
表的主键会默认自动创建索引
-
每个字段都可以被索引
-
大量降低数据库的IO磁盘读写成本,极大提高了检索速度
-
索引事先对数据进行了排序,大大提高了查询效率
-
-
索引的缺点
-
索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间
-
.索引表中的内容,在业务表中都有,数据是重复的,空间是“浪费的”
-
虽然索引大大提高了查询的速度,但对数据的增、删、改的操作需要更新索引表信息, 如果数据量非常巨大,更新效率就很慢,因为更新表时,MySQL不仅要保存数据,也要保存一下索引文件
-
随着业务的不断变化,之前建立的索引可能不能满足查询需求,需要消耗我们的时间去更新索引
-
观察SQL的性能,执行计划关键字
-
关键字:explain
-
找 possible_keys的值
为什么索引快
-
因为:索引表可以类似二分查找,非常有效的提高了查询的速度。
-
过程:先到事先排序好的索引表中检索查询,找到其主键后,就直接定位到记录所在位置,然后直接返回这条数据。
什么是表关联
-
表关联则代表了表之间的关系
表关系的分类
-
一对一 one to one QQ和QQ邮箱,员工和员工编号
-
一对多 one to many 最常见,部门和员工,用户和订单
-
多对一 many to one 一对多反过来,员工和部门,订单和用户
-
多对多 many to many 老师和学生,老师和课程
多表联查有几种
-
笛卡尔积
-
连接查询
-
子查询
什么是子查询
把上次的查询结果,用来作为下次查询的条件
什么是视图
可视化的表,视图当做是一个特殊的表。是指把sql执行的结果,直接缓存到了视图中,下次还要发起相同sql,直接查看视图
SQL优化
-
查询SQL尽量不要使用select *,而是具体字段
-
避免在where子句中使用or来连接条件
-
使用varchar代替char
-
尽量使用数值替代字符串类型
-
查询尽量避免返回大量数据
-
使用explain分析你SQL执行计划
-
是否使用了索引及其扫描类型
-
创建name字段的索引
-
优化like语句
-
字符串怪现象
-
索引不宜太多,一般5个以内
-
索引不适合建在有大量重复数据的字段上
-
where限定查询的数据
-
避免在where中对字段进行表达式操作
-
避免在where子句中使用!=或<>操作符
-
去重distinct过滤字段要少
-
where中使用默认值代替null
-
批量插入性能提升
-
批量删除优化
-
伪删除设计
-
提高group by语句的效率
-
复合索引最左特性
-
排序字段创建索引
-
删除冗余和重复的索引
-
不要有超过5个以上的表连接
-
inner join 、left join、right join,优先使用inner join
-
in子查询的优化
-
尽量使用union all替代union
-
where限定查询的数据
-
避免在where中对字段进行表达式操作
-
避免在where子句中使用!=或<>操作符
-
去重distinct过滤字段要少
-
where中使用默认值代替null
-
批量插入性能提升
-
批量删除优化
-
伪删除设计
-
提高group by语句的效率
-
复合索引最左特性
-
排序字段创建索引
-
删除冗余和重复的索引
-
不要有超过5个以上的表连接
-
inner join 、left join、right join,优先使用inner join
-
in子查询的优化
-
尽量使用union all替代unio