MySQL基础操作
一、数据库操作
1. 创建数据库
1CREATE DATABASE database_name; 2CREATE DATABASE IF NOT EXISTS database_name; -- 如果不存在则创建 3CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 指定字符集
2. 选择数据库
1USE database_name;
3. 查看所有数据库
1SHOW DATABASES;
4. 删除数据库
1DROP DATABASE database_name; 2DROP DATABASE IF EXISTS database_name; -- 安全删除
5. 查看数据库信息
1SHOW CREATE DATABASE database_name; -- 查看创建语句
二、表操作
1. 创建表
1CREATE TABLE users ( 2 id INT PRIMARY KEY AUTO_INCREMENT, 3 username VARCHAR(50) NOT NULL UNIQUE, 4 email VARCHAR(100) NOT NULL UNIQUE, 5 age INT DEFAULT 0, 6 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 7 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 8); 9 10-- 创建带索引的表 11CREATE TABLE products ( 12 id INT PRIMARY KEY AUTO_INCREMENT, 13 name VARCHAR(100) NOT NULL, 14 price DECIMAL(10,2) NOT NULL, 15 category VARCHAR(50), 16 stock INT DEFAULT 0, 17 INDEX idx_category (category), 18 INDEX idx_price (price) 19); 20 21-- 创建带外键的表 22CREATE TABLE orders ( 23 id INT PRIMARY KEY AUTO_INCREMENT, 24 user_id INT NOT NULL, 25 total_amount DECIMAL(10,2) NOT NULL, 26 status ENUM('pending', 'processing', 'completed', 'cancelled') DEFAULT 'pending', 27 order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 28 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE 29);
2. 查看表
1SHOW TABLES; -- 查看所有表 2SHOW TABLES LIKE 'user%'; -- 模糊查询表名 3DESCRIBE users; -- 查看表结构 4DESC users; -- 简写 5SHOW CREATE TABLE users; -- 查看创建表的SQL语句 6SHOW FULL COLUMNS FROM users; -- 查看表的完整列信息
3. 修改表结构
1-- 添加列 2ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email; 3 4-- 修改列 5ALTER TABLE users MODIFY COLUMN age TINYINT UNSIGNED; 6 7-- 重命名列 8ALTER TABLE users CHANGE COLUMN age user_age INT; 9 10-- 删除列 11ALTER TABLE users DROP COLUMN phone; 12 13-- 添加索引 14ALTER TABLE users ADD INDEX idx_username (username); 15ALTER TABLE users ADD UNIQUE INDEX unique_email (email); 16 17-- 添加主键 18ALTER TABLE users ADD PRIMARY KEY (id); 19 20-- 添加外键 21ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id); 22 23-- 重命名表 24ALTER TABLE users RENAME TO customers; 25RENAME TABLE customers TO users; 26 27-- 修改表字符集 28ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4. 删除表
1DROP TABLE users; 2DROP TABLE IF EXISTS users; -- 安全删除 3TRUNCATE TABLE users; -- 清空表数据,保留表结构
三、数据操作(CRUD)
1. 插入数据 (INSERT)
1-- 插入单条数据 2INSERT INTO users (username, email, age) VALUES ('张三', 'zhangsan@example.com', 25); 3 4-- 插入多条数据 5INSERT INTO users (username, email, age) VALUES 6 ('李四', 'lisi@example.com', 30), 7 ('王五', 'wangwu@example.com', 28), 8 ('赵六', 'zhaoliu@example.com', 35); 9 10-- 插入忽略重复(如果存在唯一约束冲突则忽略) 11INSERT IGNORE INTO users (username, email, age) VALUES ('张三', 'zhangsan@example.com', 26); 12 13-- 插入或替换(如果存在则替换) 14REPLACE INTO users (id, username, email, age) VALUES (1, '张三', 'zhangsan_new@example.com', 26); 15 16-- 插入或更新(ON DUPLICATE KEY UPDATE) 17INSERT INTO users (username, email, age) 18VALUES ('张三', 'zhangsan@example.com', 26) 19ON DUPLICATE KEY UPDATE 20 email = VALUES(email), 21 age = VALUES(age), 22 updated_at = CURRENT_TIMESTAMP;
2. 查询数据 (SELECT)
1-- 查询所有列 2SELECT * FROM users; 3 4-- 查询指定列 5SELECT id, username, email FROM users; 6 7-- 条件查询 8SELECT * FROM users WHERE age > 25; 9SELECT * FROM users WHERE age BETWEEN 20 AND 30; 10SELECT * FROM users WHERE username LIKE '张%'; -- 张开头 11SELECT * FROM users WHERE username LIKE '%三'; -- 三结尾 12SELECT * FROM users WHERE username LIKE '%张%'; -- 包含张 13SELECT * FROM users WHERE username NOT LIKE '张%'; -- 不是张开头 14 15-- IN 操作符 16SELECT * FROM users WHERE age IN (25, 30, 35); 17SELECT * FROM users WHERE age NOT IN (25, 30, 35); 18 19-- NULL 值判断 20SELECT * FROM users WHERE phone IS NULL; 21SELECT * FROM users WHERE phone IS NOT NULL; 22 23-- 多重条件 24SELECT * FROM users WHERE age > 25 AND email LIKE '%@example.com'; 25SELECT * FROM users WHERE age < 20 OR age > 40; 26 27-- 排序 28SELECT * FROM users ORDER BY age ASC; -- 升序 29SELECT * FROM users ORDER BY age DESC; -- 降序 30SELECT * FROM users ORDER BY age DESC, username ASC; -- 多重排序 31 32-- 限制结果 33SELECT * FROM users LIMIT 10; -- 前10条 34SELECT * FROM users LIMIT 5, 10; -- 从第6条开始,取10条(跳过前5条) 35SELECT * FROM users LIMIT 10 OFFSET 5; -- 同上 36 37-- 去重 38SELECT DISTINCT age FROM users; 39 40-- 聚合函数 41SELECT COUNT(*) FROM users; -- 总行数 42SELECT COUNT(DISTINCT age) FROM users; -- 不同年龄数量 43SELECT AVG(age) FROM users; -- 平均年龄 44SELECT SUM(age) FROM users; -- 年龄总和 45SELECT MAX(age) FROM users; -- 最大年龄 46SELECT MIN(age) FROM users; -- 最小年龄 47 48-- 分组查询 49SELECT age, COUNT(*) as count FROM users GROUP BY age; 50SELECT age, COUNT(*) as count FROM users GROUP BY age HAVING count > 1; 51 52-- 别名 53SELECT u.username AS name, u.email AS mail FROM users AS u; 54 55-- 连接查询 56-- 内连接 57SELECT u.username, o.order_date, o.total_amount 58FROM users u 59INNER JOIN orders o ON u.id = o.user_id; 60 61-- 左连接 62SELECT u.username, o.order_date, o.total_amount 63FROM users u 64LEFT JOIN orders o ON u.id = o.user_id; 65 66-- 右连接 67SELECT u.username, o.order_date, o.total_amount 68FROM users u 69RIGHT JOIN orders o ON u.id = o.user_id; 70 71-- 子查询 72SELECT * FROM users WHERE age > (SELECT AVG(age) FROM users); 73SELECT username FROM users WHERE id IN (SELECT DISTINCT user_id FROM orders); 74 75-- EXISTS 76SELECT * FROM users u WHERE EXISTS ( 77 SELECT 1 FROM orders o WHERE o.user_id = u.id 78); 79 80-- UNION 81SELECT username FROM users WHERE age < 20 82UNION 83SELECT username FROM users WHERE age > 40; 84 85-- CASE WHEN 86SELECT 87 username, 88 age, 89 CASE 90 WHEN age < 20 THEN '少年' 91 WHEN age BETWEEN 20 AND 30 THEN '青年' 92 WHEN age BETWEEN 31 AND 50 THEN '中年' 93 ELSE '老年' 94 END AS age_group 95FROM users;
3. 更新数据 (UPDATE)
1-- 更新所有行 2UPDATE users SET updated_at = CURRENT_TIMESTAMP; 3 4-- 条件更新 5UPDATE users SET age = 26 WHERE username = '张三'; 6 7-- 更新多个字段 8UPDATE users SET 9 age = age + 1, 10 updated_at = CURRENT_TIMESTAMP 11WHERE username = '张三'; 12 13-- 使用子查询更新 14UPDATE users u 15JOIN ( 16 SELECT user_id, COUNT(*) as order_count 17 FROM orders 18 GROUP BY user_id 19) o ON u.id = o.user_id 20SET u.order_count = o.order_count 21WHERE u.id = 1; 22 23-- 限制更新数量 24UPDATE users SET status = 'active' WHERE status = 'inactive' LIMIT 10;
4. 删除数据 (DELETE)
1-- 删除所有数据(慎用!) 2DELETE FROM users; 3 4-- 条件删除 5DELETE FROM users WHERE age > 100; 6 7-- 限制删除数量 8DELETE FROM users WHERE status = 'inactive' LIMIT 100; 9 10-- 删除重复数据 11DELETE u1 FROM users u1 12INNER JOIN users u2 13WHERE 14 u1.id > u2.id AND 15 u1.email = u2.email; -- 保留id最小的
四、索引操作
1. 创建索引
1-- 创建普通索引 2CREATE INDEX idx_age ON users(age); 3 4-- 创建唯一索引 5CREATE UNIQUE INDEX idx_email ON users(email); 6 7-- 创建复合索引 8CREATE INDEX idx_name_age ON users(username, age); 9 10-- 创建全文索引(适用于文本搜索) 11CREATE FULLTEXT INDEX idx_content ON articles(content); 12 13-- 创建空间索引 14CREATE SPATIAL INDEX idx_location ON places(location);
2. 查看索引
1SHOW INDEX FROM users; 2SHOW INDEXES FROM users;
3. 删除索引
1DROP INDEX idx_age ON users; 2ALTER TABLE users DROP INDEX idx_email;
五、事务操作
1-- 开始事务 2START TRANSACTION; 3-- 或 4BEGIN; 5 6-- 执行SQL操作 7UPDATE accounts SET balance = balance - 100 WHERE id = 1; 8UPDATE accounts SET balance = balance + 100 WHERE id = 2; 9 10-- 提交事务 11COMMIT; 12 13-- 回滚事务 14ROLLBACK; 15 16-- 设置保存点 17SAVEPOINT sp1; 18-- 回滚到保存点 19ROLLBACK TO SAVEPOINT sp1; 20-- 释放保存点 21RELEASE SAVEPOINT sp1;
六、视图操作
1-- 创建视图 2CREATE VIEW user_orders_view AS 3SELECT u.username, o.order_date, o.total_amount 4FROM users u 5JOIN orders o ON u.id = o.user_id; 6 7-- 查看视图 8SELECT * FROM user_orders_view; 9 10-- 创建或替换视图 11CREATE OR REPLACE VIEW user_orders_view AS 12SELECT u.username, u.email, o.order_date, o.total_amount 13FROM users u 14JOIN orders o ON u.id = o.user_id; 15 16-- 查看视图定义 17SHOW CREATE VIEW user_orders_view; 18 19-- 删除视图 20DROP VIEW user_orders_view;
七、存储过程和函数
1. 创建存储过程
1DELIMITER // 2 3CREATE PROCEDURE GetUserByAge(IN min_age INT, IN max_age INT) 4BEGIN 5 SELECT * FROM users 6 WHERE age BETWEEN min_age AND max_age 7 ORDER BY age ASC; 8END // 9 10DELIMITER ; 11 12-- 调用存储过程 13CALL GetUserByAge(20, 30);
2. 创建函数
1DELIMITER // 2 3CREATE FUNCTION GetUserCountByAgeRange(min_age INT, max_age INT) 4RETURNS INT 5DETERMINISTIC 6BEGIN 7 DECLARE user_count INT; 8 SELECT COUNT(*) INTO user_count 9 FROM users 10 WHERE age BETWEEN min_age AND max_age; 11 RETURN user_count; 12END // 13 14DELIMITER ; 15 16-- 使用函数 17SELECT GetUserCountByAgeRange(20, 30);
八、用户和权限管理
1-- 创建用户 2CREATE USER 'username'@'localhost' IDENTIFIED BY 'password'; 3CREATE USER 'username'@'%' IDENTIFIED BY 'password'; -- 允许任何主机 4 5-- 修改密码 6ALTER USER 'username'@'localhost' IDENTIFIED BY 'new_password'; 7 8-- 授予权限 9GRANT SELECT, INSERT, UPDATE ON database_name.* TO 'username'@'localhost'; 10GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost'; 11 12-- 授予创建用户的权限 13GRANT CREATE USER ON *.* TO 'admin'@'localhost'; 14 15-- 查看权限 16SHOW GRANTS FOR 'username'@'localhost'; 17 18-- 撤销权限 19REVOKE INSERT ON database_name.* FROM 'username'@'localhost'; 20 21-- 删除用户 22DROP USER 'username'@'localhost';
九、备份和恢复
1-- 导出数据库(命令行) 2mysqldump -u username -p database_name > backup.sql 3 4-- 导出特定表 5mysqldump -u username -p database_name table1 table2 > backup.sql 6 7-- 导入数据库 8mysql -u username -p database_name < backup.sql 9 10-- 导出数据到CSV 11SELECT * INTO OUTFILE '/tmp/users.csv' 12FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 13LINES TERMINATED BY '\n' 14FROM users; 15 16-- 从CSV导入数据 17LOAD DATA INFILE '/tmp/users.csv' 18INTO TABLE users 19FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 20LINES TERMINATED BY '\n' 21IGNORE 1 ROWS; -- 忽略标题行
十、实用技巧和最佳实践
1. 性能优化
1-- 使用EXPLAIN分析查询 2EXPLAIN SELECT * FROM users WHERE age > 25; 3 4-- 强制使用索引 5SELECT * FROM users FORCE INDEX (idx_age) WHERE age > 25; 6 7-- 优化表 8OPTIMIZE TABLE users; 9 10-- 分析表 11ANALYZE TABLE users; 12 13-- 检查表 14CHECK TABLE users; 15 16-- 修复表 17REPAIR TABLE users;
2. 系统信息查询
1-- 查看MySQL版本 2SELECT VERSION(); 3 4-- 查看当前用户 5SELECT USER(); 6 7-- 查看当前数据库 8SELECT DATABASE(); 9 10-- 查看服务器状态 11SHOW STATUS; 12 13-- 查看系统变量 14SHOW VARIABLES LIKE 'max_connections'; 15SHOW VARIABLES LIKE '%timeout%';
3. 时间处理
1-- 当前时间 2SELECT NOW(); -- 日期时间 3SELECT CURDATE(); -- 日期 4SELECT CURTIME(); -- 时间 5 6-- 日期格式化 7SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); 8SELECT DATE_FORMAT(NOW(), '%W, %M %d, %Y'); 9 10-- 日期计算 11SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); 12SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH); 13SELECT DATEDIFF('2024-12-31', '2024-01-01'); 14 15-- 提取日期部分 16SELECT YEAR(NOW()), MONTH(NOW()), DAY(NOW()); 17SELECT HOUR(NOW()), MINUTE(NOW()), SECOND(NOW());
这些是 MySQL 的基础操作,涵盖了数据库管理的各个方面。建议在实际使用时根据具体需求选择合适的方法,并注意数据安全。