4、SQL语言概述:SQL分类(DDL、DML、DQL、DCL)、SQL语法基础、标识符与数据类型

SQL(Structured Query Language,结构化查询语言)是关系型数据库管理系统的核心语言,用于管理、操作和查询数据。在计算机二级MySQL数据库考试中,理解SQL的分类、语法基础、标识符规则和数据类型是后续编写复杂查询、设计表结构的前提。本章将系统梳理SQL语言的四大分类(DDL、DML、DQL、DCL),讲解SQL语句的基本书写规范,并深入解析MySQL中的标识符命名规则与核心数据类型,帮助学习者建立扎实的SQL语言知识框架。

SQL语言分类与语法基础结构图 SQL 语言 DDL 数据定义语言 CREATE / ALTER / DROP DML 数据操作语言 INSERT / UPDATE / DELETE DQL 数据查询语言 SELECT DCL 数据控制语言 GRANT / REVOKE SQL 语法基础 • 语句以分号(;)结尾,关键字不区分大小写 • 字符串用单引号(' ')括起,数字直接书写 • 注释:-- 单行注释 / /* 多行注释 */ • 命名规则:字母开头,可含数字、下划线,长度≤64字符 核心数据类型: INT / VARCHAR / CHAR / DATE / DATETIME / DECIMAL / FLOAT / TEXT ENUM / SET / BLOB / BOOLEAN

4.1 SQL分类:四大语言体系

SQL语言按照功能可以划分为四大类:数据定义语言(DDL)、数据操作语言(DML)、数据查询语言(DQL)和数据控制语言(DCL)。每一类语言在数据库生命周期中承担不同的职责,理解它们的边界是学习MySQL的第一步。

4.1.1 核心原理:各类SQL的职责边界

DDL(Data Definition Language)用于定义数据库对象的结构,包括数据库、表、视图、索引、存储过程等。DDL语句执行后通常会自动提交事务,无法使用ROLLBACK回滚。常见的DDL命令包括:

  • CREATE DATABASE / TABLE / INDEX / VIEW:创建数据库对象
  • ALTER TABLE:修改表结构(添加列、修改列类型、删除列等)
  • DROP TABLE / DATABASE:删除数据库对象
  • TRUNCATE TABLE:清空表数据但保留表结构

DML(Data Manipulation Language)用于操作表中的数据记录,包括插入、修改和删除。DML操作受事务控制,可以使用COMMIT提交或ROLLBACK回滚。核心命令包括:

  • INSERT INTO:向表中插入新记录
  • UPDATE:修改表中已有记录
  • DELETE FROM:删除表中记录

DQL(Data Query Language)是SQL中最常用的部分,核心命令是SELECT,用于从数据库中检索数据。DQL支持条件过滤、排序、分组、连接查询、子查询等复杂操作,是考试和实际开发中的重点。

DCL(Data Control Language)用于管理数据库用户的权限,控制谁可以访问哪些数据库对象以及执行哪些操作。核心命令包括:

  • GRANT:授予用户权限
  • REVOKE:撤销用户权限

4.1.2 判断方法:如何区分SQL语句类别

判断一条SQL语句属于哪一类,可以从操作对象和操作性质两个维度入手:

SQL类别 操作对象 典型动词 是否受事务控制
DDL 数据库、表结构、索引、视图 CREATE, ALTER, DROP, TRUNCATE 否(自动提交)
DML 表中的数据行 INSERT, UPDATE, DELETE 是(可回滚)
DQL 表中的数据行(只读) SELECT 不适用(只读)
DCL 用户权限 GRANT, REVOKE 否
经验提示:在MySQL中,TRUNCATE虽然属于DDL,但它操作的是表数据而非表结构。它与DELETE(DML)的区别在于:TRUNCATE不能加WHERE条件,且执行后无法回滚,同时会重置自增计数器。

4.1.3 案例拆解:一个完整的建表与操作流程

假设我们需要为一个学生管理系统创建数据库和表,并执行基本的数据操作。以下是完整的SQL流程:

-- 1. DDL:创建数据库
CREATE DATABASE student_db DEFAULT CHARACTER SET utf8mb4;

-- 2. DDL:使用数据库并创建表
USE student_db;
CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    age TINYINT,
    gender ENUM('M', 'F'),
    enroll_date DATE
);

-- 3. DML:插入数据
INSERT INTO student (name, age, gender, enroll_date) 
VALUES ('张三', 20, 'M', '2024-09-01');

-- 4. DQL:查询数据
SELECT * FROM student WHERE age > 18;

-- 5. DCL:创建用户并授权
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'password123';
GRANT SELECT, INSERT, UPDATE ON student_db.* TO 'app_user'@'localhost';

这个案例展示了四类SQL的协同工作方式:DDL搭建结构,DML填充数据,DQL检索信息,DCL控制访问权限。在实际开发中,这四类语句往往交替使用,构成完整的数据库操作闭环。

4.1.4 常见误区与总结复盘

风险提示:初学者容易混淆DELETE和TRUNCATE。DELETE是DML,可以加WHERE条件,逐行删除且不重置自增ID;TRUNCATE是DDL,直接重建表,速度更快但不可回滚。在考试中,务必根据题目要求选择正确的命令。

另外,DDL语句在MySQL中执行后会自动提交,无法通过ROLLBACK撤销。因此,在生产环境中执行ALTER TABLE或DROP TABLE之前,必须做好备份或先在测试环境验证。

4.2 SQL语法基础

SQL语法虽然相对简单,但遵循统一的书写规范是保证语句正确性和可读性的基础。本节将介绍SQL语句的基本书写规则、注释方式以及语句结构。

4.2.1 核心原理:SQL语句的书写规范

  • 语句结束符:MySQL默认使用分号(;)作为语句结束符。在命令行客户端中,必须输入分号后按回车才会执行语句。
  • 大小写规则:SQL关键字不区分大小写,但为了可读性,通常将关键字大写,表名和列名小写。数据库名、表名在Linux系统下区分大小写,在Windows下不区分。
  • 字符串与数字:字符串常量必须使用单引号(' ')括起,数字可以直接书写。日期时间类型建议使用字符串格式'YYYY-MM-DD HH:MM:SS'。
  • 注释:单行注释使用-- (两个连字符加一个空格)或#;多行注释使用/* ... */。

4.2.2 操作流程:SQL语句的执行顺序

一条完整的SQL查询语句在逻辑上遵循特定的执行顺序,理解这个顺序有助于优化查询性能:

  1. FROM:确定数据来源表
  2. WHERE:过滤行数据
  3. GROUP BY:分组
  4. HAVING:过滤分组
  5. SELECT:选择列
  6. ORDER BY:排序
  7. LIMIT:限制返回行数

虽然书写时SELECT在最前面,但数据库引擎实际先执行FROM和WHERE。这一顺序在编写复杂查询时尤为重要,例如WHERE中不能使用SELECT中定义的别名。

4.2.3 实战场景:一个带注释的完整查询

-- 查询2024年入学的男生信息,按年龄降序排列
SELECT id, name, age, enroll_date  -- 选择需要的列
FROM student                      -- 数据来源
WHERE gender = 'M'                -- 过滤条件
  AND enroll_date >= '2024-01-01' -- 追加条件
ORDER BY age DESC                 -- 按年龄降序
LIMIT 10;                         -- 只返回前10条

这个查询展示了SQL语法的核心要素:SELECT子句、FROM子句、WHERE子句、ORDER BY子句和LIMIT子句的组合使用。注意WHERE中的条件使用AND连接多个过滤条件,ORDER BY使用DESC表示降序。

4.2.4 常见误区与总结复盘

重点提醒:在MySQL中,字符串比较默认不区分大小写(取决于排序规则)。如果需要进行大小写敏感的查询,可以在WHERE条件中使用BINARY关键字,例如:WHERE BINARY name = 'ZhangSan'。

另一个常见错误是忘记在字符串中使用引号,或者混用单引号和双引号。MySQL默认支持单引号,双引号在默认SQL模式下也可以使用,但为了兼容性,建议统一使用单引号。

4.3 标识符与数据类型

标识符是数据库对象的名称,数据类型则定义了列中存储数据的格式和范围。正确选择标识符和数据类型是数据库设计的基础,直接影响存储效率、查询性能和数据的完整性。

4.3.1 核心原理:标识符命名规则

MySQL中的标识符包括数据库名、表名、列名、索引名、约束名等。命名时需要遵循以下规则:

  • 字符范围:允许使用字母(A-Z,a-z)、数字(0-9)、下划线(_)和美元符号($),但首字符不能是数字。
  • 长度限制:标识符最长64个字符(某些版本为255)。
  • 保留字:不能使用MySQL的保留字(如SELECT、FROM、WHERE等)作为标识符,除非使用反引号(`)括起。
  • 大小写敏感:数据库名和表名在Linux下区分大小写,在Windows下不区分。列名和索引名在所有平台都不区分大小写。

4.3.2 数据类型详解

MySQL提供了丰富的数据类型,主要分为数值类型、字符串类型、日期时间类型和其他类型。选择合适的数据类型可以节省存储空间并提高查询效率。

类别 数据类型 存储范围/说明 典型用途
数值类型 TINYINT -128 ~ 127(1字节) 年龄、状态码
INT / INTEGER -2^31 ~ 2^31-1(4字节) 主键、计数器
DECIMAL(M,D) 精确小数,M为总位数,D为小数位 金额、价格
FLOAT / DOUBLE 近似浮点数(4/8字节) 科学计算、百分比
字符串类型 CHAR(n) 定长字符串,n≤255,不足补空格 固定长度编码(如身份证号)
VARCHAR(n) 变长字符串,n≤65535,实际长度+1字节 姓名、地址、描述
TEXT 长文本,最大64KB 文章内容、评论
日期时间 DATE 'YYYY-MM-DD',范围1000-01-01 ~ 9999-12-31 生日、入职日期
DATETIME 'YYYY-MM-DD HH:MM:SS',8字节 订单时间、日志时间
TIMESTAMP 时间戳,4字节,范围1970~2038 自动记录修改时间
其他 ENUM / SET 枚举类型 / 集合类型 性别、状态、多选项

4.3.3 案例拆解:学生表的数据类型设计

假设我们要设计一个学生信息表,包含学号、姓名、性别、出生日期、联系电话、邮箱、成绩和备注字段。以下是合理的数据类型选择:

CREATE TABLE student_info (
    student_id CHAR(10) PRIMARY KEY,      -- 学号:定长字符串,如'20240001'
    name VARCHAR(20) NOT NULL,             -- 姓名:变长,最长20字符
    gender ENUM('M', 'F') DEFAULT 'M',     -- 性别:枚举类型
    birth_date DATE,                       -- 出生日期
    phone VARCHAR(15),                     -- 电话:变长,考虑国际区号
    email VARCHAR(50) UNIQUE,              -- 邮箱:变长,唯一约束
    score DECIMAL(5,2),                    -- 成绩:总长5位,小数2位,如98.50
    remark TEXT                            -- 备注:长文本
);

这个设计体现了数据类型选择的原则:定长数据用CHAR,变长数据用VARCHAR,精确数值用DECIMAL,固定选项用ENUM。学号使用CHAR(10)是因为学号长度固定且需要频繁比较;成绩使用DECIMAL(5,2)避免浮点误差;性别使用ENUM限制取值范围。

4.3.4 常见误区与总结复盘

风险提示:不要滥用TEXT类型。TEXT类型不能设置默认值,且索引时需要指定前缀长度。对于短文本(如地址、描述),VARCHAR(255)通常足够。另外,DECIMAL和FLOAT的选择要谨慎:涉及金额计算必须使用DECIMAL,避免浮点精度丢失。

另一个常见误区是忽略UNSIGNED属性。对于不需要负数的字段(如年龄、数量),可以加上UNSIGNED属性,将存储范围扩大一倍。例如TINYINT UNSIGNED的范围是0~255。

本章总结:SQL语言分为DDL、DML、DQL、DCL四大类,各自承担不同的职责。SQL语法基础包括语句结束符、大小写规则、字符串引用和注释方式。标识符命名需遵循字符范围、长度限制和保留字规则。数据类型的选择直接影响存储效率和查询性能,需要根据实际业务需求合理选择。掌握这些基础知识,是后续学习复杂查询、事务管理和数据库优化的前提。