# Ubuntu 安装
sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql
# 初始化安全设置(设置 root 密码)
sudo mysql_secure_installation
-- 登录本地MySQL(需输入密码)
mysql -u root -p
-- 显示所有数据库
SHOW DATABASES;
CREATE DATABASE shop; -- 创建数据库
USE shop; -- 切换到 shop 数据库
DROP DATABASE test; -- 删除数据库
-- 创建表(含主键、自增、非空约束)
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 修改表结构
ALTER TABLE users ADD COLUMN age INT AFTER name; -- 添加列
ALTER TABLE users MODIFY email VARCHAR(150); -- 修改列类型
-- 插入数据
INSERT INTO users (name, email)
VALUES ('张三', '[email protected]');
-- 查询数据
SELECT id, name AS 姓名 FROM users WHERE age > 18 ORDER BY id DESC LIMIT 10;
-- 更新数据(需启用 safe update 模式避免全表更新)
UPDATE users SET age = 20 WHERE id = 1;
-- 删除数据
DELETE FROM users WHERE email IS NULL;
-- 多表连接(INNER JOIN)
SELECT o.order_id, u.name
FROM orders o
INNER JOIN users u ON o.user_id = u.id;
-- 分组统计(GROUP BY + HAVING)
SELECT department, COUNT(*) AS num_employees
FROM employees
GROUP BY department
HAVING num_employees > 5;
-- 子查询(EXISTS)
SELECT name FROM products
WHERE EXISTS (
SELECT 1 FROM orders WHERE product_id = products.id
);
-- 计算销售排名(按部门分区)
SELECT
employee_id,
sales,
RANK() OVER (PARTITION BY department ORDER BY sales DESC) AS dept_rank
FROM sales_records;
WITH dept_sales AS (
SELECT department, SUM(sales) total
FROM orders
GROUP BY department
)
SELECT * FROM dept_sales WHERE total > 100000;
-- 创建索引
CREATE INDEX idx_name ON users(name);
CREATE UNIQUE INDEX idx_email ON users(email); -- 唯一索引
-- 查看执行计划(排查慢查询)
EXPLAIN SELECT * FROM users WHERE name LIKE '张%';
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 回滚测试:ROLLBACK;
COMMIT;
-- 创建用户
CREATE USER 'dev_user'@'localhost' IDENTIFIED BY 'Password123!';
-- 授权(精确到表级)
GRANT SELECT, INSERT ON shop.products TO 'dev_user'@'localhost';
FLUSH PRIVILEGES;
-- 查询近一个月销售额 Top10 商品
SELECT
p.product_name,
SUM(oi.quantity * oi.unit_price) AS total_sales
FROM order_items oi
JOIN products p ON oi.product_id = p.id
JOIN orders o ON oi.order_id = o.id
WHERE o.order_date > CURDATE() - INTERVAL 1 MONTH
GROUP BY p.id
ORDER BY total_sales DESC
LIMIT 10;
# 使用 mysqldump 导出结构
mysqldump -u root -p --no-data shop > schema.sql
# 使用数据字典工具(推荐:phpMyAdmin 或 MySQL Workbench)
-- 查询生成数据字典
SELECT
TABLE_NAME AS `表名`,
COLUMN_NAME AS `字段名`,
DATA_TYPE AS `数据类型`,
COLUMN_COMMENT AS `描述`
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'shop';
命令 | 作用 |
---|---|
SHOW GLOBAL STATUS LIKE 'Threads_running'; |
查看当前连接数 |
SHOW VARIABLES LIKE '%buffer%'; |
检查内存缓冲区设置 |
ANALYZE TABLE users; |
更新表统计信息 |
#!/bin/bash
DATE=$(date +%Y%m%d)
mysqldump -u root -p'your_password' --all-databases | gzip > /backups/mysql_$DATE.sql.gz
# 添加到 crontab:0 2 * * * /path/to/backup.sh
-- MySQL 8.0 使用 caching_sha2_password 插件
ALTER USER 'dev_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
✅ 重点提示:实操时建议在测试环境练习高危操作(如DROP/ALTER),生产环境必须备份!
本教程遵循 MIT License 协议开源,代码可自由使用。建议配合 MySQL Docker 镜像 快速搭建练习环境。