SQL 数据类型详解及应用(七)

在数据库开发中,正确选择和使用数据类型对于确保数据的准确性和性能至关重要。本文将详细介绍 SQL 中常见的数据类型,并探讨不同数据库系统(如 Microsoft Access、MySQL 和 SQL Server)中的具体实现。此外,我们还将介绍 SQL 中的聚合函数和标量函数,帮助你在实际项目中更好地利用这些工具。

SQL 数据类型概览

SQL 数据类型用于定义表中列可以存储的数据种类。每个列在创建时都需要指定一个名称和数据类型。数据类型不仅决定了列可以存储的数据种类,还影响了 SQL 如何与这些数据进行交互。

常见的 SQL 数据类型

以下是一些常见的 SQL 数据类型及其用途:

  • CHAR(n):固定长度的字符串,长度为 n。
  • VARCHAR(n):可变长度的字符串,最大长度为 n。
  • BINARY(n):固定长度的二进制字符串,长度为 n。
  • BOOLEAN:存储布尔值,即 TRUE 或 FALSE。
  • VARBINARY(n):可变长度的二进制字符串,最大长度为 n。
  • INTEGER(p):整数值,精度为 p。
  • SMALLINT:整数值,精度为 5。
  • INTEGER:整数值,精度为 10。
  • BIGINT:整数值,精度为 19。
  • DECIMAL(p, s):精确数值,精度为 p,小数点后位数为 s。
  • NUMERIC(p, s):与 DECIMAL 相同,精确数值。
  • FLOAT(p):近似数值,尾数精度为 p。
  • REAL:近似数值,尾数精度为 7。
  • DOUBLE PRECISION:近似数值,尾数精度为 16。
  • DATE:存储年、月、日的值。
  • TIME:存储小时、分、秒的值。
  • TIMESTAMP:存储年、月、日、小时、分、秒的值。
  • INTERVAL:表示一段时间,由多个整数字段组成。
  • ARRAY:固定长度的有序元素集合。
  • MULTISET:可变长度的无序元素集合。
  • XML:存储 XML 数据。

不同数据库系统中的数据类型

虽然 SQL 标准定义了一些通用的数据类型,但不同的数据库系统可能会有不同的实现。以下是一些常见数据库系统中的数据类型对比:

Microsoft Access 数据类型

数据类型描述存储
Text用于文本或文本与数字的组合,最多 255 个字符。
Memo用于更大数量的文本,最多存储 65,536 个字符。无法排序,但可搜索。
Byte允许 0 到 255 的数字。1 字节
Integer允许 -32,768 到 32,767 的数字。2 字节
Long允许 -2,147,483,648 到 2,147,483,647 的数字。4 字节
Single单精度浮点数。4 字节
Double双精度浮点数。8 字节
Currency用于货币,支持 15 位整数和 4 位小数。8 字节
AutoNumber自动为每条记录分配数字,通常从 1 开始。4 字节
Date/Time用于日期和时间。8 字节
Yes/No逻辑字段,显示为 Yes/No、True/False 或 On/Off。1 比特
OLE Object存储图片、音频、视频等二进制大对象。最多 1GB
Hyperlink包含指向其他文件的链接。
Lookup Wizard创建下拉列表选项。4 字节

MySQL 数据类型

文本类型

数据类型描述
CHAR(size)固定长度的字符串,最多 255 个字符。
VARCHAR(size)可变长度的字符串,最多 255 个字符。超过 255 个字符时转换为 TEXT。
TINYTEXT最大长度为 255 个字符的字符串。
TEXT最大长度为 65,535 个字符的字符串。
BLOB用于二进制大对象,最多 65,535 字节。
MEDIUMTEXT最大长度为 16,777,215 个字符的字符串。
MEDIUMBLOB用于二进制大对象,最多 16,777,215 字节。
LONGTEXT最大长度为 4,294,967,295 个字符的字符串。
LONGBLOB用于二进制大对象,最多 4,294,967,295 字节。
ENUM(x, y, z, etc.)允许输入预定义的值列表,最多 65535 个值。
SET允许输入预定义的值列表,最多 64 个值,可存储多个选择。

数字类型

数据类型描述
TINYINT(size)带符号范围 -128 到 127,无符号范围 0 到 255。
SMALLINT(size)带符号范围 -32768 到 32767,无符号范围 0 到 65535。
MEDIUMINT(size)带符号范围 -8388608 到 8388607,无符号范围 0 到 16777215。
INT(size)带符号范围 -2147483648 到 2147483647,无符号范围 0 到 4294967295。
BIGINT(size)带符号范围 -9223372036854775808 到 9223372036854775807,无符号范围 0 到 18446744073709551615。
FLOAT(size, d)浮点数,最大位数为 size,小数点后最大位数为 d。
DOUBLE(size, d)双精度浮点数,最大位数为 size,小数点后最大位数为 d。
DECIMAL(size, d)固定精度的数值,最大位数为 size,小数点后最大位数为 d。

日期类型

数据类型描述
DATE日期,格式为 YYYY-MM-DD。支持范围从 '1000-01-01' 到 '9999-12-31'。
DATETIME日期和时间的组合,格式为 YYYY-MM-DD HH:MM:SS。支持范围从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。

| TIMESTAMP | 时间戳,格式为 YYYY-MM-DD HH:MM:SS。支持范围从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC。 | | TIME | 时间,格式为 HH:MM:SS。支持范围从 '-838:59:59' 到 '838:59:59'。 | | YEAR | 年份,2 位或 4 位格式。4 位格式支持 1901 到 2155,2 位格式支持 70 到 69(表示 1970 到 2069)。 |

SQL Server 数据类型

字符串类型

数据类型描述存储
char(n)固定长度的字符串,最多 8,000 个字符。定义的宽度
varchar(n)可变长度的字符串,最多 8,000 个字符。2 字节 + 字符数
varchar(max)可变长度的字符串,最多 1,073,741,824 个字符。2 字节 + 字符数
text可变长度的字符串,最多 2GB 文本数据。4 字节 + 字符数
nchar固定长度的 Unicode 字符串,最多 4,000 个字符。定义的宽度 x 2
nvarchar可变长度的 Unicode 字符串,最多 4,000 个字符。2 字节 + 字符数
nvarchar(max)可变长度的 Unicode 字符串,最多 536,870,912 个字符。2 字节 + 字符数
ntext可变长度的 Unicode 字符串,最多 2GB 文本数据。4 字节 + 字符数
bit允许 0、1 或 NULL。1 比特
binary(n)固定长度的二进制字符串,最多 8,000 字节。
varbinary(n)可变长度的二进制字符串,最多 8,000 字节。
varbinary(max)可变长度的二进制字符串,最多 2GB。
image可变长度的二进制字符串,最多 2GB。

数字类型

数据类型描述存储
tinyint允许 0 到 255 的数字。1 字节
smallint允许 -32,768 到 32,767 的数字。2 字节
int允许 -2,147,483,648 到 2,147,483,647 的数字。4 字节
bigint允许 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 的数字。8 字节
decimal(p, s)固定精度和比例的数字,最大位数为 p,小数点后最大位数为 s。5-17 字节
numeric(p, s)与 decimal 相同,固定精度和比例的数字。5-17 字节
smallmoney介于 -214,748.3648 到 214,748.3647 之间的货币数据。4 字节
money介于 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 之间的货币数据。8 字节
float(n)浮点数,n 参数指示 4 字节或 8 字节。4 或 8 字节
real浮点数,范围从 -3.40E + 38 到 3.40E + 38。4 字节

日期类型

数据类型描述存储
datetime从 1753 年 1 月 1 日到 9999 年 12 月 31 日,精度为 3.33 毫秒。8 字节
datetime2从 1753 年 1 月 1 日到 9999 年 12 月 31 日,精度为 100 纳秒。6-8 字节
smalldatetime从 1900 年 1 月 1 日到 2079 年 6 月 6 日,精度为 1 分钟。4 字节
date仅存储日期,从 0001 年 1 月 1 日到 9999 年 12 月 31 日。3 字节
time仅存储时间,精度为 100 纳秒。3-5 字节
datetimeoffset与 datetime2 相同,外加时区偏移。8-10 字节
timestamp存储唯一的数字,每当创建或修改某行时更新。8 字节

其他数据类型

数据类型描述
sql_variant存储最多 8,000 字节的不同数据类型的数据,除 text、ntext 和 timestamp。
uniqueidentifier存储全局唯一标识符 (GUID)。
xml存储 XML 格式的数据,最多 2GB。
cursor存储对数据库操作指针的引用。
table存储结果集,供稍后处理。

SQL 聚合函数

SQL 聚合函数用于对列中的值进行计算,返回一个单一的值。以下是一些常用的聚合函数:

  • AVG():返回平均值。
  • COUNT():返回行数。
  • FIRST():返回第一个记录的值。
  • LAST():返回最后一个记录的值。
  • MAX():返回最大值。
  • MIN():返回最小值。
  • SUM():返回总和。

AVG() 函数示例

假设我们有一个 orders 表,其中包含 order_id 和 amount 列。我们可以使用 AVG() 函数计算订单金额的平均值:

SELECT AVG(amount) AS average_amount
FROM orders;

SQL 标量函数

SQL 标量函数基于输入值返回一个单一的值。以下是一些常用的标量函数:

  • UPPER():将字符串转换为大写。
  • LOWER():将字符串转换为小写。
  • LEN():返回字符串的长度。
  • SUBSTRING():提取字符串的一部分。
  • ROUND():四舍五入数值。
  • CONVERT():将数据类型转换为另一种类型。

示例

假设我们有一个 employees 表,其中包含 first_name 和 last_name 列。我们可以使用 UPPER() 函数将员工的名字转换为大写:


SELECT UPPER(first_name) AS first_name_upper, last_name
FROM employees;

总结

正确选择和使用数据类型是数据库设计的重要环节。不同的数据库系统提供了丰富的数据类型选择,开发者需要根据具体需求选择合适的数据类型。此外,SQL 提供了多种聚合函数和标量函数,帮助我们在查询中进行复杂的计算和数据处理。希望本文能为你在数据库开发中提供有价值的参考。