MySQL 笔记

启动或停止

net start mysql;
net stop mysql;

登录或退出

mysql -uroot -p123
mysql -uroot -p 这种方式可隐藏输入的密码
mysql -h IP地址或域名 -uroot1 -p 远程登录服务器的Mysql
exit 退出
\c 终止当前命令

查看信息或使用

show databases;
show tables; 
use tableName;
select * from tableName; 查看表的数据
desc tableName; 查看表的结构

查看数据库版本和当前数据库

select version();
select database();

导入sql文件和执行脚本

source C:\xx.sql

创建

创建数据库 create table tableName;

数据导出

//导出fruitshop数据库
mysqldump fruitshop > D:\xxx\xxx.sql -uroot -p123

//导出fruitshop数据库的user表
mysqldump fruitshop user > D:\xxx\xxx.sql -uroot -p123

数据导入

create database table;
source D:\.....

数据库概念理论知识

DQL:数据库查询语言 ,例如select ...

DML:数据库操作语言(对表的数据进行操作)
凡是对表当中的数据进行增删改
例如:insert增、delete删、update改

DDL:数据库定义语言(对表的结构进行操作)
凡是带有create增、drop删、alter改的搜索DDL

TCL:事务控制语言(包括事务提交commit、事务回滚rollback)

DCL:数据控制语言(授权grant、撤销权限revoke...)

表的命名和字段命名 使用下划线分隔单词,例如 table_name,user_phone

常见的数据类型

varchar 可变长度的字符串,会根据实际的数据长度分配大小,优点:节省空间,缺点:需要动态分配空间速度慢
char 定长字符串,char(6) 就是6,优点:速度较快,缺点:使用不当会导致空间浪费
int 数字中的整数型,等同于java 的int
bigint 数字中的整数型,等同于java 的long
float 单精度浮点数
double 双精度浮点数
date 短日期 只包括年月日
datetime 长日期 包括年月日时分秒
text 长文本
clob 字符大对象,最多可存4G的字符串,比如存文章
blob 二进制大对象 用于存储图片、声音、视频;需要使用IO流插入

建表 Create

create table 表名 (
    字段名1 数据类型,
    字段名2 数据类型, 
    ...);

//将查询结果 插入到一张新表中
create table 新的表名 as select * from user; 

删表 Drop

drop table 表名;

修改表 Alter

 alter table t_student rename to student;

插入数据 Insert

insert into 表名(字段名1,字段名2) values('数据1','数据2');
insert into 表名 values('数据1','数据2'); 省略字段名,等同插入所有字段
insert into 表名 values('数据1','数据2'),('数据3','数据4'); 

将查询结果插入到一张表中
insert into 插入的表名 select * from user;

修改数据 Update

update 表名 set 字段名1='数据1',字段名2='数据2' where 条件;
update user set username='test',user_emai='xx@qq.com' where id=1;

删除数据 Delete

delete 语句 删除的不是真实删除,可以支持回滚
delete from 表名 where 条件;
delete from user where id=1;

快速删除表中的数据(物理删除)
truncate 删除后不支持回滚,优点快速
truncate table 表名;

数据库范式

第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。

第二范式:建立在第一范式基础之上,要求所有的非主键字段完全依赖主键,不要产生部分依赖;

第三范式:建立在第二范式基础上,要求所有非主键字段直接依赖主键,不要产生传递依赖;

设计数据库表的时候,按照以上的范式进行,可以避免表中数据冗余,空间的浪费;

MySQL 约束和事务

约束

什么是约束(constraint) ,在创建表的时候,我们可以给表中的字段加入一些约束,来保证表中数据的完整性、有效性。

约束包含哪些?

约束

create table user(
 id int not null unique, //如果一起使用这两,自动设为主键
 age int not null, //非空,只有列级约束
 name varcah(255) unique,//唯一
 email varchar(255),
 phone varchar(255),
 uniqe(eamil,phone) 
 //约束没有添加在列的后面,这种约束被称为表级约束,如上行
);
int id primary key auto_increment 单一主键,自动增长
primary key(id,name) 联合主键,不建议使用!
任何一张表都应该有主键,主键一般为自动增长id

外键约束
foreign key
foreigh key(uid) references user(id) 将user表的id作为外键 
外键要唯一性,才能引用

存储引擎

create table user(......)engine=引擎名 defaule charset=utf8;

InnoDB
    这是mysql默认的存储引擎,安全,同时也是个重量级的存储引擎。
    支持事务,支持数据库奔溃后自动恢复机制。
    表空间tablespace 被用于存储表的内容

---------------------------------------------------
MyISAM
    使用三个文件表示每个表
    格式文件、数据文件、索引文件
    对于一张表老说,只要是主键或者加有unique约束的字段上会自动创建索引
    特点:可被转换为压缩、只读表来节省空间,不支持事务。
----------------------------------------------------    
Memory
    内存存储引擎,数据和索引存在内存中,速度快。
    不能包含text或blob字段
    特点:查询效率最高,不安全,断电后数据消失

事务

一个事务其实就是个完整的业务逻辑(增、删、改)
事务的四大特性:

  1. 原子性: 说明事务是最小的工作单元,不可再分;
  2. 隔离性:A事务在操作一张表时,另一张表也操作这张表,具有一定的隔离性;
  3. 一致性:要么同时成功,要么同时失败;
  4. 持久性:事务提交后,将数据保存在磁盘上;

假设转账,从A账户向B账户中转账1w
将A账户的钱减去1w,将B账户的钱加上1w
这就是个完整的业务逻辑。

以上的操作是一个最小的工作单元,要么同时成功,要么同时失败。

事务是怎么做到多条DML语句同时成功和同时失败的呢?
InnoDB引擎:提供了一组用来记录事务性活动的日志文件

在事务的执行过程中,每一条DML操作都会记录到”事务性活动的日志文件“中,在提交事务过程中,我们可以提交事务,也可以回滚事务。
提交事务?
清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中
提条事务标志着,事务的借宿,并且是一种全部成功的结束。
回滚事务?
将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件。
回滚事务标志着,事务的结束,并且是一种全部失败的结束;
提交后将不可回滚;

怎么提交事务?
提交事务:commit;
回滚事务:rollback;
事务对应的英语单词是transaction

MySQL 默认的事务是自动提交方式
如果关闭mysql自动提交机制
先执行:start transaction;
再执行SQL语句,insert .....
然后 rollback; 即可回滚

  1. 事务的隔离级别:
    读未提交(read uncommitted)(没有提交就能读到):
    最低的隔离级别,事务A可以读取到事务B未提交的数据,会造成脏读;
    这重隔离级别一般没人用;

  2. 读已提交(read committed)(提交之后才能读到):
    事务A只能读取到事务B提交之后的数据,可解决脏读。
    存在缺点:不可重复读数据,在事务开启之后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再读取的 时候,读到的数据是4条。
    这种隔离级别读到的数据是绝对的真实,是oracle默认的。

  3. 可重复读(repeatable read)(提交之后也读不到,读到的是刚开启事务时的数据):
    事务A开启之后,每次事务A中读取的数据都是一致的,即使事务B已修改并提交,读取到的数据还是没有改变。会出 现幻读,不够真实。
    这是MySQL默认的隔离级别;

  4. 序列化(serializable):
    最高的隔离级别,效率最低,但解决了所有问题,但不能并发,有点类似synchronized,需要排队,线程同步。

    设置全局的隔离级别
    set global transaction isolation level read uncommitted;

    查询隔离级别
    select @@tx_isolation

索引

索引是数据库表的字段上添加的,是为了提高查询效率存在的一种机制,有点像书的目录。

底层通过自平衡二叉树BTree 实现,缩小扫描的范围,避免全表扫描,

mysql中,主键上和unique字段上会自动添加索引

啥情况使用索引呢?

  1. 数据量庞大;
  2. 该字段经常出现在where的后面,已条件的形式存在,也就是说这个字段总是被扫描;
  3. 该字段很少的DML操作,因为DML后,索引要重新排序

建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低速度,建议通过主键查询或nnique字段查询

create index emp_ename_index on emp (ename);
给emp表的ename字段添加索引,起名emp_ename_index

drop index emp_ename_index on emp;删除索引

查看是否有索引
explain select * from user where ename='abc'
查看type和扫描行数rows,判断是否有索引

索引的失效?

  1. select * from user were username like '%c';
    username 即使添加了索引也不会走索引
    因为%号开始的原因,不知道开头是啥,走不了索引
  2. 使用or也会失效,要求or的两边都要有索引,索引其中有一边没,就失效了,建议使用union不会失效;
  3. 使用复合索引的时候,没有使用左侧的列查找,索引失效
    什么是复合索引?两个字段,或者更多字段联合起来添加一个索引。(a,b),使用右边的b会失效
  4. 索引的列参与了运算 例如,where sal +1 = 800,索引失效
  5. 索引列使用了函数,例如 where lower(name),索引失效

视图

创建视图对象

create view user_view as select * from user;

删除视图

drop view user_view

只有查询语句才能以view视图的形式创建

我们可以面向视图对象进行增删改查,通过对视图的操作,会影响到原表数据。
例如对视图进行查询 select * from 视图名;

视图对象在实际开发中 有什么用?

视图用来简化sql语句的,面向视图进行查询,假设有条很复杂的sql语句,每次都在不同的位置反复使用。每一次使用都需要重复编写,这时候,可以使用视图代替。

使用视图时,可以像使用表一样,视图不是在内存当中,视图对象也是存储在硬盘上,简化开发,利于维护。

“MySQL 笔记”的46个回复

评论已关闭。