SQL 建表语句详解

SQL 建表语句详解

在 SQL 中,创建表(Table)是数据库设计的基础。表是存储数据的基本单位,每个表由行和列组成。创建表的过程涉及到定义表的结构,包括列名、数据类型、约束等。本文将详细介绍 SQL 中的建表语句,并通过示例帮助读者更好地理解。

1. 基本语法

创建表的基本语法如下:

复制代码
CREATE TABLE table_name (
    column1 datatype constraint,
    column2 datatype constraint,
    column3 datatype constraint,
    ...
);
  • table_name:表的名称。
  • column1, column2, column3:列的名称。
  • datatype:列的数据类型。
  • constraint:列的约束条件。
2. 数据类型

SQL 支持多种数据类型,常见的有:

  • 整数类型INT, BIGINT, SMALLINT, TINYINT
  • 浮点数类型FLOAT, DOUBLE, DECIMAL(p, s)
  • 字符串类型CHAR(n), VARCHAR(n), TEXT
  • 日期和时间类型DATE, TIME, DATETIME, TIMESTAMP
  • 布尔类型BOOLEAN
3. 约束

约束用于保证数据的完整性和一致性,常见的约束有:

  • 主键约束PRIMARY KEY,唯一标识表中的每一行。
  • 唯一约束UNIQUE,确保列中的所有值都是唯一的。
  • 非空约束NOT NULL,确保列中的值不能为空。
  • 默认值约束DEFAULT,为列提供默认值。
  • 外键约束FOREIGN KEY,确保一个表中的数据与另一个表中的数据一致。
  • 检查约束CHECK,确保列中的值满足特定条件。
4. 示例

下面通过一个具体的示例来演示如何创建一个表。

假设我们要创建一个名为 students 的表,用于存储学生的信息,包括学号、姓名、性别、出生日期和班级。

复制代码
CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender CHAR(1) CHECK (gender IN ('M', 'F')),
    birth_date DATE,
    class_id INT,
    FOREIGN KEY (class_id) REFERENCES classes(class_id)
);

在这个示例中:

  • student_id 是主键,唯一标识每个学生。
  • name 是学生的姓名,不能为空。
  • gender 是学生的性别,只能是 'M' 或 'F'。
  • birth_date 是学生的出生日期。
  • class_id 是学生所在的班级,是一个外键,引用 classes 表中的 class_id
5. 创建带有默认值的表

有时候我们需要为某些列设置默认值,例如学生的入学日期。

复制代码
CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender CHAR(1) CHECK (gender IN ('M', 'F')),
    birth_date DATE,
    class_id INT,
    enrollment_date DATE DEFAULT CURRENT_DATE,
    FOREIGN KEY (class_id) REFERENCES classes(class_id)
);

在这个示例中,enrollment_date 列的默认值是当前日期。

6. 创建带有复合主键的表

有时候我们需要使用多个列作为主键,例如订单表中的订单号和产品号。

复制代码
CREATE TABLE order_details (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id),
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

在这个示例中,order_idproduct_id 共同组成主键。

7. 创建带有检查约束的表

检查约束用于确保列中的值满足特定条件,例如学生的年龄必须在 18 到 30 岁之间。

复制代码
CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender CHAR(1) CHECK (gender IN ('M', 'F')),
    birth_date DATE,
    class_id INT,
    enrollment_date DATE DEFAULT CURRENT_DATE,
    age INT CHECK (age >= 18 AND age <= 30),
    FOREIGN KEY (class_id) REFERENCES classes(class_id)
);

在这个示例中,age 列的值必须在 18 到 30 岁之间。

8. 创建带有唯一约束的表

唯一约束用于确保列中的所有值都是唯一的,例如学生的邮箱地址。

复制代码
CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender CHAR(1) CHECK (gender IN ('M', 'F')),
    birth_date DATE,
    class_id INT,
    enrollment_date DATE DEFAULT CURRENT_DATE,
    email VARCHAR(100) UNIQUE,
    FOREIGN KEY (class_id) REFERENCES classes(class_id)
);

在这个示例中,email 列的值必须是唯一的。

9. 创建带有自增列的表

自增列用于自动生成唯一的标识符,例如学生的学号。

复制代码
CREATE TABLE students (
    student_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender CHAR(1) CHECK (gender IN ('M', 'F')),
    birth_date DATE,
    class_id INT,
    enrollment_date DATE DEFAULT CURRENT_DATE,
    FOREIGN KEY (class_id) REFERENCES classes(class_id)
);

在这个示例中,student_id 列是自增列,每次插入新记录时会自动生成一个唯一的学号。

10. 创建带有注释的表

注释用于为表和列提供说明,便于理解和维护。

复制代码
CREATE TABLE students (
    student_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '学生的唯一标识',
    name VARCHAR(50) NOT NULL COMMENT '学生的姓名',
    gender CHAR(1) CHECK (gender IN ('M', 'F')) COMMENT '学生的性别',
    birth_date DATE COMMENT '学生的出生日期',
    class_id INT COMMENT '学生所在的班级',
    enrollment_date DATE DEFAULT CURRENT_DATE COMMENT '学生的入学日期',
    FOREIGN KEY (class_id) REFERENCES classes(class_id)
) COMMENT='学生信息表';

在这个示例中,为表和列添加了注释,便于理解其含义。

总结

通过本文的讲解,我们详细介绍了 SQL 中的建表语句,包括基本语法、数据类型、约束、示例等内容。希望读者能够通过这些内容更好地理解和掌握 SQL 建表语句的使用方法。在实际应用中,根据具体需求选择合适的数据类型和约束,可以有效地保证数据的完整性和一致性。

相关推荐
小荷才露尖尖角,早有蜻蜓立上头24 分钟前
过滤器的4种创建方式
java
大圣编蚕34 分钟前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
程序员阿明1 小时前
idea把插件啥的不默认放在C盘
java·ide·intellij-idea
斑马1391 小时前
Linux软件编程学习笔记(十三)——数据库
数据库·oracle
初願致夕霞1 小时前
MySQL_索引
数据库·mysql
linweidong1 小时前
中科闻歌Java面试题及参考答案
java·python·大模型·提示词·ai agent·mcp·rag原理
OpenAnolis小助手2 小时前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
十六年开源服务商2 小时前
2026网站备份方案完整指南
数据库·oracle
ForteScarlet2 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
萧瑟余晖2 小时前
Java深入解析篇六十二之安全机制详解
java·开发语言