MySql

MySql安装

  • 压缩包安装,解压后放入指定的环境目录中

  • 添加环境变量,我的电脑--属性--高级设置--环境变量;将MySq的bin目录的路径放入Path中。

  • 在MySql下新建配置文件my.ini,添加以下内容,date目录会自动生成。

    [mysql]
    # 设置mysql客户端默认字符集
    default-character-set=utf8
    [mysqld]
    #设置3306端口
    port = 3306
    # 设置mysql的安装目录
    basedir=D:\Environments\mysql-5.7.31\mysql-5.7.31\
    # 设置mysql数据库的数据的存放目录
    datadir=D:\Environments\mysql-5.7.31\mysql-5.7.31\data\
    # 允许最大连接数
    max_connections=200
    # 服务端使用的字符集默认为8比特编码的latin1字符集
    character-set-server=utf8
    # 创建新表时将使用的默认存储引擎
    default-storage-engine=INNODB
    #第一次跳过密码验证
    skip-grant-tablesini
  • 启动管理员模式下的CMD,将路径切换到MySql的bin目录下,输入mysqld -install(安装mysql)。

  • 输入mysqld --initialize-lnsecure --user=mysql 初始化数据文件。

  • 输入net start mysql启动mysql服务,再输入mysql -u root -p进入mysql管理界面,按两次回车。

  • 输入update mysql .user set authentication string=password('123456') where user='root' and Host = 'localhost'; 后回车。

  • flush privileges刷新权限。

  • 删除my.ini最后一句skip-grant-tablesini。

  • 启动:net start mysql;关闭:net stop mysql。

连接数据库

CMD命令行连接:mysql -u root -p123456

查看所有的数据库:show databases;

切换数据库:use school; (use 数据库名)

查看数据库中所有的表:show tables;

查看表中的所有信息:describe student;

创建数据库:create database west;

sql的注释: --

操作数据库

创建数据库:creat database (if not exists) west;

删除数据库:drop database(if exists) west;

使用数据库:use school;如果表名或者字段名是一个特殊字符,需要带``。

查看所有的数据库:show databases;

数据库的列类型

数值

  • tinyint 十分小的数据 一个字节
  • smallint 较小的数据 两个字节
  • mediumint 中等大小 三个字节
  • int 标准的整数 四个字节 常用的
  • bigint 较大的数据 八个字节
  • float 浮点数 四个字节
  • double 浮点数 八个字节
  • decimal 字符串形式的浮点数 金融计算的时候使用

字符串

  • char 字符串 固定大小的 0-255
  • varchar 可变字符串 0-65535 常用的
  • tinytext 微型文本 2^8-1
  • text 文本串 2^16-1

时间日期

  • date YYYY-MM-DD 日期格式
  • time HH:mm:ss 时间格式
  • datetime YYYY-MM-DD HH:mm:ss 常用的
  • timestamp 时间戳 1970.1.1到现在的毫秒数
  • year 年份表示

null:没有值,未知 。

数据库的字段属性

Unsigned:无符号

  • 无符号的整数
  • 不能声明为负数

zerofill:零填充

  • 不足的位数使用0来填充

自增:自动在上一条记录的基础上加1(默认)

  • 通常用来设计唯一的主键,必须是整数类型的
  • 可以自定义设置主键自增的起始值和步长

Null和not null

  • 如果设置为not null如果不给它赋值就会报错
  • Null:如果不赋值,默认就是NUll

创建数据库

--目标:创建一个studens数据库
--表的名字和字段尽量使用``括起来
--字符串使用单引号括起来
--语句后面加,(英文的),最后一行不加
--PRIMARY KEY设置主键,一般一个表只有一个唯一的主键
CREATE TABLE IF NOT EXISTS `students` (
`id` INT ( 4 ) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR ( 20 ) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR ( 20 ) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR ( 2 ) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`addresws` VARCHAR ( 50 ) DEFAULT NULL COMMENT '地址',
`email` VARCHAR ( 30 ) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY ( `id` )
)ENGINE INNODB DEFAULT Charset = utf8

格式

CREATE TABLE IF NOT EXISTS] '表名'(
'字段名' 列的类型[长度] [属性] [索引] [注释],
'字段名' 列的类型[长度] [属性] [索引] [注释],
'字段名' 列的类型[长度] [属性] [索引] [注释],
...
'字段名' 列的类型[长度] [属性] [索引] [注释]
)[表类型][字符集][注释]

查看创建数据库的语句

show create database school;

查看创建表的语句

show create table students;

查看表的结构

desc students;

数据库引擎engine

INNODB:默认使用

MYISAM:以前使用

INNODB MYISAM
事务支持 支持 不支持
数据行锁定 支持 不支持
外键 支持 不支持
全文索引 不支持 支持
表空间大小 较大 较小

常规使用操作:

  • MYISAM:节约空间,速度较快
  • INNODB:安全性高,事物的处理,多表多用户操作

所有的数据库文件都在date目录下,本质还是文件的存储!

MySQL引擎在物理文件上的区别:

  • INNODB:在数据库中只有一个**.frm文件,以及上级目录下的ibdata1文件
  • MYISAM:对应的文件
    • *.frm表结构的定义文件
    • *.MYD数据文件 (data)
    • *.MYI索引文件 (index)

设置数据库表的字符集编码

CHARSET=utf8

不设置的话是MySQL的默认字符集编码(不支持中文)。

在my.ini中配置默认的编码

charter-set-server=utf8

修改删除表

修改表名:ALTER TABLE 旧表名 RENAME AS 新表名

  • ALTER TABLE student RENAME AS student1;

增加字段:ALTER TABLE 表名 ADD 字段 列属性

  • ALTER TABLE student1 ADD phone int(11);

修改表的字段

  • 重命名:ALTER TABLE 表名 CHANGE 旧字段名 新字段名

    • ALTER TABLE student1 CHANGE phone phone1
  • 修改约束:ALTER TABLE 表名 MODIFY 字段名 属性
    • ALTER TABLE student1 MODIFY phone VARCHAR(11)

删除表的字段:ALTER TABLE DROP 字段名

  • ALTER TABLE student1 DROP phone1

删除表:DROP TABLE (if exists) student1

所有的创建和删除操作尽量加上判断是否存在(if exists),以免报错。

数据管理

外键

外键(了解即可):1.在创建表的时候增加约束

CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',
`gradename` VARCHAR(10) NOT null COMMENT '年级名称',
primary KEY(`gradeid`)
)ENGINE INNODB DEFAULT CHARSET=utf8 ------------------------------------------------------------------------------------------------------------
CREATE TABLE `student` (
`id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` varchar(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` datetime DEFAULT NULL COMMENT '出生日期',
`gradeid` INT(10) NOT NULL COMMENT'学生年级',
`addresws` varchar(50) DEFAULT NULL COMMENT '地址',
`email` varchar(30) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

删除有外键关系的表的时候,必须先删除引用别人的表(从表),再删除被引用的表(主表)。

2.修改表添加外键约束

  • ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 哪个表(哪个字段)

  • ALTER TABLE student ADD CONSTRAINT FK_gradeid FOREIGN KEY(gradeid) REFERENCES grade (gradeid);

以上都是物理外键,数据库级别的外键,不建议使用。(避免数据库过多造成困扰)

最佳办法:数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)。如果想使用多张表,用程序去实现(不用外键)

DML语言

DML语言

DML语言:数据操作语言。

添加

语法格式:INSERT INTO 表名(字段1,字段2,字段3...)VALUES ('值1','值2','值3'...),('值1','值2','值3'...),('值1','值2','值3'...)

--添加 一定要保证数据和字段一一对应!!!!
INSERT INTO 表名(字段1,字段2,字段3...)VALUES ('值1','值2','值3'...) --由于主键自增可以省略(如果不写表的字段,它就会一一匹配)
INSERT INTO `grade`(`gradename`) VALUES ('大一') --插入多条数据
INSERT INTO `grade`(`gradename`) VALUES ('大二'),('大三'),('大四') INSERT INTO `students`(`name`) VALUES ('张三') INSERT INTO `students`(`name`,`pwd`,`sex`)
VALUES ('张三','bbbbb','男'),('李四','bbbbb','男'),('王五','bbbbb','男') --省略字段
INSERT INTO `students` values ('5','麻子','wwww','男','2010-01-01','武汉','email')

注意

  • 字段和字段之间用英文逗号隔开
  • 字段是可以省略的,但是插入的值必须一一对应
  • 可以同时插入多条数据,每一条数据用(),隔开

修改

语法格式:update 表名 set 字段=value , 字段=value where 字段 = ?

--修改学生的名字
UPDATE `students` SET `name`='周' WHERE id = 1 --不指定条件会改动表中所有的名字
UPDATE `students` SET `name`='周' --修改多个条件
UPDATE `students` SET `name`='李',`pwd`='666666' WHERE id =2 --通过多个条件定位数据
UPDATE `students` SET `name`='王' WHERE id=4 AND sex='男' --变量
UPDATE `students` SET `birthday`=CURRENT_DATE WHERE id=4 AND sex='男'

条件:where子句, id等于某个值 大于某个值 在某个区间

操作符 含义 范围 结果
= 等于 5=6 false
<>或!= 不等于 5<>6 true
> 大于
< 小于
<= 小于等于
.>= 大于等于
BETWEEN....and... 在什么什么之间
AND &&
OR ||或

注意

  • 字段是数据库的列,尽量带上``
  • where后面是筛选的条件,如果没有指定则会修改所有的列
  • value是一个具体的值也可以是变量(比如时间,日期)
  • 多个设置属性之间用英文的逗号隔开

删除

语法格式:delete from 表名 where 条件

--删除数据
DELETE FROM `students` WHERE id=7 --删除所有数据(避免) 表的自增列不会重置
DELETE FROM `students`

TRUNCATE:完全清空一个数据库表的数据,表的结构和索引约束不变。

TRUNCATE TABLE 表名;清空表后表的自增列也会重置,计数器归0,而且不会影响事物。

CREATE TABLE `test`(
`id` INT(4) NOT NULL AUTO_INCREMENT,
`coll` VARCHAR(8) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE INNODB DEFAULT CHARSET=utf8 INSERT INTO `test`(`coll`) VALUES('1'),('2'),('3')
--不影响自增
DELETE FROM `test`
--自增归0
TRUNCATE TABLE `test`

了解:delete删除的时候,重启数据库

  • innoDB 自增列会从1开始(存在内存中的 断电即失)
  • MYISAM 继续从上一个自增两开始(存在文件中的 不会消失)

DQL查询数据(重点)

data query language:数据查询语言

  • 所有的查询操作都用它 select
  • 简单的查询,复杂的查询都能做
  • 数据库最核心的语言

查询

查询语法:SELECT 字段 FROM 表

--查询全部的学生   SELECT 字段 FROM 表
SELECT * FROM student1 --查询指定字段
SELECT `StudentNo`,`StudentName` FROM student1 --给列起别名(也可以给表起别名)
SELECT `StudentNo` AS '学号',`StudentName` AS '姓名' FROM student1 --函数 Concat(a,b)
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student1

去重

去重:distinct(去除查询结果中重复的数据)

--查询哪些同学参加了考试 有成绩
SELECT * FROM `result` --查询全部考试的成绩 SELECT `studentno` FROM `result` --查询哪些同学参加了考试
--发现重复数据 去重
SELECT DISTINCT `studentno` FROM `result`

数据库的列(表达式)

--查询系统的版本(函数)
SELECT VERSION()
--计算结果
SELECT 100*3-5 AS --计算结果
--查询自增的步长(变量)
SELECT @@AUTO_INCREMENT_INCREMENT --学生的成绩 +1
SELECT `studentno`,`studentresult`+1 AS '提1分' FROM `result`

where条件子句

作用:检索数据中符合符合条件的值

SELECT `studentno`,`studentresult` FROM `result`

--查询成绩在80-100中间的  and   &&
SELECT `studentno`,`studentresult` FROM `result` WHERE `studentresult`>=80 AND `studentresult` <=100
SELECT `studentno`,`studentresult` FROM `result` WHERE `studentresult`>=80 && `studentresult` <=100 --模糊查询(区间)
SELECT `studentno`,`studentresult` FROM `result` WHERE studentresult BETWEEN 80 AND 100 --查询学号不为1000的学生成绩 != not
SELECT `studentno`,`studentresult` FROM `result` WHERE studentno != 1000
SELECT `studentno`,`studentresult` FROM `result` WHERE NOT studentno = 1000

模糊查询

模糊查询:比较运算符

运算符 语法 描述
IS NULL a is null 如果为null 则结果为真
IS NOT NULL a is not null 如果为not null 则结果为真
BETWEEN a between b and c a在b和c之间则结果为真
LIKE a like b SQL匹配
in a in(a1,a2,a3...) 假设a在a1,a2....中
==========================================模糊查询======================================================

--查询姓张的同学
--like结合 %(代表0到任意个字符) _(一个字符)
SELECT `studentno`,`studentname` FROM `student1` WHERE studentname LIKE '张%' --查询姓赵的同学 姓后面有一个字的
SELECT `studentno`,`studentname` FROM `student1` WHERE studentname LIKE '赵_' --查询名字中带有强字的 %强%
SELECT `studentno`,`studentname` FROM `student1` WHERE studentname LIKE '%强%' =========in=============
--查询1001,1000学生信息
SELECT `studentno`,`studentname` FROM `student1` WHERE studentno in (1000,1001) --查询在北京的学生
SELECT `studentno`,`studentname` FROM `student1` WHERE address IN ('北京') ===========null not null=============== --查询生日为空的学生
SELECT `studentno`,`studentname` FROM `student1` WHERE borndate IS NULL OR borndate=''
address
--查询地址不为空的学生
SELECT `studentno`,`studentname` FROM `student1` WHERE address IS NOT NULL

连表查询

join:

==================================连表查询join===============================================
--查询参加了考试的同学(学号 姓名 科目编号 分数)
SELECT r.studentno,`studentname`,`subjectno`,`studentresult`
FROM `result` AS r
INNER JOIN `student1` AS s
WHERE r.studentno = s.studentno -- INNER JOIN语句中用ON和where都可以
--where在left和right语句中不能使用 --join on 连接查询
--where 等值查询 =====RIGHT JOIN=======
SELECT s.studentno,`studentname`,`subjectno`,`studentresult`
FROM `student1` s
RIGHT JOIN `result` r
ON s.studentno=r.studentno =====LEFT JOIN=======
SELECT s.studentno,`studentname`,`subjectno`,`studentresult`
FROM `student1` s
LEFT JOIN `result` r
ON s.studentno=r.studentno --查询缺考的同学
SELECT s.studentno,`studentname`,`subjectno`,`studentresult`
FROM `student1` s
LEFT JOIN `result` r
ON s.studentno=r.studentno
WHERE studentresult IS NULL --查询参加考试的同学的信息(学号,姓名,科目名,分数)
SELECT r.studentno,`studentname`,`subjectname`,`studentresult`
FROM `student1` s
RIGHT JOIN `result` r
ON r.studentno=s.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno --查询学生所属的年级(学号,学生姓名,年级名称)
SELECT s.studentno,studentname,gradename
FROM student1 s
INNER JOIN `grade` g
ON s.gradeid=g.gradeid --查询科目所属的年级(科目名称,年级名称)
SELECT subjectname, gradename
FROM `grade` g
INNER JOIN `subject` s
ON g.gradeid=s.gradeid --查询参加了C语言-1考试的同学(学号 姓名 科目 分数)
SELECT s.studentno,studentname,subjectname,studentresult
FROM student1 s
INNER JOIN `result` r
ON s.studentno=r.studentno
INNER JOIN `subject` sub
on r.subjectno=sub.subjectno
where subjectname='C语言-1'
操作 描述
inner join 如果表中至少有一个人匹配,就返回行
left join 会从左表中返回所有的值,即使右表中没有匹配
right join 会从右表中返回所有的值,即使左表中没有匹配

自连接(了解)

自连接:把一张表拆成两张一样的表

--查询父子信息  把一张表分为两个一样的表
SELECT a.`categoryName`AS '父栏目',b.`categoryName` AS 子栏目
FROM `category` AS a,`category` AS b
WHERE a.`categoryid`=b.`pid`

分页和排序

排序:

====================分页 limit  排序 order by=====================================
--排序: 升序asc 降序desc
--根据成绩排序
--LIMIT 0,5 1-5 从第几个开始一页显示几个
--limit 1,5 2-6
SELECT r.studentno,`studentname`,`subjectname`,`studentresult`
FROM `student1` s
RIGHT JOIN `result` r
ON r.studentno=s.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
ORDER BY studentresult DESC
LIMIT 0,5 --第一页 limit 0,5
--第二页 limit 5,5
--第三页 limit 10,5
--第n页 limit (n-1)*5,5
--[pagesize 页面大小]
--[(n-1)*pagesize 起始值]
--[n 当前页]
--[数据总数/页面大小=总页数] --分页 缓解数据库压力 体验更好 不分页的叫瀑布流 --查询C语言排名前三并且分数大于80的学生信息(学号,姓名,课程名,分数)
SELECT s.studentno,`studentname`,`subjectname`,`studentresult`
FROM student1 s
INNER JOIN result r
ON s.studentno=r.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
WHERE subjectname LIKE 'C语言%' AND studentresult>80
ORDER BY studentresult desc
LIMIT 0,3

语法:limit 查询起始下标 pagesize

子查询

where (计算出来的值);本质是在where后面嵌套一个查询语句。

=============================where===========================================
--查询C语言-1的所有的考试结果(学号,科目名,科目编号,成绩)降序排列
--方式一,使用连接查询
SELECT studentno,subjectname,r.subjectno,studentresult
FROM result r
INNER JOIN `subject` sub
on r.subjectno=sub.subjectno
WHERE subjectname='C语言-1'
ORDER BY studentresult DESC --查询C语言-1的所有的考试结果(学号,科目编号,成绩)降序排列
--方式二,使用子查询(由里及外)
SELECT studentno,subjectno,studentresult
FROM result
WHERE subjectno = (SELECT subjectno
FROM `subject`
WHERE subjectname='C语言-1'
)ORDER BY studentresult desc --查询C语言-1的学生学号
SELECT subjectno FROM `subject` WHERE subjectname='C语言-1' --分数不小于80分的学生的学号和姓名
SELECT DISTINCT s.studentno,studentname
FROM student1 s
INNER JOIN result r
ON s.studentno=r.studentno
WHERE studentresult >=80 --在这个基础上增加一个科目 高等数学-2
--查询科目为 高等数学-2且分数不小于8分的学生的学号和姓名
SELECT s.studentno,studentname
FROM student1 s
INNER JOIN result r
ON s.studentno=r.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
WHERE studentresult >=80 AND subjectname = '高等数学-2'
ORDER BY studentresult DESC --子查询
SELECT DISTINCT s.studentno,studentname
FROM student1 s
INNER JOIN result r
ON s.studentno=r.studentno
WHERE studentresult >=80 AND subjectno = (SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2') --查询高等数学-2的编号
SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2' --再改造
SELECT studentno,studentname FROM student1
WHERE studentno IN (SELECT studentno FROM result WHERE studentresult>=80
AND subjectno = (SELECT subjectno FROM `subject` where subjectname = '高等数学-2')) --查询C语言-1 的同学的信息(学号,姓名,分数)
SELECT s.studentno,studentname,studentresult
FROM student1 s
INNER JOIN result r
on s.studentno=r.studentno
WHERE subjectno = (SELECT subjectno FROM `subject` WHERE subjectname = 'C语言-1' )

MySQL函数

常用函数

=========================常用函数======================================
--数学运算
SELECT ABS(-8) --绝对值
SELECT CEILING(9.4) --向上取整
SELECT FLOOR(9.4) --向下取整
SELECT RAND() --随机数
SELECT SIGN(2) --判断一个数的符号 负数返回-1 正数返回1 --字符串函数
SELECT CHARACTER_LENGTH('中国') --字符串长度
SELECT CONCAT('我','是') --拼接字符串
SELECT INSERT('我爱helloword',1,2,'超级') --查询 替换 从某个位置替换某个长度
SELECT LOWER('asdsAAAAadwa') --转小写
SELECT UPPER('aaFDSFSDdxd') --转大写
SELECT INSTR('kuang','u') --返回第一次出现字符的索引
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()) --系统
SELECT SYSTEM_USER() --当前用户
SELECT USER() --当前用户
SELECT VERSION() --版本

聚合函数(常用)

函数名称 描述
COUNT() 计数
SUM() 求和
AVG() 平均值
MAX() 最大值
MIN() 最小值
....
===============聚合函数================
--都能够统计表中的数据
SELECT COUNT(studentname) FROM `student1` --指定列 会忽略所有的null值
SELECT COUNT(*) FROM `student1` --不会忽略null值
SELECT COUNT(1) FROM `student1` --不会忽略null值 SELECT SUM(`studentresult`) AS 总分 FROM result
SELECT AVG(`studentresult`) AS 平均分 FROM result
SELECT MAX(`studentresult`) AS 最高分 FROM result
SELECT MIN(`studentresult`) AS 最低分 FROM result --查询不同课程的最高分,最低分,平均分
--核心 不同的课程分组
SELECT subjectname,AVG(studentresult) AS 平均分,MAX(studentresult),MIN(studentresult)
FROM result r
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
GROUP BY r.subjectno #通过什么分组
HAVING 平均分>=80

select语法:

--顺序很重要
SELECT 去重 要查询的字段 FROM 表 (表和字段可以起别名)
***JOIN 要连接的表 ON 等值判断
WHERE (具体的值,子查询语句)
GROUP BY (通过哪个字段分组)
HAVING (过滤分组后的信息,条件和where一样的,位置不同)
ORDER BY (通过哪个字段排序 ASC/DESC)
LIMIT startindex pagesize(分页)

数据库级别的MD5加密

主要增强算法的复杂度和不可逆性。

MD5不可逆,具体值加密后是一样的。

MD5破解网站的原理,后台有一个字典,存储加密前的值和加密后的值。

========================测试MD5加密==========================
CREATE TABLE `testmd5`(
`id` INT(4) NOT NULL,
`name` VARCHAR(20) NOT NULL,
`pwd` VARCHAR(100) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE INNODB DEFAULT CHARSET=utf8 --明文密码
INSERT INTO `testmd5` VALUES(1,'zhangsan','123456'),(2,'lisi','123456'),(3,'wangwu','123456') --加密
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id=1 --插入的时候加密
INSERT INTO `testmd5` VALUES(4,'xiaoming',MD5('123456')) --如何校验 将用户传进来的密码加密 然后与数据库存储的比较
SELECT * FROM testmd5 WHERE `name` = 'xiaoming' AND pwd=MD5('123456')

事务

什么是事物:要幺都成功,要么都失败

事物原则:ACID原则--->> 原子性,一致性,隔离性,持久性 (脏读,幻读.....)

  • 原子性(Atomicity):要么都成功,要么都失败
  • 一致性(Consistency):事务前后的数据完整性要保持一致
  • 持久性(Durability):事物一旦提交就不可逆,被持久化到数据库中
  • 隔离性(Isolation):多个用户并发访问数据库时,数据库为每一个用户开启的事务,不会被其他事务的操作干扰

隔离产生的一些问题:

  • 脏读:指一个事务读取了另一个事务未提交的数据
  • 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同(不一定是错误,只是某些场合不对)
  • 虚读(幻读):指在一个事务内读取到了别的事物插入的数据,导致前后读取不一致
===============事物=======================
MySQL是默认开启事务自动提交的
SET AUTOCOMMIT = 0 /*关闭自动提交*/
SET AUTOCOMMIT = 1 /*开启自动提交(默认)*/ -手动处理事务
SET AUTOCOMMIT = 0 --关闭自动提交
--事务开启
START TRANSACTION --标记一个事务的开始 从这个开始的sql都在一个事务内 --提交,持久化(成功)
COMMIT --回滚,回到原来的样子(失败)
ROLLBACK --事务结束
SET AUTOCOMMIT = 1 --开启事务提交 --了解
SAVEPOINT --设置事务的一个保存点名
ROLLBACK SAVEPOINT --回滚到保存点
RELEASE SAVEPOINT --撤销保存点

模拟转账事务

--转账
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop CREATE TABLE `account` (
`id` INT(4) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`money`DECIMAL(8,2) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE INNODB DEFAULT CHARSET=utf8 INSERT INTO `count`(`name`,`money`) VALUES('a',2000.00),('b',10000.00) --模拟转账 事务 一行一行执行
SET autocommit = 0;
START TRANSACTION;
UPDATE account SET money=money-500 WHERE `name` = 'a';
UPDATE account SET money=money+500 WHERE `name` = 'b'; COMMIT;
ROLLBACK;
SET autocommit = 1;

MySql学习笔记--详细整理--上的更多相关文章

  1. MySql学习笔记--详细整理--下

    目录 索引 测试索引 索引原则 权限管理和备份 备份 规范数据库设计 三大范式 JDBC JDBC程序 Statement对象 工具类实现 sql注入 PreparedStatement对象 事务 数 ...

  2. 初识mysql学习笔记

    使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...

  3. mysql basic operation,mysql总结,对mysql经常使用语句的详细总结,MySQL学习笔记

    mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...

  4. 【mysql学习笔记整理】

    /*mysql学习笔记整理*/ /*常用的数据库操作对象*/ #库的操作#创建#数据库的创建USE mysql;CREATE DATABASE db_x;#删除#删除数据库DROP DATABASE ...

  5. 一千行MySQL学习笔记 (转)

    出处:  一千行MySQL学习笔记 /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权 ...

  6. Mysql学习笔记(三)对表数据的增删改查。

    正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...

  7. MySQL学习笔记-数据库文件

    数据库文件 MySQL主要文件类型有如下几种 参数文件:my.cnf--MySQL实例启动的时候在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还介绍了参数类 ...

  8. 数据库MySQL学习笔记高级篇

    数据库MySQL学习笔记高级篇 写在前面 学习链接:数据库 MySQL 视频教程全集 1. mysql的架构介绍 mysql简介 概述 高级Mysql 完整的mysql优化需要很深的功底,大公司甚至有 ...

  9. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

随机推荐

  1. python机器学习实现线性回归

    线性回归 关注公众号"轻松学编程"了解更多. [关键词]最小二乘法,线性 一.普通线性回归 1.原理 分类的目标变量是标称型数据,而回归将会对连续型的数据做出预测. 应当怎样从一大 ...

  2. 我用 Python 找出了删除我微信的所有人并将他们自动化删除了

    1. 概述 不知你是否遇到过在微信上给通讯录中的某个人发消息,结果出现了这一幕: 平时一直认为自己的心里素质过硬,不过遇到这种情况 ... 在我缓了半个钟头(半分钟)之后,缓缓拿出了手机,打开微信,找 ...

  3. 9.mysql性能优化-慢查询分析、优化索引和配置

    目录 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 max_connections ...

  4. 从零开始实现ASP.NET Core MVC的插件式开发(九) - 升级.NET 5及启用预编译视图

    标题:从零开始实现ASP.NET Core MVC的插件式开发(九) - 如何启用预编译视图 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/1399 ...

  5. NO.A.0001——FIO工具使用教程

    一.FIO工具安装: 1.FIO地址: 官网地址:http://freecode.com/projects/fio/ 源码安装包:http://brick.kernel.dk/snaps/fio-2. ...

  6. TCP/IP协议图解

    联网的各个终端之间能否进行交互的软件基础是网络协议栈,目前主流的网络协议栈是TCP/IP协议栈. 1.主机到网络层协议:以太网协议 主机到网络层主要为IP协议和ARP协议提供服务.发送和接收网络数据报 ...

  7. 服务和进程管理及查看分区和cpu

    查看分区:cat /proc/partitions   [root@lbg init.d]# cat /proc/partitions major minor  #blocks  name       ...

  8. 内核补丁热更新ceph内核模块

    前言 内核模块的更新一般需要卸载模块再加载,但是很多时候使用场景决定了无法做卸载的操作,而linux支持了热更新内核模块的功能,这个已经支持了有一段时间了,一直没有拿ceph的相关模块进行验证 准备工 ...

  9. ceph各个版本之间参数变化分析

    前言 本篇主要是分析ceph的版本之间参数的变化,参数变化意味着功能的变化,通过参数来分析增加,删除,修改了哪些功能,以及版本之间的变化,本篇主要通过导出参数,然后通过脚本去比对不同的版本的参数变化 ...

  10. CephFS用户认证格式写错的问题

    问题三: CephFS(James Gallagher) 问题原文 Hi, I'm looking to implement the CephFS on my Firefly release (v0. ...