当前位置:网站首页>MySQL学习
MySQL学习
2022-08-05 01:11:00 【小波(学习版)】
一、MySQL安装和卸载
1.安装完毕之后:管理员模式下进入黑窗口启动mysql
2.用命令 mysql -u root -p 进入mysql管理界面
3.进入界面后更改root密码
update mysql.user set authentication_string=password(‘123456’) where user=‘root’ and Host = ‘localhost’;
4.刷新权限
flush privileges;
5.修改mysql安装目录下的my.ini文件删除最后一句skip-grant-tables
6.配置好环境之后,不需要进入mysql安装目录即可在任意地方启动
7.重新启动mysql即可正常使用
net start mysql // 启动
net stop mysql //结束
8.安装工具SQLyog
二、MySQL语法
1.数据库操作
创建数据库 : create database [if not exists] 数据库名;
删除数据库 : drop database [if exists] 数据库名;
查看数据库 : show databases;
使用数据库 : use 数据库名;
创建数据表
语法:
create table [if not exists] `表名`(
`字段名1` 列类型 [属性][索引][注释],
`字段名2` 列类型 [属性][索引][注释],
`字段名3` 列类型 [属性][索引][注释],
#...
`字段名n` 列类型 [属性][索引][注释],
)[表类型][表字符集][注释];
说明:反引号用于区别MySQL保留字与普通字符而引入的(键盘esc下面的键)
数据值和列类型
列类型:规定数据库中该列存放的数据类型
数值类型
tinyint: 非常小的数据 1字节
smallint : 较小的数据 2字节
mediumint:中等大小的数据 3字节
int: 标准整数 4字节
字符串类型
char[]: 固定长字符串,检索快但废空间 M字符
varchar[]: 可变字符串 变长度
tinytext: :微型文本串
text: 文本串
日期和时间型数据类型
DATE: YYYY-MM-DD,日期格式
TIME: Hh:mm:ss, 时代格式
DATETIME: YY-MM-DD hh:mm:ss
TIMESTAMP:YYYYMMDDhhmmss 格式表示的时间戳
YEAR: YYYY格式的年份值
Null值
未知值/没有值 不要用Null进行算术运算,结果仍未Null
数据字段属性:
Unsigned:无符号 声明该数据列不允许负数
ZEROFILL:0填充的 不足位数的用0来填充,如int(3),则为005
Auto_inCrement:
自动增长的,每添加一条数据,自动在上一个记录数上加1(默认)
通常用于设置主键,且为整数类型,可定义起始值和步长,当前表设置步长时,只影响当前表,[email protected]@auto_increment_increment=5;影响所有使用自增的表(全局)
NULL和NOT NULL:默认为null,如果设置为not null,则该列必须有值
DEFAULT:默认的;用于设置默认值
例如:性别字段:默认‘男’,否则为‘女;若无指定该列的值,则默认值为‘’男’的值
例题:创建一个school数据库,创建学生表(列,字段) ,学号int 登录密码varchar(20) 姓名,性别varchar(2),出生日期(datatime),家庭住址,email 创建表之前 , 一定要先选择数据库
show create database wei //查看数据库的定义
show create table student // 查看数据表的定义
desc student //显示表的结构
USE wei
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '生日',
`address` VARCHAR(100) DEFAULT NULL COMMENT '地址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
DESC student
数据表的类型:
设置数据表的类型:
create table 表名(
省略一些代码 MySQL注释 #单行注释 /**/ 多行注释)engine = myisam(or innodb)
show engines #查看mysql所支持的引擎类型(表类型)
适用场合:
节约空间及相应速度–MyISAM
安全性,事务处理及多用户操作数据表=InnoDB
数据表的存储位置
MySQL数据表以文件方式存在磁盘中,包括表文件,数据文件,以及数据库中的选项文件
位置:Mysql安装目录\data\下存放数据表,目录名对应数据库名,该目录下文件名对应数据表
*.frm - 表结构定义文件
*.MYD - 数据文件(data)
*.MYI - 索引文件(index)
设置数据表字符集
我们可以为数据库,数据表,数据列设定不同的字符集,设定方法为:
创建时通过命令来设置,如果:create table 表名() charset = uft8
如无设定,根据MySQL数据库配置文件my.ini中的参数设定
2.修改数据库
修改表:alter table
修改表名:alter table 旧表名 rename as 新表名
添加字段:alter table 表名 add字段名 列属性[属性]
修改字符:alter table 表名 modify 字段名 列类型[属性] /alter table 表名 change 旧字段名 新字段名 列属性[属性]
删除字符:alter table 表名 drop 字段名
删除数据表
语法:drop table if exists 表
- if exist 为可选,判断是否存在该数据表
- 如删除不存在的数据表会抛出错误
其他
1.每个库目录存在一个保存当前数据库的选项文件dp.opt
2.注释:#单行 /**/多行
3.SQL对大小写不敏感
4.清除已有语句:\c
外键:
将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值,此时,第二个表中保存这些值的属性成为外键
作用:保持数据一致性,完整性,主要目的是控制存储在外键表中的数据约束,使两张表形成关联,外键只能引用外表中的列的值或适用空值
创建外键
建表时指定外键约束:
创建外键的方式一:创建子表同时创建外键
//年级表
CREATE TABLE `grade`(
`gradeid`INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',
`gradename`VARCHAR(50) NOT NULL COMMENT '年级名称' ,
PRIMARY KEY(`gradeid`)
)ENGINE= INNODB DEFAULT CHARSET=utf8
//学生信息表(学号,姓名,性别,年级,手机,地址,出生日期,邮箱,身份证号)
CREATE TABLE `student` (
`studentno` INT(4) NOT NULL COMMENT '学号',
`studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` TINYINT(1) DEFAULT '1' COMMENT '性别',
`gradeid` INT(10) DEFAULT NULL COMMENT '年级',
`phoneNum` VARCHAR(50) NOT NULL COMMENT '手机',
`address` VARCHAR(255) DEFAULT NULL COMMENT '地址',
`borndate` DATETIME DEFAULT NULL COMMENT '生日',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
PRIMARY KEY (`studentno`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
创建外键方式二:创建子表完毕后,修改子表添加外键
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);
删除外键
操作:删除grade表,删除具有主外键关系的表时,要先删子表,后删主表
删除外键:later table student drop foreign key FK_gradeid;
索引还在,所以要删除索引 : alter table student drop index FK_gardeid;
3.DML语言
数据库的意义:数据存储,数据管理
1.通过sqlyog等管理工具管理数据库数据 -
2.同通过DML语句管理数据库数据
DML:数据库操作语言 用于操作数据库对象中所包含的数据
包括:inset(添加数据语句) updata(更行数据语句) delete(删除数据语句)
添加数据
语法:insert into 表名[(字段1,字段2,字段3…)]VALUES(值1
,值2
…)
注意:可同时插入多条数据,values后用英文逗号隔开
USE wei
INSERT INTO grade(gradename) VALUES('大二');
//添加的值务必与表结构,数据列,顺序相对应,且数量一致
//一次插入多条数据
INSERT INTO grade(gradename) VALUES('大四'),('研究生');
修改数据
语法:update 表名 set column_name=value[,column_name2 = value2,…][where condition];
注意:column_name为要更改的数据列 condition为筛选条件,如不指定则修改该表的所有列数据
where条件子句
修改年级年级信息
UPDATE grade SET gradename = '高中' WHERE gradeid = 1;
删除数据
语法:delete from 表名[where condition];
注意:condition为筛选条件,如不指定则删除该表的所有列数据
删除最后一个数据
DELETE FROM grade WHERE gradeid = 5
TRUNCATE命令
作用:用于完全清空表数据,但表结构,索引,约束等不变
语法:TURNCATE [table] table_name;
清空年级表
TRUNCATE grade
注意区别与delete命令:
相同:都能删除数据,不删除表结构,但truncate速度更快
不同:适用truncate table重新设置atuo_increment计时器,适用truncate table不会对事务有影响
测试:
//创建一个测试表
CREATE TABLE `test` (
`id` INT(4) NOT NULL AUTO_INCREMENT,
`coll` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
//插入几个测试数据
INSERT INTO test(coll) VALUES('row1'),('row2'),('row3');
//删除表数据(不带WHERE条件的DELETE)
DELETE FROM test;
//结论:如不指定WHERE则删除该表的所有数据,自增当前值依然可以从原来基础上进行,会记录日志
//删除表数据(TRUNCATE)
TRUNCATE TABLE test;
DESC test
//结论:TRUNCATE删除数据,自增当前值会恢复到初始值重新开始,不会记录日志
//同样适用DELETE清空不同引擎的数据库数据
4.DQL语言
DQL(数据查询语言)
1.查询数据库数据,如select语句
2.简单的单表查询或夺标的复杂查询和嵌套查询
3.是数据库语言中最核心最重要的语句
4.使用频率最高的语句
select语法
SELECT [ALL | DISTINCT]
{
* | table.* | [table.field1[AS alias1][,table.field2[AS alias2]][,...]]}
FROM table_name [AS table_alias]
[LEFT | RIGHT | INNER JOIN table_name2] -- 联合查询
[WHERE ...] -- 指定结果需满足的条件
[GROUP BY ...] -- 指定结果按照哪几个字段来分组
[HAVING] -- 过滤分组的记录必须满足的次要条件
[ORDER BY ...] -- 指定查询记录按一个或多个条件排序
[LIMIT {
[OFFSET,]ROW_COUNT | row_countOFFSET OFFSET}];
-- 指定查询的记录从哪条至哪条
[]代表可选,{}代表必选
指定查询字段
查询所有学生信息:
SELECT * FROM student;
SELECT studentno,studentname FROM student;
AS子句作为别名
作用:可给数据列取一个新的别名,给表取一个新的别名,可把经计算或总给的结果用另一个新名称来代替
SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;
SELECT CONCAT('姓名',studentname)AS 新姓名 FROM student;
distinct关键词使用
作用:去掉select查询返回的记录结果中重复的记录(返回所有列的值都相同,只返回一条)
# 查看哪些同学参加了考试(学号) 去除重复项
SELECT * FROM result; -- 查看考试成绩
SELECT studentno FROM result; -- 查看哪些同学参加了考试
SELECT DISTINCT studentno FROM result; -- 了解:DISTINCT 去除重复项 , (默认是ALL)
使用表达式的列
数据库中的表达式:一般由文本值,列值,null,函数和操作符等组成
where条件语句
作用:用于检索数据表中符合条件的记录
搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假
逻辑操作符
-- 满足条件的查询(where)
SELECT Studentno,StudentResult FROM result;
-- 查询考试成绩在95-100之间的
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult>=95 AND StudentResult<=100;
-- AND也可以写成 &&
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult>=95 && StudentResult<=100;
-- 模糊查询(对应的词:精确查询)
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult BETWEEN 95 AND 100;
-- 除了1000号同学,要其他同学的成绩
SELECT studentno,studentresult
FROM result
WHERE studentno!=1000;
-- 使用NOT
SELECT studentno,studentresult
FROM result
WHERE NOT studentno=1000;
模糊查询:比较操作符
-- LIKE
-- 查询姓刘的同学的学号及姓名
-- like结合使用的通配符 : % (代表0到任意个字符) _ (一个字符)
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘%';
-- 查询姓刘的同学,后面只有一个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘_';
-- 查询姓刘的同学,后面只有两个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘__';
-- 查询姓名中含有 嘉 字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '%嘉%';
-- 查询姓名中含有特殊字符的需要使用转义符号 '\'
-- 自定义转义符关键字: ESCAPE ':'
-- IN
-- 查询学号为1000,1001,1002的学生姓名
SELECT studentno,studentname FROM student
WHERE studentno IN (1000,1001,1002);
-- 查询地址在北京,南京,河南洛阳的学生
SELECT studentno,studentname,address FROM student
WHERE address IN ('北京','南京','河南洛阳');
-- NULL 空
-- 查询出生日期没有填写的同学
-- 不能直接写=NULL , 这是代表错误的 , 用 is null
SELECT studentname FROM student
WHERE BornDate IS NULL;
-- 查询出生日期填写的同学
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;
-- 查询没有写家庭住址的同学(空字符串不等于null)
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;
连接查询
join对比:
inner join:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集
left join:左表的记录将会全部表现出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为null
right join: 左边只会显示符合搜索条件的记录,而右表会全部显示出来,左表记录不足的地方均为null
全连接union:通过union连接的sql它们分别单独取出列数必须相同;不要求合并的列名称相同时,以第一个sql表列名为准
/* 连接查询 如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询 内连接 inner join 查询两个表中的结果集中的交集 外连接 outer join 左外连接 left join (以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充) 右外连接 right join (以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充) 等值连接和非等值连接 自连接 */
-- 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
SELECT * FROM student;
SELECT * FROM result;
/*思路: (1):分析需求,确定查询的列来源于两个类,student result,连接查询 (2):确定使用哪种连接查询?(内连接) */
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
-- 右连接(也可实现)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
RIGHT JOIN result r
ON r.studentno = s.studentno
-- 等值连接
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s , result r
WHERE r.studentno = s.studentno
-- 左连接 (查询了所有同学,不考试的也会查出来)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
-- 查一下缺考的同学(左连接应用场景)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
WHERE StudentResult IS NULL
-- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON sub.subjectno = r.subjectno
自连接
数据表与自身进行连接,需求:从一个包含栏目ID , 栏目名称和父栏目ID的表中 查询父栏目名称和其他子栏目名称
排序和分页
语法 : ORDER BY
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照ASC升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
-- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
-- 按成绩降序排序
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC
分页:
-- 每页显示5条数据
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5
-- 查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='JAVA第一学年'
ORDER BY StudentResult DESC
LIMIT 0,10
子查询
什么是子查询?
在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句,嵌套查询可由多个子查询组成,求解的方式是由里及外;子查询返回的结果一般都是集合,故而建议使用IN关键字;
-- 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列
-- 方法一:使用连接查询
SELECT studentno,r.subjectno,StudentResult
FROM result r
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE subjectname = '数据库结构-1'
ORDER BY studentresult DESC;
-- 方法二:使用子查询(执行顺序:由里及外)
SELECT studentno,subjectno,StudentResult
FROM result
WHERE subjectno=(
SELECT subjectno FROM `subject`
WHERE subjectname = '数据库结构-1'
)
ORDER BY studentresult DESC;
5.MySQL函数
数据函数
SELECT ABS(-8); //绝对值
SELECT CEILING(9.4); //向上取整
SELECT FLOOR(9.4); //向下取整
SELECT RAND(); //随机数,返回一个0-1之间的随机数
SELECT SIGN(0); //符号函数: 负数返回-1,正数返回1,0返回0
字符串函数
SELECT CHAR_LENGTH(‘狂神说坚持就能成功’); //返回字符串包含的字符数
SELECT CONCAT(‘我’,‘爱’,‘程序’); //合并字符串,参数可以有多个
SELECT INSERT(‘我爱编程helloworld’,1,2,‘超级热爱’); //替换字符串,从某个位置开始替换某个长度
SELECT LOWER(‘KuangShen’); //小写
SELECT UPPER(‘KuangShen’); //大写
SELECT LEFT(‘hello,world’,5); //从左边截取
SELECT RIGHT(‘hello,world’,5); //从右边截取
SELECT REPLACE(‘狂神说坚持就能成功’,‘坚持’,‘努力’); //替换字符串
SELECT SUBSTR(‘狂神说坚持就能成功’,4,6); //截取字符串,开始和长度
SELECT REVERSE(‘狂神说坚持就能成功’); /*反转
日期和时间函数
SELECT CURRENT_DATE(); //获取当前日期
SELECT CURDATE(); //获取当前日期
SELECT NOW(); //获取当前日期和时间
SELECT LOCALTIME(); //获取当前日期和时间
SELECT SYSDATE(); //获取当前日期和时间
– 获取年月日,时分秒
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
SELECT HOUR(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW());
聚合函数
COUNT() 返回满足Select条件的记录总和数,如 select count(*) 【不建议使用 *,效率低】
SUM() 返回数字字段或表达式列作统计,返回一列的总和。
AVG() 通常为数值字段或表达列作统计,返回一列的平均值
MAX() 可以为数值字段,字符字段或表达式列作统计,返回最大的值。
MIN() 可以为数值字段,字符字段或表达式列作统计,返回最小的值
MD5加密
1.简介:MD5是计算机广泛使用的杂凑算法之一,是杂凑算法的基础原理
2.实现数据加密
//创建一个新的表bo
CREATE TABLE `bo` (
`id` INT(4) NOT NULL,
`name` VARCHAR(20) NOT NULL,
`pwd` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
//插入一些数据
INSERT INTO bo VALUES(1,'wuhu','123456'),(2,'aha','456789')
//对pwd这一些列数据进行加密
update testmd5 set pwd = md5(pwd);
//单独对某个用户的密码进行加密
INSERT INTO bo VALUES(3,'yahu','123456')
update bo set pwd = md5(pwd) where name = 'yahu';
//插入新的数据进行加密
INSERT INTO bo VALUES(4,'aha',md5('123456'));
//查询登录用户信息(md5对比使用,查看用户输入密码后的面膜进行对比)
SELECT * FROM testmd5 WHERE `name`='aha' AND pwd=MD5('123456');
数值函数:
abs(x) – 绝对值 abs(-10.9) = 10
format(x, d) – 格式化千分位数值 format(1234567.456, 2) = 1,234,567.46
ceil(x) – 向上取整 ceil(10.1) = 11
floor(x) – 向下取整 floor (10.1) = 10
round(x) – 四舍五入去整
mod(m, n) – m%n m mod n 求余 10%3=1
pi() – 获得圆周率
pow(m, n) – m^n
sqrt(x) – 算术平方根
rand() – 随机数
truncate(x, d) – 截取d位小数
时间日期函数:
– 时间日期函数
now(), current_timestamp(); – 当前日期时间
current_date(); – 当前日期
current_time(); – 当前时间
date(‘yyyy-mm-dd hh:ii:ss’); – 获取日期部分
time(‘yyyy-mm-dd hh:ii:ss’); – 获取时间部分
date_format(‘yyyy-mm-dd hh:ii:ss’, ‘%d %y %a %d %m %b %j’); – 格式化时间
unix_timestamp(); – 获得unix时间戳
from_unixtime(); – 从时间戳获得时间
字符串函数:
length(string) – string长度,字节
char_length(string) – string的字符个数
substring(str, position [,length]) – 从str的position开始,取length个字符
replace(str ,search_str ,replace_str) – 在str中用replace_str替换search_str
instr(string ,substring) – 返回substring首次在string中出现的位置
concat(string [,…]) – 连接字串
charset(str) – 返回字串字符集
lcase(string) – 转换成小写
left(string, length) – 从string2中的左边起取length个字符
load_file(file_name) – 从文件读取内容
locate(substring, string [,start_position]) – 同instr,但可指定开始位置
lpad(string, length, pad) – 重复用pad加在string开头,直到字串长度为length
ltrim(string) – 去除前端空格
repeat(string, count) – 重复count次
rpad(string, length, pad) --在str后用pad补充,直到长度为length
rtrim(string) – 去除后端空格
strcmp(string1 ,string2) – 逐字符比较两字串大小
聚合函数:
count()
sum();
max();
min();
avg();
group_concat()
其他常用函数:
md5();
default();
6.事务和索引
事务:将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内所有的SQL都将被取消执行,MySQL事务数理只支持InnoDB和BDB数据表类型
事务的原则:
原子性:要么全部完成,要么全部不完成
一致性:事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少
隔离性:隔离状态执行事务,是它们好像是系统在给定时间内执行的唯一操作
持久性:在事务完成以后,该事务对数据库所作的更改便持久的保持在数据库之中,并不会被回滚
基本语法
-- 使用set语句来改变自动提交模式
SET autocommit = 0; /*关闭*/
SET autocommit = 1; /*开启*/
-- 注意:
--- 1.MySQL中默认是自动提交
--- 2.使用事务时应先关闭自动提交
-- 开始一个事务,标记事务的起始点
START TRANSACTION
-- 提交一个事务给数据库
COMMIT
-- 将事务回滚,数据回到本次事务的初始状态
ROLLBACK
-- 还原MySQL数据库的自动提交
SET autocommit =1;
-- 保存点
SAVEPOINT 保存点名称 -- 设置一个事务保存点
ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 删除保存点
测试:
A在线买一款价格为500元商品,网上银行转账.
A的银行卡余额为2000,然后给商家B支付500.
商家B一开始的银行卡余额为10000
//创建数据库shop和创建表account并插入2条数据
CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `shop`;
CREATE TABLE `account` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`cash` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO account (`name`,`cash`)
VALUES('A',2000.00),('B',10000.00)
//转账实现
SET autocommit = 0; //关闭自动提交
START TRANSACTION; //开始一个事务,标记事务的起始点
UPDATE account SET cash=cash-500 WHERE `name` = `A`;
UPDATE account SET cash=cash+500 WHERE `name` = `B`;
COMMIT; //提交事务
SET autocommit = 1; //恢复自动提交
索引
索引的作用:提高查询速度,确保数据的唯一性,可以加速表和表之间的连接,实现表与表之间的参照完整性,使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间,全文检索字段进行搜索优化
分类
主键索引,唯一索引,常规索引,全文索引
主键索引:某一个属性组能唯一标识一条记录,最常见的的索引类型,确保数据记录的唯一性
唯一索引:避免同一个表中某数据列中的值重复,主键索引只能由一个,唯一索引可能有多个
常规索引:快速定位特定数据,index和key关键词都可以设置常规索引
全文索引:快速定位特定数据
备份
– 导出 -w可携带备份条件
- 导出一张表 – mysqldump -uroot -p123456 school student >D:/a.sql mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:/a.sql)
- 导出多张表 – mysqldump -uroot -p123456 school student result >D:/a.sql mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 文件名(D:/a.sql)
- 导出所有表 – mysqldump -uroot -p123456 school >D:/a.sql mysqldump -u用户名 -p密码 库名 > 文件名(D:/a.sql)
- 导出一个库 – mysqldump -uroot -p123456 -B school >D:/a.sql mysqldump -u用户名 -p密码 -B 库名 > 文件名(D:/a.sql)
如有错误,请及时指正!如有侵权,联系删除
参考文章:狂神说
边栏推荐
- ora-00604 ora-02429
- 2022 Hangzhou Electric Power Multi-School Session 3 K Question Taxi
- Bit rate vs. resolution, which one is more important?
- 4. PCIe interface timing
- 手把手基于YOLOv5定制实现FacePose之《YOLO结构解读、YOLO数据格式转换、YOLO过程修改》
- 新唐NUC980使用记录:在用户应用中使用GPIO
- ORA-00257
- 【机器学习】21天挑战赛学习笔记(二)
- 从一次数据库误操作开始了解MySQL日志【bin log、redo log、undo log】
- 方法重写与Object类
猜你喜欢
ORA-01105 ORA-03175
A new technical director, who calls DDD a senior, is convinced
习题:选择结构(一)
5. PCIe official example
Countdown to 1 day!From August 2nd to 4th, I will talk with you about open source and employment!
[How to smash wool according to the music the couple listens to during the Qixi Festival] Does the background music affect the couple's choice of wine?
活动推荐 | 快手StreamLake品牌发布会,8月10日一起见证!
软件基础的理论
[Redis] Redis installation under Linux
Day Fourteen & Postman
随机推荐
Day Fourteen & Postman
如何发现一个有价值的 GameFi?
oracle create user
Kubernetes 网络入门
蓝牙Mesh系统开发四 ble mesh网关节点管理
Creative code confession
安装oracle11的时候为什么会报这个问题
2022 Hangzhou Electric Power Multi-School Session 3 K Question Taxi
Three handshake and four wave in tcp
Software testing interview questions: the difference and connection between black box testing, white box testing, and unit testing, integration testing, system testing, and acceptance testing?
Are testing jobs so hard to find?I am 32 this year and I have been unemployed for 2 months. What should an older test engineer do next to support his family?
matlab 采用描点法进行数据模拟和仿真
如何用 Solidity 创建一个“Hello World”智能合约
### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionExcep
习题:选择结构(一)
Lattice PCIe 学习 1
Software Testing Interview Questions: What Are the Types of Software Testing?
Is DDOS attack really unsolvable?Do not!
PCIe Core Configuration
新来个技术总监,把DDD落地的那叫一个高级,服气