mysql数据库数据的⼼得_mysql数据库总结数据库定义语句⾔DDL(Data Definition Language)
创建数据库:create Database database_name 执⾏成功显⽰(Query Ok).
查看数据库:show databases;
选择数据库:use databases_name; 出现Database changed
删除数据库:drop database database_name 所有数据库对象也会删除
查看数据库所⽀持的存储引擎:
show engines G
show variables like 'have%';
源代码结局送外卖查询默认存储引擎:show variables like 'storage_engine%'
修改默认存储引擎:在my.ini配置⽂件中该掉default-storage-engine=? 修改后需要重启MySQL服务
查看表的定义:describe table_name
查看表的详细定义:show create table table_name G
删除表:drop table table_name
该表名:alter table old_name rename new_name;
增加列在最后⼀个位置:alter table table_name add 属性名 属性类型;
第⼀个位置增加列:alter table table_name add 属性名 属性类型 first;列举shell脚本的应用场景
在某个列之后增加字段:alter table table_name add 属性名 属性类型 after 属性名
删除字段:alter table table_name drop 属性名;
修改属性的数据类型:alter table table_name modify 属性名 属性类型;
修改属性名:alter table table_name change 旧属性名 新属性名 旧属性类型;
同时修改属性名和属性:alter table table_name change 旧属性名 新属性名 新属性名;
⾃连接外连接?
单表查询sql语句
distinct避免重复数据:select distinct 列名 from 表名
四则运算操作:加减乘除取余。+ - * / %
例:select 属性*12 from 表名;
设置显⽰格式:
concat()来连接字符串
例:select concat(ename,‘雇员的年薪为:’,sal*12) as yearsalary from table_name;
条件查询
where + 条件
AND与 OR或 XOR异或 NOT⾮
is null/not null 是否空的条件
between a and b :a到b之间
in(a,b,)判断字段是否是在集合⾥⾯,可以代替or
不在集合⾥就是 not in(a,)
not in集合中如果有null,则不会出现任何的查询结果,⽽in⾥⾯不会
like来模糊查询
filed like value:来判断字段和value字符串是否相匹配
like关键字⽀持的通配符:
“_”匹配⼀个字符
“%”任意长度的字符,可以是0个,1个等多个字符。
列:查第⼆个字符为A的:字段 like '_A%'
第⼆个字符不为A的: not 字段 like '_A%'
like '%%'表⽰查询所有的记录
排序数据记录
排序在查询语句的最后默认是asc的也就是升序
单字段排序:
oder by 字段 desc/asc
多字段排序:
oder by 字段 desc/asc,字段 desc/asc,......
限制数据记录查询数量
limit(起始下标,查询结果数量);起始下标默认从0开始
统计函数
avg()平均值 sum()总和 max()最⼤值 min()最⼩值
count(*):对表中记录进⾏统计,不管字段是否包含null
count(field):对指定字段的记录进⾏统计,将忽略null值
所操作的表中没有任何记录的话Count()函数返回0,⽽其他统计函数显⽰null
分组查询
group by 字段
通过分组查询得到的每个组中随机的⼀条记录,具有很⼤的不确定性,所以可以通过函数group_concat(字段)来实现多个字段分组查询:group by field1,field2,......filedn;⾸先按照field1进⾏分组再按照field2进⾏分组以此类推
对分组实现条件限制⽤having不⽤where
多表数据记录查询
内连接查询
from table_name1 inner join table_name2 on 匹配条件
⾃连接查询
内连接查询中⼀种特殊的等值连接,表与⾃⾝进⾏连接
等值连接
三个以上的表:from table_name1 inner join table_name2 on 相等条件 inner join table_name3 on 相等条件
不等连接
除了等于关系的运算符
外连接查询
from table_name1 left|right|full table_name2 on 条件
合并查询
select fieldn from tablename1
union | union all
select fieldn from tablename1
union会去掉重复数据,union all不会
连接查询性能差,因此出现了连接查询的替代者⼦查询
存储过程和函数
简单的可以理解为⼀条或多条sql语句的集合。存储过程和函数就是事先经过编译并存储在数据库中的⼀段SQL语句集合。
存储过程和函数的区别
函数必须有返回值,⽽存储过程没有。
存储过程的参数类型远远多于函数参数类型。
存储过程的优点:
存储过程只在创造时进⾏编译,以后每次执⾏存储过程都不需要再重新编译,⽽⼀般SQL语句每次执⾏就需要编译⼀次,所以存储过程可以提⾼数据库执⾏速度。
对数据库进⾏复杂操作时,可以将此复杂过程封装起来与数据库提供的事务处理结合⼀起使⽤。这些操作如果⽤程序来完成的话,就变成了⼀条条的sql语句,可能需要多次连接数据库。⽽换成存储过程只需要连接⼀次数据库就可以了。
存储过程可以重复使⽤,减少开发⼈员的⼀个⼯作量。
安全性⾼,可设定⽤户对存储过程的使⽤权限。
存储过程缺点:
mysql查看所有存储过程调试⿇烦。
⽐单句SQL语句复杂。
在编写存储过程和函数时,需要创建这些数据库对象的权限。
数据库事务
主要是为了保证数据的完整性
事务具有以下4个特性:
原⼦性:数据修改操作只能是完全提交或者完全回滚。
⼀致性:完成事务时必须使所有的数据从⼀种⼀致性变更为另⼀种⼀致性,以确保数据的完整性。
隔离性:及当前事务不会查看有另⼀个并发事务正在修改的数据。通过锁机制实现。
持久性:事务完成后,所做的修改对数据的影响是永久的。及重启或者系统故障数据仍然可以恢复。
REDO⽇志和UNDO⽇志
REDO⽇志:
事务执⾏时需要将执⾏的事务⽇志写⼊REDO⽇志。在mysql崩溃恢复时会重新执⾏REDO⽇志中的记录。
UNDO⽇志:
主要⽤于事务异常的回滚。复制事务前的数据库内容到UNDO缓冲区,然后在适当的时间将内容刷新到磁盘。
所有的UNDO⽇志均存放在表空间对应的.ibd数据⽂件中。UNDO⽇志⼜被称为回滚段。
MySQL事务控制语句
使⽤begin开始事务、commit结束事务、rollback回滚事务。用js实现轮播图效果
事务隔离级别
SQL标准定义了4种隔离级别:
未提交读:所有事务可以看到其他未提交事务的执⾏结果。
set global transaction isolation level read uncommitted;
提交读:⼤多数数据库系统默认的隔离级别,但不是mysql默认的隔离级别。事务只能看见已经提交事务所做的改变。
set global transaction isolation level read committed;
可重复读:MySQL的默认事务隔离级别。能确保同⼀事务的多个实例在并发读取数据时,会看到同样的数据⾏。会导致幻读(在⼀个事务的两次查询中数据笔数不⼀致)的问题。InnoDB存储引擎MVCC机制:通过为每个数据⾏增加2个隐含值得⽅式来实现。
set global transaction isolation level repeatable read;
可串⾏化:在每个读的数据⾏上加上共享锁。在这个级别,可能会导致⼤量的超时现象和锁竞争,⼀般不推荐使⽤。
set global transaction isolation level serializable;
InnoDB锁机制
共享锁S(Share):粒度是⾏或元组(多个⾏)。⼀个事务获取了共享锁之后,可以对锁范围内的数据进⾏读操作。
排他锁X(eXclusive):粒度是⾏或元组。⼀个事务获得排它锁后,可对锁范围内的数据进⾏写操作。
意向锁:
意向锁是⼀种表锁,锁的粒度是整张表。分为意向共享锁IS和意向排它锁IX两类。
为了尽可能提⾼数据库的并发量,每次锁定的数据范围越⼩越好,越⼤的锁其消耗的系统资源越多,系统性能下降。
锁粒度
锁的粒度主要分为表锁和⾏锁。
表锁管理锁的开销最⼩,同时允许的并发量也是最⼩的锁机制。MyISAM存储引擎使⽤该锁机制。
⾏锁可以⽀持最⼤的并发。InnoDB存储引擎使⽤该锁机制。
索引
索引与图书⽬录类似,主要是为了提⾼从表中检索数据的速度。索引是创建在数据库表对象上的,由表中的⼀个字段或多个字段⽣成的键组成,这些键存储在数据结构(B-树或哈希表)中。根据索引的存储类型,可以将索引分为B型树索引(BTREE)和哈希索(HASH)引。
InnoDB和MyISAM存储引擎⽀持BTREE类型索引,MEMORY存储引擎⽀持HASH类型索引,默认为前者索引。
适⽤索引的情况
经常被查询的字段,即where⼦句中出现的字段。
在分组的字段,即在group by⼦句中出现的字段。
存在依赖关系的⼦表和⽗表之间的联合查询,即主键和外键字段。
设置唯⼀完整性约束的字段。
不适合创建索引:
在查询中很少被使⽤的字段。
拥有许多重复值得字段。
索引的基本操作:
创建索引:
创建表时创建普通索引:
create table table_name(
属性名 数据类型(),
属性名 数据类型(),
属性名 数据类型(),
属性名 数据类型(),
.....
docker基本操作index|key 索引名(属性名(长度) asc|desc)
);
为了校验数据表中索引是否创建成功可以:
show create table table_name \G;汇编合法指令规定
为了校验数据库表中索引是否被使⽤:
explain
select * from table_name where 有索引的属性名=1 \G;
在已经存在的表上创建普通索引:
create index 索引名
on 表名(属性名(长度) as|desc);
alter table table_name add index|key 索引名 (属性名(长度) asc|desc);创建和查看唯⼀索引:
创建唯⼀索引时,限制索引的值必须是唯⼀的。
create table table_name(
属性名 数据类型(),
属性名 数据类型(),
....
unique index|key 索引名 (属性名(长度) asc|desc)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论