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

相关推荐
AscendKing5 小时前
Oracle 数据库OGG 工具简介
数据库·oracle·ogg
敲代码的嘎仔5 小时前
JavaWeb零基础学习Day5——MySQL
java·数据库·学习·程序人生·mysql·adb·改行学it
爱宇阳5 小时前
使用 PowerShell 批量导出 MySQL 数据库(新手教程)
数据库·mysql
落世繁华5 小时前
Docker快速部署--Mysql一键初始化
运维·mysql·docker·容器·一键部署
得物技术5 小时前
RAG—Chunking策略实战|得物技术
数据库·人工智能·算法
Fuly10246 小时前
使用Milvus作为向量数据库
数据库·milvus
全栈师6 小时前
LigerUI下frm与grid的交互
java·前端·数据库
叫我詹躲躲6 小时前
救命!MySQL 误删数据找不回?老运维私藏的备份技巧,免费给
运维·数据库
_大学牲6 小时前
Flutter 之魂 Dio🔥:四两拨千斤的网络库
前端·数据库·flutter