一.sql的分类
DML:数据操纵语言 date manipulation language,
语法包括:select、insert、delete、update
记忆方法:使用sql操作数据的增删改查,对数据产生改变,对表不会产生改变
DDL:数据定义语言 date definition language
语法包括:alter,create、drop、rename truncate
记忆方法:只会对表产生改变,对数据不会产生改变
DCL:数据控制语言 date control language
语法包括:grant、revoke
transaction:事务
rollback、savepoint
二、数据库的基本操作(DDL)
增:
创建数据库:create database dbname charactor set utf8;
删:
删除数据库:drop database dbname;
查:
查看实例中所有的表:show databases;
改:
改变当前使用的数据库:use dbname;
三、表的基本操作
增:
创建表:
方式一:CREATE TABLE `emp3_copy` (
`empno` int(10) NOT NULL,
`ename` varchar(20) NOT NULL,
`job` varchar(20) DEFAULT NULL,
`mgr` int(20) DEFAULT NULL,
`hiredate` datetime DEFAULT NULL,
`sal` double(20,0) DEFAULT NULL,
`comm` double(20,0) DEFAULT NULL,
`deptno` int(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
方式二:create table dbname as select * from table_name where 1=1
注意:会赋值所有的数据,但是不会复制约束
方式三:create table dbname as select * from table name where 1=2
注意:只会赋值表结构,不会复制数据和约束
删:
删除表:drop table emp3_copy;
改:
更改表:
增加列:
alter table emp3 add column test varchar(10) not null comment "测试" after empno
更改列:
alter table emp3 modify column test varchar(20) unique null comment "再测试"
注意:更改列的时候需要将原属性加上,否则更改时会覆盖原属性
删除列:
alter table emp3 frop column test;
改表名:
alter table emp3 rename test3;
查:
查询表结构
desc emp3
四、表的常见约束(constraint):
建表时,同时可以制定一些规则,来约束插入的数据,这些规则称之为约束,是表上强制执行的数据校验规则。
约束可以在建表时添加上,也可在建表后添加
建表时在字段后添加相应需要的约束,字段用","隔开
CREATE TABLE `emp3_copy` (
`empno` int(10) NOT NULL primary key,
`ename` varchar(20) NOT NULL,
`job` varchar(20) DEFAULT NULL,
`mgr` int(20) DEFAULT NULL,
`hiredate` datetime DEFAULT NULL,
`sal` double(20,0) DEFAULT NULL,
`comm` double(20,0) DEFAULT NULL,
`deptno` int(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
建表后添加:
alter table emp3 modify column test varchar(20) unique null comment "再测试"
约束包括:
- not null:非空,用于保证该字段的数值不能为空
- default:默认值,用于保证该字段有默认值。
- primary key: 主键,用于保证该字段的值具有唯一性且非空
- unique: 唯一键,用于保证该字段的值具有唯一性,可以为空
- foreign key: 外键,用于限制两个表的关系,用于保证该字段必须有来自主表的关联列的值
- check:用于自定义约束,mysql中没有,用时需要在定义列中添加check(age>0 and age < 120)
4.1主键的定义(primary key):
创建有两种方式:
在表定义中加上如下子句primary key (列名、列名)
在主属性定以后,在之后加上primary key
4.2外键约束
外键是表中的一个列,其值必须在另外一个表的主键或唯一键列出
作为主键的表为主表,作为外键的表为依赖表
外键是参照的主表的主键或者唯一键
当删除主表的主键时,其依赖表会组织删除,要删除主表某个记录时可以采取以下三种做法
restrict方式:只有当依赖表中没有一个外键值与要删除的主表中的主键值相对应,才可以执行删除
cascade方式:主表中被删除的主键值相关联的以来表中的外键值的记录一起删掉
set null方式:将以依赖表中的相关联的值设置为空值
五.索引
概述:
索引是为了加快查询所存在的,存于磁盘中,myisam引擎中是单独存在一个磁盘文件中,innodb中是与数据存放在一起的。其作用是在数据库中用来加速对表的查询,通过使用快速路径访问方法快速定位数据,减少磁盘io,且sql中的索引是非显性的,用的时候不需要写出他的名字,会自动起作用。
开发中使用索引的要点:
-
- 索引改善检索操作的性能,但是降低了数据的插入、修改和删除的性能,再执行这些操作时,DBMS必须动态地更新索引。
- 索引数据可能要占用大量的存储空间。
- 唯一性不好的数据不一定适合于索引。
- 索引用于数据过滤和数据排序,如果经常以某种特定的顺序排序数据,则该数据可能是索引的备选。
- 可以在索引中定义多个列,也就是联合索引。
扩展知识储备:
局部性原理:程序和数据的访问都有聚集成群的倾向,在一个时间段内,仅适用其中一小部分(空间局部性),或者最近访问过的程序代码和数据,很快又被访问的可能性很大(时间局部性)
磁盘预读:(预读长度一般为一页(page)的整数倍)
页是存储器的逻辑块,操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,这个块成为一页(许多操作系统中,页的大小通常为4K),主存和磁盘以页为单位交换数据
5.1加索引的两种方式:
- create index index_name on table(list_columns);
- alter table table_name add index index_name (list_columns);
5.2删除索引的两种方式:
- drop index index_name on table;
- alter table table_name drop index index_name;
5.3索引的分类
mysql索引的五种类型:主键索引、唯一索引、普通索引、全文索引、组合索引,通过给字段添加索引,可以提高数据的读取速度,提高项目的并发能力和抗压能力
- 主键索引:primary key 每个表只能有一个主键,是唯一性索引
- 唯一索引:unique 索引列的所以只都只能出现一次,必须唯一,只可以为空
- 普通索引:基本的索引类型,可以为空,没有唯一性限制(覆盖索引)
- 全文索引:MyISAM引擎支持,Innodb在5.6之后支持fulltext。可以在varchar、char、text类型的列上创建
- 组合索引:多列值组成一个索引,专门用于组合搜索(最左匹配原则)
解释:
索引覆盖:在索引中取得我们想要的数据,不需要在数据表中读取,查询列被使用的索引覆盖
最左匹配原则:当使用组合索引时,创建索引如下(index1,index2)先匹配index1,在匹配index2,也可单独使用index1,这样索引是起到作用的,当使用index2时,索引并未起到作用,想要使用时,需要单独创建index2的索引
5.4mysql的存储引擎
MyISAM |
Innodb |
|
索引类型 |
非聚簇索引 |
聚簇索引 |
支持事务 |
否 |
是 |
支持表锁 |
是 |
是 |
支持行锁 |
否 |
是 |
支持外键 |
否 |
是 |
支持全文检索 |
是 |
5.6以后支持 |
适合操作类型 |
select |
insert、update、update |
5.5mysql-MyISAM索引机制:
5.6mysql-Innodb索引机制:
5.7索引的维护
索引在插入新值的时候,为了维护索引的有序性,必须要维护,在维护索引的时候需要分一下集中情况:
1.如插入一个比较大的值,直接插入即可,几乎没成本
2.如果插入一个中间值,需要逻辑上移动后续的元素,空出位置
3.如果插入的数据页满了,就需要单独申请一个新的数据页,然后移动部分数据过去,叫做页分裂,此时性能会受到影响,空间使用率也会降低,除了也分裂之外还包含业合并
综上:尽量使用自增主键作为索引
5.8 扫盲
5.6.1什么是回表:
回表就是查询数据时先通过数据库索引扫描所在的行获取主键id,在通过主键id获取该行索引中没有提供的数据,即基于非主键索引的查询需要多扫描一颗索引树。
5.6.2什么是索引下推:
当不使用icp,通过使用非主键索引(普通索引or二级索引)进行查询,存储引擎通过索引检索数据,然后返回给mysql服务器,服务器再判断是否符合条件。
举例说明,就是将表的多个用的着的列进行创建组合索引,进行不使用icp索引,使用普通索引多条件查询时,通过第一个索引查询相应的元组,此时可能有多个,此时再根据第二个条件和第三个标间进行判断索引是否符合标准,将符合的主键id返回,进行查找数据,只进行一次回表查询;
如不使用索引下推,会使用第一条件查询到的多个id进行查询,产生多次回表查询,判断符合的数据返回给mysql服务器
5.6.3为什么索引使用B+树的数据结构
https://blog.csdn.net/weixin_39772200/article/details/104191637