【MYSQL】第二篇:SQL进阶指南:增删改查与性能优化实战手册
第二篇:SQL进阶指南:增删改查与性能优化实战手册
掌握了SQL基础查询后,是时候深入数据库操作的核心了!本文将完整介绍所有数据操作函数、索引函数、多表关联函数和统计函数,让您从SQL使用者升级为数据库管理者。
核心内容
1. 数据操作完整函数集
INSERT 语句 - 插入数据
-- 插入单条完整记录
INSERT INTO users VALUES (1, '张三', 'zhang@example.com', '2024-01-01');-- 插入指定字段(推荐)
INSERT INTO users (username, email, age) VALUES ('李四', 'li@example.com', 30);-- 批量插入
INSERT INTO products (name, price) VALUES
('iPhone', 5999),
('iPad', 3299),
('MacBook', 9999);-- 从查询结果插入
INSERT INTO user_backup
SELECT * FROM users WHERE created_at < '2023-01-01';
作用:向表中插入新记录
UPDATE 语句 - 更新数据
-- 更新单个字段
UPDATE users SET email = 'new@example.com' WHERE id = 1;-- 更新多个字段
UPDATE products
SET price = price * 0.9, update_time = NOW(),discount = 1
WHERE category = '电子产品';-- 基于条件更新
UPDATE orders
SET status = 'completed'
WHERE status = 'pending' AND created_at < '2024-01-01';-- 使用表达式更新
UPDATE accounts
SET balance = balance + 1000
WHERE user_id = 123;
作用:修改表中的现有记录
DELETE 语句 - 删除数据
-- 删除特定记录
DELETE FROM orders WHERE status = 'cancelled';-- 删除过期数据
DELETE FROM user_sessions WHERE expire_time < NOW();-- 使用子查询删除
DELETE FROM users
WHERE id IN (SELECT user_id FROM inactive_users);
作用:从表中删除记录
TRUNCATE TABLE 语句
-- 清空整个表
TRUNCATE TABLE temp_logs;-- 与DELETE的区别
-- DELETE: 逐行删除,可恢复,记录日志
-- TRUNCATE: 立即清空,不可恢复,不记录日志
作用:快速清空整个表
2. 索引相关完整函数
CREATE INDEX - 创建索引
-- 创建普通索引
CREATE INDEX idx_user_email ON users(email);-- 创建唯一索引
CREATE UNIQUE INDEX idx_unique_username ON users(username);-- 创建复合索引
CREATE INDEX idx_category_price ON products(category_id, price);-- 创建聚簇索引
CREATE CLUSTERED INDEX idx_user_clustered ON users(id);-- 创建允许重复的聚簇索引
CREATE CLUSTERED INDEX idx_user_dup ON users(department)
WITH ALLOW_DUP_ROW;
作用:创建索引以提高查询性能
DROP INDEX - 删除索引
-- 删除索引
DROP INDEX idx_user_email ON users;-- 删除复合索引
DROP INDEX idx_category_price ON products;
作用:删除不再需要的索引
3. 多表关联完整函数
INNER JOIN - 内连接
-- 基本内连接
SELECT o.order_id, u.username
FROM orders o
INNER JOIN users u ON o.user_id = u.id;-- 多表内连接
SELECT o.order_id, u.username, p.product_name
FROM orders o
INNER JOIN users u ON o.user_id = u.id
INNER JOIN products p ON o.product_id = p.id;
作用:返回两个表中匹配的记录
LEFT JOIN / RIGHT JOIN - 外连接
-- 左外连接(返回左表所有记录)
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 orders o
RIGHT JOIN users u ON o.user_id = u.id;-- 完整外连接(MySQL不支持,可用UNION实现)
SELECT u.username, o.order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
UNION
SELECT u.username, o.order_id
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
作用:返回一个表的所有记录和另一个表的匹配记录
自连接
-- 员工和经理关系
SELECT e.name as employee_name,m.name as manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
作用:表与自身进行连接
4. 聚合统计完整函数
GROUP BY - 分组统计
-- 按城市分组统计
SELECT city, COUNT(*) as user_count
FROM users
GROUP BY city;-- 多字段分组
SELECT department, gender, COUNT(*) as count
FROM employees
GROUP BY department, gender;-- 分组后使用聚合函数
SELECT category,COUNT(*) as product_count,AVG(price) as avg_price,MAX(price) as max_price,MIN(price) as min_price,SUM(stock) as total_stock
FROM products
GROUP BY category;
作用:按指定字段对结果进行分组
HAVING - 分组后过滤
-- 过滤分组结果
SELECT city, COUNT(*) as user_count
FROM users
GROUP BY city
HAVING COUNT(*) > 100;-- 多个条件过滤
SELECT category, AVG(price) as avg_price
FROM products
GROUP BY category
HAVING AVG(price) > 100 AND COUNT(*) > 10;-- 使用聚合函数条件
SELECT user_id, SUM(amount) as total_spent
FROM orders
GROUP BY user_id
HAVING SUM(amount) > 1000;
作用:对分组后的结果进行条件过滤
完整的聚合函数集
COUNT() - 计数函数
-- 统计总记录数
SELECT COUNT(*) FROM users;-- 统计非空值数量
SELECT COUNT(email) FROM users;-- 统计不同值的数量
SELECT COUNT(DISTINCT city) FROM users;-- 分组计数
SELECT department, COUNT(*) FROM employees GROUP BY department;
SUM() - 求和函数
-- 计算总和
SELECT SUM(amount) FROM orders;-- 分组求和
SELECT user_id, SUM(amount) FROM orders GROUP BY user_id;-- 条件求和
SELECT SUM(CASE WHEN status='completed' THEN amount ELSE 0 END)
FROM orders;
AVG() - 平均值函数
-- 计算平均值
SELECT AVG(price) FROM products;-- 分组平均值
SELECT category, AVG(price) FROM products GROUP BY category;-- 忽略空值的平均值
SELECT AVG(COALESCE(age, 0)) FROM users;
MAX() / MIN() - 极值函数
-- 最大值和最小值
SELECT MAX(price), MIN(price) FROM products;-- 分组极值
SELECT category, MAX(price), MIN(price) FROM products GROUP BY category;-- 日期极值
SELECT MAX(created_at), MIN(created_at) FROM users;
5. 子查询完整函数
标量子查询
-- 返回单个值的子查询
SELECT name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);-- 在SELECT中使用
SELECT name,price,(SELECT AVG(price) FROM products) as avg_price
FROM products;
EXISTS 子查询
-- 检查是否存在相关记录
SELECT username
FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);-- 不存在相关记录
SELECT username
FROM users u
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
IN 子查询
-- 使用IN的子查询
SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);-- 多值IN查询
SELECT * FROM products
WHERE category IN (SELECT category FROM categories WHERE active = 1);
6. 高级比较函数
BETWEEN - 范围查询
-- 数值范围
SELECT * FROM products WHERE price BETWEEN 100 AND 500;-- 日期范围
SELECT * FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';-- 不在范围内
SELECT * FROM products WHERE price NOT BETWEEN 100 AND 500;
作用:查询在某个范围内的值
IN - 多值匹配
-- 匹配多个值
SELECT * FROM users WHERE city IN ('北京', '上海', '广州');-- 子查询IN
SELECT * FROM products
WHERE category_id IN (SELECT id FROM categories WHERE type = 'electronic');-- 不匹配多个值
SELECT * FROM users WHERE city NOT IN ('北京', '上海');
作用:查询匹配多个值中的任何一个
7. 完整实战:电商数据分析系统
-- 1. 用户购买行为分析
SELECT u.id,u.username,u.city,COUNT(o.id) as order_count,SUM(o.amount) as total_spent,AVG(o.amount) as avg_order_value,MAX(o.created_at) as last_order_date,DATEDIFF(NOW(), MAX(o.created_at)) as days_since_last_order
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed'
GROUP BY u.id, u.username, u.city
HAVING COUNT(o.id) >= 1
ORDER BY total_spent DESC;-- 2. 商品销售排行榜
SELECT p.id,p.name,p.category,SUM(oi.quantity) as total_sold,SUM(oi.quantity * oi.price) as total_revenue,COUNT(DISTINCT o.user_id) as unique_customers,AVG(oi.quantity) as avg_quantity_per_order
FROM products p
INNER JOIN order_items oi ON p.id = oi.product_id
INNER JOIN orders o ON oi.order_id = o.id
WHERE o.status = 'completed'AND o.created_at BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY p.id, p.name, p.category
HAVING total_sold > 0
ORDER BY total_revenue DESC
LIMIT 20;-- 3. 月度销售趋势分析
SELECT YEAR(created_at) as year,MONTH(created_at) as month,COUNT(*) as order_count,SUM(amount) as monthly_revenue,AVG(amount) as avg_order_value,COUNT(DISTINCT user_id) as active_customers
FROM orders
WHERE status = 'completed'AND created_at >= '2023-01-01'
GROUP BY YEAR(created_at), MONTH(created_at)
ORDER BY year DESC, month DESC;
8. 性能优化相关函数
EXPLAIN - 执行计划分析
-- 查看查询执行计划
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';-- 详细执行计划
EXPLAIN FORMAT=JSON SELECT * FROM users WHERE age > 18;-- 分析多表查询
EXPLAIN
SELECT u.username, o.order_id
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
作用:显示MySQL如何执行查询
SHOW INDEX - 查看索引
-- 查看表的索引
SHOW INDEX FROM users;-- 查看索引详细信息
SHOW INDEX FROM users WHERE Key_name = 'idx_user_email';
作用:显示表的索引信息
本篇涵盖的所有函数总结
| 函数/语句 | 作用 | 语法示例 |
|---|---|---|
| INSERT | 插入数据 | INSERT INTO table VALUES (...) |
| UPDATE | 更新数据 | UPDATE table SET column=value WHERE condition |
| DELETE | 删除数据 | DELETE FROM table WHERE condition |
| TRUNCATE | 清空表 | TRUNCATE TABLE table |
| CREATE INDEX | 创建索引 | CREATE INDEX idx_name ON table(column) |
| DROP INDEX | 删除索引 | DROP INDEX idx_name ON table |
| INNER JOIN | 内连接 | SELECT * FROM a INNER JOIN b ON a.id=b.id |
| LEFT JOIN | 左外连接 | SELECT * FROM a LEFT JOIN b ON a.id=b.id |
| RIGHT JOIN | 右外连接 | SELECT * FROM a RIGHT JOIN b ON a.id=b.id |
| GROUP BY | 分组统计 | SELECT column FROM table GROUP BY column |
| HAVING | 分组过滤 | GROUP BY column HAVING condition |
| COUNT() | 计数 | SELECT COUNT(column) FROM table |
| SUM() | 求和 | SELECT SUM(column) FROM table |
| AVG() | 平均值 | SELECT AVG(column) FROM table |
| MAX()/MIN() | 极值 | SELECT MAX(column) FROM table |
| EXISTS | 存在检查 | WHERE EXISTS (subquery) |
| BETWEEN | 范围查询 | WHERE column BETWEEN value1 AND value2 |
| IN | 多值匹配 | WHERE column IN (value1, value2) |
| EXPLAIN | 执行计划 | EXPLAIN SELECT ... |
| SHOW INDEX | 查看索引 | SHOW INDEX FROM table |
附基础篇:第一篇:SQL入门宝典:零基础学会数据查询,这一篇就够了!
