SQL概述及DDL
2026/9/12大约 6 分钟
SQL概述及DDL
本篇整理 SQL 的基本概念与分类,以及 DDL(数据定义语言)中对数据库和表的常用操作。
1. 关于SQL
1.1 SQL概述
SQL:Structured Query Language(结构化查询语言)。客户端使用 SQL 来操作数据库,SQL 可以应用到所有关系型数据库中。
SQL 语言标准由 ISO(国际标准化组织)发布,ISO 定义了很多 SQL 标准(例如 SQL99)对 RDBMS 进行统一操作,相同的语句可以操作 Oracle、MySQL。但各个数据库厂商有自己的标准,类似于方言,例如 MySQL 中的 limit。
SQL 语法特点:
- SQL 语句可以在单行或多行书写,以分号结尾;
- 可使用空格和缩进来增强语句的可读性;
- MySQL 不区分大小写,建议关键字大写。
提示
通常执行对数据库的“增删改查”,简称 CRUD:C(Create)、R(Read)、U(Update)、D(Delete)。
1.2 SQL分类
| 分类 | 全称 | 说明 |
|---|---|---|
| DDL | Data Definition Language,数据定义语言 | 创建、删除、修改库与表结构 |
| DML | Data Manipulation Language,数据操作语言 | 增、删、改表记录 |
| TPL | Transaction Process Language,事务处理语言 | 用于对事务进行处理 |
| DQL | Data Query Language,数据查询语言 | 用来查询记录 |
| DCL | Data Control Language,数据控制语言 | 用来定义访问权限和安全级别 |
2. 数据库操作
2.1 查看数据库
# 查看所有的数据库
mysql> SHOW DATABASES;| 数据库名称 | 描述 |
|---|---|
| information_schema | 信息数据库,其中保存着关于所有数据库的信息(元数据)。元数据是关于数据的数据,如数据库名或表名、列的数据类型、访问权限等 |
| mysql | 核心数据库,主要负责存储数据库的用户、权限设置、关键字等,以及需要使用的控制和管理信息,不可以删除 |
| performance_schema | 性能优化的数据库,MySQL 5.5 版本中新增的一个性能优化的引擎 |
| sys | 系统数据库,MySQL 5.7 版本中新增的、可以快速了解元数据信息的系统库,便于发现数据库的多样信息,解决性能瓶颈问题 |
2.2 切换数据库
# 切换到想要操作的数据库
mysql> USE sys;2.3 查询当前使用的数据库
mysql> select database();2.4 创建数据库
# 创建名字为mydb1的数据库
mysql> CREATE DATABASE mydb1;
# 创建数据库并设置编码格式为utf8
mysql> CREATE DATABASE mydb2 CHARACTER SET utf8;
# 如果mydb3数据库不存在,则创建;如果存在,则不创建
mysql> CREATE DATABASE IF NOT EXISTS mydb3;2.5 查看数据库创建信息
mysql> SHOW CREATE DATABASE mydb1;2.6 修改数据库
# 修改数据库的字符集
mysql> ALTER DATABASE mydb1 CHARACTER SET gbk;2.7 删除数据库
# 删除数据库mydb1
mysql> DROP DATABASE mydb1;
# 如果存在数据库mydb2就删除
mysql> DROP DATABASE IF EXISTS mydb2;3. 表的操作
3.1 数据类型
MySQL 支持多种数据类型,大致可以分为三类:
- 数值;
- 字符串(字符)类型;
- 日期时间。
数据类型对于约束数据的类型有很大的帮助。
3.1.1 数值类型
| 类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
|---|---|---|---|---|
| INT | 4 字节 | (-2 147 483 648, 2 147 483 647) | (0, 4 294 967 295) | 大整数值 |
| DOUBLE | 8 字节 | (-1.797E+308, -2.22E-308) | (0, 2.22E-308, 1.797E+308) | 双精度浮点数值 |
| DOUBLE(M,D) | 8 字节,M 表示长度,D 表示小数位数 | 同上,受 M 和 D 的约束,如 DOUBLE(5,2) 表示 -999.99~999.99 | 同上,受 M 和 D 的约束 | 双精度浮点数值 |
| DECIMAL(M,D) | 依赖于 M 和 D 的值,M 最大值为 65 | 依赖于 M 和 D 的值,M 最大值为 65 | 依赖于 M 和 D 的值,M 最大值为 65 | 小数值,和钱相关,不会出现精度缺失的问题 |
3.1.2 字符串类型
| 类型 | 大小 | 用途 |
|---|---|---|
| CHAR | 0-255 字符 | 定长字符串,如 CHAR(10) 表示 10 个字符 |
| VARCHAR | 0-65535 字节 | 变长字符串,如 VARCHAR(10) 表示 10 个字符 |
| BLOB(binary large object) | 0-65535 字节 | 二进制形式的长文本数据 |
| TEXT | 0-65535 字节 | 长文本数据 |
关于 CHAR 和 VARCHAR 的区别:
- CHAR(255):数据长度不足指定长度时,补足到指定长度,用于身份证号、手机号、时间等长度固定的内容;
- VARCHAR(65535):数据长度不足指定长度时,不补足到指定长度,用于用户名、备注等长度不固定的内容;
- VARCHAR 需要至少花一个字节保存数据长度,如果长度超过一个字节能表示的范围,就要花费两个字节。
3.1.3 日期时间类型
| 类型 | 大小(字节) | 范围 | 格式 | 用途 |
|---|---|---|---|---|
| DATE | 3 | 1000-01-01 / 9999-12-31 | YYYY-MM-DD | 日期值 |
| TIME | 3 | '-838:59:59' / '838:59:59' | HH:MM:SS | 时间值或持续时间 |
| YEAR | 1 | 1901 / 2155 | YYYY | 年份值 |
| DATETIME | 8 | 1000-01-01 00:00:00 / 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
| TIMESTAMP | 4 | 1970-01-01 00:00:00 / 2038 年,结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038 年 1 月 19 日凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
3.2 创建表
语法如下:
CREATE TABLE [IF NOT EXISTS] 表名(
列名 数据类型 [约束],
列名 数据类型 [约束],
列名 数据类型 [约束] //最后一列的末尾不加逗号
)[CHARSET=utf8]; //可根据需要指定表的字符编码集关于约束后面会讲到,这里可以暂时不关注。
举例:创建学生表(student)。
| 列名 | 数据类型 | 说明 |
|---|---|---|
| id | INT | 编号 |
| name | VARCHAR(20) | 姓名 |
| age | INT | 年龄 |
| birthday | TIMESTAMP | 生日 |
| phonenum | CHAR(11) | 手机号 |
| address | VARCHAR(20) | 住址 |
CREATE TABLE student (
id INT,
name VARCHAR(20),
age INT,
birthday TIMESTAMP,
phonenum CHAR(11),
address VARCHAR(20)
);3.3 查看表
# 查看当前数据库中所有表名称
SHOW TABLES;
# 查看指定表的创建语句
SHOW CREATE TABLE 表名;
# 查看表结构
DESC 表名;3.4 修改表
# 添加列
ALTER TABLE 表名 ADD (
列名 列类型,
列名 列类型
)
# 修改列类型(如果被修改的列已存在数据,那么新的类型可能会影响到已存在数据),修改表中的某列时,也要写全列的名字、数据类型、约束
ALTER TABLE 表名 MODIFY 列名 列类型;
# 修改列名。在给定列新名称时,要指定列的类型和约束
ALTER TABLE 表名 CHANGE 原列名 新列名 列类型;
# 删除列。删除列时,每次只能删除一列
ALTER TABLE 表名 DROP 列名;
# 修改表名称
ALTER TABLE 原表名 RENAME TO 新表名;
ALTER TABLE 原表名 RENAME 新表名;3.5 删除表
DROP TABLE 表名;