目录
MySQL 数据类型
数值类型
| 类型 | 字节 | 取值范围 | 推荐使用场景 |
|---|---|---|---|
| TINYINT | 1 | -128 0 | 年龄、状态码、小范围枚举 |
| SMALLINT | 2 | -32768 0 | 年份、数量统计 |
| MEDIUMINT | 3 | -8388608 0 | 中等规模自增ID |
| INT / INTEGER | 4 | -2147483648 0 | 常规自增ID、数量、价格(分) |
| BIGINT | 8 | ±9.22×10^18 | 大数据量ID、金额(分)、时间戳 |
| FLOAT | 4 | 单精度浮点 | 不推荐用于精确计算 |
| DOUBLE | 8 | 双精度浮点 | 科学计算、统计数据 |
| DECIMAL(M,D) | 变长 | 精确小数 | 金额、百分比(推荐) |
字符串类型
| 类型 | 最大长度 | 存储方式 | 推荐使用场景 |
|---|---|---|---|
| CHAR(M) | 255 字符 | 定长,空格填充 | 固定长度:MD5、UUID、状态码 |
| VARCHAR(M) | 65535 字节 | 变长,前缀长度 | 姓名、标题、地址、URL |
| TINYTEXT | 255 字节 | 变长 | 短文本、备注 |
| TEXT | 65535 字节 (64KB) | 变长 | 文章摘要、描述 |
| MEDIUMTEXT | 16777215 字节 (16MB) | 变长 | 长文章、详情 |
| LONGTEXT | 4294967295 字节 (4GB) | 变长 | 超长内容、日志 |
| ENUM | 65535 个值 | 整数存储 | 性别、状态等固定选项 |
| SET | 64 个成员 | 位图存储 | 多选标签、权限组合 |
日期时间类型
| 类型 | 范围 | 格式 | 推荐使用场景 |
|---|---|---|---|
| DATE | 1000-01-01 ~ 9999-12-31 | YYYY-MM-DD | 生日、纪念日 |
| TIME | -838:59:59 ~ 838:59:59 | HH:MM:SS | 营业时间、时长 |
| YEAR | 1901 ~ 2155 | YYYY | 年份统计 |
| DATETIME | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 创建时间、更新时间 |
| TIMESTAMP | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 自动更新的时间戳 |
二进制类型
| 类型 | 最大长度 | 推荐使用场景 |
|---|---|---|
| BINARY(M) | 255 字节 | 固定长度二进制哈希值 |
| VARBINARY(M) | 65535 字节 | 变长二进制数据、加密数据 |
| TINYBLOB | 255 字节 | 小图标、缩略图 |
| BLOB | 65535 字节 | 小文件、图片 |
| MEDIUMBLOB | 16MB | 中等文件 |
| LONGBLOB | 4GB | 大文件(不推荐存数据库) |
特殊类型
| 类型 | 说明 | 推荐使用场景 |
|---|---|---|
| JSON | 5.7+ 支持 | 存储 JSON 格式数据、配置、动态字段 |
| GEOMETRY | 空间数据 | 地理位置、坐标 |
| POINT | 点坐标 | 经纬度 |
PostgreSQL 数据类型
数值类型
| 类型 | 字节 | 取值范围 | 推荐使用场景 |
|---|---|---|---|
| SMALLINT | 2 | -32768~32767 | 小范围整数 |
| INTEGER | 4 | -2147483648~2147483647 | 常规整数、ID |
| BIGINT | 8 | ±9.22×10^18 | 大数值、时间戳 |
| SERIAL | 4 | 自增整数 | 自增主键 |
| BIGSERIAL | 8 | 自增大整数 | 大表自增主键 |
| REAL | 4 | 单精度 | 浮点计算 |
| DOUBLE PRECISION | 8 | 双精度 | 高精度浮点 |
| NUMERIC(P,S) | 变长 | 任意精度 | 金额、精确计算 |
| MONEY | 8 | 货币 | 货币金额(不推荐) |
字符串类型
| 类型 | 最大长度 | 说明 | 推荐使用场景 |
|---|---|---|---|
| CHAR(N) | 1GB | 定长,空格填充 | 固定长度字符串 |
| VARCHAR(N) | 1GB | 变长 | 通用字符串(推荐) |
| TEXT | 1GB | 变长,无长度限制 | 长文本、文章内容 |
| CITEXT | 1GB | 不区分大小写的文本 | 邮箱、用户名 |
日期时间类型
| 类型 | 范围 | 精度 | 推荐使用场景 |
|---|---|---|---|
| DATE | 4713 BC ~ 5874897 AD | 日 | 日期 |
| TIME | 00:00:00 ~ 24:00:00 | 微秒 | 时间 |
| TIMESTAMP | 4713 BC ~ 294276 AD | 微秒 | 时间戳(无时区) |
| TIMESTAMPTZ | 4713 BC ~ 294276 AD | 微秒 | 时间戳(带时区)(推荐) |
| INTERVAL | -178000000 年 ~ 178000000 年 | 微秒 | 时间间隔 |
布尔类型
| 类型 | 值 | 推荐使用场景 |
|---|---|---|
| BOOLEAN | TRUE / FALSE / NULL | 开关、标志位 |
特殊类型
| 类型 | 说明 | 推荐使用场景 |
|---|---|---|
| UUID | 128位唯一标识符 | 分布式系统ID |
| JSON | JSON 数据 | JSON 存储(性能较低) |
| JSONB | 二进制 JSON | 推荐的 JSON 存储 |
| ARRAY | 数组类型 | 标签列表、多值字段 |
| HSTORE | 键值对 | 动态属性、配置 |
| INET | IP 地址 | IPv4/IPv6 地址 |
| CIDR | 网络地址 | 网段 |
| MACADDR | MAC 地址 | 硬件地址 |
| XML | XML 数据 | XML 文档存储 |
几何类型
| 类型 | 说明 | 推荐使用场景 |
|---|---|---|
| POINT | 点 | 坐标 |
| LINE | 线 | 路径 |
| POLYGON | 多边形 | 区域范围 |
| GEOMETRY | PostGIS 扩展 | 地理信息系统 |
SQL Server 数据类型
数值类型
| 类型 | 字节 | 取值范围 | 推荐使用场景 |
|---|---|---|---|
| BIT | 1 bit | 0 或 1 | 布尔值、标志位 |
| TINYINT | 1 | 0~255 | 小整数 |
| SMALLINT | 2 | -32768~32767 | 中等整数 |
| INT | 4 | ±21亿 | 常规整数 |
| BIGINT | 8 | ±922亿亿 | 大整数 |
| DECIMAL(P,S) | 5-17 | 精确数值 | 金额(推荐) |
| NUMERIC(P,S) | 5-17 | 同 DECIMAL | 精确数值 |
| MONEY | 8 | ±922万亿 | 货币(4位小数) |
| SMALLMONEY | 4 | ±21万 | 小额货币 |
| FLOAT(N) | 4/8 | 浮点数 | 科学计算 |
| REAL | 4 | 单精度浮点 | 浮点计算 |
字符串类型
| 类型 | 最大长度 | 编码 | 推荐使用场景 |
|---|---|---|---|
| CHAR(N) | 8000 | ASCII | 定长字符串 |
| VARCHAR(N) | 8000 | ASCII | 变长字符串 |
| VARCHAR(MAX) | 2GB | ASCII | 长文本 |
| NCHAR(N) | 4000 | Unicode | 定长国际化字符串 |
| NVARCHAR(N) | 4000 | Unicode | 推荐国际化字符串 |
| NVARCHAR(MAX) | 2GB | Unicode | 长国际化文本 |
| TEXT | 2GB | ASCII | 长文本(已弃用) |
| NTEXT | 2GB | Unicode | Unicode长文本(已弃用) |
日期时间类型
| 类型 | 范围 | 精度 | 推荐使用场景 |
|---|---|---|---|
| DATE | 0001-01-01 ~ 9999-12-31 | 日 | 日期 |
| TIME | 00:00:00 ~ 23:59:59.9999999 | 100纳秒 | 时间 |
| DATETIME | 1753-01-01 ~ 9999-12-31 | 3.33毫秒 | 旧版时间戳 |
| DATETIME2 | 0001-01-01 ~ 9999-12-31 | 100纳秒 | 推荐时间戳 |
| SMALLDATETIME | 1900-01-01 ~ 2079-06-06 | 1分钟 | 粗略时间 |
| DATETIMEOFFSET | 0001-01-01 ~ 9999-12-31 | 100纳秒 | 带时区时间戳 |
二进制类型
| 类型 | 最大长度 | 推荐使用场景 |
|---|---|---|
| BINARY(N) | 8000 | 定长二进制 |
| VARBINARY(N) | 8000 | 变长二进制 |
| VARBINARY(MAX) | 2GB | 大二进制数据 |
| IMAGE | 2GB | 图片(已弃用) |
特殊类型
| 类型 | 说明 | 推荐使用场景 |
|---|---|---|
| UNIQUEIDENTIFIER | GUID | 全局唯一标识符 |
| XML | XML 数据 | XML 文档 |
| SPATIAL TYPES | 空间数据 | 地理位置 |
| HIERARCHYID | 层次结构 | 组织结构树 |
通用 SQL 关键字
数据定义语言 (DDL)
| 关键字 | 含义 | 使用场景 | 示例 |
|---|---|---|---|
| CREATE | 创建 | 创建数据库、表、索引、视图等 | CREATE TABLE users (...) |
| ALTER | 修改 | 修改表结构、添加/删除列 | ALTER TABLE users ADD age INT |
| DROP | 删除 | 删除数据库、表、索引等 | DROP TABLE users |
| TRUNCATE | 清空 | 快速清空表数据(不可回滚) | TRUNCATE TABLE logs |
| RENAME | 重命名 | 重命名表或列 | RENAME TABLE old TO new |
数据操作语言 (DML)
| 关键字 | 含义 | 使用场景 | 示例 |
|---|---|---|---|
| SELECT | 查询 | 查询数据 | SELECT * FROM users |
| INSERT | 插入 | 插入新数据 | INSERT INTO users VALUES (...) |
| UPDATE | 更新 | 修改已有数据 | UPDATE users SET age=18 |
| DELETE | 删除 | 删除数据行 | DELETE FROM users WHERE id=1 |
| MERGE | 合并 | 根据条件插入或更新 | MERGE INTO ... USING ... ON ... |
数据查询语言 (DQL)
| 关键字 | 含义 | 使用场景 | 示例 |
|---|---|---|---|
| FROM | 来源 | 指定查询的表 | FROM users |
| WHERE | 条件 | 过滤行 | WHERE age > 18 |
| GROUP BY | 分组 | 按列分组聚合 | GROUP BY city |
| HAVING | 分组条件 | 过滤分组后的结果 | HAVING COUNT(*) > 10 |
| ORDER BY | 排序 | 结果排序 | ORDER BY age DESC |
| LIMIT | 限制 | 限制返回行数(MySQL/PostgreSQL) | LIMIT 10 |
| OFFSET | 偏移 | 跳过指定行数 | OFFSET 20 |
| TOP | 限制 | 限制返回行数(SQL Server) | TOP 10 |
连接与集合
| 关键字 | 含义 | 使用场景 | 示例 |
|---|---|---|---|
| JOIN | 连接 | 连接多张表 | INNER JOIN orders ON ... |
| INNER JOIN | 内连接 | 返回匹配的行 | INNER JOIN |
| LEFT JOIN | 左连接 | 返回左表所有行 | LEFT JOIN orders ON ... |
| RIGHT JOIN | 右连接 | 返回右表所有行 | RIGHT JOIN |
| FULL JOIN | 全连接 | 返回两表所有行 | FULL OUTER JOIN |
| CROSS JOIN | 笛卡尔积 | 返回所有组合 | CROSS JOIN |
| UNION | 并集 | 合并结果(去重) | SELECT ... UNION SELECT ... |
| UNION ALL | 并集 | 合并结果(保留重复) | UNION ALL |
| INTERSECT | 交集 | 两结果集的交集 | SELECT ... INTERSECT SELECT ... |
| EXCEPT | 差集 | 第一个结果集减去第二个 | SELECT ... EXCEPT SELECT ... |
约束关键字
| 关键字 | 含义 | 使用场景 | 示例 |
|---|---|---|---|
| PRIMARY KEY | 主键 | 唯一标识每行,不允许NULL | id INT PRIMARY KEY |
| FOREIGN KEY | 外键 | 引用另一表的主键 | FOREIGN KEY (user_id) REFERENCES users(id) |
| UNIQUE | 唯一 | 列值唯一(允许NULL) | email VARCHAR(100) UNIQUE |
| NOT NULL | 非空 | 列不允许NULL | name VARCHAR(50) NOT NULL |
| DEFAULT | 默认值 | 指定默认值 | status INT DEFAULT 1 |
| CHECK | 检查 | 自定义约束条件 | CHECK (age >= 0) |
| AUTO_INCREMENT | 自增 | 自动递增(MySQL) | id INT AUTO_INCREMENT |
| SERIAL | 自增 | 自动递增(PostgreSQL) | id SERIAL |
| IDENTITY | 自增 | 自动递增(SQL Server) | id INT IDENTITY(1,1) |
索引关键字
| 关键字 | 含义 | 使用场景 | 示例 |
|---|---|---|---|
| INDEX | 索引 | 创建普通索引 | CREATE INDEX idx_name ON users(name) |
| UNIQUE INDEX | 唯一索引 | 创建唯一索引 | CREATE UNIQUE INDEX |
| FULLTEXT | 全文索引 | 全文搜索 | FULLTEXT INDEX idx_content |
| SPATIAL | 空间索引 | 地理数据索引 | SPATIAL INDEX |
事务控制 (TCL)
| 关键字 | 含义 | 使用场景 | 示例 |
|---|---|---|---|
| BEGIN | 开始 | 开始事务 | BEGIN TRANSACTION |
| COMMIT | 提交 | 提交事务 | COMMIT |
| ROLLBACK | 回滚 | 撤销事务 | ROLLBACK |
| SAVEPOINT | 保存点 | 设置事务保存点 | SAVEPOINT sp1 |
权限控制 (DCL)
| 关键字 | 含义 | 使用场景 | 示例 |
|---|---|---|---|
| GRANT | 授权 | 授予用户权限 | GRANT SELECT ON users TO user1 |
| REVOKE | 撤销 | 撤销用户权限 | REVOKE SELECT ON users FROM user1 |
| DENY | 拒绝 | 明确拒绝权限(SQL Server) | DENY DELETE ON users TO user1 |
聚合函数
| 关键字 | 含义 | 使用场景 | 示例 |
|---|---|---|---|
| COUNT | 计数 | 统计行数 | COUNT(*) |
| SUM | 求和 | 计算总和 | SUM(price) |
| AVG | 平均 | 计算平均值 | AVG(age) |
| MAX | 最大 | 查找最大值 | MAX(score) |
| MIN | 最小 | 查找最小值 | MIN(price) |
| GROUP_CONCAT | 拼接 | 分组拼接字符串(MySQL) | GROUP_CONCAT(name) |
| STRING_AGG | 拼接 | 分组拼接字符串(PostgreSQL) | STRING_AGG(name, ',') |
条件与逻辑
| 关键字 | 含义 | 使用场景 | 示例 |
|---|---|---|---|
| AND | 与 | 多条件同时满足 | WHERE age > 18 AND status = 1 |
| OR | 或 | 多条件满足其一 | WHERE city = 'A' OR city = 'B' |
| NOT | 非 | 条件取反 | WHERE NOT status = 0 |
| IN | 包含 | 值在列表中 | WHERE id IN (1,2,3) |
| NOT IN | 不包含 | 值不在列表中 | WHERE id NOT IN (1,2,3) |
| BETWEEN | 区间 | 值在范围内 | WHERE age BETWEEN 18 AND 30 |
| LIKE | 模糊 | 字符串模糊匹配 | WHERE name LIKE '%张%' |
| IS NULL | 为空 | 判断NULL | WHERE email IS NULL |
| IS NOT NULL | 非空 | 判断非NULL | WHERE email IS NOT NULL |
| EXISTS | 存在 | 子查询有结果 | WHERE EXISTS (SELECT ...) |
| CASE | 条件 | 条件分支 | CASE WHEN ... THEN ... END |
| IF | 条件 | 条件判断(MySQL) | IF(status=1, 'active', 'inactive') |
| COALESCE | 非空 | 返回第一个非NULL值 | COALESCE(phone, email, 'N/A') |
| NULLIF | 空判断 | 相等时返回NULL | NULLIF(col1, col2) |
其他常用关键字
| 关键字 | 含义 | 使用场景 | 示例 |
|---|---|---|---|
| AS | 别名 | 列或表别名 | SELECT name AS username |
| DISTINCT | 去重 | 结果去重 | SELECT DISTINCT city FROM users |
| ALL | 全部 | 保留所有结果(默认) | SELECT ALL * FROM users |
| INTO | 插入到 | 结果插入新表 | SELECT * INTO new_table FROM old |
| VALUES | 值 | 插入的值 | INSERT INTO users VALUES (...) |
| SET | 设置 | 更新时赋值 | UPDATE users SET age=18 |
| ON | 条件 | JOIN条件 | ON users.id = orders.user_id |
| USING | 使用 | JOIN时使用相同列名 | JOIN orders USING(user_id) |
| WITH | 公用表表达式 | CTE查询 | WITH cte AS (...) SELECT ... |
| RECURSIVE | 递归 | 递归CTE | WITH RECURSIVE ... |
| EXPLAIN | 解释 | 查看执行计划 | EXPLAIN SELECT ... |
| DESCRIBE / DESC | 描述 | 查看表结构 | DESC users |
| SHOW | 显示 | 显示数据库信息 | SHOW TABLES |
| USE | 使用 | 切换数据库 | USE database_name |
最佳实践建议
数据类型选择原则
- 金额存储:使用
DECIMAL或NUMERIC,避免使用浮点数 - 时间戳:MySQL 使用
DATETIME,PostgreSQL 使用TIMESTAMPTZ - 布尔值:PostgreSQL 使用
BOOLEAN,MySQL 使用TINYINT(1) - JSON数据:PostgreSQL 优先用
JSONB,MySQL 5.7+ 用JSON - 字符串:根据实际长度选择,避免浪费空间
- 主键:优先使用
INT或BIGINT自增,分布式系统考虑UUID - 国际化:SQL Server 使用
NVARCHAR,其他数据库默认支持 UTF-8
性能优化提示
- 字符串类型长度适中,过长影响索引效率
- 避免使用
TEXT/BLOB类型建索引 - 合理使用
NOT NULL约束提升查询效率 - 时间字段建索引时注意精度
- 大文件不要直接存数据库,使用文件系统 + 路径存储