SQL语句是与关系型数据库交互的标准语言,不同数据库产品在语法细节上略有差异,但核心指令集高度一致。把SQL按用途归类后学习,能显著降低记忆负担,也方便在排查慢查询或设计表结构时快速定位该用哪类语句。下面从查询、操纵、定义与控制四个维度拆解常见语句。

数据查询语句SELECT的核心用法
SELECT是最常用的SQL语句,用于从一张或多张表中检索数据。基础语法包含SELECT列名、FROM表名、WHERE过滤条件、ORDER BY排序以及LIMIT限制条数。很多初学者习惯用星号返回全部字段,但在生产环境中明确写出所需列能减少网络传输并避免使用到不必要的索引。WHERE子句支持等值、范围、模糊匹配与空值判断,结合AND、OR、NOT可组合出复杂条件。
多表查询时可用JOIN将关联数据拼接到结果集。内连接INNER JOIN只保留两表匹配的记录,左连接LEFT JOIN以左表为基准补空值,右连接与全外连接适用于不同业务场景。分组统计离不开GROUP BY与聚合函数COUNT、SUM、AVG,配合HAVING可过滤分组后的结果。下面示例展示如何查询每个部门的员工数与平均薪资:
SELECT dept_id, COUNT(*) AS emp_count, AVG(salary) AS avg_salary FROM employee WHERE status = 1 GROUP BY dept_id HAVING AVG(salary) > 8000 ORDER BY emp_count DESC LIMIT 10;
执行计划是判断查询是否高效的关键。在MySQL中加EXPLAIN前缀可观察语句是否命中索引、是否产生临时表。若发现type为ALL的全表扫描,应检查WHERE字段是否建立索引或重写查询逻辑。子查询在部分场景下可被改写为JOIN以提升性能,但需注意关联字段的类型一致,否则会触发隐式转换导致索引失效。
数据操纵语句INSERT UPDATE DELETE的注意事项
INSERT用于新增记录,支持单条插入与批量插入。批量写入相比循环单条提交能大幅降低事务开销,但单次批量过大可能撑满日志缓冲,通常按五百到一千行分批次处理较稳妥。INSERT INTO后明确列出字段名是一种好习惯,这样即使表结构新增列也不会因列顺序变化而写错数据。下面是安全批量插入的示例:
INSERT INTO order_log (user_id, amount, create_time) VALUES (1001, 50.00, '2023-09-01 10:00:00'), (1002, 88.50, '2023-09-01 10:05:00'), (1003, 12.00, '2023-09-01 10:10:00');
UPDATE修改已有数据时必须带WHERE条件,否则会更新全表。在Web后台执行更新前,建议先以相同条件运行SELECT确认影响行数,再开启事务执行更新,提交前再次核对。DELETE删除数据同样要限定范围,重要业务表应尽量使用逻辑删除,即把记录标记为无效而非物理移除,以便审计与恢复。以下示例展示带事务的安全更新:
BEGIN; UPDATE account SET balance = balance - 100 WHERE user_id = 1001 AND balance >= 100; DELETE FROM coupon WHERE expire_time < '2023-09-01' AND used = 0; COMMIT;
上述操纵语句在执行期间会对涉及行加锁,高并发场景下长事务可能导致锁等待甚至死锁。因此批量删除历史数据推荐分批限量操作,例如每次删除一千行并短暂休眠,既能释放空间也能降低主从延迟。操纵类语句完成后应及时提交,避免空闲连接占用锁资源。
数据定义与控制语句CREATE ALTER DROP GRANT
数据定义语句负责库表结构。CREATE TABLE建表时需根据业务选择合适的字段类型,定长字符用CHAR,变长用VARCHAR,金额避免FLOAT改用DECIMAL防止精度丢失。主键一般使用自增整数或雪花ID,外键约束能保证参照完整性但会增加写入开销,互联网高并发系统常在应用层维护关联。建表同时创建索引可加速查询:
CREATE TABLE product ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(120) NOT NULL, category_id INT NOT NULL, price DECIMAL(10,2) NOT NULL, INDEX idx_category (category_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE用于变更结构,如新增列、修改类型或加索引。在大数据表上执行ALTER可能锁表数分钟,MySQL的在线DDL或pt-online-schema-change工具可缓解此问题。DROP TABLE与DROP DATABASE会物理删除全部数据且难恢复,执行前必须备份并确认环境。数据控制语句GRANT与REVOKE管理账号权限,遵循最小权限原则能有效防范误删与拖库:
GRANT SELECT, INSERT ON shop_db.* TO 'app_user'@'192.168.0.1'; REVOKE DELETE ON shop_db.* FROM 'app_user'@'192.168.0.1';
定义与控制类语句通常不频繁执行,但影响面极广。建议在测试库先行验证语法与兼容性,再通过审批流程在生产执行。将建表语句纳入版本管理,配合迁移工具如Flyway,可保证多环境结构一致,也方便回溯变更历史。