以下是 MySQL 数据库基础的增删查改(CRUD)操作详解:
一、数据库操作
- 创建数据库
sql
CREATE DATABASE db_name;
CREATE DATABASE IF NOT EXISTS db_name; -- 不存在时才创建
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 删除数据库
sql
DROP DATABASE db_name;
DROP DATABASE IF EXISTS db_name; -- 存在时才删除
- 选择/切换数据库
sql
USE db_name;
二、数据表操作
- 创建表
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增
username VARCHAR(50) NOT NULL UNIQUE, -- 非空,唯一
password VARCHAR(255) NOT NULL,
email VARCHAR(100),
age INT DEFAULT 18, -- 默认值
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
- 删除表
sql
DROP TABLE table_name;
DROP TABLE IF EXISTS table_name;
- 修改表结构
sql
-- 添加列
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- 修改列
ALTER TABLE users MODIFY COLUMN email VARCHAR(150);
-- 重命名列
ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(20);
-- 删除列
ALTER TABLE users DROP COLUMN mobile;
-- 添加索引
CREATE INDEX idx_username ON users(username);
-- 删除索引
DROP INDEX idx_username ON users;
三、数据操作(CRUD)
- 插入数据(Create)
sql
-- 插入单条数据(指定列)
INSERT INTO users (username, password, email, age)
VALUES ('john_doe', '123456', 'john@example.com', 25);
-- 插入单条数据(所有列)
INSERT INTO users VALUES (NULL, 'jane_doe', '654321', 'jane@example.com', 30, NOW(), NOW());
-- 插入多条数据
INSERT INTO users (username, password, email)
VALUES
('alice', 'pass123', 'alice@example.com'),
('bob', 'pass456', 'bob@example.com'),
('charlie', 'pass789', 'charlie@example.com');
- 查询数据(Read)
sql
-- 查询所有列
SELECT * FROM users;
-- 查询指定列
SELECT id, username, email FROM users;
-- 条件查询
SELECT * FROM users WHERE age > 20;
SELECT * FROM users WHERE username = 'john_doe';
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
SELECT * FROM users WHERE email LIKE '%@example.com';
-- 逻辑运算符
SELECT * FROM users WHERE age > 20 AND email LIKE '%@example.com';
SELECT * FROM users WHERE age < 18 OR age > 60;
-- 排序
SELECT * FROM users ORDER BY age DESC; -- 降序
SELECT * FROM users ORDER BY created_at ASC; -- 升序
-- 限制返回数量
SELECT * FROM users LIMIT 10; -- 前10条
SELECT * FROM users LIMIT 5, 10; -- 跳过5条,取10条
-- 去重
SELECT DISTINCT age FROM users;
-- 分组统计
SELECT age, COUNT(*) as count FROM users GROUP BY age;
SELECT age, COUNT(*) FROM users GROUP BY age HAVING COUNT(*) > 1;
-- 聚合函数
SELECT COUNT(*) as total_users FROM users;
SELECT AVG(age) as avg_age FROM users;
SELECT MAX(age) as max_age FROM users;
SELECT MIN(age) as min_age FROM users;
SELECT SUM(age) as total_age FROM users;
- 更新数据(Update)
sql
-- 更新单个字段
UPDATE users SET email = 'new_email@example.com' WHERE id = 1;
-- 更新多个字段
UPDATE users SET
email = 'updated@example.com',
age = 26,
updated_at = NOW()
WHERE username = 'john_doe';
-- 基于现有值更新
UPDATE users SET age = age + 1 WHERE age < 30;
-- 批量更新
UPDATE users SET status = 'inactive' WHERE last_login < '2024-01-01';
- 删除数据(Delete)
sql
-- 删除指定记录
DELETE FROM users WHERE id = 1;
-- 删除多条记录
DELETE FROM users WHERE age > 100;
-- 清空表(删除所有记录)
DELETE FROM users;
TRUNCATE TABLE users; -- 更快,不能回滚
四、高级查询技巧
- 连接查询
sql
-- 内连接
SELECT u.username, o.order_id, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- 左连接
SELECT u.username, o.order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- 右连接
SELECT u.username, o.order_id
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
- 子查询
sql
-- WHERE子句中的子查询
SELECT * FROM users
WHERE age > (SELECT AVG(age) FROM users);
-- FROM子句中的子查询
SELECT avg_age_table.age_group, COUNT(*)
FROM (SELECT
CASE
WHEN age < 20 THEN '少年'
WHEN age BETWEEN 20 AND 40 THEN '青年'
ELSE '中老年'
END as age_group
FROM users) as avg_age_table
GROUP BY age_group;
- 联合查询
sql
SELECT username, email FROM active_users
UNION
SELECT username, email FROM inactive_users;
五、事务处理
sql
-- 开始事务
START TRANSACTION;
-- 执行操作
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
-- 提交或回滚
COMMIT; -- 确认更改
-- 或
ROLLBACK; -- 撤销更改
六、实用技巧
- 备份数据
sql
-- 创建表备份
CREATE TABLE users_backup AS SELECT * FROM users;
-- 插入备份数据
INSERT INTO users_backup SELECT * FROM users WHERE created_at > '2024-01-01';
- 批量操作
sql
-- 批量插入(提高性能)
INSERT INTO users (username, email) VALUES
('user1', 'user1@example.com'),
('user2', 'user2@example.com'),
('user3', 'user3@example.com');
- 使用CASE表达式
sql
SELECT
username,
age,
CASE
WHEN age < 18 THEN '未成年'
WHEN age BETWEEN 18 AND 60 THEN '成年'
ELSE '老年'
END as age_group
FROM users;
注意事项
- WHERE条件:UPDATE和DELETE操作一定要加WHERE条件,除非确实要操作所有记录
- 事务处理:重要操作使用事务,确保数据一致性
- 索引使用:频繁查询的字段建议添加索引
- SQL注入:应用程序中要使用参数化查询防止SQL注入
- 性能优化:大数据量时注意查询性能,避免SELECT *