MySql入门

本文详细介绍了MySQL数据库的基础知识,包括数据库的概念、DBS、DB、DBA和DBMS。接着深入讲解了MySQL的特点,以及如何设置MySQL编码。SQL作为结构化查询语言,其主要组成部分包括DDL、DML、DQL和DCL,文中逐一阐述了它们的用途和语法。在DQL部分,详细解析了查询、分组、排序、子查询和联表查询等操作。此外,还探讨了数据完整性、事务处理、数据库备份与还原以及一些常见问题的解决方案。最后,提到了数据库的事务隔离级别及其影响。

MySql入门

一:数据库的概念

  • 数据库:数据库就是一组经过计算机整理后的数据,存储在一个或多个文件中,而管理这个数据库的软件就称之为数据库管理系统。一般一个数据库系统(Database System)可分为数据库(Database)与数据管理系统(Database Management System,DBMS)两个部分。

    • DBS:数据库,管理员,数据库管理系统组成

    • DB:按照数据结构来组织、存储和管理数据的仓库.将数据存在硬盘上

    • DBA:管理数据库的专业人员

    • DBMS:指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。

  • 作用:既便于数据的集中管理,控制冗余,提高数据的利用率和一致性,又利于应用程序的开发和维护。

  • 分类:

    • 网状结构数据库:美国通用电气公司IDS,以节点形式存储和访问。
    • 层次结构数据库:IBM公司IMS定向有序的树状结构实现存储和访问。
    • 关系结构数据库:Oracle、DB2、MySQL、SQL Server,以表格(Table)存储,多表间建立关联关系,通过分类、合并、连接、选取等运算实现访问。
    • 非关系型数据库:ElastecSearch、MongoDB、Redis,多数使用哈希表,表中以键值(key-value)的方式实现特定的键和一个指针指向的特定数据。
  • 关系型数据库的组成:数据库的表,表与表之间关系,对象

二:MySql的介绍

  • MySQL:是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗 下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS应用软件之一。
    特点:开源免费体积小.MySql数据库默认用Innodb引擎.

设置MySql编码:C:\ProgramData\MySQL\MySQL Server 5.7修改my.ini中编码:

https://blog.csdn.net/x775229836/article/details/51831853

三:SQL

(Structured Query Language/结构化查询语言)用于访问和处理数据库的标准的计算机语言

组成部分:

DDL(Data Definition Language/数据库的定义语言):对数据库和表作创建,修改和删除操作.
DML(Data Definition Language/数据管理语言):对数据库表中数据作增加,修改,删除操作.
DQL(Data Query Language/数据查询语言):对数据库表中数据作查询操作.
DCL(Data Control Language/数据控制语言):创建用户,给用户授权,撤消权限,备份和还原. TPL(事务控制语言):操作数据库的事务,确保被DML语句影响的表的所有行及时得以更新
CCL(指针控制语言):用于对一个或多个表单独行的操作

1.DQL

数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE
子句组成的查询块:
SELECT <字段名表>
FROM <表或视图名>
WHERE <查询条件>

查询的总语法:
	select 列名1,列名2...
	from 表名1
	[inner/left/right] join 表名2 on 表名1.公共列=表名2.公共列
	[where 条件]     //边查询边筛选
	[group by 列名]   //对结果进行分组
	[having 条件]     //分组后再筛选
	[order by 列名 asc/desc] //最后再排序
	[limit count1 [,count2]] //限制输出条件或分页
单表查询
	查询表中所有记录
		语法一:select 列名1,列名2...from 表名; (推荐)
		语法二:select * from 表名;  
		eg:#1.查询表中所有记录
		select * from t_student;
		select sid,sname,sage from t_student;
	根据条件查询
		语法:select 列名1,列名2...from 表名 where 条件
		eg:select sid,sname,sage from t_student where sage>18;
	查询完后对结果进行排序
		eg:select sid,sname,sage from t_student order by sage desc,sid desc;
	聚合函数:sum(),max(),min(),avg(),count()
	模糊查询
		1. 通配符:
		  _:通配任意一个字符
		  %:通配任意长度的任意字符
		2. like语法:select 列名1,列名2...from 表名 where 列名 like 通配符;
			  注意:所有列都可以用like进行模糊查询
			  eg:#5.like查询:查询姓王的所有人
                select * from t_student where sname like '王%';
                select * from t_student where sage like '1%';
                select * from t_student where birthday like '2020-07-2%';
	between min and max:小范围值写在前面,大范围值写在后面
	in(值1,值2,值3)
		语法:select 列名1,列名2...from 表名 
			 where 列名 in(值1,值2,值3);
	is null/is not null
		语法:select 列名1,列名2...from 表名 
			where 列名 in(值1,值2,值3);
			
 	分组查询和筛选:
		注意:我们查询条件如果是根据查询结果筛选用having,如果是边查询边筛选就用where
		注意:在逻辑上,有group by的语句不一定有having,但是有having一定有group by
		
	eg:#分组查询:查询每个班的学生人数
	select count(sid) as '人数',cid as '班级编号' from t_student GROUP BY cid

	#分组再筛选:查询班级人数大于2所有班级编号及人数
	select count(sid),cid from t_student group by cid having count(sid)>2

	(MySql)limit的使用:
		语法一:限制输出记录条数:select 列名1,列名2... from 表名 limit count;
			   eg:select * from t_student order by sage desc limit 3;
		语法二:查询当前页数据:
		select 列名1,列名2... from 表名 limit 当前页起始记录数,每页显示记录条件;
		分页公式:select 列名1,列名2... from 表名 
				limit (当前页码-1)*每页显示记录条数,每页显示记录条数;

	(MySql,Oracle)distinct:去重
	eg:#去重
		select DISTINCT sname from t_student;

联表查询
如果两张及以上表中有公共列,将这几张表联合起来一起查询,叫联表查询.
	注意:n张表,只能建立n-1个桥梁(公共列关系).

	1.内连接:将两张及以上表中数据通过公共列联合查询出共有数据.表与表之间是平等关系.
			语法一:select 列名1,列名2... 
				  from 表名1,表名2,表3
				  where 表名1.公共列=表名2.公共列 and 表名2.公共列=表名3.公共列

			语法二:select 列名1,列名2... 
				   from 表名1
				   inner join 表名2 on 表名1.公共列=表名2.公共列
				   inner join 表名3 on 表名2.公共列=表名3.公共列
			注意:查询列如果公共列是一定要用表名或表别名调用列,其他列直接写,
					也可以用表名调用.
			eg:#内联接:查询学生姓名和班级名称
                select sname,cname,s.cid
                from t_student s,t_class c
                where s.cid=c.cid

                select sname,cname,s.cid
                from t_student s
                INNER JOIN t_class c on s.cid=c.cid;
                
                
	2.外连接:两张及以上表通过公共列联合查询,主表中数据全部显示,子表中有与主表对应的数			据就显示,没有对应就以null显示;子表中有的数据,主表中没有的就不显示.
		2.1:左外连接:以左边的表为主.
			语法:select 列名1,列名2... 
				   from 表名1
				   left [outer] join 表名2 on 表名1.公共列=表名2.公共列
				   left [outer] join 表名3 on 表名2.公共列=表名3.公共列


		2.2:右外连接:以右边的表为主
			语法:select 列名1,列名2... 
				   from 表名1
				   right [outer] join 表名2 on 表名1.公共列=表名2.公共列
				   right [outer] join 表名3 on 表名2.公共列=表名3.公共列
			eg:#外联接
#查询所有的学生信息以及与之相关班级信息(学生信息要全部查询,班级信息有相关才显示)
                SELECT s.*,c.*
                from t_student s
                left join t_class c on s.cid=c.cid;

                SELECT s.*,c.*
                from t_class c
                right join t_student s on s.cid=c.cid;

#查询所有的班级信息以及与之相关学生信息(班级信息要全部查询,学生有相关才显示)
                SELECT s.*,c.*
                from t_class c
                left join t_student s on s.cid=c.cid;

                SELECT s.*,c.*
                from t_student s
                right join t_class c on s.cid=c.cid;

子查询

在一个查询语句中嵌套另一个查询语句

1.执行顺序:由内到外执行.
	2.子查询可以多层嵌套,一般用到二到三层嵌套
	3.子查询不能用在limit和order by后面
	4.能用子查询解决的问题,也可以用联表查询;能用联表查询的问题,不一定能用子查询解决.
	5.如果一个问题既可以子查询也可以联表查询,首选子查询.
	6.在查询中,能用精确查询就不要用模糊查询.
eg:#子查询:查询所有学生信息->先在班级表中查询对应的班级编号,再根据班级编号查询学生表中信息
        select * from t_student 
        where cid=(select cid from t_class where cname='初三一班');

        select s.* from t_student s
        inner join t_class c on s.cid=c.cid
        where c.cname='初三一班';

联合查询

查询的列名相同,才能用联合查询.

1.UNION合并结果并去重: 
	#查询年龄小于等于18岁所有学生信息,再查询年龄大于15岁所有学生信息,将两个结果合并
        select * from t_student where sage<=18
        union
        select * from t_student where sage>15;

	2.UNION all合并结果不去重
	 #查询年龄小于等于18岁所有学生信息,再查询年龄大于15岁所有学生信息,将两个结果合并
        select * from t_student where sage<=18
        union all
        select * from t_student where sage>15;

2.DML

数据操纵语言DML主要有三种形式:

  1. 插入:INSERT
向表添加一条记录:
	语法一:insert into 表名(列名1,列名2...) values(值1,值2...) (推荐)
	语法二:insert into 表名 values(值1,值2,值3...);
向表中插入多条记录:
	语法:insert into 表名(列名1,列名2...)
		 values(值1,值2...),(值1,值2...),(值1,值2...);

  1. 更新:UPDATE
修改表中数据:语法:update 表名 set 列名1=新值1,列名2=新值2...[where 条件] 
  1. 删除:DELETE
删除表中数据:语法: delete from 表名 [where 条件]
删除表中所有记录:
1.delete from 表名; (delete from t_class;)
只删除表中所有数据,表的结构和标识种子还在,一行一行的删除,所以删除效率最低也是删除最不彻底的
2.TRUNCATE table 表名;(TRUNCATE table t_class;)
删除表中所有数据及标识种子和表的结构,一页一页删除,再创建一个与原表相同结构的表.删除效率最高
3.drop table 表名; (drop table t_class;)
删除表的所有东西,包括结构和标识种子.删除最彻底.

3.DDL(用第三方软件操作)

数据定义语言DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等如:
创建数据库:create database [if not exists] 数据库名 [defalut charset utf-8] 查看数据库的创建:show create database 数据库名 删除数据库:drop database 数据库名 进入数据库中(使用数据库):use 数据库名; 查看当前数据库的所有表:show tables;

创建表:
		create table 表名(
			列名1 数据库类型1 列的特征,
			列名2 数据库类型2 列的特征,
			...
			列名n 数据库类型n 列的特征
		);
		
		create table 【数据名.】表名(
		字段名1 数据类型  primary key ,
		....
        );
        或
        create table 【数据名.】表名(
            字段名1 数据类型,
            ....,
            primary key(字段名1)
        );
        或
        create table 【数据名.】表名(
            字段名1 数据类型,
            字段名2 数据类型,
            ....,
);
primary key(复合主键字段列表)#如果是复合主键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加primary key

主键约束:primary key
		指定主键约束
		alter table 表名称 add primary key (主键字段列表);
		
		删除主键约束
		alter table 表名称 drop primary key;
		
		建表后增加唯一键约束
		alter table表名称 add 【constraint 约束名】 unique 【key】 (字段名列表);
		#如果没有指定约束名,(字段名列表)中只有一个字段的,默认是该字段名,如果是多个字段的默认是字段名列表的第1个字段名。也可以通过show index from 表名;来查看
		
		删除唯一键约束
		ALTER TABLE 表名称 DROP INDEX 唯一性约束名;
		#注意:如果忘记名称,可以通过“show index from 表名称;”查看
		
		主键的特点:
		(1)唯一并且非空
		(2)一个表只能有一个主键约束
		(3)主键约束名就叫做PRIMARY
		(4)创建主键会自动创建对应的索引,同样删除主键对应的索引也会删除。
		注意:主键列 VS 唯一键
			相同点:确保列值不重复.
			不同点:
					主键列不能为空;唯一键可以为空
					主键列可以由一列或多列组成,但是唯一键一般都是用来限制一个列.
					由多个列组成主键叫复合主键,复合主键列要求组成的列有一个列值不							同就是不同的主键,复合主键要求组成的列的所有列值相同就是重复主键.

唯一键约束:unique key

	1)唯一键约束特点
    同一个表可以有多个唯一约束。

    唯一约束可以是某一个列的值唯一,也可以多个列组合值的唯一。

    MySQL会给唯一约束的列上默认创建一个唯一索引。

    删除唯一键只能通过删除对应索引的方式删除,删除时需要指定唯一键索引名

    2)如何在建表时指定唯一键约束
    create table 【数据名.】表名(
	字段名1 数据类型  primary key ,
	字段名2 数据类型 unique key,
	....
);

    create table 【数据名.】表名(
        字段名1 数据类型  primary key ,
        字段名2 数据类型,
        字段名3 数据类型,
        ....,
    unique key(复合唯一字段列表)#如果是复合唯一键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加
        
        3)如何在建表后增加唯一键约束
		alter table表名称 add 【constraint 约束名】 unique 【key】 (字段名列表);
#如果没有指定约束名,(字段名列表)中只有一个字段的,默认是该字段名,如果是多个字段的默认是字段名列表的第1个字段名。也可以通过show index from 表名;来查看
        
        4)如何删除唯一键约束
        ALTER TABLE 表名称 DROP INDEX 唯一性约束名;
		#注意:如果忘记名称,可以通过“show index from 表名称;”查看
        
外键约束:foreign key	

	1)外键特点
	* 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的	两个字段之间的参照关系。
	
	* 在创建外键约束时,如果不给外键约束名称,默认名不是列名,而是自动产生一个外键名(例如 	 student_ibfk_1;),也可以指定外键约束名。

	* 当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是列名,不是外	键的约束名。
	
	* 删除外键时,关于外键列上的普通索引需要单独删除
	
	2)要求
    * 在从表上建立外键,而且主表要先存在。

    * 一个表可以建立多个外键约束

    * 从表的外键列,在主表中引用的只能是键列(主键,唯一键,外键)。

    * 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样
    
    3)约束关系:约束是针对双方的
    添加了外键约束后,主表的修改和删除受约束

    添加了外键约束后,从表的添加和修改受约束

	4)5个约束等级
	* Cascade方式:在父表上update/delete记录时,同步update/delete掉子表的匹配记录 

    * Set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要		注意子表的外键列不能为not null  

    * No action方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操		作  

    * Restrict方式:同no action, 都是立即检查外键约束

    * Set default方式(在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置	成一个默认的值,但Innodb不能识别
    
    5)如何在建表时指定外键约束
    create table 【数据名.】表名(
	字段名1 数据类型  primary key ,
	字段名2 数据类型 【unique key】,
	....,
    foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级【
    #外键只能在所有字段列表后面单独指定
);

    create table 【数据名.】表名(
        字段名1 数据类型,
        字段名2 数据类型,
		....,
    primary key(复合主键字段列表),#如果是复合主键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加primary key
    unique key(复合唯一字段列表),#如果是复合唯一键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加unique key
    foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级【
    #外键只能在所有字段列表后面单独指定
);

	6)如何在建表后指定外键约束
	alter table表名称 add 【constraint 约束名】 foreign key (从表字段名) references 主表名(主表被参照字段名) 【on update xx】[on delete xx];
	
	7)如何删除外键约束
	ALTER TABLE 表名称 DROP FOREIGN KEY 外键约束名;
#查看约束名 SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';
#删除外键约束不会删除对应的索引,如果需要删除索引,需要用ALTER TABLE 表名称 DROP INDEX 索引名;
#查看索引名 show index from 表名称;

非空约束:not null
	NOT NULL 非空约束,规定某个字段不能为空
	
	
	1)如何在建表时给某个字段指定非空约束
	create table 【数据名.】表名(
	字段名1 数据类型  primary key ,
	字段名2 数据类型 【unique key】 【not null】,
	....,
    foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级【
    #外键只能在所有字段列表后面单独指定
);

    create table 【数据名.】表名(
        字段名1 数据类型 【not null】,
        字段名2 数据类型 【not null】,
        ....,

	建立函数索引
	方式一:
	create index test_id_fbi_idx on test(round(id));
	方式二: 
	alter table tb_products add index idx_product_keyword(tb_web_keyword);
	
	删除:
	drop index idx_product_keyword on tb_products;

	展示:
	show index from tb_products;
	
    primary key(复合主键字段列表),#如果是复合主键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加primary key
    unique key(复合唯一字段列表),#如果是复合唯一键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加unique key
    foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级【
    #外键只能在所有字段列表后面单独指定
);

	2)如何在建表后指定某个字段非空
	ALTER TABLE 表名称 MODIFY 字段名 数据类型 NOT NULL 【default 默认值】;
#如果该字段原来设置了默认值约束,要跟着一起再写一遍,否则默认值约束会丢失

	3)如何在建表后取消某个字段非空
	ALTER TABLE 表名称 MODIFY 字段名 数据类型 【default 默认值】;
#如果该字段原来设置了默认值约束,要跟着一起再写一遍,否则默认值约束会丢失

默认值约束:default

	1)如何在建表时给某个字段指定默认约束
	create table 【数据名.】表名(
	字段名1 数据类型  primary key ,
	字段名2 数据类型 【unique key】 【not null】 【default 默认值】,
	....,
    foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级【
    #外键只能在所有字段列表后面单独指定
);

    create table 【数据名.】表名(
        字段名1 数据类型 【not null】 【default 默认值】,
        字段名2 数据类型 【not null】 【default 默认值】,
        ....,
    primary key(复合主键字段列表),#如果是复合主键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加primary key
    unique key(复合唯一字段列表),#如果是复合唯一键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加unique key
    foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级【
    #外键只能在所有字段列表后面单独指定
);

	2)如何在建表后指定某个字段的默认值约束
	ALTER TABLE 表名称 MODIFY 字段名 数据类型  【default 默认值】 【NOT NULL】;
#如果该字段原来设置了非空约束,要跟着一起再写一遍,否则非空约束会丢失

	3)如何在建表后取消某个字段的默认值约束
	ALTER TABLE 表名称 MODIFY 字段名 数据类型 【NOT NULL】;
#如果该字段原来设置了非空约束,要跟着一起再写一遍,否则非空约束会丢失

检查约束:check  检查约束,mysql暂不支持

自增约束:auto_increment

	1)关于自增长auto_increment:
	* 一个表最多只能有一个自增长列
    * 自增长列必须是键列(主键列,唯一键列,外键列),并且要求非空。
    * 自增列必须是整数类型
    * InnoDB表的自动增长列可以手动插入,但是插入的值如果是空或者0,则实际插入的将是自动增		长后的值。
    
    2)如何在建表时指定自增长列
    create table 【数据名.】表名(
	字段名1 数据类型  primary key auto_increment,
	字段名2 数据类型 【unique key】 【not null】 【default 默认值】,
	....
);

    或
    create table 【数据名.】表名(
        字段名1 数据类型  primary key ,
        字段名2 数据类型 【unique key  not null】 auto_increment,
        ....
);

	3)如何在建表后指定自增长列
	alter table 【数据名.】表名 modify 自增字段名 数据类型 auto_increment;
	
	4)如何删除自增约束
	alter table 【数据名.】表名 modify 自增字段名 数据类型;

4.DCL

数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制
数据库操纵事务发生的时间及效果,对数据库实行监视等。如:

  1. GRANT:授权。

  2. REVOKE:废除数据库中某用户的权限

  3. ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。

  4. COMMIT [WORK]:提交。

1.创建用户:create user 用户名 identified by 密码;
	2.删除用户:drop user 用户名;
	3.给用户授权:grant 权限 on 库名.表名 to 用户名@主机名 identified by 密码;
	4.撤消用户权限:revoke 权限 on 库名.表名 from 用户名@主机名
		eg:#创建用户--不存在用户,如果用户存在会报错
		create user abc IDENTIFIED by '123';

		#给用户授权
		grant all on db_myschool.* to abc@localhost identified by '123';

		#撤消权限
		revoke all on db_myschool.t_student from abc@localhost;

		#删除用户
		drop user abc;

四:数据的完整性

数据库最重要的就是数据的完整性

  • 完整性:数据的可靠性和准确性.
  • 数据完整性:实体完整性,域完整性,引用完整性,自定义完整性.
  • 实体完整性:主键约束,唯一约束,标识列.
    注意:一般情况下,每张表都要有一个主键.
  • 域完整性:数据类型,默认约束,非空,检查约束(check).
    注意:MySql5.5之后不支持检查约束
  • 引用完整性:外键约束.
    外键约束的优点:保护数据的安全性
    缺点:效率低
    综合外键约束的优缺点:一般不建立外键约束.
  • 自定义完整性:规则、存储过程、触发器

五:数据库备份

第一种用sql命令备份:用管理员身份运行cmd->cd MySql安装目录\bin->输入命令:
mysqldump -u 用户名 -p 数据库名>文件路径\文件名.sql;

第二种用Navicat备份:在Navicat中选中数据库名->右键->转存为Sql文件->选择文件保存的文件夹->关闭.

六:数据库还原(还原数据库中表及数据)

第一种用sql命令还原:用管理员身份运行cmd->用sql命令登录MySql数据库->创建 数据库->use 数据库名->用命令还原数据:source 文件路径\文件名.sql;

第二种用Navicat还原:在Navicat中选中链接->创建数据库->选中数据库->右键-> 运行Sql文件->选择之前备份的Sql文件->开始->关闭

七:事务

数据库的最小的执行单元.由一条到多条Sql语句组成一个逻辑执行单位,事务中Sql语句要么同时执行成功,要么同时执行失败,如果事务中有一条Sql语句执行失败就全部失败.

事务的作用:保护数据安全性.
事务的特性(ACID):
  • 原子性(Atomicity):事务中Sql语句不能再分,要么同时执行成功,要么同时执行失败.
  • 一致性(Consistency):事务执行之前和执行之后,事务中数据的总状态不变.
  • 隔离性(Isolation):事务与事务之间是彼此隔离,互不干扰的.
  • 持久性(Durability):事务提交之后对数据库的更改将是永久.
事务的常用方法

注意:默认情况,MySql数据库中一条Sql一个事务,自动提交.不想用默认事务,手动开启事务数据库

开启事务  start transaction;			 
提交事务  commit;						
回滚事务  rollback;	
设置保存点 savepoint 保存点名
回滚到保存点 rollback [to] 保存点名

        eg:#开启手动事务
        start TRANSACTION

        update t_bank set money=money-200 where acount=1;

        #设置保存点
        SAVEPOINT a;

        update t_bank set money=money+200 where acount=2;

        #提交事务
        commit;

        #回滚事务
        ROLLBACK;

        #回滚到保存点,记事提交才能生效.
        ROLLBACK to a;

事务隔离错误

在数据库的事务中不允许出现的现象.但是有的错误不影响Java程序

  • 脏读:一个线程中事务读取另一个线程中事务没有提交数据.(程序不允许)
  • 不可重复读:一个线程中事务读到另一个线程中事务刚刚提交修改的数据
  • 幻读(虚读):一个线程中事务读取另一个线程中事务刚刚提交的新增的数据
事务隔离级别

安全性越高,执行效率越低,安全性越低,执行效率越高

  • DEFAULT :这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
  • 未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生
  • 已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
  • 可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
  • 串行化的 (serializable) :避免以上所有读问题.

Mysql 默认:可重复读
Oracle 默认:读已提交

注意:Oracle数据库默认采用READ COMMITTED隔离级别.
MySql数据库默认采用REPEATABLE READ 隔离级别.


查询数据库隔离级别:select @@tx_isolation;//查看当前的隔离级别
		设置事务的隔离级别:set global/session transaction isolation level 级别;// 					设置当前的事务隔离级别(注意每次修改事务隔离级别后,要重新连接					登录数据库,才能生效)
            eg:#查看MySql数据库的事务隔离级别
            select @@tx_isolation

            #设置事务隔离级别成功后,要重新登录才能看到
            set GLOBAL TRANSACTION ISOLATION LEVEL read UNCOMMITTED;

            set GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ ;

            #开启事务
            start TRANSACTION;

            select * from t_bank;

            update t_bank set money=1200 where acount=1;

            insert into t_bank(acount,name,money) values('3','王五',1000);

            #提交事务
            COMMIT;

            #回滚事务
            ROLLBACK;

八:经典问题

1、命令行操作sql乱码问题

原因:安装数据库时选择utf8,服务器端认为你的客户端的字符集是utf-8,而实际上你的客户端的字符集是GBK。

2、忘记root用户密码问题

1:通过任务管理器或者服务管理,关掉mysqld(服务进程)

2:通过命令行+特殊参数开启mysqld

mysqld --skip-grant-tables

3:此时,mysqld服务进程已经打开,并且,不需要权限检查.

4:mysql -uroot 无密码登陆服务器.

5: 修改权限表

(1) use mysql;

(2) update user set Password = password(‘123456’) where User = ‘root’;

(3)flush privileges;

6:通过任务管理器,关掉mysqld服务进程.

7:再次通过服务管理,打mysql服务。

8:即可用修改后的新密码登陆.

3、查看字符集和校对规则

关于SQL的关键字和函数名等不区分大小写,但是对于数据值是否区分大小写,和字符集与校对规则有关。

_ci(大小写不敏感),_cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关)

utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。
utf8_general_ci 校对速度快,但准确度稍差。
utf8_unicode_ci 准确度高,但校对速度稍慢。

如果你的应用有德语、法语或者俄语,请一定使用utf8_unicode_ci。一般用utf8_general_ci就够了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值