数据库
首页 > 数据库> > Mysql高级操作

Mysql高级操作

作者:互联网

一、创建表

  格式:

CREATE TABLE [IF NOT EXISTS] `表名`(
    `字段名` 列类型 [属性] [索引] [注释], 
    `字段名` 列类型 [属性] [索引] [注释], 
    `字段名` 列类型 [属性] [索引] [注释], 
    ....
    `字段名` 列类型 [属性] [索引] [注释]
)[表类型][字符集设置][注释]

      比如:创建一个学生表,字段分别是学号,登录密码,姓名,性别,出生日期,家庭地址

CREATE DATABASE IF NOT EXISTS westos;  --创建数据库

USE westos;  --使用数据库

创建student表
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 '家庭地址',
    `eamil` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

注意:

1、AUTO_INCREMENT :自增
2、使用英文的()
3、表名称和字段尽量适应·· 括起来
4、字符串使用单引号括起来
5、所有的语句后面都要加上英文的 , 逗号
6、最后一个语句不用加逗号
7、PRIMARY KEY 主键 一般一个表只有一个唯一的主键

 二、修改与删除表

  1、修改表 (alter)

#修改表名 

#格式:alter table 旧表名 rename as 新表名; ALTER TABLE student RENAME AS student1; #格式:Alter table 表明 add 字段名 列属性;
ALTER TABLE student1 ADD hobby VARCHAR(20); #增加表的字段

#删除表字段

#格式:alter table 表名 drop 字段名

ALTER TABLE student1 DROP hobby;

#修改表的字段

#格式 : alter table 表名 modify 字段名 列属性[]; ALTER TABLE student1 MODIFY eamil VARCHAR(55); #修改列属性的值(约束)
#格式 : alter table 表名 change 旧字段名 新字段名 列属性[]; ALTER TABLE student1 CHANGE eamil email VARCHAR(55); #修改字段名 区别:   MODIFY :不用来字段重命名,只能修改字段类型和约束   change : 用来字段重命名,不能修改字段约束和类型

    2、删除表(drop)

Drop Table student1; --删除数据表

DROP TABLE IF EXISTS student1; --如果表存在在删除

注意:所有的创建和删除操作尽可能的使用判断,以免报错

三、DML 语言

  数据库的意义:数据存储,数据管理

  DML语言:数据操作语言(insert、update、delete)

  1、添加/插入 (insert)

#插入语句(添加)
#格式:insert into 表名([字段名1,字段名2,字段名3,..])values('值1','值2','值3'..) #插入一条字段 INSERT INTO `student1`(`name`) VALUES('张三'); #插入多条字段 INSERT INTO `student1`(`name`) VALUES('张三'),('李四'); #插入一个数据 INSERT INTO `student1`(`name`,`pwd`,`sex`,`birthday`,`address`,`email`) VALUES('张三','1234587','男','2020-2-10','中国','15239867@qq.com');
#插入多条数据 INSERT INTO `student1`(`name`,`pwd`,`sex`,`birthday`,`address`,`email`) VALUES('张三','1234587','男','2020-2-10','中国','15239867@qq.com'),                          ('王五','1152587','男','1998-5-28','上海','1965867@qq.com'),                          ('王二','9854587','女','1820-11-10','北京','1523523@qq.com');

#注意:1、一般插入数据,我们一定要数据和字段一 一对应
    2、字段与字段之间,以英文状态下的逗号隔开,
    3、可以同时插入多条数据,values后面的值,需要使用英文状态下的逗号隔开,即可 。如:values(),()...

    

  2、修改/更新(update)

 # 修改学员的名字   指定条件
 UPDATE `student1` SET NAME ='小花' WHERE id=1; 
 
 # 不指定条件,会改动所有的表的字段名
 
  UPDATE `student1` SET NAME ='小明' ;

  #修改多个属性,逗号隔开

  UPDATE `student1` SET `name`='小明',`address`='重庆' WHERE id=3;

  #修改id=3和id=6之间的数据

    UPDATE `student1` SET `name`='小明',address='重庆' WHERE id  BETWEEN 3 AND 6;



#语法:
update 表名 set colnum_name=value where [条件];

注意:
 colnum_name是数据库的列,尽量带上
条件 where :筛选的条件,如果没有指定,则会修改所有的列
 value :是一个具体的值,也可以是一个变量
 多个设置的属性之间,使用英文逗号隔开


 条件:where 子句  

      运算符  :id等于某个值、id 小于某个值,id 大于某个值  在某个区域内修改...

操作符 含义
= 等于
<>或 != 不等于
> 大于
< 小于
<= 小于等于
>= 大于等于
between...and... 在...范围之间
and
or

3、删除(delete / truncate)

语法:delete from 表名  [ where 条件];

#删除指定数据
DELETE FROM `student1` WHERE id=6;

#删除数据 (避免这样写,会全部删除)
delete from `student1`;

  truncate 命令:

    作用:完全清空一个数据表,表的结构和索引约束不会变!

 #清空student 表
 TRUNCATE `student1`;

   delete / truncate  区别:

    相同点:都能删除数据,都不会删除表结构

    不同点:

      1、truncate 可以重新设置,自增列计数器会归零

        delete 不会影响自增列计数器会归零

      2、truncate 不会影响事务

   delete删除的问题:可以重启数据库

  现象:

    如果有lnnodb  ,自增列会从1开始(存在内存当中,断电即失)

    如果有myism  ,继续从上一个自增量开始(存在文件当中,不会丢失)

四、DQL语言(数据查询语言)

  数据库最核心的语言,最重要的语句,使用最频繁的语句

SELECT [ALL | DISTINCT]
{* |table.* | [table.fiel1[AS alias1][,[table.field2[AS alias2]][,[table.field3[AS alias3]][,...]]
FROM table_name [AS table_alias]
    [LEFT | RIGHT | INNER JOIN table_name2]   #联合查询
    [WHERE ...]     #指定结果需满足的条件
    [GROUP by...]     #指定结果按照哪几个字段来分组
    [HAVING]     #过滤分组的记录必须满足的次要条件
    [ORDER by...]     #指定查询记录按一个或多个条件排序
    [LIMIT {[offset.]roe_count | row_countOFFSET OFFSET}];     #指定查询记录从那条到那条 

[] 括号代表可选
{} 括号 代表必选

 创建了几个表

CREATE DATABASE `school`;
USE `school`;

CREATE TABLE `grade`(
    `GradeID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号',
    `GradeName` VARCHAR(50) NOT NULL COMMENT '年级名称',
    PRIMARY KEY (`GradeID`)
)ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `grade` (`GradeID`,`GradeName`) VALUES(1,'大一'),(2,'大二'),(3,'大三'),(4,'大四'),(5,'预科班');

CREATE TABLE `result`(
    `StudentNO` INT(4) NOT NULL COMMENT '学号',
    `SubjectNo` INT(4) NOT NULL COMMENT '课程编号',
    `ExamDate` DATETIME NOT NULL COMMENT '考试日期',
    `StudentResult` INT(4) NOT NULL COMMENT '考试成绩',
    KEY `SubjectNo` (`SubjectNo`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `result` (`StudentNO`,`SubjectNo`,`ExamDate`,`StudentResult`) VALUES(1000,1,'2013-11-11 16:00:00',75);
INSERT INTO `result` (`StudentNO`,`SubjectNo`,`ExamDate`,`StudentResult`) VALUES(1001,4,'2013-11-11 16:00:00',89);
INSERT INTO `result` (`StudentNO`,`SubjectNo`,`ExamDate`,`StudentResult`) VALUES(1003,5,'2013-11-11 16:00:00',90);
INSERT INTO `result` (`StudentNO`,`SubjectNo`,`ExamDate`,`StudentResult`) VALUES(1005,2,'2013-11-11 16:00:00',62);

INSERT INTO `result` (`StudentNO`,`SubjectNo`,`ExamDate`,`StudentResult`) VALUES(1007,4,'2013-11-11 16:00:00',86);
INSERT INTO `result` (`StudentNO`,`SubjectNo`,`ExamDate`,`StudentResult`) VALUES(1004,1,'2013-11-11 16:00:00',93);
INSERT INTO `result` (`StudentNO`,`SubjectNo`,`ExamDate`,`StudentResult`) VALUES(1008,3,'2013-11-11 16:00:00',80);

CREATE TABLE `student`(
    `StudentNO` INT(4) NOT NULL COMMENT '学号',
    `LoginPwd` VARCHAR(20) DEFAULT NULL,
    `StudentName` VARCHAR(20) DEFAULT NULL COMMENT '学生姓名',
    `Sex` TINYINT(1) DEFAULT NULL COMMENT '性别,取值0或者1',
    `GradeId` INT(11) DEFAULT NULL COMMENT '年级编号',
    `Phone` INT(50) DEFAULT NULL COMMENT '联系电话,允许为空,即可选输入',
    `Address` VARCHAR(255) NOT NULL COMMENT '地址,允许为空,即可选输入',
    `BornDate` DATETIME DEFAULT NULL COMMENT '出生时间',
    `Email` VARCHAR(50) NOT NULL COMMENT '邮件账户,允许为空,即可选输入',
    `IdentityCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
    PRIMARY KEY (`StudentNo`),
    UNIQUE KEY `IdentityCard`(`IdentityCard`),
    KEY `Email` (`Email`)
)ENGINE=MYISAM DEFAULT CHARSET=utf8;

INSERT INTO `student`(`StudentNO`,`LoginPwd`,`StudentName`,`Sex`,`GradeId`,`Phone`,`Address`,`BornDate`,`Email`,`IdentityCard`)
    VALUES(1001,'1111','张三',1,1,'135205278','上海','1985-02-12 00:00:00','12589654@qq.com','52369875412');
INSERT INTO `student`(`StudentNO`,`LoginPwd`,`StudentName`,`Sex`,`GradeId`,`Phone`,`Address`,`BornDate`,`Email`,`IdentityCard`)
    VALUES(1002,'1236','李四',0,1,'152638752','杭州','1998-05-16 00:00:00','5689254@qq.com','8952875412');
INSERT INTO `student`(`StudentNO`,`LoginPwd`,`StudentName`,`Sex`,`GradeId`,`Phone`,`Address`,`BornDate`,`Email`,`IdentityCard`)
    VALUES(1003,'1125','王二',1,5,'186320148','武汉','1923-09-12 00:00:00','357959654@qq.com','89521475412');
INSERT INTO `student`(`StudentNO`,`LoginPwd`,`StudentName`,`Sex`,`GradeId`,`Phone`,`Address`,`BornDate`,`Email`,`IdentityCard`)
    VALUES(1004,'5234','夏利',1,3,'185632479','北京','1986-03-26 00:00:00','7892654@qq.com','55624775412');
INSERT INTO `student`(`StudentNO`,`LoginPwd`,`StudentName`,`Sex`,`GradeId`,`Phone`,`Address`,`BornDate`,`Email`,`IdentityCard`)
    VALUES(1005,'5867','明和',0,5,'135698742','石家庄','1979-07-24 00:00:00','1856972@qq.com','8629875412');
INSERT INTO `student`(`StudentNO`,`LoginPwd`,`StudentName`,`Sex`,`GradeId`,`Phone`,`Address`,`BornDate`,`Email`,`IdentityCard`)
    VALUES(1006,'4523','金萨',0,4,'147895234','广州','1968-09-18 00:00:00','848569@qq.com','125875412');
INSERT INTO `student`(`StudentNO`,`LoginPwd`,`StudentName`,`Sex`,`GradeId`,`Phone`,`Address`,`BornDate`,`Email`,`IdentityCard`)
    VALUES(1007,'1895','明霞',1,2,'169774524','深圳','1959-06-09 00:00:00','1956487@qq.com','5157875412');
    
TRUNCATE `student`;
    
SELECT * FROM student;

CREATE TABLE `subject`(
    `SubjectNo` INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号',
    `SubjectName` VARCHAR(50) DEFAULT NULL COMMENT '课程名称',
    `ClassHour` INT(4) DEFAULT NULL COMMENT '学时',
    `GradeId` INT(4) DEFAULT NULL COMMENT '年级编号',
    PRIMARY KEY(`SubjectNo`)
)ENGINE=INNODB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;

INSERT INTO `subject`(`SubjectNo`,`SubjectName`,`ClassHour`,`GradeId`) VALUES(1,'c语言',110,2);
INSERT INTO `subject`(`SubjectNo`,`SubjectName`,`ClassHour`,`GradeId`) VALUES(5,'java',110,4);
INSERT INTO `subject`(`SubjectNo`,`SubjectName`,`ClassHour`,`GradeId`) VALUES(4,'c语言',110,2);
INSERT INTO `subject`(`SubjectNo`,`SubjectName`,`ClassHour`,`GradeId`) VALUES(2,'java',110,3);
INSERT INTO `subject`(`SubjectNo`,`SubjectName`,`ClassHour`,`GradeId`) VALUES(3,'c语言',110,2);
INSERT INTO `subject`(`SubjectNo`,`SubjectName`,`ClassHour`,`GradeId`) VALUES(6,'java',110,4);
INSERT INTO `subject`(`SubjectNo`,`SubjectName`,`ClassHour`,`GradeId`) VALUES(7,'c语言',110,2);

SELECT * FROM `subject`;

   1、简单的查询

USE school;
#查询student的所有数据

SELECT * FROM student;

#查询学生的学生的学号和名字
SELECT `StudentNo`,`StudentName` FROM student;

#查询学生的学生的学号和名字,并给查询的结果起一个别名,用AS (可以给字段其别名,也可以给表名起别名)

SELECT `StudentNo`AS '学号',`StudentName` AS '名字' FROM student;

#函数  Concat(a,b) 让a和b进行拼接

SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student;

 #查询StudentResult为59分的学号,并且给59分成绩加1分

 SELECT `StudentNo` ,`StudentResult`+1 AS '加分后的分数' FROM result WHERE StudentResult=59;

 

  2、去重 (distinct)

#查看全部同学的成绩
SELECT * FROM result;

#查看哪些同学参加了考试
SELECT `StudentNo` FROM result;

#发现数据重复,去重
SELECT DISTINCT `StudentNo` FROM result;

   3、where条件

#查询StudentResult为59分的学号,并且给59分成绩加1分
SELECT `StudentNo` ,`StudentResult`+1 AS '加分后的分数' FROM result WHERE StudentResult=59;


#查询考试成绩在80~100分之间
SELECT `StudentNo`,`StudentResult` FROM result WHERE StudentResult>=80 AND StudentResult <=100;

#使用between查询考试成绩在80~100分之间
SELECT `StudentNo`,`StudentResult` FROM result WHERE StudentResult BETWEEN 80 AND 100;

   4、模糊查询

运算符 语法
is null a is null
is not null a is not null
between ... and... a between b and c
like a like b
in a in (a1,a2,a3)
#查询姓张的同学 
 #解析:利用like结合 % 代表0到任意一个字符   _ 代表一个字符
 
 SELECT `StudentNo`,`StudentName` FROM student WHERE StudentName LIKE '张%';
 
  SELECT `StudentNo`,`StudentName` FROM student WHERE StudentName LIKE '张_';
 
 #查询名字中间带有“二”的同学的全部信息
 
 SELECT * FROM student WHERE StudentName LIKE '%二%';
 
 #查询1001,1002,1003号的学生
 
SELECT * FROM student WHERE StudentNo IN(1001,1002,1003);


#查询地址为空的同学的信息

SELECT `StudentNo`,`StudentName` FROM student WHERE address=' ' OR address IS NULL;

#查询有出生日期的同学(不为空的)

SELECT `StudentNo`,`StudentName` FROM student WHERE BornDate IS NOT NULL;

   5、联表查询(join)

       步骤:a、分析需求,分析查询的字段来自哪里 (连接查询)

           b、确定使用哪种连接查询(inner join 、left join 、right join)

          c、确定交叉点(这两表中哪个数据是相同的)

          d、判断条件

操作 描述
inner join 如果表中至少有一个匹配,就返回匹配的数据
left join 会从左表中返回所有的值,即使右表中没有匹配
right join 会从右表中返回所有的值,即使左表中没有匹配

 

#查询参加了考试的同学的信息

#inner join  内联查询

SELECT s.studentNo,studentName,SubjectNo,StudentResult 
FROM student AS s 
INNER JOIN result AS r
WHERE s.studentNo=r.studentNo;

#left join

SELECT s.studentNo,studentName,SubjectNo,StudentResult 
FROM student AS s 
LEFT JOIN result AS r
ON s.studentNo=r.studentNo;


#right join 

SELECT s.studentNo,studentName,SubjectNo,StudentResult 
FROM student AS s 
RIGHT JOIN result AS r
ON s.studentNo=r.studentNo;

#查询缺考的同学的信息

  join(连接的表) on (判断的条件):连接查询

  where 等值查询


  SELECT s.studentNo,studentName,SubjectNo,StudentResult
  FROM student AS s
  LEFT JOIN result AS r
  ON s.studentNo=r.studentNo
  WHERE StudentResult IS NULL;

 

#查询参加考试的同学的科目和分数

SELECT s.studentNo,studentName,Subjectname,StudentResult
FROM student AS s
RIGHT JOIN result AS r
ON s.StudentNo=r.StudentNo
INNER JOIN `subject` AS su
ON r.SubjectNo=su.SubjectNo;

 

#查询学生所属的年级
SELECT studentNo,studentName,GradeName
FROM student s
INNER JOIN grade g
ON s.GradeID=g.GradeID;

 

#查询课程所属的年级
SELECT SubjectName,GradeName
FROM `subject` sub
INNER JOIN grade g
ON sub.GradeID=G.GradeID;

 

#查询参加了java考试的学生信息
SELECT s.`StudentNO`,`StudentName`,`SubjectName`,`StudentResult`
FROM student s
INNER JOIN result r
ON s.StudentNo=r.StudentNo
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
WHERE subjectName='java';

 

步骤:要查哪些数据   select .....

   从那几个表中查  from 表  xxx join 连接的表    on  交叉条件

  假设存在一种多张表查询,慢慢来,先查询两张表,然后再慢慢的增加 



  6、自连接

  自己的表和自己的表连接 

  核心:一张表拆为两张一样的表即可

CREATE TABLE `category`(
    `categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id',
    `pid` INT(10) NOT NULL COMMENT '父id',
    `categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字',
    PRIMARY KEY (`categoryid`)
)ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

INSERT INTO `category`(`categoryid`,`pid`,`categoryName`)
VALUES
('2','1','信息技术'),
('3','1','软件开发'),
('4','3','数据库'),
('5','2','美术设计'),
('6','1','web开发'),
('7','5','ps技术'),
('8','5','办公信息');
#查询父子信息
SELECT a.`categoryName` AS '父栏目', b.`categoryName` AS '子栏目'
FROM `category` AS a,`category` AS b
WHERE a.`categoryid`=b.`pid`;

   7、分页和排序

      排序 :利用order by ,通过查询哪一个字段排序,排序的方式

        升序 :ASC 

        排序 :DESC 

#查询的结果根据成绩降序排序


SELECT s.`StudentNO`,`StudentName`,`SubjectName`,`StudentResult`
FROM student s
INNER JOIN result r
ON s.StudentNo=r.StudentNo
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
WHERE subjectName='java'
ORDER BY StudentResult ASC;

    分页:limit

      语法 :limit  起始值,页面的大小

                            ( limtit (n-1)*pageSize,pageSize) ==>pageSize :页面大小、    (n-1)*pageSize :起始值 、   n:当前页  、 数据总数/页面大小 =总页数   

#每页只显示3条数据

SELECT s.`StudentNO`,`StudentName`,`SubjectName`,`StudentResult`
FROM student s
INNER JOIN result r
ON s.StudentNo=r.StudentNo
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
WHERE subjectName='c语言'
ORDER BY StudentResult ASC
LIMIT 0,3;

#查询C语言 课程成绩排名前3的学生,并且分数要大于80的学生信息

SELECT s.`StudentNO`,s.`StudentName`,`SubjectName`,`StudentResult`
FROM student s
INNER JOIN result r
ON s.`StudentNO`=r.`StudentNO`
INNER JOIN `subject` sub
ON sub.`SubjectNO`=r.`SubjectNO`
WHERE `SubjectName` ='c语言' AND StudentResult>=80
ORDER BY StudentResult DESC
LIMIT 0,3

   8、子查询

      本质:在where语句中嵌套一个字查询语句

#查询java的所有考试成绩,并且考试成绩降序排列

#第一种方式:利用连接查询
SELECT `StudentNO`,r.`SubjectNo`,`StudentResult`
FROM result r
INNER JOIN `subject` s
ON r.SubjectNo=s.SubjectNo
WHERE SubjectName='java'
ORDER BY StudentResult DESC;

#方式二:使用子查询

SELECT StudentNO,SubjectNo,StudentResult
FROM `result`
WHERE SubjectNo =(
SELECT SubjectNo FROM `subject` 
WHERE SubjectName='java'
)
ORDER BY StudentResult DESC;

#查询分数不小于80分的学生的学号和姓名

SELECT `StudentNO`,`StudentName`
FROM student 
WHERE StudentNo=(
 SELECT StudentNo FROM result WHERE StudentResult>80
);

   9、常用函数

常用函数 描述
ABS() 绝对值
CEILING() 向上取整
FLOOR() 向下取整
RAND 返回一个0-1之间的随机数
SIGN 返回参数的符号 。负数返回-1,整数返回 1
CHAR_LENGTH() 字符串的长度
CONCAT 拼接字符串
INSERT(某个位置,替换的长度) 替换,插入
LOWER() 转小写字母
UPPER() 转大写字母
INSTR() 返回第一个出现的字串的索引
REPLACE() 替换出现的指定字符串
SUBSTR(原字符串,截图的位置,截取的长度) 返回指定的字符串
REVERSE() 字符串反转
CURRENT_DATE(),CURDATE() 获取当前日期
NOW() 获取当前时间

  10、聚合函数

函数名称(常用) 描述
COUNT 计数
SUM() 就和
AVG() 平均值
MAX() 最大值
MIN() 最小值
#Count(指定列)
SELECT COUNT(StudentName) FROM student; SELECT COUNT(*) FROM student; SELECT COUNT(1) FROM result;

COUNT(字段名)、COUNT(*)、COUNT(列行) 它们都能够统计表中的数据,但它们之间有什么区别?

1、COUNT(字段名) ,会忽略所有的null 值,但COUNT(*)、COUNT(列行),不会忽略所有的null 值



   10、分组

  group by   ....  having....


#查询不同的课程的平均分、最低分、最高分


SELECT sub.SubjectName,AVG(StudentResult),MAX(StudentResult),MIN(StudentResult)
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
GROUP BY r.SubjectNo; #通过什么字段来分组


#查询不同的课程的平均分、最低分、最高分,并且平均分大于80分
SELECT sub.SubjectName,AVG(StudentResult) 平均分,MAX(StudentResult) 最大值,MIN(StudentResult) 最小值 FROM result r INNER JOIN `subject` sub ON r.SubjectNo=sub.SubjectNo GROUP BY r.SubjectNo #通过什么字段来分组 HAVING 平均分>80;

  拓展:

    数据库级别的MD5加密

    MD5主要是增强算法和不可逆性

USE school;

CREATE TABLE `testmd5`(
    `id` INT(4) NOT NULL,
    `name` VARCHAR(20) NOT NULL,
    `pwd` VARCHAR(40) NOT NULL,
    PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

#明文密码
INSERT INTO `testmd5` VALUES(1,'张三','12346');
INSERT INTO `testmd5` VALUES(2,'李四','147852');
INSERT INTO `testmd5` VALUES(3,'王二','258963');
INSERT INTO `testmd5` VALUES(4,'麻子','369852');

SELECT * FROM testmd5;

#加密
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id = 1;  #加密一条

UPDATE testmd5 SET pwd=MD5(pwd) #加密全部的密码

#插入的时候加密
INSERT INTO testmd5 VALUES(5,'小明',MD5('89745612'));

#如何校验:将用户传递进来的密码,进行md5加密,然后比对加密的值
SELECT * FROM testmd5 WHERE `name`='小明' AND pwd=MD5('89745612');

 

标签:00,高级,StudentResult,SubjectNo,student,Mysql,操作,NULL,SELECT
来源: https://www.cnblogs.com/16904985zy-aoyu/p/14514276.html