4、SQL语言概述:SQL分类(DDL、DML、DQL、DCL)、SQL语法基础、标识符与数据类型
SQL(Structured Query Language,结构化查询语言)是关系型数据库管理系统的核心语言,用于管理、操作和查询数据。在计算机二级MySQL数据库考试中,理解SQL的分类、语法基础、标识符规则和数据类型是后续编写复杂查询、设计表结构的前提。本章将系统梳理SQL语言的四大分类(DDL、DML、DQL、DCL),讲解SQL语句的基本书写规范,并深入解析MySQL中的标识符命名规则与核心数据类型,帮助学习者建立扎实的SQL语言知识框架。
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 | 否 |
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查询语句在逻辑上遵循特定的执行顺序,理解这个顺序有助于优化查询性能:
- FROM:确定数据来源表
- WHERE:过滤行数据
- GROUP BY:分组
- HAVING:过滤分组
- SELECT:选择列
- ORDER BY:排序
- 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 常见误区与总结复盘
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 常见误区与总结复盘
另一个常见误区是忽略UNSIGNED属性。对于不需要负数的字段(如年龄、数量),可以加上UNSIGNED属性,将存储范围扩大一倍。例如TINYINT UNSIGNED的范围是0~255。