MySQL笔记

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值