【零基础学MySQL】第二章:SQL类型
SQL,全称为
Structure Query Language(结构化查询语言)
,是一套用于管理关系型数据库的标准编程语言。如果把数据库比作一座大型图书馆,SQL 就像是图书馆管理员的 “工作手册”—— 通过它,我们能精准地完成图书(数据)的入库、整理、查找和权限管理等操作。
从本质上来说,SQL 是操作数据库的 “通用普通话”,无论你使用 MySQL、Oracle、SQL Server 还是 PostgreSQL,核心的 SQL 逻辑都是相通的。但需要注意的是,不同数据库厂商会在标准 SQL 的基础上增加 “方言”,以适配自身特性。例如:
-
MySQL 的分页方言:使用
LIMIT关键字,比如SELECT * FROM table LIMIT 10 OFFSET 20(查询第 21-30 条数据); -
Oracle 的分页方言:依赖伪列
ROWNUM,例如SELECT * FROM (SELECT t.*, ROWNUM rn FROM table t WHERE ROWNUM <= 30) WHERE rn >= 21。
掌握 SQL 的关键,在于区分它的五大核心类型 ——DDL、DML、DQL、DCL、TCL。它们各司其职,共同构成了数据库操作的完整流程。
3.1 DDL:数据定义语言,“搭建数据库的骨架”
DDL(Data Definition Language)是用于定义和管理数据库对象结构的语言,相当于为数据库 “搭建骨架”—— 比如创建数据库、数据表,修改表结构,或删除无用的对象。它的操作会直接改变数据库的物理结构,且执行后通常无法撤销(需谨慎操作)。
核心作用
-
创建数据库、数据表、视图、索引等对象;
-
修改已存在对象的结构(如给表加字段、改字段类型);
-
删除不需要的对象(如删表、删索引)。
常用命令及示例
- CREATE:创建对象,最基础的 DDL 命令。
-
创建数据库:
CREATE DATABASE test_db;(创建名为 test_db 的数据库); -
创建数据表:
CREATE TABLE user (id INT PRIMARY KEY, name VARCHAR(50), age INT);(创建 user 表,包含 id、name、age 三个字段,id 为主键)。
- ALTER:修改对象结构,常用于调整表结构。
-
给表加字段:
ALTER TABLE user ADD email VARCHAR(100);(给 user 表新增 email 字段); -
修改字段类型:
ALTER TABLE user MODIFY age TINYINT;(将 age 字段从 INT 改为 TINYINT); -
改表名:
ALTER TABLE user RENAME TO user_info;(将 user 表重命名为 user_info)。
- DROP:删除对象,操作不可逆,需格外小心。
-
删除数据表:
DROP TABLE user_info;(删除 user_info 表,表中所有数据也会被删除); -
删除数据库:
DROP DATABASE test_db;(删除 test_db 数据库,库中所有表和数据都会被清空)。
3.2 DML:数据操作语言,“给数据库填充血肉”
DML(Data Manipulation Language)是用于操作数据表中数据的语言,相当于为 “骨架” 填充 “血肉”—— 比如添加新数据、修改已有数据、删除无用数据。它的操作针对的是表中的具体记录,且默认情况下可以通过事务回滚撤销(需配合 TCL 使用)。
核心作用
-
向数据表中插入新数据(增);
-
修改表中已存在的数据(改);
-
删除表中不需要的数据(删)。
常用命令及示例
- INSERT:插入数据,向表中添加新记录。
-
插入单条数据:
INSERT INTO user (id, name, age) VALUES (1, '张三', 25);(给 user 表插入一条 id 为 1、姓名为张三、年龄 25 的记录); -
插入多条数据:
INSERT INTO user (id, name, age) VALUES (2, '李四', 30), (3, '王五', 28);(一次性插入两条记录)。
- UPDATE:修改数据,更新表中已有记录的内容。
-
修改单条记录:
UPDATE user SET age = 26 WHERE id = 1;(将 id 为 1 的用户年龄改为 26,必须加 WHERE 条件,否则会修改表中所有记录); -
修改多条记录:
UPDATE user SET age = age + 1 WHERE age < 30;(将所有年龄小于 30 的用户,年龄加 1)。
- DELETE:删除数据,删除表中的记录(注意:DELETE 删的是记录,不是表结构,表还在)。
-
删除单条记录:
DELETE FROM user WHERE id = 3;(删除 id 为 3 的用户记录); -
删除符合条件的多条记录:
DELETE FROM user WHERE age > 50;(删除所有年龄大于 50 的用户记录); -
清空表中所有记录(慎用):
DELETE FROM user;(删除 user 表中所有记录,但表结构保留,可通过事务回滚恢复)。
3.3 DQL:数据查询语言,“从数据库中挖掘价值”
DQL(Data Query Language)是用于从数据库中查询数据的语言,也是日常开发中使用频率最高的 SQL 类型。它不修改数据,只负责 “读取” 数据 —— 无论是简单的单表查询,还是复杂的多表联查、统计分析,都依赖 DQL 实现。
核心作用
-
从一个或多个表中查询指定字段的数据;
-
对查询结果进行过滤、排序、分组、统计等处理;
-
按需返回符合业务需求的数据(如分页查询、模糊查询)。
核心命令:SELECT
SELECT是 DQL 的唯一核心命令,但它可以结合多种关键字实现复杂查询,常见用法如下:
- 基础查询:查询指定字段或所有字段。
-
查询所有字段:
SELECT * FROM user;(*表示所有字段,不推荐在生产环境使用,效率低); -
查询指定字段:
SELECT id, name FROM user;(只查询 user 表的 id 和 name 字段)。
- 条件查询:结合
WHERE过滤数据。
-
等值查询:
SELECT * FROM user WHERE age = 25;(查询年龄等于 25 的用户); -
范围查询:
SELECT * FROM user WHERE age BETWEEN 20 AND 30;(查询年龄在 20-30 之间的用户); -
模糊查询:
SELECT * FROM user WHERE name LIKE '张%';(查询姓 “张” 的用户,%表示任意字符)。
- 排序与分页:结合
ORDER BY和分页方言。
-
按年龄排序:
SELECT * FROM user ORDER BY age DESC;(按年龄降序排列,DESC 表示降序,ASC 表示升序,默认 ASC); -
MySQL 分页查询:
SELECT * FROM user ORDER BY age DESC LIMIT 10 OFFSET 0;(查询前 10 条数据,OFFSET 0 表示从第 0 条开始)。
- 统计查询:结合
COUNT、SUM等聚合函数。
-
统计用户总数:
SELECT COUNT(*) AS user_count FROM user;(COUNT(*)统计所有记录数,AS给结果列起别名); -
统计平均年龄:
SELECT AVG(age) AS avg_age FROM user;(AVG(age)计算年龄的平均值)。
3.4 DCL:数据控制语言,“给数据库加把安全锁”
DCL(Data Control Language)是用于管理数据库权限的语言,相当于为数据库 “加安全锁”—— 它决定了谁能访问数据库、能对数据库执行哪些操作(如是否允许某个用户修改表数据)。DCL 主要用于数据库管理员(DBA)进行权限管控,保障数据安全。
核心作用
-
授予用户某个数据库或表的操作权限(如查询权、修改权);
-
撤销用户已有的权限,防止越权操作;
-
管理数据库用户(如创建用户、修改密码,但部分数据库将用户管理归为 DDL,如 MySQL)。
常用命令及示例
- GRANT:授予权限,给用户分配操作权限。
-
授予查询权限:
GRANT SELECT ON test_db.user TO 'test_user'@'``localhost``';(给localhost的 test_user 用户,授予 test_db 数据库下 user 表的查询权限); -
授予所有权限:
GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'``localhost``';(给 test_user 用户,授予 test_db 数据库下所有表的所有权限,*表示所有表); -
授予权限并允许传递:
GRANT SELECT ON test_db.user TO 'test_user'@'``localhost``' WITH GRANT OPTION;(允许 test_user 将查询权限传递给其他用户)。
- REVOKE:撤销权限,收回用户已有的权限。
-
撤销查询权限:
REVOKE SELECT ON test_db.user FROM 'test_user'@'``localhost``';(收回 test_user 对 user 表的查询权限); -
撤销所有权限:
REVOKE ALL PRIVILEGES ON test_db.* FROM 'test_user'@'``localhost``';(收回 test_user 对 test_db 数据库所有表的所有权限)。
3.5 TCL:事务控制语言,“保障数据操作的一致性”
TCL(Transaction Control Language)是用于管理数据库事务的语言,它能确保一组 DML 操作(如插入、修改)要么 “全部成功”,要么 “全部失败”,避免出现数据不一致的情况(比如转账时,扣款成功但收款失败)。
核心作用
-
开启一个事务(标记操作的起始点);
-
提交事务(确认所有操作,永久生效);
-
回滚事务(撤销所有操作,恢复到事务开始前的状态);
-
保存事务点(允许回滚到指定中间点,而非全部回滚)。
常用命令及示例
首先需要明确:不同数据库的事务默认行为不同。例如,MySQL 的 InnoDB 引擎默认 “自动提交事务”(即每执行一条 DML 就自动提交),需先通过SET AUTOCOMMIT = 0;关闭自动提交,再手动控制事务。
- 开启事务:标记事务的起始点,后续的 DML 操作都会纳入事务管理。
- 显式开启:
START TRANSACTION;或BEGIN;(两种写法等价)。
- 提交事务:确认事务中的所有 DML 操作,将修改永久写入数据库,事务结束。
- 示例:转账场景(用户 A 给用户 B 转 100 元)
SET AUTOCOMMIT = 0; -- 关闭自动提交START TRANSACTION; -- 开启事务UPDATE account SET balance = balance - 100 WHERE user\_id = 'A'; -- A扣款100UPDATE account SET balance = balance + 100 WHERE user\_id = 'B'; -- B收款100COMMIT; -- 确认操作,事务提交,数据永久生效
- 回滚事务:撤销事务中所有未提交的 DML 操作,恢复到事务开始前的状态。
- 延续上面的转账场景,如果 B 收款失败(如 SQL 报错),则回滚:
SET AUTOCOMMIT = 0;START TRANSACTION;UPDATE account SET balance = balance - 100 WHERE user\_id = 'A'; -- A已扣款UPDATE account SET balance = balance + 100 WHERE user\_id = 'C'; -- 错误:用户C不存在,SQL报错ROLLBACK; -- 回滚事务,A的扣款会被撤销,数据恢复到事务前状态
- 保存事务点:结合
SAVEPOINT和ROLLBACK TO,回滚到事务中的指定点,而非全部回滚。
START TRANSACTION;INSERT INTO user (id, name) VALUES (1, '张三'); -- 操作1SAVEPOINT sp1; -- 保存事务点sp1INSERT INTO user (id, name) VALUES (2, '李四'); -- 操作2ROLLBACK TO sp1; -- 回滚到sp1,操作2被撤销,操作1保留COMMIT; -- 最终只插入“张三”的记录
总结:SQL 五大类型的核心区别
为了帮大家快速区分,我们用一张表格总结五大 SQL 类型的核心差异:
| 类型 | 核心作用 | 关键命令 | 是否修改数据 / 结构 | 可逆性 |
|---|---|---|---|---|
| DDL | 定义数据库结构 | CREATE、ALTER、DROP | 修改结构(表、库等) | 不可逆 |
| DML | 操作表中数据 | INSERT、UPDATE、DELETE | 修改数据(记录) | 可通过事务回滚 |
| DQL | 查询数据 | SELECT | 不修改,仅读取 | - |
| DCL | 管理权限 | GRANT、REVOKE | 不修改数据 / 结构,仅调整权限 | 可逆(撤销权限) |
| TCL | 管理事务 | COMMIT、ROLLBACK | 不直接修改,控制 DML 的生效 | 事务提交前可回滚 |
掌握这五大类型,就相当于掌握了 SQL 的 “语法骨架”。在实际开发中,我们通常会结合多种类型使用(如用 DDL 建表,用 DML 插数据,用 DQL 查数据,用 TCL 保障事务一致性),灵活应对不同的业务场景。
