02MYSQL基础语法(超详细)

1,016 阅读7分钟

第三章 数据库的三大设计范式

这是我参与更文挑战的第17天,活动详情查看: 更文挑战

	1.第一范式  	1NF

		数据表中的所有字段都是不可分割的原子值?
		create table user(id int primary key,name varchar(20));

		字段还可以继续拆分的,就不满足第一范式。不能拆分了就满足第一港式。
			例如:中国湖北恩施咸丰大坝
				它还可以折成 :  中国  湖北  恩施  咸丰  大坝 

	

	2.第二范式

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

		其实就是一表中的所有元素只依赖与一个主键!!!!!!


	
	3.第三范式 3NF
	
		必须先满足第二范式,除开主键列的其他列之间不能有传送依赖关系。

		例如: 其实就是 一个表中除开主键,其他的元素不可以相互依赖。

第四章 SQL的四种连接查询

内连接
	inner join 或者 join 

	select * from user inner join user1 on user.id = user1.id;
		on:表示连接条件
	内联查询,其实就是两张表中的数据,通过某个字段对,查询出相关记录数据。没有就不显示。


外链接
	1.左外连接 left join 或者 left outer join
		select * from user left join user1 on user.id = user1.id;
		左外连接,会把左边表(urse)里面的所有数据取出来,而右表中(user1)的数据,如果有相等的,就显示出来。如果没有,就会补UNLL


	2.右外连接 right joinright outer join
		select * from user right join user1 on user.id = user1.id;
		右外连接,会把右边表(urse)里面的所有数据取出来,而左表中(user1)的数据,如果有相等的,就显示出来。如果没有,就会补UNLL
	
	3.完全外链接 full join 或者 full outer join
		select * from user full join user1 on user.id = user1.id;
		MYSQL 不支持full join ,但可以用union连接表

第五章 mysql事务

mysql中,事务其实是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。
	多条sql语句,可能会有同时成功的要求,要么就同时失败。

mysql 中如何控制事务
	1.mysql 默认是开启事务的(自动提交)
		select @@autocommit;
		
		默认事务开启的作用是什么?
			当我们去执行一个sql 语句的时候,效果会立即体现出来,且不能回滚。
		
		事务回滚:撤销sql语句执行效果
			rollback;
	2.设置 mysql 自动提交为 false

	commit:手动提交  用rollback的话有效果
	set autocommit=0 就变成了手支提交
	select @@autocommit :自动提交数据@@autocommit = 1rollback 就可以撤销上条数据。
	rollback: 撤销上条数据

就是手动提交不可以撤销 自动提交设置成0就可以提交。

事务给我们提供了一个返回的机会。



begin;  start transaction; 都可以手动开启一个事务

	例
		begin;(或者 start transaction)
		update user set mo =mo+100 where name='b';
	在前面加上beginstart transaction就是和 setautocommit=0设置一样。



事务的四大特征:
	A 原子性:事务是最小的单位,不可以在分割
	B 一致性:事务要求,同一事务中的 sql 语句 ,必须保证同时成功或者同时失败。
	I 隔离性:事务1 和 事务2 之间是具有隔离性的。
	D 持久性:事务一但结束(commit,rollback),就不可以返回。


事务开启:
	1.修改默认提交  set autocommit=0;
	2.begin;
	3.start transaction;
	用上面三种了 后面用commit提交数据

事务手动提交:
	commit;

事务手支回滚:
	rollback;






事务的隔离性:
	1.read uncommitted;	读未提交的
	2.read committed;	读已经提交的
	3.repeatable read;	可以重复读
	4.serializable;		串行化


	1-read uncommitted
		如果有事务a,和事务b
			a事务对数据进行操作,在操作的过程中,事务没有被提交,但是b,可以看见a 操作的结果。
			
			如果两个不同的地主,都在进行操作,如果事务a 开启之后,他的数据可以被其他事务读取到,就会出现脏读(脏读:一个事务读到了别外一个事务没有提交的数据,就叫做脏读),实现开发不允许脏读的出现。!!!!
	
	如何查看数据库的隔离级别?
		mysql 8.0:
		--系统级别的 : select @@global.transaction_isolation;
		--会话级别的 : select @@transaction_isolation;
			mysql 默认隔离级别 REPEATABLE-READ

		mysql 5.x:(数据库版本是5的话)
		select @@global.tx_isolation
		select @@tx_isolation;

	如何修改隔离级别?
		set global transaction isolation level read uncommitted;

read uncommitted(A事务对数据进行操作,在操作的过程中,事务没有被提交,但是B,可以看见A的操作结果。) //1.先创建数据表 mysql> select * from user1; +------+--------+-------+ | id | name | money | +------+--------+-------+ | 1 | 小明 | 10000 | | 1 | 淘宝店 | 10000 | | 2 | 小涵 | 5000 | +------+--------+-------+ 3 rows in set (0.00 sec)

//2.查看数据表的隔离级别 select @@global.tx_isolation; +-----------------------+ | @@global.tx_isolation | +-----------------------+ | READ-UNCOMMITTED | +-----------------------+

//3.修改隔离级别 set global transaction isolation level read uncommitted;

//4.查看修改过来没有 mysql> select @@global.tx_isolation; +-----------------------+ | @@global.tx_isolation | +-----------------------+ | READ-UNCOMMITTED | +-----------------------+

//5.用begin开启事务 begin; //6.对数据表进行操作,小明把钱给了淘宝店 update user1 set money = money-9000 where name="小明"; update user1 set money = money+9000 where name="淘宝店";

mysql> select * from user1; +------+--------+-------+ | id | name | money | +------+--------+-------+ | 1 | 小明 | 1000 | | 1 | 淘宝店 | 19000 | | 2 | 小涵 | 5000 | +------+--------+-------+

//7.小明用rollback撤销了上一步给钱的操作。 rollback;

mysql> select * from user1; +------+--------+-------+ | id | name | money | +------+--------+-------+ | 1 | 小明 | 10000 | | 1 | 淘宝店 | 10000 | | 2 | 小涵 | 5000 | +------+--------+-------+ 3 rows in set (0.00 sec)

	2.read committed;(读已经提交的)
		a.先创建表
		b.修改事务(在查看事务select @@global.tx_isolation;)	 set global transaction isolation level read committed;
		c.开启事务 start transaction
		d.对事务的操作
		e.提交事务 commit;
		f.读到了提交的数据


	3.repeatable read; (可以重复读)
		事务1:
			a.先创建表
			b.修改事务(在查看事务select @@global.tx_isolation;)	 set global transaction isolation level repeatable read;
			c.开启事务 start transaction
			d.插入数据

			e.提交事务 commit;
			f.读到了提交的数据
		事务2:
			a.先创建表
			b.查看表
			c.开启事务 start transaction
			d.对事务的操作,插入和事务1一样的数据
			e.出错(出现幻读)
	
	事务1和事务2 同时操作一张表,事务1提交的数据,不能被事务2读到,就要造成幻读。
		


	4.serializable;(串行化)

		事务1 :
			a.先创建表
			b.修改事务(在查看事务select @@global.tx_isolation;)	 set global transaction isolation level serializable;
		c.开启事务 start transaction
		d.对事务的操作
		e.提交事务 commit;
		f.读到了提交的数据
		
		事务2:
			a.先创建表
			b.修改事务(在查看事务select @@global.tx_isolation;)	 set global transaction isolation level serializable;
		c.开启事务 start transaction
		

	如果事务2没有commit提交事务,那么事务1就无法提交数据,就进入了排队状态(串行化),要等事务2提交commit 事务1才可以提交数据。(其实和Python中的互斥锁一样)

	
		串行化问题是,性能 差
		READ-UNCOMMITTED > READ-COMMITTED>REPEATABLE-READ>SERIALIZABLE;

第六章 操作数据表记录

5.1 插入,更新,删除记录操作	

	修改表名 : alert table 表名 rename 要修改的表名;

		alter table A rename B;


	添加表列 :alter table 表名 add column 添加的列名  添加的类型;
		
		alter table B add column sex varchar(10);


	删除表列: alert table 表名 drop column 删除的列名

		alter table B drop column age;


	修改表列类型(属性) alter table 表名 modify 修改的列名 要修改的属性;

		alter table B modify sex char(20);

	修改表列名和属性   alter table  表名 change column 需要修改的类名 修改后的类名  修改后的属性;

		alter table B change column id  iddd char(10);



	数据的插入 insert into 表名 values();
		insert into B values(1,2);

		insert into 表名 set id = 3;
		insert into B select
                    
                    
                    

结语

文章篇幅较长,给看到这里的小伙伴点个大大的赞!由于作者水平有限,文章中难免会有错误之处,欢迎小伙伴们反馈指正。

如果觉得文章对你有帮助,麻烦 点赞、评论、收藏

你的支持是我最大的动力!!!