MySQL笔记总结

橙三吉。 提交于 2020-03-10 13:12:37

总结一下我之前自己学习MySQL的笔记,仅供参考。
使用命令行调用MySQL一定要注意分号,不然会出现报错。建议自己练习的时候,可以先把代码打到记事本里,再粘贴到命令行中运行,就不容易犯错了。
1.数据库常用操作
1)查询数据库:show databases;
2)创建数据库:create databases 数据库名字;
3)使用某一个数据库:use 数据库名字;
4)显示当前数据库里的数据表: show tables;
5)创建数据表: create table 表名字(
数据类型+字段);
创建数据表操作
6)显示数据表:describe 数据表名;
7)查看数据表中的记录:select * from 数据表名;
8)向数据表中添加数据记录: insert into 数据表名 values(‘a’,‘b’,‘c’,NULL);
9)从数据表中删除数据记录:delete from 数据表名 where name = ’ ‘;
10)从数据表中修改记录: update 数据表名 set name= ’ 改后的名’ where 所属的类名=‘ 对应的名’;

2.MySQL支持的数据类型有三种:数值,日期/时间,字符串类型

3.MySQL建表约束
1)主键约束:能够唯一确定一张表中的一条记录,即通过给某个字段增加约束,可使得该字段不重复且不为空。
create table 数据表名(
id int primary key,
name varchar(20)
);

2)联合主键约束:多个字段
create table 数据表名(
id int ,
name varchar(20)
password varchar(20)
primary key(id,name)
);

3)自增约束:id自动生成
create table 数据表名(
id int primary key auto_increment,
name varchar(20)
);
注意:
如果创建表的时候忘记创建主键约束
alter table 数据表名 add primary key(id);
删除主键:
alter table 数据表名 drop primary key(id);
修改字段:
alter table 数据表名 modify id int primary key;

4)唯一约束:约束修饰的字段的值不可以重复
create table 数据表名(
id int,
name varchar(20)*
*
);
备注:
alter table 数据表名 add unique(name)
*处可以直接放unique(name)
使用modify 添加:alter table 数据表名 modify name varchar(20) unique;
总结:
1)建表时候添加约束
2)可以使用alter…add…
3)alter…modify…
4)删除alter…drop…

5)非空约束:修饰的字段不能为空NULL
create table 数据表名(
id int,
name varchar(20) not null
);

6)默认约束:当我们插入字段值的时候,如果没有传值就会使用默认值
create table 数据表名(
id int,
name varchar(20),
age int default 10
);

7)外键约束:涉及到两个表:主表和副表(父表和子表)
例:班级表
create table classes(
id int primary key,
name varchar(20)
);
学生表
create table students(
id int primary key,
name varchar(20),
class_id int
foreign key (class_id) references class(id)
);
主表class中没有的数据值,在副表中是不可以使用的
主表中的记录被副表引用,是不可以被删除的

4.数据库的三大设计范式

1)第一范式1NF
数据表中的所有字段都是不可分割的原子值
create table students(
id int primary key,
name varchar(20),
address varchar(30)
);
insert into student2 values(1,‘张三’,‘中国大连’)
insert into student2 values(2,‘李四’,‘日本东京’)
insert into student2 values(3,‘王五’,‘美国洛杉矶’)
字段值还可以继续拆分的就不满足第一范式

create table students(
id int primary key,
name varchar(20),
country varchar(30)
province varchar(30)
);
范式设计的越详细,对于某些实际操作可能更好,但不一定都是好处

2)第二范式
必须是满足第一范式的前提下,第二范式要求,除主键外的每一列都必须完全依赖主键。如果要出现不完全依赖,只可能发生在联合主键的情况下。

例:订单表
create table myorder(
product_id int,
customer_id int,
product_name varchar(20),
customer_name varchar(20),
primary key product_id,customer_id)
);
问题:除主键以外的其他列,只依赖于主键的部分字段
拆表 就满足第二范式
create table myorder(
order_id int primary key,
product_id int,
customer_id int,
);
create table product(
id int primary key,
name varchar(20)
);
create table customer(
id int primary key,
name varchar(20)
);
3)第三范式
除开主键列的其他列之间不能有传递依赖关系。
不满足:create table myorder(
order_id int primary key,
product_id int,
customer_id int,
customer_phone varchar(15)
);
改:create table customer(
id int primary key,
name varchar(20)
phone varchar(15)
);

5.四种连接查询
1)内连接
内连接查询就是把数据表内有关系的数据连接查询,包括inner join 或者join

例:select * from person inner join card on person.cardId= card.id;
内连接查询

2)外连接
左连接 left join 或者 left outer join;
右连接 right join 或者 right outer join;
完全外连接 full join 或者 full outer join;

左外连接会把左边表的所有数据都取出来,而右边表中的数据,如果有就取出来,如果没有就补上NULL,右外连接则相反。
例:select * from person left join card on person.cardId=card.id;
左外连接
全外连接结果可以左连接union右连接表示出来,实际就是韦恩图交集和补集。
例:select * from person full join card on person.cardId=card.id;

6.MySQL中的事务
MySQL中,事务是一个最小的不可分割的工作单元,事务能保证一个业务的完整性。
例如银行转账,
a ->-100
update user set money=money-100 where name=‘a’;
b->+100
update user set money=money+100 where name=‘b’;
实际的程序中,如果只有一条语句执行成功,而另外一条没有执行成功,会出现数据前后不一致的情况。多条SQL语句肯定会有同时成功的要求,要么就同时失败。
MySQL默认是开启事务的。默认事务开启的作用是,当我们去执行一个SQL语句的时候,效果会立刻体现出来且不能回滚。(类似于自动提交)
(事务回滚是撤销SQL语句执行效果roll back)
默认事务
设置mysql语句自动提交为false,set autocommit=0;
上面的操作关闭了自动提交则可以被撤销,mysql>commit 手动提交是不可以被撤销的 有持久性。
begin; 或者start transaction;都可以帮我们手动开启一个事务,将上述两个情况前面加上这两个之一后即可回滚。值得注意的是,事务开启之后一旦commit提交就不可以回滚
behin
7.事务的四大特征(ACID)
1)A 原子性:事务是最小的单位,不可以分割
2)C一致性:事务要求,同一事务中的SQL语句必须保证同时成功或失败
3)I隔离性: 事务1和事务2之间是具有隔离性的
4)D持久性:事务一旦结束(commit,rollback),就不可以返回

小总结:
事务开启: 修改默认提交 set autocommit=0 begin start transaction
事务手动提交:commit
事务手动回滚:rollback

8.事务的隔离性
1)read uncommitted读未提交的
事务a和事务b,事务a对数据进行操作,在操作中事务没有被提交,但是b可以看见a的结果
查看数据库的隔离级别:
sql8.0
系统级别select @@global.transaction_isolation;
会话级别select @@transaction_isolation;
sql5.x
系统级别select @@global.tx_isolation;
会话级别select @@tx_isolution
修改隔离级别
set trabsaction isolation level read uncommitted;
如果两个不同的地方都在进行操作,事务a开启后,他的数据可以被其他事务读取到。这样就会出现脏读(一个事务读到了另一个事务没有提交的数据)
2)read committed读已提交的
set trabsaction isolation level read committed;
带来的问题是读取同一个表的数据,前后不一样。
3)repetable read可以重复读
带来的问题是幻读,即异地工作同一个表时,一个地方提交了,另一个地方读不到。
4)serializable串行化
SQL数据表被另一个事务操作的时候,其他事务里的写操作会卡住,只能一边等待一边commit
进入排队状态(事务阻塞)
串行化带来的问题是性能特差
总结1>2>3>4
隔离级别越好性能越差,默认级别是repeatable read。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!