1. 首页 > MySQL教程 > 正文

MySQL教程FG058-MySQL常见操作示例

GF-MySQL

内容简介:本文主要介绍MySQL相关知识,包括安装、配置、优化等内容。风哥教程参考MySQL官方文档MySQL SQL Syntax、MySQL Server Administration。 01 更多视频教程www.fgedu.net.cn 02 学习交流加群风哥微信: itpux-com

Part01-基础概念与理论知识

1.1 连接MySQL服务器

# 使用默认端口连接
mysql -u root -p

# 指定主机和端口连接
mysql -h localhost -P 3306 -u root -p

# 直接连接到指定数据库
mysql -u root -p testdb
        

1.2 数据库操作

-- 创建数据库
CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 查看所有数据库
SHOW DATABASES;

-- 使用数据库
USE testdb;

-- 删除数据库
DROP DATABASE IF EXISTS testdb;
        

Part02-生产环境规划与建议

2.1 创建表

-- 创建用户表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 创建订单表
CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    total_amount DECIMAL(10,2) NOT NULL,
    status VARCHAR(20) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
        

2.2 修改表结构

-- 添加列
ALTER TABLE users ADD COLUMN age INT;

-- 修改列
ALTER TABLE users MODIFY COLUMN age TINYINT UNSIGNED;

-- 删除列
ALTER TABLE users DROP COLUMN age;

-- 添加索引
ALTER TABLE users ADD INDEX idx_username (username);

-- 添加唯一索引
ALTER TABLE users ADD UNIQUE INDEX idx_email (email);
        

2.3 查看表结构

-- 查看表结构
DESCRIBE users;

-- 查看表创建语句
SHOW CREATE TABLE users;

-- 查看表索引
SHOW INDEX FROM users;
        

Part03-生产环境项目实施方案

3.1 插入数据

-- 插入单条数据
INSERT INTO users (username, email, password) 
VALUES ('admin', 'admin@fgedu.net.cn', 'password123');

-- 插入多条数据
INSERT INTO users (username, email, password) 
VALUES 
('user1', 'user1@fgedu.net.cn', 'pass123'),
('user2', 'user2@fgedu.net.cn', 'pass456'),
('user3', 'user3@fgedu.net.cn', 'pass789');

-- 插入订单数据
INSERT INTO orders (user_id, total_amount, status) 
VALUES (1, 100.50, 'completed'),
       (2, 200.75, 'pending'),
       (1, 50.25, 'completed');
        

3.2 查询数据

-- 查询所有数据
SELECT * FROM users;

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

-- 带条件查询
SELECT * FROM users WHERE id > 1;

-- 排序查询
SELECT * FROM users ORDER BY created_at DESC;

-- 限制结果数量
SELECT * FROM users LIMIT 2;

-- 分页查询
SELECT * FROM users LIMIT 0, 10; -- 第1页
SELECT * FROM users LIMIT 10, 10; -- 第2页
        

3.3 连接查询

-- 内连接
SELECT u.id, u.username, o.id AS order_id, o.total_amount, o.status 
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- 左连接
SELECT u.id, u.username, o.id AS order_id, o.total_amount 
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

-- 右连接
SELECT u.id, u.username, o.id AS order_id, o.total_amount 
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
        

3.4 更新数据

-- 更新单条数据
UPDATE users SET email = 'newemail@fgedu.net.cn' WHERE id = 1;

-- 批量更新
UPDATE users SET password = 'newpassword' WHERE id > 2;

-- 更新订单状态
UPDATE orders SET status = 'completed' WHERE id = 2;
        

3.5 删除数据

-- 删除单条数据
DELETE FROM users WHERE id = 3;

-- 批量删除
DELETE FROM orders WHERE status = 'pending';

-- 清空表数据(保留表结构)
TRUNCATE TABLE orders;
        

Part04-生产案例与实战讲解

4.1 聚合函数

-- 统计用户数量
SELECT COUNT(*) AS user_count FROM users;

-- 计算订单总金额
SELECT SUM(total_amount) AS total_revenue FROM orders;

-- 计算平均订单金额
SELECT AVG(total_amount) AS avg_order_amount FROM orders;

-- 查找最大和最小订单金额
SELECT MAX(total_amount) AS max_order, MIN(total_amount) AS min_order FROM orders;
        

4.2 分组查询

-- 按状态分组统计订单数量
SELECT status, COUNT(*) AS order_count 
FROM orders 
GROUP BY status;

-- 按用户分组统计订单总金额
SELECT user_id, SUM(total_amount) AS user_total 
FROM orders 
GROUP BY user_id 
HAVING SUM(total_amount) > 100;
        

4.3 子查询

-- 子查询获取订单金额大于平均金额的订单
SELECT * FROM orders 
WHERE total_amount > (SELECT AVG(total_amount) FROM orders);

-- 子查询获取有订单的用户
SELECT * FROM users 
WHERE id IN (SELECT DISTINCT user_id FROM orders);
        

4.4 联合查询

-- 联合两个查询结果
SELECT id, username, 'user' AS type FROM users
UNION
SELECT id, CONCAT('Order-', id), 'order' AS type FROM orders;
        

Part05-风哥经验总结与分享

-- 开始事务
START TRANSACTION;

-- 执行操作
INSERT INTO users (username, email, password) VALUES ('transuser', 'trans@fgedu.net.cn', 'transpass');
INSERT INTO orders (user_id, total_amount, status) VALUES (LAST_INSERT_ID(), 150.00, 'pending');

-- 提交事务
COMMIT;

-- 回滚事务(如果需要)
-- ROLLBACK;
        

6. 索引优化示例

6.1 查看执行计划

-- 查看查询执行计划
EXPLAIN SELECT * FROM users WHERE username = 'admin';

-- 查看带索引的执行计划
EXPLAIN SELECT * FROM users WHERE email = 'admin@fgedu.net.cn';
        

6.2 索引使用建议

-- 为频繁查询的列创建索引
CREATE INDEX idx_email ON users(email);

-- 为外键列创建索引
CREATE INDEX idx_user_id ON orders(user_id);

-- 创建复合索引
CREATE INDEX idx_status_amount ON orders(status, total_amount);
        

7. 存储过程示例

-- 创建存储过程
DELIMITER //
CREATE PROCEDURE GetUserOrders(IN user_id INT)
BEGIN
    SELECT o.id, o.total_amount, o.status, o.created_at
    FROM orders o
    WHERE o.user_id = user_id
    ORDER BY o.created_at DESC;
END //
DELIMITER ;

-- 调用存储过程
CALL GetUserOrders(1);

-- 删除存储过程
DROP PROCEDURE IF EXISTS GetUserOrders;
        

8. 触发器示例

-- 创建触发器
DELIMITER //
CREATE TRIGGER before_user_insert
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
    SET NEW.password = MD5(NEW.password);
END //
DELIMITER ;

-- 测试触发器
INSERT INTO users (username, email, password) VALUES ('triggeruser', 'trigger@fgedu.net.cn', 'plainpassword');

-- 查看结果
SELECT id, username, password FROM users WHERE username = 'triggeruser';

-- 删除触发器
DROP TRIGGER IF EXISTS before_user_insert;
        

9. 视图示例

-- 创建视图
CREATE VIEW user_order_summary AS
SELECT u.id AS user_id,
       u.username,
       COUNT(o.id) AS order_count,
       SUM(o.total_amount) AS total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.username;

-- 查询视图
SELECT * FROM user_order_summary;

-- 删除视图
DROP VIEW IF EXISTS user_order_summary;
        

10. 导入导出示例

10.1 导出数据

# 导出整个数据库
mysqldump -u root -p testdb > testdb.sql

# 导出特定表
mysqldump -u root -p testdb users orders > testdb_tables.sql

# 导出数据(不包含结构)
mysqldump -u root -p testdb --no-create-info > testdb_data.sql
        

10.2 导入数据

# 导入数据库
mysql -u root -p testdb < testdb.sql

# 导入数据到现有表
mysql -u root -p testdb --execute="LOAD DATA INFILE '/path/to/data.csv' INTO TABLE users FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;"
        

11. 备份恢复示例

11.1 逻辑备份

# 使用mysqldump备份
mysqldump -u root -p --single-transaction --routines --triggers testdb > testdb_backup.sql

# 恢复备份
mysql -u root -p testdb < testdb_backup.sql
        

11.2 物理备份

# 使用xtrabackup备份
xtrabackup --backup --target-dir=/backup/testdb --user=root --password

# 恢复备份
xtrabackup --prepare --target-dir=/backup/testdb
xtrabackup --copy-back --target-dir=/backup/testdb --datadir=/var/lib/mysql
        

12. 性能优化示例

12.1 慢查询分析

-- 启用慢查询日志
SET GLOBAL slow_query_log = 1;
SET GLOBAL slow_query_log_file = '/var/lib/mysql/slow.log';
SET GLOBAL long_query_time = 1;

-- 查看慢查询日志
SELECT * FROM mysql.slow_log;

-- 使用pt-query-digest分析慢查询
pt-query-digest /var/lib/mysql/slow.log
        

12.2 配置优化

-- 查看当前配置
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'max_connections';

-- 临时修改配置
SET GLOBAL innodb_buffer_pool_size = 1024*1024*1024; -- 1GB
SET GLOBAL max_connections = 1000;

-- 永久修改(在my.cnf中)
[mysqld]
innodb_buffer_pool_size = 1G
max_connections = 1000
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
        

13. 安全管理示例

13.1 用户管理

-- 创建用户
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'apppassword';

-- 授予权限
GRANT SELECT, INSERT, UPDATE ON testdb.* TO 'appuser'@'localhost';

-- 查看权限
SHOW GRANTS FOR 'appuser'@'localhost';

-- 撤销权限
REVOKE UPDATE ON testdb.* FROM 'appuser'@'localhost';

-- 删除用户
DROP USER 'appuser'@'localhost';
        

13.2 密码管理

-- 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

-- 密码过期策略
ALTER USER 'root'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;

-- 锁定用户
ALTER USER 'appuser'@'localhost' ACCOUNT LOCK;

-- 解锁用户
ALTER USER 'appuser'@'localhost' ACCOUNT UNLOCK;
        

14. 监控与维护示例

14.1 服务器状态

-- 查看服务器状态
SHOW GLOBAL STATUS;

-- 查看连接数
SHOW GLOBAL STATUS LIKE 'Threads%';

-- 查看缓冲区使用情况
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';
        

14.2 表维护

-- 检查表
CHECK TABLE users;

-- 优化表
OPTIMIZE TABLE users;

-- 修复表
REPAIR TABLE users;

-- 分析表
ANALYZE TABLE users;
        

15. 常见问题解决方案

15.1 连接问题

-- 查看连接状态
SHOW PROCESSLIST;

-- 杀死长时间运行的查询
KILL [process_id];

-- 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';
        

15.2 性能问题

-- 查看当前运行的查询
SHOW FULL PROCESSLIST;

-- 查看InnoDB状态
SHOW ENGINE INNODB STATUS;

-- 查看慢查询
SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
        

16. 实战案例

16.1 电商系统数据库操作

-- 创建产品表
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    stock INT NOT NULL,
    category_id INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 创建分类表
CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    parent_id INT
);

-- 创建订单详情表
CREATE TABLE order_items (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
    FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
);

-- 查询用户订单详情
SELECT o.id AS order_id,
       o.created_at,
       o.total_amount,
       o.status,
       p.name AS product_name,
       oi.quantity,
       oi.price
FROM orders o
JOIN order_items oi ON o.id = oi.order_id
JOIN products p ON oi.product_id = p.id
WHERE o.user_id = 1
ORDER BY o.created_at DESC;
        

16.2 博客系统数据库操作

-- 创建文章表
CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT NOT NULL,
    author_id INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (author_id) REFERENCES users(id)
);

-- 创建评论表
CREATE TABLE comments (
    id INT AUTO_INCREMENT PRIMARY KEY,
    post_id INT NOT NULL,
    user_id INT NOT NULL,
    content TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 查询文章及其评论
SELECT p.id,
       p.title,
       p.content,
       u.username AS author,
       c.id AS comment_id,
       c.content AS comment_content,
       cu.username AS commenter,
       c.created_at AS comment_time
FROM posts p
JOIN users u ON p.author_id = u.id
LEFT JOIN comments c ON p.id = c.post_id
LEFT JOIN users cu ON c.user_id = cu.id
WHERE p.id = 1
ORDER BY c.created_at ASC;
        

注意:以上示例中的命令和SQL语句仅供参考,实际使用时请根据具体环境和需求进行调整。 03 学习交流加群风哥QQ113257174

警告:在生产环境中执行数据库操作时,请务必谨慎,建议先在测试环境中验证操作结果。 04 风哥提示:

17. 总结

本教程提供了MySQL数据库常见操作的详细示例,包括: 05更多学习教程公众号风哥教程itpux_com

  • 连接与基本操作
  • 表操作
  • 数据操作
  • 高级查询
  • 事务处理
  • 索引优化
  • 存储过程与触发器
  • 视图
  • 导入导出
  • 备份恢复
  • 性能优化
  • 安全管理
  • 监控与维护
  • 常见问题解决方案
  • 实战案例

通过这些示例,您可以快速掌握MySQL数据库的基本操作和高级功能,为实际项目开发和维护提供参考。 06 from mysql视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息