由于我之前已经学过一大半了,但由于时间可能隔得比较远有些遗忘,故重新来一遍
采用的是在wsl2中的docker部署MySQL
一、基础概述

二、部署MySQL并进入
# 进入你的发行版,我使用的是Ubuntu
wsl -d Ubuntu
# 如果设置了用普通用户的密码登录则需要输入密码,否则默认root用户登录
# 拉取镜像,不写版本号默认最新版
docker pull mysql
# 查看是否拉取成功
docker images
# 运行一个容器
docker run --name <你设置的容器名> -p 3306:3306 -e MYSQL_ROOT_PASSWORD=<你要设置的密码> -d mysql
# 查看正在运行的容器
docker ps
# 如果没启动使用docker start <你的容器名>即可,不要使用docker run,那样会创建一个新容器并启动
# 进入MySQL
docker exec -it <你的容器名> /bin/bash
mysql -u root -p
# 当然也可一步到位
docker exec -it <你的容器名> mysql -u root -p
# 之后输入你运行容器时设置的密码即可
注意:只有你成功启动了你的MySQL容器(docker start),你才可以通过图形化界面(datagrip、navicat等等)连接到MySQL进行接下来的操作

我的datagrip破解版可参考B站视频:【DataGrip2024中文破解版安装教程】DataGrip2024中文破解版安装教程_哔哩哔哩_bilibili
三、SQL
1、SQL通用语法:
①、可单行/多行书写,分号结尾
②、可通过缩进/空格来强调
③、不区分大小写,关键字建议使用大写
④、注释方式
-
-- 这是注释
-
# 这是注释
-
/* 这是注释 */
2、SQL分类
①、DDL
DDL(Data Definition Language),数据定义语言,用来定义数据库对象(数据库,表,字段)包括对数据库、表等的操作
Ⅰ、操作数据库
# 1、查询数据库
# 查询所有数据库
SHOW DATABASES;
# 查询当前数据库
SELECT DATABASE();
# 2、创建数据库
# 中括号的选写,IF NOT EXISTS 没有就创建,有就不创建
CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集] [ COLLATE 排序规则];
# 3、删除数据库
# 中括号的选写,IF EXISTS 有就删除,没有不报错
DROP DATABASE [ IF EXISTS ] 数据库名;
# 4、使用数据库
USE 数据库名;
Ⅱ、操作表
# 1、查询表
# 查询当前数据库所有表
SHOW TABLES;
# 查询表结构
DESC 表名;
# 查询指定表的建表语句
SHOW CREATE TABLE 表名;
# 2、创建表
CREATE TABLE 表名(
字段1 字段1类型 [COMMENT 字段1注释 ],
字段2 字段2类型 [COMMENT 字段2注释 ],
字段3 字段3类型 [COMMENT 字段3注释 ],
......
字段n 字段n类型 [COMMENT 字段n注释 ]
) [COMMENT 表注释 ];
# 3、修改表
# 添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
# 修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
# 修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
# 删除字段
ALTER TABLE 表名 DROP 字段名;
# 修改表名
ALTER TABLE 表名 RENAME TO 新表名;
# 4、删除表
# 删除表
DROP TABLE [ IF EXISTS ] 表名;
# 删除指定表,并重新创建该表
TRUNCATE TABLE 表名;
②、DML
DML(Data Manipulation Language),数据操作语言,用来对数据库表中的数据进行增删改
# 1、添加数据
# 给指定字段添加数据
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
# 给全部字段添加数据
INSERT INTO 表名 VALUES (值1, 值2, ...);
# 批量添加数据
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);
INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);
# 2、修改数据
UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [ WHERE 条件 ];
# 3、删除数据
DELETE FROM 表名 [ WHERE 条件 ]
③、DQL
DQL(Data Query Language),数据查询语言,用来查询数据库中表的记录
# 1、基本查询
# 查询多个字段
SELECT 字段1, 字段2, 字段3 ... FROM 表名;
# 查询所有信息
SELECT * FROM 表名;
# 设置别名
SELECT 字段1 [AS 别名1], 字段2 [AS 别名2] ... FROM 表名;
# 去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
# 2、条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表;
# 常见条件:>、>=、<、<=、=、<> 或 !=、BETWEEN...AND...、IN(...)、IS NULL、AND 或 &&、OR 或 ||、NOT 或 !、like占位符
# 注意between.小.and.大.,且是(小,大]
# 注意like占位符,'_'表示一位数,'_3'表示以3结尾的二位数,'%3'表示所有以3结尾的数
# 3、聚合函数
SELECT 聚合函数(字段列表) FROM 表名;
# 常见聚合函数:count(统计数量)、max(最大值)、min(最小值)、avg(平均值)、sum(求和)
# 所有null值不参与聚合函数的运算
# 4、分组查询
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ];
# where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
# where不能对聚合函数进行判断,而having可以。
# 注意:执行顺序: where > 聚合函数 > having
# 5、排序查询
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;
# 排序方式:ASC:升序(默认值)、DESC:降序
# 注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
# 6、分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;
# 注意:
# 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
# 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
# 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10。
④、DCL
DCL(Data Control Language),数据控制语言,用来创建数据库用户、控制数据库的访问权限
# 1、管理用户
# 查询用户
USE mysql;
SELECT * FROM user;
# 创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
# 修改用户密码
# 注意:MySQL8.0之后默认认证插件已经从mysql_native_password改为caching_sha2_password
ALTER USER '用户名'@'主机名' IDENTIFIED WITH caching_sha2_password BY '新密码';
# 删除用户
DROP USER '用户名'@'主机名';
# 2、权限控制
# 查询权限
SHOW GRANTS FOR '用户名'@'主机名';
# 授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
# 撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
除了使用以上命令行方式创建,还可以通过图形化界面创建表、列等等

3、部分实操
不进行对数据库、表、数据、查询的实操,只展示DCL部分(因为这部分之前很少做,可能不太熟悉)
创建一个测试用户test_user



此处将对mysql数据库的user表的所有权限给了test_user(此处只是做演示,不建议真正这么做,mysql.user是系统表不建议给普通用户直接管理的权限)

四、函数
1、字符串函数
| 函数 | 功能 |
|---|---|
| CONCAT(S1,S2,...Sn) | 字符串拼接,将S1,S2,...Sn拼接成一个字符串 |
| LOWER(str) | 将字符串str全部转为小写 |
| UPPER(str) | 将字符串str全部转为大写 |
| LPAD(str,n,pad) | 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度 |
| RPAD(str,n,pad) | 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 |
| TRIM(str) | 去掉字符串头部和尾部的空格 |
| SUBSTRING(str,start,len) | 返回从字符串str从start位置起的len个长度的字符串 |
2、数值函数
| 函数 | 功能 |
|---|---|
| CEIL(x) | 向上取整 |
| FLOOR(x) | 向下取整 |
| MOD(x,y) | 返回x/y的模 |
| RAND() | 返回0~1内的随机数 |
| ROUND(x,y) | 求参数x的四舍五入的值,保留y位小数 |
3、日期函数
| 函数 | 功能 |
|---|---|
| CURDATE() | 返回当前日期 |
| CURTIME() | 返回当前时间 |
| NOW() | 返回当前日期和时间 |
| YEAR(date) | 获取指定date的年份 |
| MONTH(date) | 获取指定date的月份 |
| DAY(date) | 获取指定date的日期 |
| DATE_ADD(date, INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
| DATEDIFF(date1,date2) | 返回起始时间date1和结束时间date2之间的天数 |
4、流程函数
| 函数 | 功能 |
|---|---|
| IF(value , t, f) | 如果value为true,则返回t,否则返回f |
| IFNULL(value1 , value2) | 如果value1不为空,返回value1,否则返回value2 |
| CASE WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END | 如果val1为true,返回res1,... 否则返回default默认值 |
| CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END | 如果expr的值等于val1,返回res1,... 否则返回default默认值 |
五、约束
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确、有效性和完整性。
外键约束所引用的列一般要是唯一的,即要么unique要么primary key
| 约束 | 描述 | 关键字 |
|---|---|---|
| 非空约束 | 限制该字段的数据不能为null | NOT NULL |
| 唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | UNIQUE |
| 主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
| 默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
| 检查约束(8.0.16版本之后) | 保证字段值满足某一个条件 | CHECK |
| 外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY |
# 添加外键
CREATE TABLE 表名(
字段名 数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)
);
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);
# 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
| 行为 | 说明 |
|---|---|
| NO ACTION | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 RESTRICT 一致) |
| RESTRICT | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 NO ACTION 一致) |
| CASCADE | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。 |
| SET NULL | 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)。 |
| SET DEFAULT | 父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持) |
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名(主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
# 此处是CASCADE的使用
# 完整使用是在添加外键约束的后面加上
# On update+行为①+on delete+行为 ②
# 即更新时用行为①,删除时用行为②
前两个约束(NO ACTION,RESTRICT)是默认的,不用单独额外设置
395

被折叠的 条评论
为什么被折叠?



