当前位置: 首页 > news >正文

【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入门宝典:零基础学会数据查询,这一篇就够了!

http://www.dtcms.com/a/528451.html

相关文章:

  • Spring Boot3零基础教程,Profile 配置文件 按环境分配置文件,笔记56
  • 小白python入门 - 7. Python分支与循环结构实战:从基础语法到代码逻辑解析
  • Chrony服务器同步时间服务器实验
  • 万互网站建站网站建设怎么提需求
  • 国产 做 视频网站陕西建筑培训网
  • [人工智能-大模型-69]:模型层技术 - 计算机处理问题的几大分支:数值型性问题、非数值型问题?
  • 0. Qt 安装及源码及报错
  • jQuery 事件方法详解
  • 基于Python大数据的热门游戏推荐系统
  • 网站如何做关健词收录网站应该如何推广
  • 网站应该如何进行优化微信企业网站 源码下载
  • LlamaFactory的docker-compose安装
  • RK3568笔记102:基于LVGL8的车载娱乐小平板设计
  • 技术随笔:Node.js ESM 中巧用 `-r dotenv/config` 解决环境变量异步加载问题
  • 网站做端口是什么有没有可以免费做试卷的网站_最好可以学会...
  • 游戏人物设计 简单思路 那任务简单说是显示的 完成任务是每个条件脚本自己判断 完成后发给任务脚本信息
  • 利用消息队列(MQ)设计:解耦与异步削峰的艺术
  • 自由学习记录(111)
  • ESP32使用笔记(基于ESP-IDF):小智AI的ESP32项目架构与启动流程全面解析
  • 网站建设 软文网站创作思路
  • 未来之窗昭和仙君(三十七)抽奖随机算法修仙体——东方仙盟筑基期
  • HCIP---作业
  • 海天建设集团公司网站vi应用设计
  • Mybatis10-xml文件与mapper文件的目录位置说明
  • 安全的网站网站开发要
  • 面向模块的综合技术之综合策略优化(六)
  • Mem0:构建具有可扩展长期记忆的生产级AI代理 - 论文学习总结1
  • 【三相异步电动机判断好坏】
  • 整体设计 全面梳理复盘 之6 整体设计表格体系与执行逻辑迭代
  • SpringBoot集成Elasticsearch | Spring官方场景启动器(Spring Data Elasticsearch)方式