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;

在某个列之后增加字段: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,c,d…)判断字段是否是在集合里面,可以代替or

不在集合里就是 not in(a,b,c…)

not in集合中如果有null,则不会出现任何的查询结果,而in里面不会

like来模糊查询

filed like value:来判断字段和value字符串是否相匹配

like关键字支持的通配符:

  1. “_”匹配一个字符
  2. “%”任意长度的字符,可以是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 field1 field2…fieldn from tablename1

union | union all

select field1 field2…fieldn from tablename1

union会去掉重复数据,union all不会

连接查询性能差,因此出现了连接查询的替代者子查询

存储过程和函数

简单的可以理解为一条或多条sql语句的集合。存储过程和函数就是事先经过编译并存储在数据库中的一段SQL语句集合。

存储过程和函数的区别

  1. 函数必须有返回值,而存储过程没有。
  2. 存储过程的参数类型远远多于函数参数类型。

存储过程的优点:

  1. 存储过程只在创造时进行编译,以后每次执行存储过程都不需要再重新编译,而一般SQL语句每次执行就需要编译一次,所以存储过程可以提高数据库执行速度。
  2. 对数据库进行复杂操作时,可以将此复杂过程封装起来与数据库提供的事务处理结合一起使用。这些操作如果用程序来完成的话,就变成了一条条的sql语句,可能需要多次连接数据库。而换成存储过程只需要连接一次数据库就可以了。
  3. 存储过程可以重复使用,减少开发人员的一个工作量。
  4. 安全性高,可设定用户对存储过程的使用权限。

存储过程缺点:

  1. 调试麻烦。
  2. 比单句SQL语句复杂。
  3. 在编写存储过程和函数时,需要创建这些数据库对象的权限。

数据库事务

主要是为了保证数据的完整性

事务具有以下4个特性:

  1. 原子性:数据修改操作只能是完全提交或者完全回滚。
  2. 一致性:完成事务时必须使所有的数据从一种一致性变更为另一种一致性,以确保数据的完整性。
  3. 隔离性:及当前事务不会查看有另一个并发事务正在修改的数据。通过锁机制实现。
  4. 持久性:事务完成后,所做的修改对数据的影响是永久的。及重启或者系统故障数据仍然可以恢复。

REDO日志和UNDO日志

REDO日志:

​ 事务执行时需要将执行的事务日志写入REDO日志。在mysql崩溃恢复时会重新执行REDO日志中的记录。

UNDO日志:

​ 主要用于事务异常的回滚。复制事务前的数据库内容到UNDO缓冲区,然后在适当的时间将内容刷新到磁盘。

​ 所有的UNDO日志均存放在表空间对应的.ibd数据文件中。UNDO日志又被称为回滚段。

MySQL事务控制语句

使用begin开始事务、commit结束事务、rollback回滚事务。

事务隔离级别

SQL标准定义了4种隔离级别:

  1. 未提交读:所有事务可以看到其他未提交事务的执行结果。

    set global transaction isolation level read uncommitted;

  2. 提交读:大多数数据库系统默认的隔离级别,但不是mysql默认的隔离级别。事务只能看见已经提交事务所做的改变。

    set global transaction isolation level read committed;

  3. 可重复读:MySQL的默认事务隔离级别。能确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。会导致幻读(在一个事务的两次查询中数据笔数不一致)的问题。InnoDB存储引擎MVCC机制:通过为每个数据行增加2个隐含值得方式来实现。

    set global transaction isolation level repeatable read;

  4. 可串行化:在每个读的数据行上加上共享锁。在这个级别,可能会导致大量的超时现象和锁竞争,一般不推荐使用。

    set global transaction isolation level serializable;

InnoDB锁机制

  1. 共享锁S(Share):粒度是行或元组(多个行)。一个事务获取了共享锁之后,可以对锁范围内的数据进行读操作。

  2. 排他锁X(eXclusive):粒度是行或元组。一个事务获得排它锁后,可对锁范围内的数据进行写操作。

  3. 意向锁:

    意向锁是一种表锁,锁的粒度是整张表。分为意向共享锁IS和意向排它锁IX两类。

为了尽可能提高数据库的并发量,每次锁定的数据范围越小越好,越大的锁其消耗的系统资源越多,系统性能下降。

锁粒度

锁的粒度主要分为表锁和行锁。

  • 表锁管理锁的开销最小,同时允许的并发量也是最小的锁机制。MyISAM存储引擎使用该锁机制。
  • 行锁可以支持最大的并发。InnoDB存储引擎使用该锁机制。

索引

索引与图书目录类似,主要是为了提高从表中检索数据的速度。索引是创建在数据库表对象上的,由表中的一个字段或多个字段生成的键组成,这些键存储在数据结构(B-树或哈希表)中。根据索引的存储类型,可以将索引分为B型树索引(BTREE)和哈希索(HASH)引。

InnoDB和MyISAM存储引擎支持BTREE类型索引,MEMORY存储引擎支持HASH类型索引,默认为前者索引。

适用索引的情况

  1. 经常被查询的字段,即where子句中出现的字段。
  2. 在分组的字段,即在group by子句中出现的字段。
  3. 存在依赖关系的子表和父表之间的联合查询,即主键和外键字段。
  4. 设置唯一完整性约束的字段。

不适合创建索引:

  1. 在查询中很少被使用的字段。
  2. 拥有许多重复值得字段。

索引的基本操作:

创建索引:

创建表时创建普通索引:
create table table_name(
	属性名 数据类型(),
  属性名 数据类型(),
  属性名 数据类型(),
  属性名 数据类型(),
  .....
  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)
);

create unique index 索引名
	on 表名(属性名(长度) asc|desc);

alter table table_name 
	add unique index|key 索引名 (属性名(长度) asc|desc);

创建全文索引:

将上述唯一索引的unique换成fulltext就行了

全文索引主要关联在数据类型为char、varchar和text的字段上,以便能够更快地查询数据量较大的字符串类型的字段。

只能在存储引擎为MyISM的数据库表上创建全文索引。

创建多列索引:

create table table_name(
  属性名 数据类型(),
  属性名 数据类型(),
  ....
  index|key 索引名 (属性名1(长度) asc|desc,
                	属性名2(长度) asc|desc,
                 	属性名3(长度) asc|desc,
                 	.....
                )
);

create index 索引名
	on 表名(属性名1(长度) asc|desc,
           属性名2(长度) asc|desc,
           属性名3(长度) asc|desc,
           .....
    )
    
alter table table_name
	add index|key 属性名1(长度) asc|desc,
                	属性名2(长度) asc|desc,
                 	属性名3(长度) asc|desc,
                 	.....;

删除索引:

drop index index_name on table_name

视图

为什么使用视图?

mysql从5.0.1版本开始提供。

​ 数据库中关于数据的查询有时非常复杂,例如表连接、子查询等,因为他们的逻辑复杂,编写语句比较多。当这种查询需要重复使用时,则不会每次都能编写正确,从而降低了数据库的实用性。

为了提高复杂SQL语句的复用性和表操作的安全性,数据库提供了视图特性。它在本质上是一种虚拟表,行和列数据来自定义视图的查询索引用的基本表,并在具体引用时动态生成。这样程序员只能看到视图中定义的数据,而不是视图所引用表中的数据,从而提高数据库中数据的安全性。

视图的功能实际是封装查询语句。

视图的特点:

  1. 视图的列可以来自于不同的表。
  2. 视图是由基本表产生的表(虚表)。
  3. 视图的建立和删除不影响基本表。
  4. 对视图内容的更新直接影响基本表。
  5. 当视图来自多个基本表时,不允许添加和删除数据。

创建视图:

视图命名规范一般为view_xxx或v_xxx。

create view view_name 
	as 查询SQL语句

查看视图:

use view;
show tables;//显示表中所有视图名

show table status from view like "view_name"\G;//查看视图对象详细信息
show create view viewname \g;查看视图定义信息
describe|desc view_name 查看视图设计信息
select * from views where table_name='view_name' \G;

删除视图:

drop view view_name;

修改视图:

create or replace view view_name as 查询语句
//alter语句修改
alter view view_name as 查询语句   

通过视图操作基本表:

通过视图查询数据,与通过表进行查询完全相同,只不过通过视图查询比表更安全、更简单、实用。

select *from view_name;
insert into view_name (field1,field2...) values(xx,xx,xx..);
delete from view_name where ...;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶追风少年|

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值