1、初识MySQL
JavaEE:企业级Java开发 Web
1.sql
2.前端——页面:展示,数据
3.后台——连接点:连接数据库(JDBC、MyBatis)
连接前端(Severlet、Spring):控制视图跳转,给前端传递数据
4.数据库——存数据
1.1、什么是数据库
数据库:DB(DataBase)
概念:数据仓库,软件,安装在操作系统上
作用:存储数据、管理数据
1.2、数据库分类
关系型数据库(SQL):
- DB2
- SQLite
通过表和表之间,行和列之间的关系进行数据的存储
非关系型数据库(NoSQL——Not Only):
- Redis
- MongoDB
对象存储,通过对象的属性来决定(如存储一个人的位置)
1.3、DBMS(数据库管理系统)
- 数据库的管理软件,科学有效的管理我们的数据,维护和获取数据
- MySQL——数据库管理系统:操作管理数据
- SQLyog——可视化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CGQOCY3B-1634744437223)(C:\Users\Ken-Chy\AppData\Roaming\Typora\typora-user-images\image-20211008162347258.png)]
如果创建浮点型数据,不能指定长度!!!
1.4、连接数据库
命令行连接
mysql -uroot -p123456 --连接数据库 ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';--修改用户密码 flush privileges;刷新权限 ------------------------------------- -- 所有语句都使用;结尾 show databases; -- 查看所有的数据库 use school; -- 切换数据库:use 数据库名 show tables; -- 查看数据库中所有的表 describe student; -- 显示表的信息 create database dorms; -- 创建一个数据库dorms exit;-- 推出连接 -- 单行注释 /* 多行注释 */
数据库xxx语言(CRUD增删改查)
- DDL 定义
- DML 操作
- DQL 查询
- DCL 控制
2、操作数据库
操作数据库>>操作数据库中的表>>操作数据库中表的数据
mysql关键字不区分大小写
2.1、操作数据库
1、创建数据库
create database [if not exists] dorms;
2、删除数据库
drop database [if exists] dorms;
3、使用数据库
use dorms
如果数据库是一个关键字,则在名字左右加上``
4、查看数据库
show databases
2.2、数据库的列类型(字段)
1、数值
- tinyint 1个字节
- smallint 2个字节
- mediumint 3个字节
- int 4个字节 int
- bigint 8个字节 long
- float 4个字节
- double 8个字节(精度问题!)
- decimal 字符串型的浮点数,金融计算时使用,解决精度问题
2、字符串
- char 字符串固定大小 0-255
- varchar 可变字符串 0-65535
varchar和char 的区别——定长和变长
对于 char(4) 表示固定容纳4个字符,当少于4个字符时,会使用空格填充空缺的部分,使其达到4个字符。如果超过4个字符,会自动截断超出部分
而 varchar(4),小于4个的话,则插入多少个字符就存多少个。且对于varchar字段来说,需要使用一个(如果字符串长度小于255)或两个字节(长度大于255)来存储字符串的长度(因为varchar是变长的,没有这个长度值他不知道如何读取数据)
()里的长度是当前字符集的字符长度,而不是字节长度
- tinytext 微信文本 2^8-1
- text 文本串 2^16-1
text和varchar的最大限制都是64k个字节,但text本质是溢出存储,innodb默认只会存放前768字节在数据页中,而剩余的数据则会存储在溢出段中。text类型的数据,将被存储在元数据表之外地方,但是varchar/char将和其他列一起存储在表数据文件中,值得注意的是,varchar列在溢出的时候会自动转换为text类型。text数据类型实际上将会大幅度增加数据库表文件尺寸。
text列不允许拥有默认值
int字段的长度与你存储的数据长度无关
,与显示有关
char字段的长度与你存储数据长度有关
int类型的存储大小为4个字节,一个字节8位,也就是2^32 。 int的取值范围(-2147483648 ~ 2147483647),在数据库中的int不管后面填的长度为多少,只要在int的取值范围内,都能够将你的存储的数正常放入。int类型中长度的意义是位数不满足时,自动补充0(使用zerofill才能够显示),但不影响存储
3、时间日期
java.util.Date
- date YYYY-MM-DD——日期格式
- time HH:mm:ss——时间格式
- datetime YYYY-MM-DD HH:mm:ss——最常用的时间格式
- timestamp 时间戳,表示1970年到现在的毫秒数
- year 表示年份
4、null
- 没有值,位置
- 不要使用其进行运算,结果为NULL
2.3、数据库的字段属性
Unsigned:
- 无符号的整数
- 声明了该列不能声明为负数
zerofill:
- 0填充
- 不足的位数,使用0填充。int(3) 5–>005
自增:
- 自动在上一条记录的基础上+1(默认)
- 通常用来设计唯一的逐渐index,必须是整数类型
- 可以自定义设计主键自增的起始值和步长
- 一个表只有一列能设置自增,且该字段必须为key
非空:
- NULL/NOT NULL
- 假设设置为not null,如果不给它赋值则会报错
- 加入没有设置,如果不填写值则默认为null
default:
- 设置默认的值
- sex,默认值设为男,则如果不指定该列的值,就自动为男
每个表都必须存在以下五个字段(做项目用的,表示数据存在的意义)
/* id 主键 `version` 乐观锁 is_delete 伪删除 gmt_create 创建时间 gmt_update 修改时间 */
2.4、创建数据库表
格式
create table [if not exit] `表名`( `字段名` 列类型[属性][索引][注释], `字段名` 列类型[属性][索引][注释], ...... `字段名` 列类型[属性][索引][注释] )[表类型][字符串设置][注释]
注意点
使用英文的符号,表的名字和是字段尽量使用``括起来
AUTO_INCREMENT表示自增
字符串使用单引号或双引号括起来
所有的语句后面加英文的逗号,最后一个不用加
PRIMARY KEY表示主键,一般一个表只有一个唯一的主键
示例
CREATE TABLE `people`( `id` INT(4) ZEROFILL NOT NULL AUTO_INCREMENT COMMENT '学号', `name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名', `gender` VARCHAR(2) NOT NULL COMMENT '性别', `age` INT(3) NOT NULL COMMENT '年龄', `birthday` DATETIME DEFAULT NULL COMMENT '生日', `phone` INT(11) DEFAULT 123 COMMENT '电话号码', PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8
常用命令
show tables -- 查看当前数据库的所有表 show create database school -- 查看创建数据库的语句 show create table student -- 查案创建表的语句 desc student -- 显示表的结构
2.5、数据表的类型
-- 关于数据库引擎 /* INNODB 默认使用 MYISAM 早些年使用 */
不同类型的区
不同类型的优点
- MYISAM 节约空间,速度较快
- INNODB 安全性高,事务的处理,多表多用户操作
在物理空间存在的位置物理文件上的区别
使用InnoDB引擎的表结构对应的物理文件
.frm文件:保存了每个表的元数据,包括表结构的定义等;
.ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per_table = 1)产生的存放该表的数据和索引的文件。
.ibdata文件:共享表空间存储方式使用.ibdata文件,所有表共同使用一个ibdata文件
使用了MyISAM引擎的表会有对应的三种物理文件:
- *.frm–表定义,是描述表结构的文件。
- .MYD–"D"数据信息文件,是表的数据文件。
- *.MYI–"I"索引信息文件,是表数据文件中任何索引的数据树。
设置数据表的字符集编码
charset=utf8
不设置的话为,会是mysql默认的字符集编码
可在my.ini配置文件中设置默认的编码
charset-set-server=utf8
2.6、修改删除表
修改
-- 修改表名:alter table 旧表名 raname 新表名 ALTER TABLE teacher RENAME AS teacher1 -- 增加表的字段:alter table 表名 add 字段名 列属性 ALTER TABLE teacher1 ADD wage INT(10) -- 修改表的字段:重命名、修改约束 -- 修改约束 alter table 表名 modify 字段名 列属性[] ALTER TABLE teacher1 MODIFY wage VARCHAR(11) -- 字段重命名 alter table 表名 change 旧名字 新名字 列属性[] ALTER TABLE teacher1 change age age1 INT(1) -- 删除表的字段 alter table 表名 drop 字段名 ALTER TABLE teacher1 DROP age1
删除
-- 删除表 drop table if exists teacher1
3、MySQL数据管理
3.1、外键(了解)
CREATE TABLE `grade` ( `gradeId` INT(8) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT COMMENT '年级ID', `gradeName` VARCHAR(10) NOT NULL COMMENT '年级名字', PRIMARY KEY (`gradeId`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 -- 学生表的gradeId字段要去引用成绩表的gradeId CREATE TABLE `student`( `id` INT(8) ZEROFILL NOT NULL AUTO_INCREMENT COMMENT '学生id', `name` VARCHAR(10) NOT NULL COMMENT '学生姓名', `gradeId` INT(8) ZEROFILL NOT NULL COMMENT '学生年级', `gender` VARCHAR(3) NOT NULL COMMENT '性别', PRIMARY KEY(`id`), -- 定义外键key KEY `FK_gradeId`(`gradeId`), -- 给这个外键添加约束(执行引用) references引用 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`); -- ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 被引用表(被引用列)
删除有外键关系的表的时候,必须要先删除去引用的表(从表),在删除被引用的表(主表)
以上的操作都是物理外键,数据库级别的外键,不建议使用(避免数据库过多造成困扰)
最佳操作
- 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
- 我们想使用多张表的数据,想使用外键(用程序实现)
3.2、DML语言
3.2、DML语言
数据库意义:数据存储,数据管理
DML语言:数据库操作语言
- insert
- update
- delete
3.3、添加
-- 添加语句(插入) -- insert into 表名[(字段1,字段2,字段3)] values ('值A1','值A2','值A3'),('值B1','值B2','值B3')... INSERT INTO grade(`gradename`) VALUES ('大四'); -- 没有设置NOT NULL的字段和设置了自增的键都可以不赋值,其他字段不赋值都会报错 -- 如果省略表的字段,则会把所有字段与后面的值一一对应(即需要把每个字段的值都写出来,没有设置NOT NULL的字段和设置了自增的键如果不赋值也需要写NULL占位) INSERT INTO `student` VALUES (NULL, '陈彦亨', NULL, '男'); -- 插入多个数据时values一般换行书写 INSERT INTO `student`(`name`, `gender`) VALUES ('李四', '男'), ('王五', '女');
语法:insert into 表名[(字段1,字段2,字段3)] values ('值A1','值A2','值A3'),('值B1','值B2','值B3')...
注意事项:
- 字段和字段之间使用英文逗号隔开
- 字段是可以省略的,但是后面的值必须要一一对应,不能少
- 可以同时插入多条数据,values后面的值需要使用逗号隔开
3.4、修改
-- 修改语句(update) -- 修改学员名字,带了条件 UPDATE `student` SET `name` = '陈梓坤' WHERE id = 1; -- 不指定条件(会导致所有数据被修改) UPDATE `student` SET `gender` = '男'; -- 修改多个属性,逗号隔开 UPDATE `student` SET `name` = '臭弟弟', `gender` = '女' WHERE id = 2;
条件语句where:返回布尔值
操作符:
- = : 等于
- <> 或 != :不等于
- < 、>、<=、>= :小于,大于,小于等于,大于等于
- between A and B :A和B的闭区间
- A and B :A && B
- A or B :A || B
- is null :没有值
注意事项:
- column_name 是数据库的列,尽量带上``
- 条件,筛选的条件,如果没有指定,则会修改所有的列
- value,是一个具体的值,也可以是一个变量/函数
如current_time(获的当前时间)
3.5、删除
delete命令
语法:delete from 表名 [where 条件]
-- 删除数据(避免这样写,会删除所有数据) delete from `student`; -- 删除指定数据 delete from `student` where id = 1;
truncate命令
作用:完全清空一个数据库表,表的结构和索引约束不会变
-- 清空student表 truncate `student`;
delete和truncate命令的区别
- 相同点:都能删除数据,都不会删除表结构
- 不同点:
- truncate会重新设置自增列,计数器会归零,而delete的计数器不会归零
- truncate不会影响事务
4、DQL查询数据
4.1、DQL
简单的查询
SELECT CONCAT(StudentNo, CONCAT(':', StudentName)) AS 结果 FROM student -- 查询表的全部字段 SELECT * FROM student; -- 查询表的指定字段 SELECT `StudentNo`, `StudentName` FROM student; -- 函数 concat(a, b) SELECT CONCAT(StudentNo, CONCAT(':', StudentName)) AS 结果 FROM student
输入字段名时不区分大小写,输出的结果列名大小写形式和输入时保持一致,和创建时不一定一致
别名与去重
as 起别名
-- 别名:给结果起一个名字 -- 给字段起别名 SELECT StudentNo AS 学生学号, studentname AS 学生姓名 FROM student -- 给表起别名 SELECT StudentNo, studentname 姓名 FROM student AS s
其别名时as可以省略,as后的内容可以带引号也可以不带
distinct 去重
-- 查询有哪些学生参加了考试 -- 查询所有成绩,每个学生有多个科目的成绩 select * from result; -- 查询所有学生,发现重复数据(此表中没有主键) select `StudentNo` from result; -- 去除重复数据 select distinct `StudentNo` from result;
数据库表达式
数据库的列(表达式)
-- 查询系统版本(函数) SELECT VERSION(); -- 查询计算结果(表达式) SELECT 100*3-1 AS 计算结果; -- 查询自增的步长(变量) SELECT @@auto_increment_increment; -- 查看学员考试成绩加一分后的结果 SELECT `StudentNo`, `StudentResult`+1 AS 加分后 FROM result;
格式:select 表达式 from 表;
数据库中的表达式:
- 文本值
- 列
- null
- 函数
- 计算表达式
- 系统变量
4.2、where条件子句
作用:检索数据中符合条件的值
搜索的条件为一个或者多个表达式
逻辑运算符
尽量使用英文字母
-- 查询考试成绩再95-100分之间的数据 -- and SELECT `StudentNo`, `StudentResult` FROM `result` WHERE `StudentResult` >= 95 AND `StudentResult` <= 100; -- && 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; SELECT `StudentNo`, `StudentResult` FROM `result` WHERE !`StudentNo` = 1000; -- not SELECT `StudentNo`, `StudentResult` FROM `result` WHERE NOT `StudentNo` = 1000;
模糊查询:比较字符串
运算符 语法 描述
is null A is null A为null则为真
is not null A is not null A不为null则为真
between A between B and C A再B和C之间则为真
like A like B SQL匹配,A匹配B则为真
in A in (A1, A2, A3…) A是A1,A2,A3…其中的一个值则为真
模糊查询:比较字符串
-- 模糊查询 -- 查询姓张的同学 -- 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 '张__'; -- 查询名字中间有伟字的同学 SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentName` LIKE '%伟%'; -- in(具体的一个或者多个值) -- 查询1001,1002,1003号学员 SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentNo` IN (1001, 1002, 1003); -- 查询在北京或广东的学生(精确相等才返回true) SELECT `StudentNo`,`StudentName` FROM `student` WHERE `Address` IN ('北京', '广东'); -- null -- 查询地址为空的学生 SELECT `StudentNo`,`StudentName` FROM `student` WHERE `Address` IS NULL OR NOT ''; -- 查询有出生日期的学生 不为空 SELECT `StudentNo`,`StudentName` FROM `student` WHERE `Address` IS NOT NULL OR '';
4.3、联表查询
示例
student表
result表
-- 笛卡尔积 -- 两表关联,把左表的列和右表的列通过笛卡尔积的形式表达出来。 -- 语法:select * from t1 join t2 SELECT s.StudentNo, StudentName, SubjectNo, StudentResult FROM Student AS s INNER JOIN result AS r
/* 思路 1.分析需求,分析查询的字段来自哪些表 2.确定使用哪种连接查询 确定交叉点(这两个表中哪个字段数据是相同的) 判断的条件:学生表中的StudentNo = 成绩表的StudentNo */ -- 内连接 SELECT s.StudentNo, StudentName, SubjectNo, StudentResult FROM Student AS s INNER JOIN result AS r ON s.StudentNo = r.StudentNo;
-- 左外连接 SELECT s.StudentNo, StudentName, SubjectNo, StudentResult FROM Student AS s LEFT JOIN result AS r ON s.StudentNo = r.StudentNo;
-- 右外连接 SELECT s.StudentNo, StudentName, SubjectNo, StudentResult FROM Student AS s RIGHT JOIN result AS r ON s.StudentNo = r.StudentNo;
Joins总结
oracle里面有full join,但是在mysql中没有full join。我们可以使用union来达到目的。
练习
-- 查询缺考的同学 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 ...
- 从哪几个表中查:
from 表 xxx join 连接的表 on 交叉条件(两表的共有列)
- 假设存在多张表的查询,先两张查询再慢慢叠加
SELECT s.StudentNo, StudentName, SubjectName, StudentResult FROM Student AS s RIGHT JOIN Result AS r ON s.StudentNo = r.StudentNo LEFT JOIN `subject` AS sub ON r.SubjectNo = sub.SubjectNo
4.4、自联接
自己的表和自己的表联接
核心:一张表拆成两张一模一样的表
第一张表
第二张表
操作:查询父类对应的子类关系
-- 查询父子信息:把一张表看成两张一样的表 SELECT a.`categoryName` AS '父栏目', b.`categoryName` AS '子栏目' FROM category AS a, category AS b WHERE a.categoryId = b.pId;
4.5、分页和排序
排序
-- 排序:升序ASC,降序DESC -- ORDER BY 通过哪个字段排序,怎么排 -- 查询学生高等数学-3的成绩,结果按成绩降序排序 SELECT stu.studentNo, studentName, SubjectName, StudentResult FROM student AS stu INNER JOIN result AS re ON stu.studentNo = re.studentNo INNER JOIN `subject` AS sub ON re.subjectNo = sub.subjectNo WHERE SubjectName = '高等数学-3' ORDER BY StudentResult DESC
分页
为什么要分页?
缓解数据库压力,给人的体验更好 / 瀑布流
-- 分页,每页只显示五条数据 -- 语法: limit 数据索引起始值,每页数据数 -- limit 0, 5 第1-5条数据 -- limit 5, 5 第6-10条数据 SELECT stu.studentNo, studentName, SubjectName, StudentResult FROM student AS stu INNER JOIN result AS re ON stu.studentNo = re.studentNo INNER JOIN `subject` AS sub ON re.subjectNo = sub.subjectNo ORDER BY StudentResult DESC LIMIT 0, 3 -- pagesize:页面大小(每页数据数) -- n:当前页 -- (n-1)*pagesize:起始值 -- (数据总数 + 每页数据数 - 1)/每页数据数 = 总页数
语法:limit(查询数据的起始下标, pagesize);
4.6、子查询
where(这个值是计算出来的(原本where后是一个定值或表中已有数据))
本质:在where语句中嵌套一个子查询语句
where (select * from)
查询 “ 数据库结构-1 ” 的所有考试结果,科目编号,成绩,降序排序
-- 连表查询 SELECT studentNo, r.subjectNo, studentresult FROM result AS r INNER JOIN `subject` AS s ON r.subjectNo = s.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
高等数学分数不小于80分的学生的学号和姓名
-- 连表查询+子查询 SELECT DISTINCT s.studentNo, studentName FROM result AS r INNER JOIN student AS s ON r.studentNo = s.studentNo WHERE studentresult >= 80 AND subjectNo = ( SELECT subjectNo FROM `subject` WHERE subjectName = '高等数学-1' )
-- 连表查询 SELECT DISTINCT s.studentNo, studentName FROM result AS r INNER JOIN student AS s ON r.studentNo = s.studentNo INNER JOIN `subject` AS sub ON r.subjectNo = sub.subjectNo WHERE subjectName = '高等数学-1'
-- 子查询 SELECT studentNo, studentName FROM student WHERE studentNo IN ( SELECT studentNo FROM result WHERE studentresult >= 80 AND subjectNo = ( SELECT subjectNo FROM `subject` WHERE subjectName = '高等数学-1' ) )
练习:查询C语言-1前5名同学的成绩信息(学号,姓名,分数)
使用子查询
SELECT s.studentNo, studentName, studentResult FROM student AS s INNER JOIN result AS r ON s.studentNo = r.studentNo WHERE subjectNo = ( SELECT subjectNo FROM `subject` WHERE subjectName = 'C语言-1' ) ORDER BY studentResult DESC LIMIT 0, 5 1 ————————————————
4.7、分组和过滤
-- 查询每个科目的平均分,最高分,最低分,平均分>80分-- 查询不同课程的 SELECT subjectName, AVG(studentResult) AS 平均分, MAX(studentResult), MIN(studentResult) FROM result AS r INNER JOIN `subject` AS sub ON r.subjectNo = sub.subjectNo GROUP BY sub.subjectName HAVING 平均分 > 80
having和where的差别
where在数据分组之前进行过滤,having在数据分组之后进行过滤。where排除的行不包括在分组中,这可能会改变计算值,从而影响having子句基于这些值过滤掉的分组
4.8、总结
完整的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 表(表和字段可以取别名)
xxx join 要连接的表 on 等值判断
where(具体的值 / 子查询语句)
group by(通过哪个字段来分组)
having(过滤分组后的信息,条件和where是一样的,位置不同)
order by …(通过那个字段排序)[升序 / 降序]
limit startindex, pagesize
顺序很重要!
5、MySQL常用函数
5.1、常用函数(不常用)
数学运算
- abs(-8) – 绝对值
- ceiling(9.4) – 向上取整
- floor(9.4) – 向下取整
- rand() – 返回一个0-1之间的随机数
- sign() – 判断一个数的符号(0–>0,负数->-1,正数->1)
字符串函数
- har_length(‘xxxx’) – 字符串长度
- concat(‘x’,‘xx’,…) – 拼接字符串
- insert(‘xxx’,fromindex,len,‘xx’) – 从某个位置开始替换某个长度的字符串,若长度为0则为插入,下标从1开始
- lower(‘xxx’) – 转换为小写字母
- upper(‘xxx’) – 转换为大写字母
- instr(‘xxxxxx’, ‘xx’) – 返回第一次出现的字串的索引
- replace(‘xxxx’,‘from’,‘to’) – 替换出现的指定字符串
- substr(‘xxx’,fromindex,len) – 返回指定的子字符串,没有len则返回到字符串末尾
- reverse(‘xx’) – 反转
时间和日期函数
- current_date() – 获取当前时间(年月日)
- curdate() – 获取当前日期
- now() – 获取当前时间(年月日时分秒)
- localtime() – 本地时间
- sysdate() – 系统时间
- year/month/day/hour/minute/second(now())
系统
- system_user()
- user()
- version()
5.2、聚合函数(常用)
统计表中数据
count(字段) -- 会忽略所有的null值 count(*) -- 不会忽略null值 cout(1) -- 不会忽略null值
-- 查询平均分,最高分,最低分 SELECT ANY_VALUE(subjectName), AVG(studentResult), MAX(studentResult), MIN(studentResult) FROM result AS r INNER JOIN `subject` AS sub ON r.subjectNo = sub.subjectNo -- 因为没有分组,所以结果为第一个科目的名字以及所有科目的所有分数的平均值和最大最小值 -- 查询每个科目的平均分,最高分,最低分,平均分>80分 SELECT subjectName, AVG(studentResult) AS 平均分, MAX(studentResult), MIN(studentResult) FROM result AS r INNER JOIN `subject` AS sub ON r.subjectNo = sub.subjectNo GROUP BY sub.subjectName HAVING 平均分 > 80
5.3、数据库级别的MD5加密
MD5不可逆,相同的值的MD5是一样的
由上–>MD5破解网站原理:网站背后有一个字典存储各种密码MD5加密后的值,与需要破解的加密后密码进行对比,相同则可知其加密前密码
-- 测试MD5加密
-- 测试MD5加密 CREATE TABLE `testmd5`( `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 testmd5 VALUES(4,'张三','123456'), (5,'李四','1234567'), (6,'王五','12345678') -- 加密 UPDATE testmd5 SET pwd = MD5(pwd) WHERE id = 1 -- 指定加密 UPDATE testmd5 SET pwd = MD5(pwd) -- 全部加密 INSERT INTO testmd5 VALUES (0, '小米', MD5(123)) -- 插入时加密 -- 如何校验:将用户传递进来的密码,进行md5加密,对比加密后的值 SELECT * FROM testmd5 WHERE `name` = '小米' AND pwd = MD5('123')
MySQL入门语法(视频学习笔记)二+https://developer.aliyun.com/article/1390454?spm=a2c6h.13148508.setting.17.350a4f0ePTOXQB