MySQL速成
MySQL-Shell的使用
启动后默认进入\JS模式,更适合数据库管理员、开发人员用于自动化运维、集群管理、数据迁移等高级任务
支持JS、Python、SQL三种语言
- 默认使用JS
- 使用\+语言缩写来切换语言,从而执行该语言的代码
- \js
- \py
- \sql 切换成功即可执行sql语句,与在终端或Navicat中执行效果一致
官方提供的VSCode的MySQL-Shell插件:MySQL Shell for VS Code,用ctrl+enter运行
以下是一些简单命令:
查询信息 \help
连接到MySQL数据库 \connect
连接本地MySQL服务器 \connect root@localhost
创建数据库 create database 库名;
选择数据库 \use 库名
SQL基础
数据库管理系统分类
关系型数据库管理系统ROBMS
- 采用关系模型组织数据,通过二维表表示数据之间的联系
- 数据一般都是用表的形式来存储,SQL用来操作表中数据
- 二维表每一行表示一条数据记录
- 二维表每一列表示一个字段
- 不同表通过关联字段来建立联系
- 常见代表:MySQL、ORACLE、PostgreSQL
非关系型数据库管理系统NON-ROBMS
- 针对数据量大、数据结构复杂、数据类型多样的数据对ROBMS进行补充和扩展而来
- 常见代表:Redis、mongoDB、neo4j、cassandra、CouchDB
SQL分类
语句不区分大小写,但为了提高可读性,会把关键字大写,表名列名其他名称小写
通常把 SQL 分为三类:
- DDL (Data Definition Language): 数据定义语言,如 CREATE、DROP、ALTER、TRUNCATE
- DML (Data Manipulation Language): 数据操作语言,如 INSERT、UPDATE、DELETE、CALL
- 细分还可以分出一类 DQL (Data Query Language): 数据查询语言,如 SELECT
- DCL (Data Contral Language): 数据查询语言,如 GRANT、REVOKE
MySQL数据类型
- 数值类型
- 整数类型:TINYINT、SMALINT、INT、BIGINT(范围小→大)
- 浮点数类型:FLOAT、DOUBLE、DECIMAL(a,b) 长度为a,保留b位小数
- 日期和时间类型
- DATE:仅存储日期,格式为YYYY-MM-DD
- TIME:仅存储时间,格式为HH:MM:SS
- DATETIME:存储完整的日期和时间
- TIMESTAMP:存储时间戳
- 字符串类型
- 定长字符串:CHAR(n) 实际占用字节只取决于n,无论是否存满都一定为n
- 变长字符串:VARCHAR(n) 实际占用字节取决于字符,最大为n
- TEXT/BLOB: 用于存储大段文本或二进制数据(如文章、图片),不建议用于频繁查询的字段
- JSON类型
- JSON:原生支持JSOM格式数据存储,适合灵活结构数据,如用户配置、日志信息
- 空间类型
- POINT(点)
- LINESTRING(线)
- POLYGON(多边形)
- GEOMETRY:通用基础类型
- 集合类型
- SET:如SET(’阅读‘,’运动’,’音乐’),适合多选标签
SQL常用命令
在MySQL命令行客户端或者GUI工具中执行命令,命令结尾记得带分号
命令行客户端:
- MySQL 8.0 Command Line Client(仅支持SQL)
- MySQL Shell(支持sql、js、py,默认js,使用前记得执行\sql切换)
查看当前存在的数据库
show databases;
创建数据库
create 数据库名字;
删除数据库
drop database 数据库名字;
选择数据库
//创建表之前需要选择数据库,再在数据库内创建表
use game;
创建表
create table 表名(字段名称 数据类型,字段名称 数据类型)
create table player(
id INT,
name VARCHAR(100),
level INT,
exp INT,
gold DECIMAL(10,2)
);
查看表的结构
DESC 表名;
-- 会显示每列名称、数据类型、是否允许为空、默认值等等

修改表结构
-- 修改列类型长度
-- 关键字 表名 关键字 列名 新的数据类型
ALTER TABLE player MODIFY COLUMN name VARCHAR(200);-- 后面再跟上数据表示初始值为该数据
-- 修改字段名
-- 关键字 表名 关键字 列名 关键字 新列名
ALTER TABLE player RENAME COLUMN name to nick_name;
-- 增加新字段(列)
-- 关键字 表名 关键字 新增字段名 数据类型
ALTER TABLE player ADD COLUMN last_login DATETIME;
-- 删某列
-- 关键字 表名 关键字 待删字段
ALTER TABLE player DROP COLUMN last_login;
删除表
-- 关键字 表名
DROP TABLE player
表中数据的增删改查
增加表中数据
INSERT INTO player(id,name,level,exp,gold) VALUES (1,'张三',1,1,1);
INSERT INTO player(id,name,level,exp,gold) VALUES (1,'张三',1,1,1),(2,'李四',2,2,2);
如果表名后面的列名和表结构完全一致 (顺序也一致),就可以省略,直接写关键字 VALUE+ 值,注意可以同时插入多条数据,逗号分隔即可。如下
INSERT INTO player VALUES (1,'张三',1,1,1);
也可以只写出部分列名称,相应的后面的值也只写部分,这样其他值就会使用创建表时设定的默认值来填充,不设置就是空值。如下
INSERT INTO player(name,gold) VALUES ('张三',1);
查看表中数据
SELECT * FROM player;
SELECT id,name FROM player;
注意 * 代表所有列,如果不想要所有列,就逐一枚举,逗号分隔。
表中数据默认值
ALTER TABLE player MODIFY level INT DEFAULT 1;
这里添加默认值之后就发现省略输入默认值不再为 Null。
修改表中数据
-- 关键字 表名 关键字 列名 改值 关键字 列名 人名
UPDATE player set level = 1 where name = '李四';
修改所有玩家的数据,多个字段用逗号隔开,如下
UPDATE player set exp=0,gold=0;
删除表中数据
DELETE FROM player WHERE gold = 0;
数据的导入导出
常用语句
where子句
用来提取满足指定标准的记录
关键字为where,后接需要筛选的字段
-- 1. 查询等级大于 1 的所有玩家信息
SELECT * FROM player WHERE level > 1;
-- 2. 多条件筛选 (AND):查询等级在 1 到 5 之间的玩家
SELECT * FROM player WHERE level > 1 AND level < 5;
-- 3. 逻辑组合 (AND/OR/括号):
-- 同时满足以下三个条件:
-- a) 等级必须大于 1
-- b) 经验值必须小于 5
-- c) 并且(等级小于 5 或者 经验值大于 1)—— 只要括号内任一条件成立即可
SELECT * FROM player WHERE level > 1 AND (level < 5 OR exp > 1) AND exp < 5;
-- 4. 多值查询 (IN):查询等级恰好为 1、3 或 5 的玩家(等同于 level=1 OR level=3 OR level=5)
SELECT * FROM player WHERE level IN (1,3,5);
-- 5.区间查询(between...and...):查询1到10之间的数据
SELECT *FROM player WHERE level BETWEEN 1 AND 10;
-- 6.取反(NOT):加在各种条件语句或比较运算符前面
SELECT *FROM player WHERE level NOT BETWEEN 1 AND 10;
-- 7.模糊查询(LIKE):后面加上用来匹配的模式,使用以下二种通配符
-- % 零个或多个任意字符
-- _ 一个任意字符
-- 查找姓王的玩家
SELECT *FROM player WHERE name LIKE '王%'
-- 查找名字包含王的玩家
SELECT *FROM player WHERE name LIKE '%王%'
-- 查找姓王的二字玩家
SELECT *FROM player WHERE name LIKE '王_'
-- 8.正则表达式(REGEXP/regexp)
-- Tips: 常用通配符
-- . : 匹配任意一个字符
-- ^ : 匹配字符串的开头
-- $ : 匹配字符串的结尾
-- [abc] : 匹配方括号内列出的任意一个字符 (例如 a, b 或 c)
-- [a-z] : 匹配指定范围内的任意一个字符 (例如小写字母 a 到 z或者数字1到9)
-- A|B : 匹配 A 或者 B (逻辑“或”)
-- 查找姓王的玩家
SELECT *FROM player WHERE name REGEXP '^王';
-- 查找名字以王结尾的玩家
SELECT *FROM player WHERE name REGEXP '王$';
-- 查找姓王的二字玩家
SELECT *FROM player WHERE name REGEXP '^王.$';
-- 查找名字包含王的玩家
SELECT *FROM player WHERE name REGEXP '王';
-- 查找名字包含王或者张的玩家
SELECT *FROM player WHERE name REGEXP '[王张]';
SELECT *FROM player WHERE name REGEXP '王|张';
-- 练习
-- 查找邮件地址以 "zhangsan" 开头的玩家
SELECT * FROM player WHERE email REGEXP '^zhangsan';
SELECT * FROM player WHERE email LIKE 'zhangsan%';
-- 查找邮件地址以 a、b 或 c 开头的玩家
SELECT * FROM player WHERE email REGEXP '^[abc]';
SELECT * FROM player WHERE email REGEXP '^[a-c]';
-- 查找邮件地址以 "net" 结尾的玩家
SELECT * FROM player WHERE email REGEXP 'net$';
SELECT * FROM player WHERE email LIKE '%net';
-- 9.查找空值/非空值(is NULL/is NOT NULL)
-- 或者使用NULL比较操作符 <=>NULL
-- 查找邮箱为空的玩家
SELECT * FROM player WHERE email is NULL;
SELECT * FROM player WHERE email <=> NULL;
-- 空字符串和NULL不一样,前者用=来判断,如下
SELECT * FROM player WHERE email = '';
逻辑运算符优先级顺序:NOT>AND>OR
排序ORDER BY
排序:关键字order by,对查询结果进行排序
-- 1.默认升序
SELECT * FROM player ORDER BY level;
-- 2.字段后加DESC则降序
SELECT * FROM player ORDER BY level DESC;
-- 3.多条件排序 按等级降序的前提下再按照经验值升序,默认或者字段后加ASC表示升序
SELECT * FROM player ORDER BY level DESC,exp;
SELECT * FROM player ORDER BY level DESC,exp ASC;
-- 4.使用列的序号排序 level字段在第五列时
SELECT * FROM player ORDER BY 5 DESC,exp;
聚合函数
用来对某列进行一些计算
-- Tips: 常用聚合函数
-- 1.AVG() : 返回集合的平均值
-- 返回所有玩家的等级平均值
SELECT AVG(level) FROM player;
-- 2.COUNT() : 返回集合中的项目数(记录行数)
-- 求所有玩家总人数
SELECT COUNT(*) FROM player;
-- 3.MAX() : 返回最大值
SELECT MAX(level) FROM player;
-- 4.MIN() : 返回最小值
SELECT MIN(level) FROM player;
-- 5.SUM() : 求和
SELECT SUM(exp) FROM player;
分组group by
用于将查询结果按一个或多个列进行分组的子句,常与聚合函数配合使用,实现对每组数– 据的统计汇总。
-- 分组前
SELECT COUNT(*) FROM player;
-- 分组后:按 level(等级)把玩家分成不同的组,然后数一数每组里有多少人。
SELECT level, COUNT(*) FROM player GROUP BY level;
SELECT level, COUNT(level) FROM player GROUP BY level;
count()和count(level)区别:后者不计算level的null数 count() 不关注任何列的具体值,包括 NULL count(level) 会忽略 level为 NULL 的行
分组后筛选having
-- 按 level(等级)把玩家分成不同的组,然后数等级大于4的每组里有多少人。
SELECT level, COUNT(level) FROM player GROUP BY level HAVING count(level)>4;
-- 按 level(等级)把玩家分成不同的组,然后数等级大于4的每组里有多少人并降序
SELECT level, COUNT(level) FROM player GROUP BY level HAVING count(level)>4 ORDER BY count(level) DESC;


