模式
模式(schema):
模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
外模式(external schema):
外模式也称子模式(subschema)或用户模式,它是数据库用固话(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
内模式(internal schema):
内模式也称存储模式(storage schema),一个数据库只有一个内模式。它是数据物理存储和存储方式的描述,是数据在数据库内部的组织方式。
三种数据不一致性
丢失修改(lost update)
两个事务T1和T2读入同一数据并修改,T2提交结果破坏了T1提交的结果,到这T1的修改被丢失。
不可重复读(Non-Repeatable Read)
不可重复读是指事务T1读取数据后,事务T2执行封信操作,使T1无法再现前一次读取的结果
读“脏”数据(dirty read)
读“脏”数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1已修改的数据恢复原职,t2读到的数据就与数据库中的数据不一致,则T2读到的数据就是“脏”数据,即不正确的数据
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
视频地址: https://www.bilibili.com/video/av57575364?p=51
1.sql语句分类:
(1)dql:数据查询语言,select语句
(2)dml:数据操作语言:insert,update,delete:对数据操作
(2)ddl:数据定义语言:create,drop,alter:对数据结构操作
(4)tcl:数据定义与研:commit 提交事务.rollback:回滚事务
(5)dcl:数据控制语言:greant授权,revoke撤销权限
2.source sql脚本绝对路径->完成sql脚本的初始化
3.查看表结构:desc 表名;
4.常用命令
(1)select databsse()->查看当前使用的数据库
(2)select version()->查看mysql版本号
(3)\c->结束一条语句
(4)exit->突出mysql
(5)show create table 表名->查看创建表的语句
5.标准sql语句要求字符串使用单引号括起来
6.between..and..左小右大,适用于数字(左右都闭)和字符(左闭右开)
7.排序asc升序,desc降序
select * from 表名 order by col1,col2 desc;-->查询表中信息先以col1升序排,col1有相同情况再以col2的降序排列
8.分组函数->多行处理函数,对“某一组”数据进行处理
(1)分组函数自动忽略Null:a(任意值)+null=null->ifnull(可能为null的数据,当做什么处理)=if(num,0)->如果num是null当做0处理
(2)分组函数不可以直接使用在where语句中
(3)count(*)和count(col)区别->第一个统计的是记录数,第二个统计的是col不为null的数据
9.goup by/having
(1)group by:按照某个字段或某些字段进行排序->分组函数联合使用(在group by执行完成之后执行,没有group by ,整张表格自成一组)
!当一条语句后面后group by则select后面只能是参加分组的字段或是分组函数
(2)having:对分组之后的数据进行再次过滤
select max(col) from 表名 group by 排序字段;
10.select(5) ..from(1) ... where(2) ... group by(3)...having(4)...order by(6)...
11. 去除重复记录:select distinct col from table;
(1) distinct要出现在所有字段最前面
(2) disticnt对后面所有字段联合起来去重
12.连接查询
(1)分类:内连接(等值连接,非等值连接,自连接,两张表没有主副之分,凡是能够匹配上的记录都查询出来,匹配不上都不显示),外连接(左外连接(左表是主表),右外连接(右表是主表),两张表有主副之分,主要查询主表数据,副表中的数据没有和主表匹配上,副表生成null和主表匹配显示,主表数据无论是否匹配上都显示),全连接
(2)避免笛卡尔积现象。不能提高匹配效率,只是显示有效记录,匹配次数不变
(3)内连接:...表1 inner(可省略) join 表2 on 连接条件(表1.col = 表2.col) where ...
自连接:将一张表看做是两张表
(4)select b.* from 表1 a right join 表2 b on a.col=b.col where a.col2 is null->查询a表中没有b表中内容的记录
13.三表连接 ...A join B join C....
14.union:联合,将多个相关或不相关的查询结果加在一起,查询结果的列数相同
15.limit startIndex(起始位置,0表示第一条数据,0可忽略),length(取几个)---->sql语句最后执行
16.通用标准分页sql->每页显示size条记录,第number页的查询limit是(number-1)*size,size
17.varchar数据类型根据内容动态分配存储空间
在实际开发中,某个字段数据长度不发生改变用char,发生改变用varchar
18.create table 表名(col1 type1,col2 type2 default 默认值);->则插入记录不声明就直接默认为默认值
19.表的复制:create table 表名 as select语句;->将查询结果当做表创建
20.删除大表->truncate table 表名->彻底将表结构删除,截断表,不可回滚,永久丢失
21.增删改查->CRUD->create,retrive,update.delete
22.给两列添加唯一性约束:
(1)unique(col1,col2);->col1和col2联合起来不能重复
(2) create table tableName{type1 col1 unique,type2 col2 unique}-->col1,col2值唯一
!not null只能在字段后面单独加,只有列级约束
23.主键分类
根据主键字段数量划分:
(1)单一主键,选择一个字段作为主键
(2)复合主键,多个字段联合起来添加一个主键约束
根据主键性质划分:
(1)自然主键,和业务没有任何关系的自然数
(2)业务主键,主键值和系统业务挂钩(!最好不要,业务改变影响表结构)
!一张表的主键约束只能有一个,表级约束定义方法->primary key(col)
24.自动增长:auto_increment
25.外键约束:
(1)a中的外键引用b表中的一个列,a表是子表,b表示父表.删除数据/表先删除子表,添加数据/表先添加父表
(2)foreign key(a外键) references b表(b表某列)
(3)引用b表的列可以不是主键,但必须是唯一的
26.存储引擎(了解)
(1)就是表的存储方式
(2)查看当前mysql支持的存储引擎
show engines \G
(3)常见的存储引擎:
[1]MyISAM:
a.不支持事务
b.最常用,非默认
c.使用三个文件表示-表结构(格式文件,frm),表内容(数据文件,myd),表索引(索引文件,myi)
d.优点:可被压缩,节省存储空间,并且可以转换为只读表,提高检索效率
[2]InnoDB:
a.mysql存储引擎
b.每个innoDB表在数据库目录以.frm格式文件显示
c.表空间tablespace用于存储表内容(逻辑概念),无法被压缩,无法转换成只读
d.支持事务,用commit,davepoint,rollback支持事务处理,提供一组用来记录事务性活动的日志文件
e.在mysql中崩溃后提供自动恢复
f.支持级联删除和级联更新
[3]Memory:
a.缺点:不支持事务,数据容易丢失(数据和索引都存储在内存中)
b.优点:速度快
c.不支持blob和clob字段
27.事务:
(1)一个事务是一个完整的逻辑单元,不可再分,要么同时成功,要么同时失败
(2)和事务相关的语句只有DML语句。因为DML都是和数据库数据相关的,通常一个业务都是多个DML语句共同连个完成,事务是为了保证数据完整性和安全性
(3)开始事务,执行了相关语句之后不会像文件中保存数据,不影响硬盘上数据,只是将执行保存在数据库操作历史中,通过提交事务(commit,修改硬盘文件的数据,清空操作历史)/回滚事务(rollback清空操作历史)结束事务
(4)特性:(ACID)
[1]原子性,是最小的工作单元,不可再分
[2]一致性,保证多条DML语句同时失败或成功
[3]隔离性,事务A与事务B之间具有隔离
[4]持久性,最终数据必须持久化到硬盘文件,事务才算成功
(5)事务的隔离级别
[1]第一级别,读未提交,read uncommit,事务A可以读取事务B没有提交的数据,存在脏读现象
[2]第二级别,读已提交(Oracle默认),read commit,问题是不可重复读
[3]第三级别,可重复读(mysql默认),repeatable read,存在问题,读取的幻想数据(事务A提交了对数据删除操作,事务B仍能读到)
[4]第四级别,序列化/串行化读,效率低,事务需要排队
(6)msyql事务默认自动提交,执行一条DML语句就提交一次,通过start transaction 关闭
28.索引
(1)相当于一本书的目录,通过目录快速查找相应资源
(2)通过索引减小扫描范围提交检索效率,但是不能随意添加,索引也是数据库对象需要维护。数据量庞大或字段很少有DML操作且经常出现在where语句中作为查询条件则可以考虑添加索引
(3)主键和unique约束的字段自动生成索引
(4)create index 索引名 on 表名(索引名);----drop index 索引名称 on 表名;
(5)实现原理
[1]采取的数据结构:B-TREE
[2]思路:数据库表中的记录都会有一条物理地址
根据查询条件的字段查找到对应的索引,通过索引检索找到字段值对应区域,在区域内再次寻找对应区域,知道定位到该值,获取记录的物理地址,原sql语句的查询条件就变成了物理地址=获取的物理地址
[3]原理:通过B TREE缩小扫描范围,底层索引进行排序,分区。索引会携带数据在表中的“物理地址”,最终通过索引检索到数据之后获取到关联的物理地址,通过物理地址定位表中数据
(6)分类:
[1]单一索引:给单个字段添加索引
[2]复合索引:联合多个字段添加一个索引
[3]主键索引:主键上自动添加索引
....
(7)失效:索引在模糊查询第一个通配符是%的时候失效
29.视图:
(1)create view 视图名 as sql的DQL语句
(2)对视图增删改查会通过视图影响原表数据
(3)作用:隐藏表的实现细节,保密级别高的系统只对外提供相关视图
30.DBA命令
(1)将数据库中数据导出
在windows的dos窗口执行
mysqldump 数据库名 [数据表名] sql文件存储路径 -用户名 -密码
(2)向数据库中导入数据
create database 数据库名
use 数据库;
source sql文件路径;
31.数据库三范式
(1)设计范式:设计表的一句,按照这个设计的表不会出现数据冗余
(2)三范式:
[1]第一范式,任何一张表都有主键,并且每个字段具有原子性,不可再分
[2]第二范式,符合第一范式,所有非主键字段完全依赖于全部主键字段(多对多->三张表,两个数据表,一个关系表->两个外键一个自然主键)
[3]第三范式,符合第二范式,不能有传递依赖(a->b,b->主键)->×,一对多->两张数据表,多的那个表加外键