【零基础学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)是用于定义和管理数据库对象结构的语言,相当于为数据库 "搭建骨架"------ 比如创建数据库、数据表,修改表结构,或删除无用的对象。它的操作会直接改变数据库的物理结构,且执行后通常无法撤销(需谨慎操作)。

核心作用

  • 创建数据库、数据表、视图、索引等对象;

  • 修改已存在对象的结构(如给表加字段、改字段类型);

  • 删除不需要的对象(如删表、删索引)。

常用命令及示例

  1. 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 为主键)。

  1. 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)。

  1. DROP:删除对象,操作不可逆,需格外小心。
  • 删除数据表:DROP TABLE user_info;(删除 user_info 表,表中所有数据也会被删除);

  • 删除数据库:DROP DATABASE test_db;(删除 test_db 数据库,库中所有表和数据都会被清空)。

3.2 DML:数据操作语言,"给数据库填充血肉"

DML(Data Manipulation Language)是用于操作数据表中数据的语言,相当于为 "骨架" 填充 "血肉"------ 比如添加新数据、修改已有数据、删除无用数据。它的操作针对的是表中的具体记录,且默认情况下可以通过事务回滚撤销(需配合 TCL 使用)。

核心作用

  • 向数据表中插入新数据(增);

  • 修改表中已存在的数据(改);

  • 删除表中不需要的数据(删)。

常用命令及示例

  1. 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);(一次性插入两条记录)。

  1. UPDATE:修改数据,更新表中已有记录的内容。
  • 修改单条记录:UPDATE user SET age = 26 WHERE id = 1;(将 id 为 1 的用户年龄改为 26,必须加 WHERE 条件,否则会修改表中所有记录);

  • 修改多条记录:UPDATE user SET age = age + 1 WHERE age < 30;(将所有年龄小于 30 的用户,年龄加 1)。

  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 的唯一核心命令,但它可以结合多种关键字实现复杂查询,常见用法如下:

  1. 基础查询:查询指定字段或所有字段。
  • 查询所有字段:SELECT * FROM user;*表示所有字段,不推荐在生产环境使用,效率低);

  • 查询指定字段:SELECT id, name FROM user;(只查询 user 表的 id 和 name 字段)。

  1. 条件查询 :结合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 '张%';(查询姓 "张" 的用户,%表示任意字符)。

  1. 排序与分页 :结合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 条开始)。

  1. 统计查询 :结合COUNTSUM等聚合函数。
  • 统计用户总数: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)。

常用命令及示例

  1. 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 将查询权限传递给其他用户)。

  1. 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;关闭自动提交,再手动控制事务。

  1. 开启事务:标记事务的起始点,后续的 DML 操作都会纳入事务管理。
  • 显式开启:START TRANSACTION;BEGIN;(两种写法等价)。
  1. 提交事务:确认事务中的所有 DML 操作,将修改永久写入数据库,事务结束。
  • 示例:转账场景(用户 A 给用户 B 转 100 元)

    SET AUTOCOMMIT = 0; -- 关闭自动提交

    START TRANSACTION; -- 开启事务

    UPDATE account SET balance = balance - 100 WHERE user_id = 'A'; -- A扣款100

    UPDATE account SET balance = balance + 100 WHERE user_id = 'B'; -- B收款100

    COMMIT; -- 确认操作,事务提交,数据永久生效

  1. 回滚事务:撤销事务中所有未提交的 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的扣款会被撤销,数据恢复到事务前状态

  1. 保存事务点 :结合SAVEPOINTROLLBACK TO,回滚到事务中的指定点,而非全部回滚。

    START TRANSACTION;

    INSERT INTO user (id, name) VALUES (1, '张三'); -- 操作1

    SAVEPOINT sp1; -- 保存事务点sp1

    INSERT INTO user (id, name) VALUES (2, '李四'); -- 操作2

    ROLLBACK 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 保障事务一致性),灵活应对不同的业务场景。

相关推荐
TDengine (老段)31 分钟前
TDengine Python 连接器入门指南
大数据·数据库·python·物联网·时序数据库·tdengine·涛思数据
萧曵 丶1 小时前
事务ACID特性详解
数据库·事务·acid
kejiayuan2 小时前
CTE更易懂的SQL风格
数据库·sql
kaico20182 小时前
MySQL的索引
数据库·mysql
清水白石0082 小时前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python
资生算法程序员_畅想家_剑魔2 小时前
Mysql常见报错解决分享-01-Invalid escape character in string.
数据库·mysql
PyHaVolask3 小时前
SQL注入漏洞原理
数据库·sql
ptc学习者3 小时前
黑格尔时代后崩解的辩证法
数据库
代码游侠3 小时前
应用——智能配电箱监控系统
linux·服务器·数据库·笔记·算法·sqlite
!chen3 小时前
EF Core自定义映射PostgreSQL原生函数
数据库·postgresql