# 本地连接
mysql -u root -p
# 远程连接
mysql -h hostname -u root -p demo
# 指定端口连接
mysql -h hostname -P 3306 -u root -p demo
连接参数说明
-u: 用户名
-p: 密码(会提示输入)
-h: 主机名或IP地址
-P: 端口号(默认3306)
2. 数据库操作
2.1 查看数据库
sql复制代码
-- 显示所有数据库
SHOW DATABASES;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
-- 使用特定数据库
USE mysql;
mysql> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
-- 显示当前使用的数据库
SELECT DATABASE();
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| mysql |
+------------+
1 row in set (0.00 sec)
2.2 创建数据库
sql复制代码
-- 基本创建
CREATE DATABASE shop;
-- 创建时指定字符集
CREATE DATABASE IF NOT EXISTS shop
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
mysql> CREATE DATABASE IF NOT EXISTS shop
-> CHARACTER SET utf8mb4
-> COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| shop |
| sys |
+--------------------+
5 rows in set (0.00 sec)
2.3 删除数据库
sql复制代码
-- 删除数据库
DROP DATABASE shop;
-- 安全删除(如果存在才删除)
DROP DATABASE IF EXISTS shop;
3. 表操作
3.1 查看表信息
sql复制代码
-- 显示当前数据库中的所有表
SHOW TABLES;
-- 查看表结构
DESCRIBE table_name;
DESC table_name;
SHOW COLUMNS FROM table_name;
-- 查看建表语句
SHOW CREATE TABLE table_name;
-- 查看表状态信息
SHOW TABLE STATUS LIKE 'table_name';
3.2 创建表
sql复制代码
-- 基本建表语法
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
password VARCHAR(255) NOT NULL,
age INT DEFAULT 0,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
mysql> use shop;
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> CREATE TABLE users (
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(50) NOT NULL UNIQUE,
-> email VARCHAR(100) NOT NULL,
-> password VARCHAR(255) NOT NULL,
-> age INT DEFAULT 0,
-> is_active BOOLEAN DEFAULT TRUE,
-> created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-> updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;
+----------------+
| Tables_in_shop |
+----------------+
| users |
+----------------+
1 row in set (0.00 sec)
3.3 常用数据类型
类型
说明
示例
INT
整数
age INT
VARCHAR(n)
可变长度字符串
name VARCHAR(50)
TEXT
长文本
description TEXT
DECIMAL(m,d)
精确小数
price DECIMAL(10,2)
DATE
日期
birth_date DATE
DATETIME
日期时间
created_at DATETIME
TIMESTAMP
时间戳
updated_at TIMESTAMP
BOOLEAN
布尔值
is_active BOOLEAN
3.4 修改表结构
sql复制代码
-- 添加列
ALTER TABLE table_name ADD COLUMN column_name data_type;
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- 删除列
ALTER TABLE table_name DROP COLUMN column_name;
ALTER TABLE users DROP COLUMN phone;
-- 修改列数据类型
ALTER TABLE table_name MODIFY COLUMN column_name new_data_type;
ALTER TABLE users MODIFY COLUMN age SMALLINT;
-- 重命名列
ALTER TABLE table_name CHANGE old_name new_name data_type;
ALTER TABLE users CHANGE username user_name VARCHAR(50);
-- 重命名表
RENAME TABLE old_table_name TO new_table_name;
-- 添加主键
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
-- 添加外键
ALTER TABLE table_name ADD FOREIGN KEY (column_name)
REFERENCES other_table(column_name);
mysql> DESC users;
+------------+--------------+------+-----+-------------------+-----------------------------------------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+-------------------+-----------------------------------------------+
| id | int | NO | PRI | NULL | auto_increment |
| user_name | varchar(50) | YES | UNI | NULL | |
| email | varchar(100) | NO | | NULL | |
| password | varchar(255) | NO | | NULL | |
| age | smallint | YES | | NULL | |
| is_active | tinyint(1) | YES | | 1 | |
| created_at | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| updated_at | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+------------+--------------+------+-----+-------------------+-----------------------------------------------+
8 rows in set (0.00 sec)
3.5 删除表
sql复制代码
-- 删除表
DROP TABLE table_name;
-- 安全删除
DROP TABLE IF EXISTS table_name;
-- 删除多个表
DROP TABLE table1, table2, table3;
-- 等值查询
SELECT * FROM users WHERE id = 1;
SELECT * FROM users WHERE user_name = 'john_doe';
mysql> SELECT * FROM users WHERE id = 1;
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
| id | user_name | email | password | age | is_active | created_at | updated_at |
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
| 1 | john_doe | john@example.com | hashed_password | NULL | 1 | 2025-09-04 16:20:58 | 2025-09-04 16:20:58 |
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM users WHERE user_name = 'john_doe';
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
| id | user_name | email | password | age | is_active | created_at | updated_at |
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
| 1 | john_doe | john@example.com | hashed_password | NULL | 1 | 2025-09-04 16:20:58 | 2025-09-04 16:20:58 |
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
1 row in set (0.00 sec)
-- 比较查询
SELECT * FROM users WHERE age = NULL;
-- 模糊查询
SELECT * FROM users WHERE user_name LIKE 'john%';
SELECT * FROM users WHERE email LIKE '%@gmail.com';
mysql> SELECT * FROM users WHERE user_name LIKE 'john%';
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
| id | user_name | email | password | age | is_active | created_at | updated_at |
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
| 1 | john_doe | john@example.com | hashed_password | NULL | 1 | 2025-09-04 16:20:58 | 2025-09-04 16:20:58 |
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM users WHERE email LIKE '%@example.com';
+----+---------------+----------------------+-----------------+------+-----------+---------------------+---------------------+
| id | user_name | email | password | age | is_active | created_at | updated_at |
+----+---------------+----------------------+-----------------+------+-----------+---------------------+---------------------+
| 1 | john_doe | john@example.com | hashed_password | NULL | 1 | 2025-09-04 16:20:58 | 2025-09-04 16:20:58 |
| 2 | user1 | user1@example.com | password1 | NULL | 1 | 2025-09-04 16:22:58 | 2025-09-04 16:22:58 |
| 3 | user2 | user2@example.com | password2 | NULL | 1 | 2025-09-04 16:22:58 | 2025-09-04 16:22:58 |
| 4 | user3 | user3@example.com | password3 | NULL | 1 | 2025-09-04 16:22:58 | 2025-09-04 16:22:58 |
| 5 | existing_user | existing@example.com | | NULL | 1 | 2025-09-04 16:23:08 | 2025-09-04 16:23:08 |
+----+---------------+----------------------+-----------------+------+-----------+---------------------+---------------------+
5 rows in set (0.00 sec)
-- 多条件查询
SELECT * FROM users WHERE age > 18 AND is_active = TRUE;
SELECT * FROM users WHERE user_name = 'john' OR email = 'john@example.com';
-- 空值查询
SELECT * FROM users WHERE phone IS NULL;
SELECT * FROM users WHERE phone IS NOT NULL;
-- 范围查询
SELECT * FROM users WHERE id IN (1, 2, 3, 4, 5);
SELECT * FROM users WHERE user_name NOT IN ('admin', 'root');
排序和分页
sql复制代码
-- 排序
SELECT * FROM users ORDER BY created_at DESC;
SELECT * FROM users ORDER BY age ASC, username DESC;
-- 分页
SELECT * FROM users LIMIT 10; -- 前10条
SELECT * FROM users LIMIT 10 OFFSET 20; -- 跳过20条,取10条
SELECT * FROM users LIMIT 20, 10; -- MySQL特有语法,跳过20条,取10条
聚合查询
sql复制代码
-- 统计函数
SELECT COUNT(*) FROM users; -- 总记录数
SELECT COUNT(phone) FROM users; -- 非空phone字段数
SELECT MAX(age), MIN(age), AVG(age) FROM users; -- 最大、最小、平均年龄
SELECT SUM(age) FROM users; -- 年龄总和
-- 分组统计
SELECT age, COUNT(*) as count FROM users GROUP BY age;
SELECT DATE(created_at) as date, COUNT(*) as daily_users
FROM users
GROUP BY DATE(created_at)
ORDER BY date DESC;
-- 分组过滤
SELECT age, COUNT(*) as count
FROM users
GROUP BY age
HAVING count > 5;
4.3 更新数据 (UPDATE)
sql复制代码
-- 更新单个字段
UPDATE users SET email = 'newemail@example.com' WHERE id = 1;
-- 更新多个字段
UPDATE users SET
email = 'updated@example.com',
age = 25,
updated_at = CURRENT_TIMESTAMP
WHERE username = 'john_doe';
-- 批量更新
UPDATE users SET is_active = FALSE WHERE created_at < '2022-01-01';
-- 使用表达式更新
UPDATE users SET age = age + 1 WHERE birthday = CURDATE();
4.4 删除数据 (DELETE)
sql复制代码
-- 删除特定记录
DELETE FROM users WHERE id = 1;
-- 批量删除
DELETE FROM users WHERE is_active = FALSE;
-- 删除所有数据(保留表结构)
DELETE FROM users;
-- 清空表(更快,重置AUTO_INCREMENT)
TRUNCATE TABLE users;
5. 高级查询
5.1 连接查询 (JOIN)
内连接 (INNER JOIN)
sql复制代码
-- 基本内连接
SELECT u.username, p.title
FROM users u
INNER JOIN posts p ON u.id = p.user_id;
-- 多表连接
SELECT u.username, p.title, c.content
FROM users u
INNER JOIN posts p ON u.id = p.user_id
INNER JOIN comments c ON p.id = c.post_id;
左连接 (LEFT JOIN)
sql复制代码
-- 左连接(显示所有用户,即使没有发布文章)
SELECT u.username, p.title
FROM users u
LEFT JOIN posts p ON u.id = p.user_id;
右连接 (RIGHT JOIN)
sql复制代码
-- 右连接(显示所有文章,即使用户不存在)
SELECT u.username, p.title
FROM users u
RIGHT JOIN posts p ON u.id = p.user_id;
全外连接 (FULL OUTER JOIN)
sql复制代码
-- MySQL不直接支持FULL OUTER JOIN,需要使用UNION
SELECT u.username, p.title
FROM users u LEFT JOIN posts p ON u.id = p.user_id
UNION
SELECT u.username, p.title
FROM users u RIGHT JOIN posts p ON u.id = p.user_id;
5.2 子查询
sql复制代码
-- 标量子查询
SELECT * FROM users
WHERE id = (SELECT user_id FROM posts WHERE title = 'My First Post');
-- 列表子查询
SELECT * FROM users
WHERE id IN (SELECT user_id FROM posts WHERE created_at > '2023-01-01');
-- 相关子查询
SELECT * FROM users u
WHERE EXISTS (SELECT 1 FROM posts p WHERE p.user_id = u.id);
-- 子查询在FROM中
SELECT avg_age.age_group, COUNT(*) as user_count
FROM (
SELECT
CASE
WHEN age < 18 THEN 'Youth'
WHEN age BETWEEN 18 AND 65 THEN 'Adult'
ELSE 'Senior'
END as age_group
FROM users
) avg_age
GROUP BY avg_age.age_group;
5.3 窗口函数 (MySQL 8.0+)
sql复制代码
-- ROW_NUMBER()
SELECT username, age,
ROW_NUMBER() OVER (ORDER BY age DESC) as rank
FROM users;
-- RANK() 和 DENSE_RANK()
SELECT username, age,
RANK() OVER (ORDER BY age DESC) as rank,
DENSE_RANK() OVER (ORDER BY age DESC) as dense_rank
FROM users;
-- 分区窗口函数
SELECT username, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;
5.4 公用表表达式 (CTE) - MySQL 8.0+
sql复制代码
-- 基本CTE
WITH high_value_users AS (
SELECT * FROM users WHERE age > 30
)
SELECT username, email FROM high_value_users;
-- 递归CTE
WITH RECURSIVE employee_hierarchy AS (
SELECT id, name, manager_id, 1 as level
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id, eh.level + 1
FROM employees e
INNER JOIN employee_hierarchy eh ON e.manager_id = eh.id
)
SELECT * FROM employee_hierarchy;
6. 索引操作
6.1 创建索引
sql复制代码
-- 普通索引
CREATE INDEX idx_username ON users (username);
-- 唯一索引
CREATE UNIQUE INDEX idx_email ON users (email);
-- 复合索引
CREATE INDEX idx_name_age ON users (username, age);
-- 前缀索引
CREATE INDEX idx_email_prefix ON users (email(10));
-- 在创建表时添加索引
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100),
INDEX idx_username (username),
UNIQUE INDEX idx_email (email)
);
6.2 查看索引
sql复制代码
-- 查看表的所有索引
SHOW INDEX FROM users;
-- 查看索引使用情况
EXPLAIN SELECT * FROM users WHERE username = 'john';
6.3 删除索引
sql复制代码
-- 删除索引
DROP INDEX idx_username ON users;
-- 删除主键
ALTER TABLE users DROP PRIMARY KEY;
7. 用户和权限管理
7.1 用户管理基础
查看当前用户信息
sql复制代码
-- 查看当前用户
SELECT USER();
-- 查看当前用户的权限
SHOW GRANTS;
-- 以root用户身份查看所有权限
SHOW GRANTS FOR 'root'@'localhost';
用户信息查询
sql复制代码
-- 切换到mysql系统数据库
USE mysql;
-- 查看user表的结构
DESC user;
-- 查看user表的主要字段
SELECT HOST, USER, authentication_string FROM user;
-- 查看所有用户
SELECT Host, User FROM mysql.user;
-- 查看当前数据库的所有用户
SELECT DISTINCT User FROM mysql.user;
-- 查看特定用户的详细信息
SELECT Host, User, authentication_string, Select_priv, Insert_priv, Update_priv, Delete_priv
FROM mysql.user
WHERE User = 'root';
-- 使用show命令查看用户权限
SHOW GRANTS FOR 'root'@'localhost';
7.2 创建用户
基本语法
sql复制代码
-- 基本创建用户语法
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
-- 完整语法
CREATE USER [IF NOT EXISTS] '用户名'@'主机名' -- 创建用户,如果已存在则忽略
IDENTIFIED BY '密码' -- 设置用户密码(默认使用 caching_sha2_password 插件)
[IDENTIFIED WITH 插件名 BY '密码'] -- 可选:指定认证插件,如 mysql_native_password
[PASSWORD EXPIRE [DEFAULT | NEVER | INTERVAL N DAY]] -- 密码过期策略
-- DEFAULT : 使用系统默认策略
-- NEVER : 密码永不过期
-- INTERVAL N DAY : N 天后密码过期
[ACCOUNT [LOCK | UNLOCK]] -- 用户账户状态
-- LOCK : 锁定账户,禁止登录
-- UNLOCK : 解锁账户,允许登录
[DEFAULT ROLE 角色名 [, 角色名] ...] -- 设置用户的默认角色
[REQUIRE { NONE | SSL | X509 | CIPHER 'str' | ISSUER 'str' | SUBJECT 'str'}]
-- TLS/SSL 登录要求
-- NONE : 不要求
-- SSL : 必须使用 SSL
-- X509 : 必须有有效证书
-- CIPHER/ISSUER/SUBJECT : 指定更严格的证书限制
创建用户时设置密码的加密处理
sql复制代码
-- 查看默认的加密验证插件
SHOW VARIABLES LIKE 'default_authentication_plugin';
-- 创建用户时指定加密密码验证插件
CREATE USER 'test_user'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
创建用户案例
sql复制代码
-- 创建本地登录用户
CREATE USER 'local_user'@'localhost' IDENTIFIED BY 'local_123';
-- 创建可以在任意主机登录的用户
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'remote_123';
-- 创建只能在特定的IP下登录的用户
CREATE USER 'office_user'@'192.168.1.100' IDENTIFIED BY 'office_123';
-- 创建只能从特定的网段登录的用户
CREATE USER 'dept_user'@'192.168.1.%' IDENTIFIED BY 'dept_123';
-- 创建用户并设置密码永不过期
CREATE USER 'app_user'@'%' IDENTIFIED BY 'app_123456' PASSWORD EXPIRE NEVER;
-- 验证用户创建成功
SELECT host, user FROM mysql.user WHERE user LIKE '%user%';
创建用户时常见报错的解决方法
sql复制代码
-- 错误1:ERROR 1396 (HY000): Operation CREATE USER failed
-- 原因:用户已经存在
-- 解决方法:使用IF NOT EXISTS或先删除用户
CREATE USER IF NOT EXISTS 'existing_user'@'localhost' IDENTIFIED BY 'password';
-- 错误2:ERROR 1045 (28000): Access denied
-- 原因:当前用户没有CREATE USER权限
-- 解决方法:使用有足够权限的用户(如root)登录
-- 错误3:密码策略不符合要求
-- 查看密码策略
SHOW VARIABLES LIKE 'validate_password%';
-- 创建符合密码策略的用户
CREATE USER 'strong_user'@'localhost' IDENTIFIED BY 'StrongPass123!';
7.3 删除用户
基本语法
sql复制代码
-- 基本语法
DROP USER '用户名'@'主机名';
-- 删除多个用户
DROP USER '用户1'@'主机1', '用户2'@'主机2';
-- 安全删除(如果用户不存在会报错)
DROP USER IF EXISTS '用户名'@'主机名';
删除用户案例
sql复制代码
-- 示例1:删除单个用户
DROP USER 'test_user'@'localhost';
-- 示例2:删除多个用户
DROP USER 'user1'@'localhost', 'user2'@'%';
-- 示例3:安全删除用户
DROP USER IF EXISTS 'maybe_not_exist'@'localhost';
-- 示例4:删除所有测试用户
-- 先查询要删除的用户
SELECT CONCAT('DROP USER ''', User, '''@''', Host, ''';') AS drop_command
FROM mysql.user
WHERE User LIKE 'test_%';
-- 执行生成的删除命令
DROP USER 'test_user1'@'localhost';
DROP USER 'test_user2'@'%';
-- 验证用户删除成功
SELECT Host, User FROM mysql.user WHERE User LIKE 'test_%';
7.4 修改用户密码
基本语法
sql复制代码
-- 使用ALTER USER(推荐mysql5.7+)
ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';
-- 使用SET PASSWORD
SET PASSWORD FOR '用户名'@'主机名' = '新密码';
-- 修改当前用户密码
SET PASSWORD = '新密码';
使用PASSWORD()函数的注意事项
sql复制代码
-- MySQL5.7以及以下版本(不推荐,已过时)
SET PASSWORD FOR 'user'@'host' = PASSWORD('新密码');
-- MySQL8+以上推荐
ALTER USER 'user'@'host' IDENTIFIED BY '新密码';
修改用户密码示例
sql复制代码
-- 示例1:root用户修改其他用户密码
ALTER USER 'app_user'@'%' IDENTIFIED BY 'new_strong_password123!';
-- 示例2:用户修改自己的密码
ALTER USER USER() IDENTIFIED BY 'my_new_password123!';
-- 示例3:修改密码并设置过期策略
ALTER USER 'temp_user'@'localhost'
IDENTIFIED BY 'temp_password123!'
PASSWORD EXPIRE INTERVAL 30 DAY;
-- 示例4:强制用户下次登录时修改密码
ALTER USER 'new_employee'@'%'
IDENTIFIED BY 'initial_password123!'
PASSWORD EXPIRE;
-- 示例5:批量修改密码(生成SQL语句)
SELECT CONCAT('ALTER USER ''', User, '''@''', Host, ''' IDENTIFIED BY ''new_password_', User, ''';') AS alter_command
FROM mysql.user
WHERE User LIKE 'temp_%';
-- 验证密码修改(通过重新登录测试)
-- mysql -u app_user -p -h localhost
7.5 权限管理
sql复制代码
-- 授予所有权限
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost';
-- 授予特定权限
GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.table_name TO 'username'@'localhost';
-- 授予创建权限
GRANT CREATE, DROP ON database_name.* TO 'username'@'localhost';
-- 查看用户权限
SHOW GRANTS FOR 'username'@'localhost';
SHOW GRANTS FOR CURRENT_USER();
-- 撤销权限
REVOKE ALL PRIVILEGES ON database_name.* FROM 'username'@'localhost';
REVOKE SELECT ON database_name.table_name FROM 'username'@'localhost';
-- 刷新权限表
FLUSH PRIVILEGES;
-- IF函数
SELECT username, IF(age >= 18, '成年', '未成年') as status FROM users;
-- CASE语句
SELECT username,
CASE
WHEN age < 18 THEN '未成年'
WHEN age BETWEEN 18 AND 65 THEN '成年'
ELSE '老年'
END as age_group
FROM users;
-- COALESCE函数(返回第一个非NULL值)
SELECT username, COALESCE(phone, email, '无联系方式') as contact FROM users;
-- NULLIF函数
SELECT NULLIF(age, 0) FROM users; -- 如果age=0则返回NULL
8.5 聚合函数
sql复制代码
-- 基本聚合
SELECT COUNT(*), COUNT(phone) FROM users; -- 总数,非空phone数
SELECT SUM(age), AVG(age) FROM users; -- 总和,平均值
SELECT MAX(age), MIN(age) FROM users; -- 最大值,最小值
-- 分组聚合
SELECT department, COUNT(*), AVG(salary)
FROM employees
GROUP BY department;
-- 字符串聚合 (MySQL 5.7+)
SELECT department, GROUP_CONCAT(name) as employees
FROM employees
GROUP BY department;