PandHedge

MySql基础

2025-09-13
PandHedge

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
  • image-20250726093018677

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
字符串类型
  1. 固定长度字符串
类型 长度范围 存储方式
CHAR(n) 0 ≤ n ≤ 255 固定长度,不足补空格
BINARY(n) 0 ≤ n ≤ 255 二进制版本的 CHAR
  1. 可变长度字符串
类型 长度范围 存储方式
VARCHAR(n) 0 ≤ n ≤ 65,535 长度 + 内容,动态分配
TEXT 0 ≤ n ≤ 65,535 (TINY) 大文本,超过 255 字节时更高效
BLOB 二进制版本的 TEXT  
枚举和集合类型
  1. 枚举(ENUM)
  • 从预定义的值列表中选择单个值。
CREATE TABLE users (
    gender ENUM('Male', 'Female', 'Other')  -- 只能选其一
);
  1. 集合(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) 是用于强制保证数据完整性和一致性的规则。通过约束,可以确保表中的数据符合特定的业务逻辑,避免无效或错误的数据进入数据库。

约束类型及作用
  1. 主键约束(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)  -- 复合主键
    );
    
  1. 唯一约束(UNIQUE)
  • 作用:确保列值的唯一性,但允许为 NULLNULL 可以出现多次)。

  • 示例:

    CREATE TABLE users (
        id INT PRIMARY KEY,
        username VARCHAR(50) UNIQUE,   -- 用户名唯一
        email VARCHAR(100) UNIQUE      -- 邮箱唯一
    );
    
  1. 非空约束(NOT NULL)
  • 作用:禁止列值为 NULL

  • 示例:

    CREATE TABLE products (
        id INT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,    -- 名称不能为空
        price DECIMAL(10, 2) NOT NULL  -- 价格不能为空
    );
    
  1. 外键约束(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:父表主键更新时,若子表有引用则拒绝更新
    
  1. 默认值约束(DEFAULT)
  • 作用:为列指定默认值,当插入数据未提供值时自动使用默认值。

  • 示例:

    CREATE TABLE orders (
        order_id INT PRIMARY KEY,
        order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  -- 默认当前时间
        status ENUM('pending', 'paid', 'shipped') DEFAULT 'pending'  -- 默认状态
    );
    
  1. 检查约束(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
    );
    
约束的管理
  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'   -- 默认值约束
);
  1. 修改表添加约束
-- 添加主键
ALTER TABLE students ADD PRIMARY KEY (id);

-- 添加唯一约束
ALTER TABLE students ADD UNIQUE (email);

-- 添加外键
ALTER TABLE courses ADD FOREIGN KEY (teacher_id) REFERENCES teachers(id);
  1. 删除约束
-- 删除主键(需先删除自增属性)
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;

子查询

子查询作为查询条件

image-20250726165829556

子查询插入表中

image-20250726170346887

表关联

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

内连接

INNER JOIN

image-20250726171004829image-20250726171120937

左连接

LEFT JOIN

右连接

RIGHT JOIN


索引

提高查询效率

创建索引

create index

image-20250726171332518

image-20250726172016960

例子:

image-20250726171514709

查看索引

SHOW INDEX FROM fast

删除索引

DROP INDEX

image-20250726171847297


视图

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

创建视图

CREATE VIEW

image-20250726172336822

修改视图

ALTER VIEW

image-20250726172502809

删除视图

DROP VIEW

DROP VIEW top10

上一篇 Linux基础

下一篇 NumPy基础

Comments

Content