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主要有三种形式:
- 插入: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...);
- 更新:UPDATE
修改表中数据:语法:update 表名 set 列名1=新值1,列名2=新值2...[where 条件]
- 删除: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用来授予或回收访问数据库的某种特权,并控制
数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
-
GRANT:授权。
-
REVOKE:废除数据库中某用户的权限
-
ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
-
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就够了。
本文详细介绍了MySQL数据库的基础知识,包括数据库的概念、DBS、DB、DBA和DBMS。接着深入讲解了MySQL的特点,以及如何设置MySQL编码。SQL作为结构化查询语言,其主要组成部分包括DDL、DML、DQL和DCL,文中逐一阐述了它们的用途和语法。在DQL部分,详细解析了查询、分组、排序、子查询和联表查询等操作。此外,还探讨了数据完整性、事务处理、数据库备份与还原以及一些常见问题的解决方案。最后,提到了数据库的事务隔离级别及其影响。

1万+

被折叠的 条评论
为什么被折叠?



