SQL(Structured Query Language,结构化查询语言)是用于管理和操作关系型数据库的国际标准语言。它是连接应用程序与数据库的桥梁,让开发者能够以声明式的方式告诉数据库“想要什么数据”,而无需关心底层具体的实现细节。
标准化:由 ANSI 和 ISO 制定标准,主流数据库均支持核心语法。
简洁强大:仅需几条命令即可完成复杂的数据检索、更新和管理。
通用性:掌握 SQL 后,可轻松切换于 MySQL、PostgreSQL、Oracle 等不同系统之间。
标准 SQL 与数据库方言
虽然 SQL 有国际标准,但各大数据库厂商(如 MySQL、Oracle、Microsoft)在实现时都会进行扩展或微调,形成了各自的数据库方言(Dialect)。
为什么存在方言?
为了适应特定的功能需求(如 MySQL 的分页 LIMIT vs Oracle 的 ROWNUM)、性能优化或特有数据类型。
实际影响:
大多数基础查询(SELECT, INSERT)在所有数据库中是通用的。但在涉及高级函数、分页逻辑、存储过程或特定数据类型时,直接迁移 SQL 语句可能会报错,需要根据目标数据库的方言进行调整。
示例:获取前 10 条记录
MySQL / PostgreSQL:
SELECT * FROM users LIMIT 10;SQL Server:
SELECT TOP 10 * FROM users;Oracle (旧版):
SELECT * FROM users WHERE ROWNUM <= 10;
SQL 命令根据功能不同,被划分为五大类。理解这些分类有助于构建清晰的数据库操作思维模型。
定义:Data Definition Language,用于定义或修改数据库的结构(Schema),而非数据本身。这类操作通常是自动提交的,一旦执行无法回滚(取决于具体 DBMS 实现)。
核心命令:
CREATE:创建新对象(数据库、表、索引、视图)。
ALTER:修改现有对象的结构(如添加列、修改字段类型)。
DROP:彻底删除对象及其所有数据。
TRUNCATE:清空表中所有数据,但保留表结构(比 DELETE 更快,重置自增 ID)。
应用场景:
项目初始化时建库建表。
业务迭代时需要增加新字段。
清理废弃的测试表。
注意:
DROP和TRUNCATE是高危操作,执行前务必确认备份!
定义:Data Manipulation Language,用于对表中的具体数据进行增、删、改操作。这是日常开发中最常用的部分。
核心命令:
INSERT:向表中插入新行。
UPDATE:修改表中已存在的行。
DELETE:删除表中符合条件的行。
应用场景:
用户注册(插入数据)。
修改个人资料(更新数据)。
注销账号或删除评论(删除数据)。
关键点:DML 操作通常需要在事务中管理,以确保数据的原子性和一致性。
定义:Data Query Language,专门用于从数据库中检索数据。虽然理论上 SELECT 属于 DML 的一部分,但在实际教学和工程中,常将其单独列为 DQL,因为它是使用频率最高的命令。
核心命令:
SELECT:查询数据,支持过滤、排序、分组、聚合和多表连接。
应用场景:
展示商品列表。
统计月度销售额。
搜索特定用户信息。
特点:
SELECT语句不会修改数据库中的数据,是只读操作。
定义:Data Control Language,用于定义数据库的访问权限和安全级别。
核心命令:
GRANT:授予用户或角色特定的操作权限(如只读、读写、管理员)。
REVOKE:收回之前授予的权限。
应用场景:
为开发人员分配只读账号用于排查问题。
禁止普通应用账号删除生产环境数据。
设置主从复制账号的同步权限。
最佳实践:遵循“最小权限原则”,只授予完成工作所需的最小权限集。
定义:Transaction Control Language,用于管理数据库事务,确保一组操作要么全部成功,要么全部失败,从而维护数据的完整性(ACID 特性)。
核心命令:
COMMIT:提交事务,永久保存当前所有更改。
ROLLBACK:回滚事务,撤销当前未提交的所有更改。
SAVEPOINT:在事务中设置保存点,允许回滚到特定位置而非整个事务。
应用场景:
银行转账:A 扣钱和 B 加钱必须同时成功,否则全部回滚。
订单创建:生成订单、扣减库存、增加积分必须作为一个整体执行。
工作机制:默认情况下,某些数据库(如 MySQL 的 InnoDB 引擎)可能开启自动提交(Auto-commit)。在复杂业务逻辑中,通常需要手动开启事务 (
START TRANSACTION),执行一系列 DML 操作后,根据结果决定COMMIT或ROLLBACK。