一、SQL数据操作基础框架(DML核心四指令)
1.1 SELECT:数据检索的基石
SQL DML 是数据操作语言(Data Manipulation Language) 的缩写,主要用于对数据库中的数据进行操作,具体包括以下几类操作:
(图片来源网络,侵删)
作用:从数据库提取数据,支持列筛选/条件过滤/分组统计/排序输出基础语法:
SELECT [DISTINCT] 列1, 列2... | * FROM 表名 [WHERE 条件] [GROUP BY 分组列] [HAVING 分组条件] [ORDER BY 排序列 [ASC|DESC]] [LIMIT 行数];参数解析:
DISTINCT:去重标识(如SELECT DISTINCT city)*:通配符表示所有列(实际开发建议显式指定列名)WHERE:行级过滤(不可用聚合函数)HAVING:分组后过滤(必须配合GROUP BY)返回值:
成功时返回二维结果集(0行或多行数据)失败时返回错误码(如1054未知列)1.2 INSERT:数据新增操作作用:向表内插入新行数据基础语法:
-- 完整插入(列与值严格对应)INSERT INTO 表名 (列1, 列2...) VALUES (值1, 值2...);-- 批量插入(事务效率更高)INSERT INTO 表名 (列1, 列2...) VALUES (值1a, 值2a...), (值1b, 值2b...);-- 从查询结果插入INSERT INTO 目标表 (列1, 列2...) SELECT 源列1, 源列2... FROM 源表;危险点:⚠️ 省略列名时需提供所有列的值(含自增ID可能报错)⚠️ 值类型必须与列定义匹配(如字符串需加引号)
返回值:
成功返回受影响行数(如5行插入)违反约束时抛出异常(如1062重复主键)1.3 UPDATE:数据修改操作作用:修改表中存在的记录基础语法:
UPDATE 表名 SET 列1 = 新值1, 列2 = 新值2... [WHERE 条件];关键机制:
WHERE子句缺失会导致全表更新(生产环境高危操作❗)可同时修改多列(如SET price=price*0.9, stock=stock-1)返回值:
返回实际被修改的行数(即使新值与原值相同)0表示条件匹配但数据未变化1.4 DELETE:数据删除操作作用:从表删除指定行基础语法:
DELETE FROM 表名 [WHERE 条件];重要特性:
无WHERE条件将清空整表(与TRUNCATE TABLE区别在于事务可回滚)受外键约束影响(如ON DELETE CASCADE会联动删除)返回值:
返回被删除的行数0表示条件匹配但无数据删除二、创建模拟数据(实战前的准备)2.1 创建电商业务相关表CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, reg_date DATE DEFAULT (CURRENT_DATE));CREATE TABLE products ( product_id INT AUTO_INCREMENT PRIMARY KEY, product_name VARCHAR(100) NOT NULL, price DECIMAL(10,2) CHECK(price > 0), stock INT DEFAULT 0);CREATE TABLE orders ( order_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, order_date DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(user_id));CREATE TABLE order_details ( detail_id INT AUTO_INCREMENT PRIMARY KEY, order_id INT, product_id INT, quantity INT, FOREIGN KEY (order_id) REFERENCES orders(order_id), FOREIGN KEY (product_id) REFERENCES products(product_id));2.2 插入模拟数据-- 插入用户数据INSERT INTO users (username, reg_date) VALUES('john_doe', '2023-01-15'),('jane_smith', '2023-02-20'),('bob_lee', '2023-03-10');-- 插入商品数据INSERT INTO products (product_name, price, stock) VALUES('无线蓝牙耳机', 299.00, 100),('Type-C快充线', 59.90, 200),('机械键盘', 450.00, 50);-- 生成订单数据(日期自动生成)INSERT INTO orders (user_id) VALUES (1), (2), (1); -- 订单明细数据INSERT INTO order_details (order_id, product_id, quantity) VALUES(1, 1, 2), (1, 3, 1),(2, 2, 3),(3, 1, 1), (3, 2, 2);三、核心指令深度解析(场景化示例)3.1 SELECT进阶应用场景:多表关联查询用户订单
SELECT u.username AS '用户名', o.order_id AS '订单号', p.product_name AS '商品名', od.quantity AS '数量', (od.quantity * p.price) AS '小计'FROM users uJOIN orders o ON u.user_id = o.user_idJOIN order_details od ON o.order_id = od.order_idJOIN products p ON od.product_id = p.product_idWHERE u.username = 'john_doe';执行结果:
用户名
订单号
商品名
数量
小计
john_doe
1
无线蓝牙耳机
2
598.00
john_doe
1
机械键盘
1
450.00
john_doe
3
无线蓝牙耳机
1
299.00
john_doe
3
Type-C快充线
2
119.80
技术点:
表别名(u/o/od/p)简化代码JOIN顺序影响查询效率表达式计算字段(小计)3.2 UPDATE连锁更新场景:用户购买后同步库存
-- 开启事务确保数据一致性START TRANSACTION;-- 减少耳机库存UPDATE products SET stock = stock - 2 WHERE product_name = '无线蓝牙耳机';-- 增加快充线库存(假设补货)UPDATE products SET stock = stock + 50 WHERE product_id = 2;COMMIT;避坑指南:
避免WHERE缺失导致全表更新(可先SELECT验证条件)高并发时考虑行级锁(如SELECT ... FOR UPDATE)3.3 DELETE与外键联动场景:删除用户时级联清理订单
-- 查看外键约束(需提前配置)SHOW CREATE TABLE orders; -- 确认有ON DELETE CASCADEDELETE FROM users WHERE username = 'bob_lee';自动执行:
删除users表中bob_lee的记录自动删除orders表中其所有订单自动删除order_details中关联明细四、函数应用示例(数据处理利器)4.1 聚合函数分组统计SELECT p.product_name AS '商品名称', SUM(od.quantity) AS '总销量', AVG(p.price) AS '平均售价', COUNT(DISTINCT o.user_id) AS '购买用户数'FROM products pJOIN order_details od ON p.product_id = od.product_idJOIN orders o ON od.order_id = o.order_idGROUP BY p.product_id;4.2 时间函数实战-- 查询最近7天注册用户的消费额SELECT u.username, SUM(od.quantity * p.price) AS total_spentFROM users uJOIN orders o ON u.user_id = o.user_idJOIN order_details od ON o.order_id = od.order_idJOIN products p ON od.product_id = p.product_idWHERE u.reg_date > (CURRENT_DATE - INTERVAL 7 DAY)GROUP BY u.user_id;4.3 条件函数处理异常值-- 修复商品价格空值(安全更新示例)UPDATE productsSET price = COALESCE(price, 0) -- 空值转0WHERE price IS NULL;五、效率优化小贴士(实测有效)索引黄金法则WHERE/JOIN条件字段建索引(如users(username))避免对索引列使用函数(如WHERE YEAR(order_date)=2023导致索引失效)EXPLAIN诊断工具EXPLAIN SELECT ... -- 查看执行计划关注type列:const > ref > range > index > ALL关注rows列:估算扫描行数(越小越好)批量操作提速插入万级数据:用LOAD DATA INFILE代替INSERT更新大表:分批执行(如LIMIT 1000+循环)六、辅助工具推荐工具类型
推荐工具
典型使用场景
数据库管理
MySQL Workbench
可视化执行SQL+ER建模
性能分析
Percona Toolkit
慢查询日志分析
数据模拟
Mockaroo
生成1000+条合规测试数据
SQL格式化
sqlformat.org
混乱SQL代码美化
注:所有示例在MySQL 8.0验证通过,需注意不同数据库(如PostgreSQL/SQL Server)的语法差异
京公网安备11000000000001号
京ICP备11000001号
还没有评论,来说两句吧...