什么是数据库?

数据库是存储和管理数据的系统。MySQL是关系型数据库,用表(类似Excel)存储数据,并用SQL语言操作。


安装MySQL

Ubuntu/Debian

1
2
3
4
5
6
7
8
9
apt update
apt install -y mysql-server mysql-client

# 启动MySQL
systemctl start mysql
systemctl enable mysql

# 安全配置
mysql_secure_installation

CentOS/RHEL

1
2
3
yum install -y mysql-server
systemctl start mysqld
systemctl enable mysqld

登录MySQL

1
2
mysql -u root -p
# 输入密码后进入MySQL命令行

数据库基本操作

创建数据库

1
2
CREATE DATABASE mydb;
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

查看数据库

1
SHOW DATABASES;

选择数据库

1
USE mydb;

删除数据库

1
DROP DATABASE mydb;

表的基本操作

创建表

1
2
3
4
5
6
7
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

字段类型:

  • INT - 整数
  • VARCHAR(n) - 字符串,n为最大长度
  • TEXT - 长文本
  • DATE - 日期
  • TIMESTAMP - 时间戳

约束:

  • PRIMARY KEY - 主键(唯一标识)
  • NOT NULL - 不能为空
  • UNIQUE - 唯一值
  • AUTO_INCREMENT - 自增
  • DEFAULT - 默认值

查看表

1
SHOW TABLES;

查看表结构

1
2
3
DESCRIBE users;
-- 或
DESC users;

删除表

1
DROP TABLE users;

数据操作(CRUD)

插入数据(Create)

1
2
3
4
5
6
INSERT INTO users (username, email, age) VALUES ('张三', 'zhangsan@example.com', 25);

-- 一次多条
INSERT INTO users (username, email, age) VALUES
('李四', 'lisi@example.com', 30),
('王五', 'wangwu@example.com', 28);

查询数据(Read)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- 查询所有
SELECT * FROM users;

-- 查询特定列
SELECT username, email FROM users;

-- 带条件
SELECT * FROM users WHERE age > 25;

-- 排序
SELECT * FROM users ORDER BY age DESC; -- DESC降序,ASC升序

-- 限制返回数量
SELECT * FROM users LIMIT 5;

-- 模糊查询
SELECT * FROM users WHERE username LIKE '张%'; -- 以张开头
SELECT * FROM users WHERE email LIKE '%@example.com';

-- 多条件
SELECT * FROM users WHERE age > 25 AND username != '张三';
SELECT * FROM users WHERE age IN (25, 30, 35);

更新数据(Update)

1
2
3
4
5
6
7
UPDATE users SET age = 26 WHERE username = '张三';

-- 更新多个字段
UPDATE users SET age = 27, email = 'newemail@example.com' WHERE id = 1;

-- 带条件
UPDATE users SET age = age + 1 WHERE username LIKE '张%';

删除数据(Delete)

1
2
3
4
5
6
7
DELETE FROM users WHERE id = 1;

-- 带条件
DELETE FROM users WHERE age < 20;

-- 删除所有数据(保留表结构)
TRUNCATE TABLE users;

高级查询

聚合函数

1
2
3
4
5
SELECT COUNT(*) FROM users;               -- 总记录数
SELECT AVG(age) FROM users; -- 平均年龄
SELECT MAX(age) FROM users; -- 最大年龄
SELECT MIN(age) FROM users; -- 最小年龄
SELECT SUM(age) FROM users; -- 年龄总和

分组(GROUP BY)

1
2
3
4
5
6
7
8
9
10
-- 按年龄段分组统计
SELECT
CASE
WHEN age < 20 THEN '20岁以下'
WHEN age < 30 THEN '20-29岁'
ELSE '30岁以上'
END AS age_group,
COUNT(*) AS count
FROM users
GROUP BY age_group;

连接表(JOIN)

假设有订单表:

1
2
3
4
5
6
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id)
);

INNER JOIN(内连接):

1
2
3
SELECT users.username, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;

LEFT JOIN(左连接):

1
2
3
SELECT users.username, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

用户管理

创建用户

1
2
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password123';
CREATE USER 'remoteuser'@'%' IDENTIFIED BY 'password123'; -- % 允许远程连接

授权

1
2
3
4
5
6
7
8
-- 授予所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'newuser'@'localhost';

-- 授予特定权限
GRANT SELECT, INSERT, UPDATE ON mydb.users TO 'newuser'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;

查看用户

1
SELECT user, host FROM mysql.user;

删除用户

1
DROP USER 'newuser'@'localhost';

修改密码

1
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

备份和恢复

备份单个数据库

1
mysqldump -u root -p mydb > mydb_backup.sql

备份所有数据库

1
mysqldump -u root -p --all-databases > all_backup.sql

恢复数据库

1
mysql -u root -p mydb < mydb_backup.sql

备份单个表

1
mysqldump -u root -p mydb users > users_backup.sql

性能优化

创建索引

1
2
3
4
5
6
7
8
-- 单列索引
CREATE INDEX idx_username ON users(username);

-- 唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);

-- 复合索引
CREATE INDEX idx_age_username ON users(age, username);

查看索引

1
SHOW INDEX FROM users;

删除索引

1
DROP INDEX idx_username ON users;

查看查询执行计划

1
EXPLAIN SELECT * FROM users WHERE username = '张三';

数据类型选择

类型 大小 用途
TINYINT 1字节 小整数(0-255)
INT 4字节 普通整数
BIGINT 8字节 大整数
VARCHAR(n) n字节 变长字符串
TEXT 最多65535字节 长文本
DATE 3字节 日期(YYYY-MM-DD)
DATETIME 8字节 日期时间
TIMESTAMP 4字节 时间戳(自动更新)

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 显示当前数据库
SELECT DATABASE();

-- 显示当前用户
SELECT USER();

-- 显示表状态
SHOW TABLE STATUS;

-- 显示创建表的SQL
SHOW CREATE TABLE users;

-- 查看连接数
SHOW PROCESSLIST;

-- 杀死连接
KILL 进程ID;

常见问题

Q: 忘记root密码?
A:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 停止MySQL
systemctl stop mysql

# 2. 跳过权限启动
mysqld_safe --skip-grant-tables &

# 3. 登录并重置密码
mysql -u root
USE mysql;
UPDATE user SET authentication_string='' WHERE user='root';
FLUSH PRIVILEGES;
EXIT;

# 4. 重启MySQL
systemctl restart mysql

Q: 字符集乱码?
A: 创建表时指定字符集:

1
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

Q: 导入大文件慢?
A:

1
2
# 增加超时时间
mysql -u root -p --max_allowed_packet=256M mydb < large_file.sql

Q: 如何查看表占用空间?
A:

1
2
3
4
5
SELECT 
table_name,
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS size_mb
FROM information_schema.TABLES
WHERE table_schema = 'mydb';

总结

  • 安装:apt install mysql-server,启动并enable
  • 数据库操作:CREATE DATABASEUSEDROP DATABASE
  • 表操作:CREATE TABLEDESCRIBEDROP TABLE
  • CRUD:INSERT插入,SELECT查询,UPDATE更新,DELETE删除
  • 高级查询:COUNT/AVG/MAX/MIN/SUMGROUP BYJOIN
  • 用户管理:CREATE USERGRANTFLUSH PRIVILEGES
  • 备份:mysqldump 备份,mysql 恢复
  • 优化:创建INDEX,用EXPLAIN分析查询
  • 常用:SHOW DATABASESSHOW TABLESDESCRIBE

下一篇:Git版本控制入门。