MySQL
MySQL安装
Docker 安装
Docker 启动
docker run -d \
--name mysql-container \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=991012 \
-e MYSQL_DATABASE=database \
-e MYSQL_USER=pandh \
-e MYSQL_PASSWORD=your_user_password \
mysql:8.0
docker run --name mysql-container \
-e MYSQL_ROOT_PASSWORD=your_password \
-p 3306:3306 \
-v /path/to/your/my.cnf:/etc/mysql/conf.d/my.cnf \
-v mysql-data:/var/lib/mysql \
-d mysql:latest
docker run --name mysql_latest ^
-p 3306:3306 ^
-e MYSQL_ROOT_PASSWORD=Liaolunkun0! ^
-e MYSQL_USER=lin ^
-e MYSQL_PASSWORD=Liaolunkun0 ^
-v D:\Program_Files\mysql\data:/var/lib/mysql ^
-v D:\Program_Files\mysql\conf\my.cnf:/etc/mysql/conf.d/my.cnf ^
-d mysql:latest
参数说明:
--name:容器名称(自定义)。
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
-e MYSQL_ROOT_PASSWORD:设置 root 用户密码。
-e MYSQL_DATABASE:创建默认数据库(可选)。
-e MYSQL_USER/MYSQL_PASSWORD:创建普通用户并设置密码(可选)。
连接容器内MySql客户端
docker exec -it mysql-container mysql -u root -p
#先进入MySql容器
docker exec -it mysql_latest bash
#容器内用户登录
mysql -u root -p
Ubuntu 安装
sudo apt install mysql-server
systemctl status mysql
sudo cat /etc/mysql/debian.cnf 查看密码
mysql -u username -p
##
python -m pip install mysql-connector
测试MySQL是否安装
import mysql.connector
创建连接
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="yourusername",
passwd="yourpassword"
)
print(mydb)
MySQL 语句
修改密码:
新建用户
CREATE USER 'root'@'%' IDENTIFIED BY '991012'; #新建用户
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; #授予权限
FLUSH PRIVILEGES; #重新加载授权表
查询用户是否存在
SELECT user, host FROM mysql.user WHERE user = ‘root’;
修改密码
#8.0以上
ALTER USER 'lin'@'localhost' IDENTIFIED BY 'Liaolunkun0!'; #本地
ALTER USER 'lin'@'%' IDENTIFIED BY 'Liaolunkun0!'; #远程
#8.0以下
alter user 'pandhedge' identified with mysql_native_password by '123456'
ALTER USER ‘lin’@’%’ IDENTIFIED BY ‘NewLinPassword456!’;
alter user ‘pandhedge’ identified with mysql_native_password by ‘123456’
端口
显示端口
show variables like '%port%'
显示IP地址:
hostname -I
ip addr show
显示用户权限:
select user, host from mysql.user where user='root';
修改用户权限:
update user set host='%' where user='root';
FLUSH PRIVILEGES; #刷新权限
监听地址修改:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
sudo ufw allow 3306/tcp
sudo ufw reload
sudo systemctl restart mysql
MySQL SHELL
安装
sudo apt-get install mysql-shell
启动
mysqlsh
连接
\connect root@localhost
切换语言
\py \sql \js
使用数据库
\use database
关系型数据库 与 非关系型数据库
SQL语句
- DDL数据定义语言: CREATE DROP ALTER TRUNCATE
- DML数据操作语言: INSERT UPDATE DELETE CALL
- DQL数据查询语言: SELECT
- DCL数据控制语言: GRANT REVOKE

SQL指令
列 COLUMN 行 Row
显示所有数据库
show databases;
显示所有数据库下的表
USE
SHOW TABLES;
显示表的结构
desc player ;
创建数据库
create database game;
use game;
create table player(
id INT,
name VARCHAR(100)
)
ALTER table player MODIFY COLUMN name VARCHAR(200);
ALTER TABLE player RENAME COLUMN name to nick_name;
ALTER TABLE player APP COLUMN last_login DATETIME;
ALTER TABLE player DROP COLUNM last_login;
DROP TABLE
数据的增删查改
INSERT INTO player (id,name) VALUES (1,’ZHANG’);
INSERT INTO player (id,name) VALUES (1,’ZHANG’),(1,’QUNIMADE’);
select * from player; #* 列名 后跟where 条件
SELECT * FROM player WHERE level LIKE '';
UPDATE player set level = 1 where name = ‘li’;
DELETE FROM player where gold = 0;
ALTER TABLE player MODIFY level INT DEFAULT 1;
逻辑操作符
= >= <=
用于组合多个条件:
| 操作符 | 说明 | 示例 |
|---|---|---|
AND |
逻辑与 | age > 20 AND salary < 10000 |
OR |
逻辑或 | country = 'China' OR country = 'USA' |
NOT |
逻辑非 | NOT (age < 18) |
优先级:NOT > AND > OR
数据导出与导入
导出
mysqldump -u root -p game > game.sql
导入
mysql -u root -p game < game.sql
常用语句
WHERE 与SELECT\UPDATE\DELETE
- IN IN ()
- BETWEENT num AND num
- NOT NOT IN ()
- LIKE LIKE ‘W%’ # %:任意多个字符 _:任意一个字符
- REGEXP 正则表达式
| · | 匹配任意一个字符 | |
| ^ 开头 | $ 结尾 | |
| [abc] | 其中任意一个字符 | |
| [a-z] | 范围内的任意一个字符 | |
| A|B | A或B |
- WHERE name is null 查询为空 is not null
- 空字符串 WHERE name is null
ORDER BY :排序 (默认升序
SELECT * FROM player ORDER BY level;
- 末尾加 DESC 降序(ASC 升序
-\ ORDER BY level, id; 多列排序
GROUP BY 分组
SELECT sex,COUNT(*) FROM player GROUP BY sex;
第一个sex 作为分组依据和统计对象
去重
SELECT dept FROM employees GROUP BY dept;
HAVING 过滤 (必须与GROUP BY 一起使用)
SELECT sex,COUNT(level) FROM player GROUP BY sex HAVING count(level)>4;
LIMIT 限制数量
LINIT 3,4; 返回3个结果,从第五个开始
DISITINCT 去重
SELECT DISTINCT sex from player;
UNION 合并查询结果集 并集
在两条语句中插入 UNION,(如果不想去掉重复项,使用 UNION ALL
INTERSECT 交集
EXCEPT 差集
聚合函数
SELECT COUNT(*) FROM player;
COUNT() 统计含null COUNT(level) 统计不含null
常用聚合函数
| AVG() | 返回集合的平均值 | |
| COUNT() | 返回集合的项目数量 | |
| MAX() | ||
| MIN() | ||
| SUM() | 求和 | |
| substr(column,开始位置,截取长度) | ||
| ROUND() | 四舍五入 | |
| exists() | 检查查询是否有结果 | SELECT EXISTS(…..); |
SELECT
SUBSTR(name, 1, 1) AS first_letter, -- 提取首字母并命名为 first_letter
COUNT(*) AS count -- 统计每个首字母出现的次数
FROM player
GROUP BY first_letter -- 按首字母分组
HAVING count > 5 -- 筛选次数超过5的组
ORDER BY count DESC -- 按次数降序排列
LIMIT 3;
数据类型
整数类型
| 类型 | 存储字节 | 范围(有符号) | 范围(无符号) |
|---|---|---|---|
TINYINT |
1 | -128 到 127 | 0 到 255 |
SMALLINT |
2 | -32,768 到 32,767 | 0 到 65,535 |
MEDIUMINT |
3 | -8,388,608 到 8,388,607 | 0 到 16,777,215 |
INT |
4 | -2,147,483,648 到 2,147,483,647 | 0 到 4,294,967,295 |
BIGINT |
8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0 到 18,446,744,073,709,551,615 |
浮点类型
| 类型 | 存储字节 | 精度 |
|---|---|---|
FLOAT |
4 | 单精度,约 7 位小数 |
DOUBLE |
8 | 双精度,约 15 位小数 |
DECIMAL |
可变 | 高精度,适合财务计算 |
日期和时间类型
| 类型 | 格式 | 范围 | 存储字节 |
|---|---|---|---|
DATE |
YYYY-MM-DD |
1000-01-01 到 9999-12-31 | 3 |
TIME |
HH:MM:SS |
-838:59:59 到 838:59:59 | 3 |
DATETIME |
YYYY-MM-DD HH:MM:SS |
1000-01-01 00:00:00 到 9999-12-31 23:59:59 | 8 |
TIMESTAMP |
YYYY-MM-DD HH:MM:SS |
1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC | 4 |
YEAR |
YYYY |
1901 到 2155 | 1 |
字符串类型
- 固定长度字符串
| 类型 | 长度范围 | 存储方式 |
|---|---|---|
CHAR(n) |
0 ≤ n ≤ 255 | 固定长度,不足补空格 |
BINARY(n) |
0 ≤ n ≤ 255 | 二进制版本的 CHAR |
- 可变长度字符串
| 类型 | 长度范围 | 存储方式 |
|---|---|---|
VARCHAR(n) |
0 ≤ n ≤ 65,535 | 长度 + 内容,动态分配 |
TEXT |
0 ≤ n ≤ 65,535 (TINY) | 大文本,超过 255 字节时更高效 |
BLOB |
二进制版本的 TEXT |
枚举和集合类型
- 枚举(ENUM)
- 从预定义的值列表中选择单个值。
CREATE TABLE users (
gender ENUM('Male', 'Female', 'Other') -- 只能选其一
);
- 集合(SET)
- 从预定义的值列表中选择零个或多个值。
CREATE TABLE products (
tags SET('New', 'Popular', 'Sale', 'Featured') -- 可多选
);
二进制类型
| 类型 | 存储范围 | 用途 |
|---|---|---|
BINARY(n) |
0 ≤ n ≤ 255 字节 | 固定长度二进制数据 |
VARBINARY(n) |
0 ≤ n ≤ 65,535 字节 | 可变长度二进制数据 |
TINYBLOB |
最大 255 字节 | 小二进制对象(如缩略图) |
BLOB |
最大 65,535 字节 | 二进制对象(如图像、音频) |
LONGBLOB |
最大 4GB | 大文件存储 |
JSON 类型
- 存储 JSON 格式数据,支持 JSON 路径查询和函数。
CREATE TABLE users (
id INT PRIMARY KEY,
info JSON
);
-- 查询 JSON 字段
SELECT info->'$.name' FROM users;
七、空间数据类型
用于存储地理空间数据(如点、线、多边形):
POINT:表示坐标点(经度、纬度)。LINESTRING:表示线段。POLYGON:表示多边形。GEOMETRY:通用几何类型。
约束
在 MySQL 中,约束(Constraint) 是用于强制保证数据完整性和一致性的规则。通过约束,可以确保表中的数据符合特定的业务逻辑,避免无效或错误的数据进入数据库。
约束类型及作用
- 主键约束(PRIMARY KEY)
-
作用:唯一标识表中的每一行,确保列值非空且唯一。
-
特点:
- 一个表只能有一个主键。
- 主键可以由单个列或多个列组合(复合主键)构成。
-
示例:
CREATE TABLE users ( id INT PRIMARY KEY, -- 单列主键 username VARCHAR(50) UNIQUE, email VARCHAR(100) ); -- 复合主键示例 CREATE TABLE order_items ( order_id INT, product_id INT, PRIMARY KEY (order_id, product_id) -- 复合主键 );
- 唯一约束(UNIQUE)
-
作用:确保列值的唯一性,但允许为
NULL(NULL可以出现多次)。 -
示例:
CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50) UNIQUE, -- 用户名唯一 email VARCHAR(100) UNIQUE -- 邮箱唯一 );
- 非空约束(NOT NULL)
-
作用:禁止列值为
NULL。 -
示例:
CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(100) NOT NULL, -- 名称不能为空 price DECIMAL(10, 2) NOT NULL -- 价格不能为空 );
- 外键约束(FOREIGN KEY)
-
作用:建立表之间的关联,确保一个表中的列值匹配另一个表的主键值。
-
特点:
- 涉及两个表:父表(主表) 和 子表(从表)。
- 子表的外键必须引用父表的主键或唯一键。
-
示例:
-- 父表:部门 CREATE TABLE departments ( dept_id INT PRIMARY KEY, dept_name VARCHAR(50) ); -- 子表:员工,关联部门表 CREATE TABLE employees ( emp_id INT PRIMARY KEY, emp_name VARCHAR(50), dept_id INT, FOREIGN KEY (dept_id) REFERENCES departments(dept_id) ON DELETE CASCADE -- 级联删除:父表记录删除时,子表相关记录自动删除 ON UPDATE RESTRICT -- 更新限制:父表主键更新时,若子表有引用则拒绝更新 ); # ON DELETE CASCADE:父表记录删除时,子表相关记录自动删除。 # ON UPDATE CASCADE:父表主键更新时,子表外键值自动更新。 # ON DELETE SET NULL:父表记录删除时,子表外键值设为 NULL(需外键列允许 NULL)。 # ON UPDATE RESTRICT:父表主键更新时,若子表有引用则拒绝更新
- 默认值约束(DEFAULT)
-
作用:为列指定默认值,当插入数据未提供值时自动使用默认值。
-
示例:
CREATE TABLE orders ( order_id INT PRIMARY KEY, order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 默认当前时间 status ENUM('pending', 'paid', 'shipped') DEFAULT 'pending' -- 默认状态 );
- 检查约束(CHECK)
-
作用:确保列值满足特定条件(MySQL 5.7 及以下版本仅语法支持,不生效;8.0+ 生效)。
-
示例:
CREATE TABLE products ( price DECIMAL(10, 2) CHECK (price > 0), -- 价格必须大于0 discount DECIMAL(3, 2) CHECK (discount BETWEEN 0 AND 1) -- 折扣范围0-1 );
约束的管理
- 创建表时添加约束
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键
name VARCHAR(50) NOT NULL,
age TINYINT CHECK (age > 0), -- 检查约束(MySQL 8.0+ 生效)
gender ENUM('M', 'F') DEFAULT 'M' -- 默认值约束
);
- 修改表添加约束
-- 添加主键
ALTER TABLE students ADD PRIMARY KEY (id);
-- 添加唯一约束
ALTER TABLE students ADD UNIQUE (email);
-- 添加外键
ALTER TABLE courses ADD FOREIGN KEY (teacher_id) REFERENCES teachers(id);
- 删除约束
-- 删除主键(需先删除自增属性)
ALTER TABLE students MODIFY id INT;
ALTER TABLE students DROP PRIMARY KEY;
-- 删除唯一约束
ALTER TABLE students DROP INDEX email;
-- 删除外键
ALTER TABLE courses DROP FOREIGN KEY fk_teacher;
子查询
子查询作为查询条件

子查询插入表中

表关联
用于查询多个表中的数据,关联的表之间必须有相同的字段。(本质就是笛卡尔积加上条件过滤)
内连接
INNER JOIN


左连接
LEFT JOIN
右连接
RIGHT JOIN
索引
提高查询效率
创建索引
create index


例子:

查看索引
SHOW INDEX FROM fast
删除索引
DROP INDEX

视图
视图本身作为一个虚拟存在的表,本身不包含数据,而是作为一个查询语句保存在数据字典中。它会根据查询语句动态生成数据。他会根据表中数据变化而变化
创建视图
CREATE VIEW

修改视图
ALTER VIEW

删除视图
DROP VIEW
DROP VIEW top10