1. SQL语言四大分类概述SQLStructured Query Language作为关系型数据库的标准查询语言根据功能不同可分为四大类数据定义语言DDL、数据操纵语言DML、数据查询语言DQL和数据控制语言DCL。这四类语言各司其职共同构成了完整的数据库操作体系。在实际开发中我经常遇到新手开发者混淆这些分类的情况。比如有人用DDL语句去修改数据记录或者试图用DML语句创建表结构。理解这些分类的本质区别是写出高效、安全SQL语句的基础。提示虽然不同数据库系统MySQL、Oracle、SQL Server等在语法细节上略有差异但这四大分类是所有关系型数据库通用的标准。2. 数据定义语言DDL详解2.1 DDL的核心功能与语法DDL用于定义和管理数据库对象的结构主要操作对象是数据库和表。其核心命令包括CREATE创建数据库或表ALTER修改表结构DROP删除数据库或表TRUNCATE清空表数据保留表结构创建数据库的典型语法CREATE DATABASE school CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;这里我特别指定了字符集和排序规则这是实际项目中经常被忽视但极其重要的细节。utf8mb4支持完整的Unicode字符包括emoji而utf8在MySQL中最多只支持3字节的UTF-8字符。2.2 表操作实战技巧创建表示例CREATE TABLE student ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE, admission_date DATE DEFAULT CURRENT_DATE, INDEX idx_name (name) ) ENGINEInnoDB;几个关键点使用AUTO_INCREMENT实现自增主键NOT NULL约束确保数据完整性UNIQUE约束防止重复邮箱为name字段创建索引提高查询效率显式指定InnoDB引擎支持事务注意VARCHAR长度应根据实际业务需求合理设置过大会浪费存储空间过小会导致数据截断。我曾遇到一个项目因为email字段设为VARCHAR(50)导致大量用户无法注册。2.3 修改表结构的注意事项ALTER TABLE可能是最危险的DDL操作之一。在大表上执行ALTER可能导致长时间锁表影响线上服务。分享几个实战经验添加列时指定DEFAULT值ALTER TABLE student ADD COLUMN gender CHAR(1) DEFAULT U COMMENT U:未知, M:男, F:女;修改列类型要谨慎-- 可能导致数据丢失 ALTER TABLE student MODIFY COLUMN name CHAR(50); -- 更安全的做法是先备份 CREATE TABLE student_backup AS SELECT * FROM student;删除列前确认依赖关系-- 检查是否有外键约束 SELECT TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA school AND TABLE_NAME student;3. 数据操纵语言DML深度解析3.1 DML基础操作DML用于操作表中的记录主要包括INSERT插入新记录UPDATE更新现有记录DELETE删除记录插入数据的几种方式-- 完整插入 INSERT INTO student VALUES(NULL, 张三, zhangsanexample.com, 2023-09-01, M); -- 指定列插入推荐 INSERT INTO student(name, email) VALUES(李四, lisiexample.com); -- 批量插入高效 INSERT INTO student(name, email) VALUES (王五, wangwuexample.com), (赵六, zhaoliuexample.com);3.2 UPDATE操作的陷阱UPDATE语句看似简单但有几个常见陷阱忘记WHERE条件会导致全表更新-- 灾难性操作会更新所有记录 UPDATE student SET gender M; -- 正确做法 UPDATE student SET gender M WHERE id 1;基于当前值的更新-- 将分数低于60的学生加10分 UPDATE student SET score score 10 WHERE score 60;多表关联更新UPDATE student s, class c SET s.class_name c.name WHERE s.class_id c.id;3.3 DELETE与TRUNCATE的区别这两个命令都能清空表数据但有本质区别特性DELETETRUNCATE分类DMLDDL可回滚是否触发触发器是否性能逐行删除较慢直接删除表后重建极快WHERE条件支持不支持实际项目中我建议需要条件删除时用DELETE需要快速清空大表时用TRUNCATE生产环境执行前务必先备份4. 数据查询语言DQL全面掌握4.1 SELECT语句执行顺序理解SELECT语句的执行顺序是写出高效查询的关键FROM确定数据来源WHERE初步筛选记录GROUP BY分组HAVING筛选分组SELECT选择输出列ORDER BY排序结果LIMIT限制返回行数常见错误是把HAVING当WHERE用导致性能问题-- 低效写法 SELECT department, AVG(salary) FROM employees GROUP BY department HAVING department IT; -- 高效写法 SELECT department, AVG(salary) FROM employees WHERE department IT GROUP BY department;4.2 多表连接查询JOIN是SQL最强大的特性之一主要有以下几种INNER JOIN只返回匹配的行SELECT s.name, c.class_name FROM student s INNER JOIN class c ON s.class_id c.id;LEFT JOIN返回左表所有行右表不匹配则为NULLSELECT s.name, c.class_name FROM student s LEFT JOIN class c ON s.class_id c.id;RIGHT JOIN返回右表所有行左表不匹配则为NULLFULL JOIN返回所有匹配和不匹配的行MySQL不支持经验在大型系统中JOIN操作可能很耗资源。我曾优化过一个从15秒降到0.5秒的查询关键是把多个JOIN拆分为更简单的查询。4.3 子查询与CTE子查询的几种常见用法WHERE子句中的子查询SELECT name FROM student WHERE score (SELECT AVG(score) FROM student);FROM子句中的子查询SELECT dept, avg_salary FROM (SELECT department AS dept, AVG(salary) AS avg_salary FROM employees GROUP BY department) AS temp WHERE avg_salary 5000;使用WITH子句的CTECommon Table ExpressionWITH high_score_students AS ( SELECT * FROM student WHERE score 90 ) SELECT * FROM high_score_students ORDER BY score DESC;CTE比子查询更易读特别是处理多层嵌套时。5. 数据控制语言DCL与事务管理5.1 权限控制DCL主要包含权限管理命令创建用户CREATE USER readonly% IDENTIFIED BY secure_password;授予权限GRANT SELECT ON school.* TO readonly%;撤销权限REVOKE SELECT ON school.* FROM readonly%;刷新权限FLUSH PRIVILEGES;安全提示生产环境中应遵循最小权限原则避免使用%作为主机名并定期审查用户权限。5.2 事务管理事务的ACID特性Atomicity原子性Consistency一致性Isolation隔离性Durability持久性基本事务操作START TRANSACTION; UPDATE account SET balance balance - 100 WHERE id 1; UPDATE account SET balance balance 100 WHERE id 2; COMMIT; -- 或 ROLLBACK;设置事务隔离级别SET TRANSACTION ISOLATION LEVEL READ COMMITTED;我曾遇到一个典型问题在高并发场景下默认的REPEATABLE READ隔离级别导致大量锁等待。调整为READ COMMITTED后性能显著提升。6. SQL优化实战技巧6.1 索引优化理解EXPLAINEXPLAIN SELECT * FROM student WHERE name 张三;关键列typeALL全表扫描→ index → range → ref → eq_ref → constpossible_keys可能使用的索引key实际使用的索引rows预估检查的行数创建合适索引-- 单列索引 CREATE INDEX idx_score ON student(score); -- 复合索引注意列顺序 CREATE INDEX idx_name_score ON student(name, score);避免索引失效不要在索引列上使用函数WHERE YEAR(create_time) 2023→WHERE create_time BETWEEN 2023-01-01 AND 2023-12-31注意LIKE前缀WHERE name LIKE %张无法使用索引6.2 查询重写技巧用JOIN代替子查询-- 低效 SELECT name FROM student WHERE class_id IN (SELECT id FROM class WHERE type A); -- 高效 SELECT s.name FROM student s JOIN class c ON s.class_id c.id WHERE c.type A;分页优化-- 低效偏移量大时 SELECT * FROM student ORDER BY id LIMIT 10000, 20; -- 高效记住上一页最后一条记录的ID SELECT * FROM student WHERE id 10000 ORDER BY id LIMIT 20;避免SELECT *-- 不好 SELECT * FROM student; -- 好 SELECT id, name FROM student;6.3 数据库设计建议规范化与反规范化规范化减少冗余适合OLTP系统反规范化适当冗余适合OLAP系统选择合适的数据类型能用INT就不用BIGINT固定长度用CHAR可变长度用VARCHAR存储精确小数用DECIMAL近似值用FLOAT/DOUBLE大字段分离-- 将不常查询的大字段单独存放 CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(50), -- 其他常用字段 ); CREATE TABLE student_profile ( student_id INT PRIMARY KEY, resume TEXT, photo LONGBLOB, FOREIGN KEY (student_id) REFERENCES student(id) );7. 常见SQL错误与解决方案7.1 语法错误忘记引号-- 错误 INSERT INTO student(name) VALUES(张三); -- 正确 INSERT INTO student(name) VALUES(张三);保留字冲突-- 错误order是保留字 CREATE TABLE order (id INT); -- 正确 CREATE TABLE order (id INT);7.2 逻辑错误NULL值处理-- 错误NULL比较不能用 SELECT * FROM student WHERE score NULL; -- 正确 SELECT * FROM student WHERE score IS NULL;日期范围-- 错误可能漏掉23:59:59的数据 SELECT * FROM orders WHERE order_date BETWEEN 2023-01-01 AND 2023-01-31; -- 正确 SELECT * FROM orders WHERE order_date 2023-01-01 AND order_date 2023-02-01;7.3 性能问题N1查询问题// 伪代码先查学生列表再循环查每个学生的班级 ListStudent students studentDao.findAll(); for (Student s : students) { s.setClass(classDao.findById(s.getClassId())); }解决方案使用JOIN一次性获取所有数据使用批量查询WHERE id IN (...)过度使用OR-- 低效 SELECT * FROM products WHERE category 电子 OR category 家居 OR category 图书; -- 高效 SELECT * FROM products WHERE category IN (电子, 家居, 图书);8. 高级SQL特性与应用8.1 窗口函数窗口函数是SQL高级特性可以在不减少行数的情况下进行计算-- 计算每个学生的分数排名同分同名次 SELECT name, score, RANK() OVER (ORDER BY score DESC) AS rank FROM student; -- 计算各部门工资排名 SELECT name, department, salary, DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank FROM employee;8.2 递归查询处理树形结构数据WITH RECURSIVE org_tree AS ( -- 基础查询找出顶级部门 SELECT id, name, parent_id, 1 AS level FROM department WHERE parent_id IS NULL UNION ALL -- 递归查询找出子部门 SELECT d.id, d.name, d.parent_id, t.level 1 FROM department d JOIN org_tree t ON d.parent_id t.id ) SELECT * FROM org_tree ORDER BY level, id;8.3 JSON支持现代数据库对JSON的支持-- MySQL JSON类型 CREATE TABLE product ( id INT PRIMARY KEY, name VARCHAR(100), attributes JSON ); -- 插入JSON数据 INSERT INTO product VALUES(1, 手机, { color: black, storage: 128GB, specs: [5G, NFC] }); -- 查询JSON字段 SELECT name, attributes-$.color AS color, JSON_EXTRACT(attributes, $.specs[0]) AS main_spec FROM product;8.4 全文检索-- 创建全文索引 ALTER TABLE article ADD FULLTEXT INDEX ft_index (title, content); -- 全文搜索 SELECT * FROM article WHERE MATCH(title, content) AGAINST(数据库 优化 IN NATURAL LANGUAGE MODE);在实际项目中我使用全文检索实现了高效的站内搜索功能比LIKE查询快10倍以上。
企业数字化 ERP 产品动态
相关推荐
SAP SE16N调试模式实现GROUP BY数据去重技巧 1. SE16N调试模式实现GROUP BY去重原理剖析在SAP系统日常运维中,SE16N作为最常用的数据表查看工具,其标准功能并不直接支持GROUP BY这类SQL聚合操作。但通过调试模式(Debug Mode),我们可以突破这个限制,实现… · 2026/11/14 21:35:32
银发经济崛起:退休人群社交与消费市场分析 1. 项目背景与市场机遇最近两年,一个特殊的商业现象正在悄然兴起:大量初创企业通过服务退休人群实现了快速增长。其中最典型的案例之一,就是某家专注退休人群社交与消费的"退休俱乐部",在短短两年内吸引了超过10万会员&… · 2026/11/7 8:21:09
从输出物倒推设计软件选型:八款工具工作流与文件交接 做设计这些年,被问得最多的问题从来不是“这个渐变怎么调”,而是“我到底该装哪几个软件”。尤其是刚入行或者从别的岗位转过来的朋友,打开搜索引擎一看,满屏都是“设计师常用的8款作图软件推荐”,点进去十篇有八篇是同… · 2026/11/14 21:43:10
内部消息:惠州电工证考试题怎么准备?工地太忙根本没时间复习考试 内部消息:惠州电工证考试题怎么准备?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这是很多一线电工兄弟的真实写照。尤其是像惠州这样的工地密集地区,电工证是刚需,但考试内容繁杂,时间又紧,很多人心里没底,怕不过关。今天咱们就来聊聊【… · 2026/11/15 2:03:54
常宁考电工证在哪通过率揭秘:实操考试心里没底怕挂科?看这篇就够了 常宁考电工证在哪通过率揭秘:实操考试心里没底怕挂科?看这篇就够了 实操考试心里没底怕挂科?你不是一个人。特别是在常宁考电工证的小伙伴,很多都担心自己操作不熟练、考试不过,白白浪费时间和精力。但别急,今天我就从一个干了10年应急管理领域的人角… · 2026/11/15 2:03:54
本溪登高架设证复审内部消息来了,实操考试心里没底怕挂科?这样准备稳了 本溪登高架设证复审内部消息来了,实操考试心里没底怕挂科?这样准备稳了 实操考试心里没底怕挂科,特别是那些在本溪从事登高架设作业的工人,很多都经历过这种焦虑。尤其是本溪登高架设证复审,一旦没通过,就可能面临停工、罚款甚至被清退的风险。很多工人… · 2026/11/15 2:03:54
全国哪里考电工证快些证怎么转异地 电工证不好考?学历不高也能报名,电子证书全国通用 你是不是也担心学历不够,考不了电工证?其实大多数地方对学历要求并不高,只要你满足一定的年龄和健康条件, 电子证书… · 2026/11/15 2:03:54
苏家屯电工证办理含金量高吗?学历不高也能报上名 苏家屯电工证办理含金量高吗?学历不高也能报上名 你是不是也担心学历不高报不了电工证?别急,苏家屯电工证办理其实并没有你想象中那么难,关键是了解流程和含金量。电工证作为特种作业操作证的一种,是从事电气安装、维修、操作等工作的必备资质。下面我结… · 2026/11/15 2:02:54
长春初级电工证怎么考?通过率揭秘全在这里 长春初级电工证怎么考?通过率揭秘全在这里 之前考的证在外省能不能转过来?这几乎是每个想从事电工工作的人都会问的问题。特别是那些在外地打拼多年、手里握着一张“外地电工证”的人,到了长春想继续干这一行,第一反应就是“我的证能用吗?”。今天我们就… · 2026/11/15 0:00:50
国内电工证报考条件与考试时间 低压电工证怎么考?学历不高也能报名,官方报名入口全在这 你是不是经常听说“电工证是入行门槛”,但又担心自己学历不够、经验不足,根本报不了名?别急,今天就带你从零了解【国内电工证】的报考流程、考试内容,还有怎么在 官方报名入口… · 2026/11/15 0:00:50
电工作业时如何断电?电子证书到底能不能全国通用? 电工作业时如何断电?电子证书到底能不能全国通用? 实操考试心里没底怕挂科,特别是电工作业时如何断电这一操作,不仅关系到你能不能拿到证书,更关系到以后能不能顺利上岗。很多人觉得这不过就是“断个电”,但其实这里面的门道可不少,稍有不慎就可能出错… · 2026/11/15 0:00:50
长春初级电工证怎么考?通过率揭秘全在这里 长春初级电工证怎么考?通过率揭秘全在这里 之前考的证在外省能不能转过来?这几乎是每个想从事电工工作的人都会问的问题。特别是那些在外地打拼多年、手里握着一张“外地电工证”的人,到了长春想继续干这一行,第一反应就是“我的证能用吗?”。今天我们就… · 2026/11/15 0:00:50
国内电工证报考条件与考试时间 低压电工证怎么考?学历不高也能报名,官方报名入口全在这 你是不是经常听说“电工证是入行门槛”,但又担心自己学历不够、经验不足,根本报不了名?别急,今天就带你从零了解【国内电工证】的报考流程、考试内容,还有怎么在 官方报名入口… · 2026/11/15 0:00:50
电工作业时如何断电?电子证书到底能不能全国通用? 电工作业时如何断电?电子证书到底能不能全国通用? 实操考试心里没底怕挂科,特别是电工作业时如何断电这一操作,不仅关系到你能不能拿到证书,更关系到以后能不能顺利上岗。很多人觉得这不过就是“断个电”,但其实这里面的门道可不少,稍有不慎就可能出错… · 2026/11/15 0:00:50
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 1:51:20
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:11:51
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 22:31:30