MySQL
1.MySQL基本命令
- 1.连接数据库:
mysql -uroot -p123456 - 2.查看所有数据库:
show databases; - 3.切换数据库: use + 数据库名
mysql> use school
Database changed - 4.查看所有表
show tables; - 5.显示数据库中所有表的信息
describe student; - 6.创建一个数据库
create database westos; - 7.退出
Exit - 8.注释
–XXX
/*
Dsadaf
*/ - 9.MySQL语言
SQL语言 : CRUD
DDL:定义
DML:操作
DQL:查询
DCL:控制
2.操作数据库
- 1.创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名
- 2.删除数据库
DROP DATABASE [IF EXISTS] 数据库名
- 3.使用数据库 --如果表名或者字段名为特殊字符,则要用
USE `school`
USE school
- 4.查看数据库
SHOW DATABASES
3.数据库的列类型
-
数值
Tinyint 1字节
Smallint 2字节
Mediumint 3字节
Int 4字节
Bigint 8字节
Float 4字节
Double 8字节
Decimal (字符串形式的浮点数,用于金融计算) -
字符串
Char 0-255
Varchar 0-65535 可变字符串
Tinytext 2^8-1 微型文本
Text 2^16-1 文本串 -
时间日期
Java.util.date
Date yyyy-mm-dd 日期格式
Time hh:mm:ss 时间格式
Timestamp 时间戳 1970.1.1到现在的毫秒数
Year 年份表示 -
null
没有值
(Tips: 不要使用null进行运算)
4.数据库的字段属性
-
Unsigned:
无符号的常数
不可声明为负数 -
Zerofill:
0填充
不足的位数,使用0来填充。 -
自增:
自动在上一条记录的基础上+1
通常用来设计唯一的主键,可自己设置步长和初始值 -
非空:
Null not null
设为not null,不赋值会报错 -
Default:
设置默认的值 -
拓展:
每个表都必须要存在一下五个字段。项目中用的,标识一个记录存在的意义
Id 主键
version 乐观锁
Is_delete 伪删除
Gmt_create 创建时间
Gmt_update 修改时间
5.创建数据库表
- 创建学生表
{id,登陆密码,姓名,性别,出生日期,家庭住址,e-mail}
/*
* NOT FAULT:设置非空
* AUTO_INCREMENT:自动自增
* DEFAULT:默认值
* COMMENT: 注释
* ENGINE = INNODB: 设置引擎
* DEFAULT CHARSET utf8 :默认字符集
* PRIMARY KEY(`id`): 设置主键
*/
CREATE TABLE IF NOT EXISTS `student` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(10) NOT NULL DEFAULT 'null' 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 '家庭住址',
`e-mail` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`)
)ENGINE = INNODB DEFAULT CHARSET=UTF8MB4
SHOW CREATE DATABASE `school` --查看创建school数据库的语句
SHOW CREATE TABLE `student` --查看创建student表的语句
DESC `student` --显示表的结构
6.修改数据库表
- 1.修改表名 ALTER TABLE [原表名] RENAME [新表名]
ALTER TABLE teacher RENAME teacher1
- 2.添加字段 ALTER TABLE [表名] ADD [字段名] [字段类型]
ALTER TABLE teacher1 ADD `name` VARCHAR(11)
- 3.修改字段约束 ALTER TABLE [表名] MODIFY [字段名] [约束]
ALTER TABLE teacher1 MODIFY `name` INT
- 4.修改字段名 ALTER TABLE [表名] CHANGE [原字段名] [新字段名]
ALTER TABLE teacher1 CHANGE `name` `name1` VARCHAR(11)
- 5.删除字段 ALTER TABLE [表名] DROP [字段名]
ALTER TABLE teacher1 DROP `name1`
- 6.删除表 DROP TABLE IF EXISTS [表名]
DROP TABLE IF EXISTS teacher1
Tips1 :删除或者创建 加上判断防报错。
Tips2:所有字段名最好使用 `` 包裹
7.创建数据库表外键
- 方式1:
-- 方式1
create table if not exists `grade`(
`gradeid` int not null auto_increment comment'年级id',
`gradename` varchar(10) not null comment '年级名称',
primary key(`gradeid`)
)ENGINE = INNODB DEFAULT CHARSET=UTF8MB4
create table if not exists `student` (
`id` int not null auto_increment comment '学号',
`name` varchar(10) not null default 'null' 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 '家庭住址',
`e-mail` varchar(50) default null comment '邮箱',
`gradeid` INT NOT NULL COMMENT'年级id',
primary key(`id`),
key `FK_gradeid` (`gradeid`),
constraint `FK_gradeid` foreign key (`gradeid`) references `grade` (`gradeid`)
)engine = innodb default charset=UTF8MB4
- 方式2:
-- 方式2
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);
- Tips:
- 1.物理外键,数据库级别的外键,不建议使用。
- 2.数据库就是单纯的表,用来存数据
- 3.使用多张表的数据,使用外键(程序实现)
8. DML
DML语言: 数据操作语言
8.1. Insert(增)
INSERT INTO `student` (`name`,`pwd`,`sex`)
VALUES ('ichi','111111','男'),('ni','222222','女')
8.2. Update(改)
--UPDATE 表名 SET 字段名=修改值 WHERE 条件
-- where子句: 设定条件
UPDATE `student` SET `name`='mashiro' WHERE `id` BETWEEN 1 AND 4
-- 逻辑运算符 [ =, <, >, <=, >=, !=(<>), between...and..., and, or,]
UPDATE `student` SET `name`='mashiro' WHERE `id` = 5 OR `id` = 7
-- 不加where则是修改所有数据
一定要注意加where !危!!!!
8.3. Delete(删)
--UPDATE FROM表名 WHERE 条件
DELETE FROM `student` WHERE `id`>5
一定要注意加where !危!!!!
-- 清空数据库
TRUNCATE `student`
9. DQL(查询)
- 所有查询操作 select
– 查询全部的学生 select 字段 from 表
SELECT * FROM `student`
– 查询指定字段
SELECT `studentno`,`studentname` FROM student
– 别名,给结果起一个名字 as 给字段/表起别名
SELECT `studentno` AS 学号,`studentname` AS 学生姓名 FROM student AS s
– 函数concat(a,b)
SELECT CONCAT('姓名:', studentname) AS 新名字 FROM student
- 去重 (去除select查询结果中重复的数据)
– DISTINCT 去重
SELECT DISTINCT `studentno` FROM result
- 逻辑运算符
And(&&),or(||),Not(!) - 模糊查询:比较运算符
- is null
- is not null
- between … and …
- like
- in
====================================================================
-- %:任意字符 _:一个字符
SELECT `studentno`,`studentname` FROM `student`
WHERE `studentname` LIKE '刘%'
SELECT `studentno`,`studentname` FROM `student`
WHERE `studentname` LIKE '刘_'
====================================================================
-- IN (要填具体的值)
SELECT `studentno`,`studentname` FROM `student`
WHERE `studentno` IN (1000,1001,1002)
====================================================================
SELECT `studentno`,`studentname` FROM `student`
WHERE `address` IS NULL
SELECT `studentno`,`studentname` FROM `student`
WHERE `address` IS NOT NULL
====================================================================
10. 多表查询(joinON)
- 内查询
-- ===========内查询========================
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM student AS s
INNER JOIN result AS r
WHERE s.studentno = r.studentno
- 左查询
-- ===========左查询==================
select s.`studentno`,`studentname`,`subjectno`,`studentresult`
from student as s
Left join result 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
11.自连接
自己的表和自己的表连接。
核心:一张表拆成两张相同的表即可
SELECT par.`categoryname` AS 'parents',chi.`categoryname` AS 'children'
FROM `category` AS par,`category` AS chi
WHERE par.`categoryid` = chi.`pid`
12.分页(limit) 排序(order by)
ORDER BY `studentresult` ASC
-- 排序 order by
-- 升序:ASC 降序:DESC
LIMIT 0,5
-- 分页
-- LIMIT (起始下标),(页面大小)
13.子查询
-- 方式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
-- 方式2: 使用子查询
SELECT `StudentNo`,r.`SubjectNo`,`StudentResult`
FROM `result`
WHERE `SubjectNo` = (
SELECT `SubjectNo` FROM `subject`
WHERE `SubjectName` = '数据库结构-1'
)
14.MySQL函数
https://www.mysqlzh.com/
14.1. 常用函数
- 数学运算
SELECT ABS(-8) -- 绝对值
SELECT CEILING(9.4) -- 向上取整
SELECT FLOOR(9.4) -- 向下取整
SELECT RAND() -- 返回0~1之间的随机数
SELECT SIGN(-4) -- 判断数的符号
- 字符串函数
SELECT CHAR_LENGTH('shina mashiro') -- 返回字符串的长度
SELECT CONCAT('ma','shi','ro') -- 拼接字符串
SELECT INSERT('hello world',1,2,'mashiro') -- 插入,在某个位置开始替换某个长度
SELECT LOWER('MASHIRO') -- 转为小写字母
SELECT UPPER('mashiro') -- 转为大写字母
SELECT INSTR('mashiro','s') -- 返回第一次出现的字串索引
- 时间函数
SELECT CURRENT_DATE()
SELECT NOW()
14.2. 聚合函数
-- count(字段),会忽略所有null值
SELECT COUNT(studengname) FROM student;
SELECT COUNT(*) FROM student;
SELECT COUNT(1) FROM student;
SELECT SUM(`studentresult`) AS 总分 FROM `result`
SELECT AVG(`studentresult`) AS 平均分 FROM `result`
SELECT MAX(`studentresult`) AS 最高分 FROM `result`
SELECT MIN(`studentresult`) AS 最低分 FROM `result`
15. 分组和过滤
-- 查询不同课程的平均分,最高分,最低分,且平均分大于80
-- 核心: (根据不同的课程分组)
SELECT `SubjectName`,AVG(StudentResult) AS `平均分`,MAX(`StudentResult`),MIN(`StudentResult`)
FROM `result` r
INNER JOIN `subject` sub
ON r.`SubjectNo` = sub.`SubnjectNo`
GROUP BY r.SubjectNo -- 通过SubjectNo分组
HAVING 平均分>80
16. MD5
17. 事务
- 原子性(Atomicity)
要么都成功,要么都失败 - 一致性(Consistency)
事务前后的数据完整性要保证一致 - 持久性(Durability)
事务一旦提交则不可逆,被持久化到数据库中 - 隔离性(Isolation)
多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其它事务的操作干扰,多个并发事务之间要相互隔离
-- ============================= 事务 ============================
-- MySQL 是默认开启事务自动提交的
SET autocommit = 0 /* 关闭 */
SET autocommit = 1 /* 开启 */
-- 手动处理事务
-- 事务开启
SET autocommit = 0 /* 关闭 */
START TRANSACTION -- 标记事务开始
-- 提交: 持久化
COMMIT
-- 回滚: 时光倒流
ROLLBACK
-- 事务结束
SET autocommit = 1 -- 开启自动提交
-- 保存点
SAVEPOINT 保存点名
ROLLBACK TO SAVEPOINT 保存点名
RELEASE SAVEPOINT 保存点名
18. 索引
18.1 索引的分类
- 主键索引(primary key)
- 唯一的标识,主键不可重复且只能有一个
- 唯一索引(unique key)
- 避免重复的列出现,唯一索引不可重复,多个列都可以标识为唯一索引
- 常规索引(key / index)
- 默认的,index,key关键字来设置
- 全文索引(fulltext)
- 快速定位数据
18.2 索引的基础语法
-- 索引的使用
-- 1.在创建表的时候给字段增加索引
-- 2.创建完毕后,增加索引
-- 显示所有索引信息
SHOW INDEX FROM `student`
-- 增加一个全文索引(索引名) 列名
ALTER TABLE school.student ADD FULLTEXT INDEX `studentName`(`studentName`);
-- EXPLAIN 分析sql执行情况
EXPLAIN SELECT * FROM student; -- 非全文索引
EXPLAIN SELECT * FROM student WHERE MATCH(studentName) AGAINST('刘');
19. 备份
20. 三大范式
- 第一范式
原子性: 保证每一列不可再分 - 第二范式
满足第一范式
每张表只描述一件事情 - 第三范式
满足第一和第二范式
确保数据表中的每一列数据都和主键直接相关
规范性 和 性能的问题
关联查询的表不得超过三张表
- 考虑商业化的需求和目标,数据库性能更重要
- 规范性能问题的时候,适当考虑一下规范性
- 故意给某些表增加一些冗余字段
- 故意增加一些计算列(从大数据量降低为小数据量的查询: 索引)
21. 链接
文档:
https://www.mysqlzh.com/
学习视频
BV1NJ411J79W