1、SQL 表的创建
在SQL中,创建表的基本语法是使用CREATE TABLE
语句。以下是一个基本的CREATE TABLE
语法模板,以及对其各个部分的解释:
sql
CREATE TABLE 表名 (
列名1 数据类型 [约束条件] [默认值],
列名2 数据类型 [约束条件] [默认值],
...
[表级约束条件]
);
CREATE TABLE
:这是创建表的关键字。表名
:这是你为新表指定的名称。在SQL中,表名通常是唯一的,并且遵循数据库的命名规则(例如,只能使用字母、数字和下划线,且不能以数字开头)。列名
:这是表中每一列的名称。列名也是唯一的(在同一表中),并且遵循与表名相同的命名规则。数据类型
:这指定了列中数据的类型。常见的数据类型包括整数(INT
)、浮点数(FLOAT
、DOUBLE
)、字符串(CHAR
、VARCHAR
)、日期和时间(DATE
、TIME
、DATETIME
)等。[约束条件]
:这是可选的,用于指定列的约束条件,如主键(PRIMARY KEY
)、唯一键(UNIQUE
)、非空(NOT NULL
)、默认值(DEFAULT
)、自动递增(AUTO_INCREMENT
,在MySQL中)等。[默认值]
:这也是可选的,用于指定列的默认值。当插入新行但未为该列提供值时,将使用默认值。[表级约束条件]
:这是可选的,用于指定表的约束条件,如外键(FOREIGN KEY
)约束,这些约束不能直接在列定义中指定,而需要在表级定义。
以下是一个具体的例子,展示了如何创建一个名为Students
的表,其中包含学生的ID、姓名、年龄和入学日期:
sql
CREATE TABLE Students (
StudentID INT AUTO_INCREMENT PRIMARY KEY, -- 学生ID,主键,自动递增
FirstName VARCHAR(50) NOT NULL, -- 名字,非空
LastName VARCHAR(50) NOT NULL, -- 姓氏,非空
Age INT, -- 年龄
EnrollmentDate DATE -- 入学日期
);
在这个例子中:
StudentID
列是一个整数类型,被指定为主键(PRIMARY KEY
),并且设置为自动递增(AUTO_INCREMENT
)。这意味着每当向表中插入新行时,StudentID
将自动增加,无需手动指定。FirstName
和LastName
列是字符串类型(VARCHAR
),最大长度为50个字符,并且被指定为非空(NOT NULL
)。这意味着在插入新行时,必须为这两个列提供值。Age
列是一个整数类型,没有约束条件。EnrollmentDate
列是一个日期类型(DATE
),用于存储学生的入学日期。
请注意,不同的数据库系统(如MySQL、PostgreSQL、SQL Server等)可能在语法和功能上略有不同。例如,AUTO_INCREMENT
是MySQL特有的,而在其他数据库系统中可能使用不同的语法来实现自动递增功能。因此,在创建表时,请务必参考你所使用的数据库系统的文档。
展示了如何创建一个简单的SQL表。这个示例表名为Employees
,用于存储员工的基本信息。
sql
-- 创建 Employees 表
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY AUTO_INCREMENT, -- 员工ID,主键,自动递增
FirstName VARCHAR(50) NOT NULL, -- 名字,非空
LastName VARCHAR(50) NOT NULL, -- 姓氏,非空
BirthDate DATE, -- 出生日期
HireDate DATE, -- 入职日期
Position VARCHAR(100), -- 职位
Salary DECIMAL(10, 2), -- 薪水,最多10位数字,2位小数
DepartmentID INT, -- 部门ID,外键
FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID) -- 外键约束,引用 Departments 表中的 DepartmentID
);
-- 假设还有一个 Departments 表,用于存储部门信息
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY AUTO_INCREMENT, -- 部门ID,主键,自动递增
DepartmentName VARCHAR(100) NOT NULL -- 部门名称,非空
);
1.1、解释
-
Employees 表
EmployeeID
: 整数类型,作为主键,并且设置为自动递增。这意味着每当你插入一条新记录时,EmployeeID
会自动赋予一个新的唯一值。FirstName
: 可变字符类型,最大长度为50个字符,不能为空。LastName
: 可变字符类型,最大长度为50个字符,不能为空。BirthDate
: 日期类型,用于存储员工的出生日期。HireDate
: 日期类型,用于存储员工的入职日期。Position
: 可变字符类型,最大长度为100个字符,用于存储员工的职位。Salary
: 十进制类型,总共最多10位数字,其中2位是小数位,用于存储员工的薪水。DepartmentID
: 整数类型,作为外键,引用Departments
表中的DepartmentID
。
-
Departments 表
DepartmentID
: 整数类型,作为主键,并且设置为自动递增。DepartmentName
: 可变字符类型,最大长度为100个字符,不能为空,用于存储部门名称。
1.2、外键约束
在 Employees
表中,DepartmentID
字段被设置为外键,它引用 Departments
表中的 DepartmentID
。这确保了 Employees
表中的 DepartmentID
必须是 Departments
表中已经存在的 DepartmentID
。
注意
- 在实际应用中,你可能需要添加更多的字段、索引、约束或其他表关系来满足业务需求。
- 在某些数据库管理系统(DBMS)中,语法可能会有细微的差别,比如
AUTO_INCREMENT
在 MySQL 中使用,而在 SQL Server 中则使用IDENTITY
。
当然可以,以下是一些具体的SQL表创建案例,涵盖了不同的场景和数据类型。
案例一:用户表(Users)
这是一个简单的用户表,包含用户ID、用户名、电子邮件、密码和创建时间等字段。
sql
CREATE TABLE Users (
UserID INT PRIMARY KEY, -- 用户ID,主键
Username VARCHAR(50) NOT NULL, -- 用户名,非空
Email VARCHAR(100) UNIQUE, -- 电子邮件,唯一
Password VARCHAR(255) NOT NULL, -- 密码,非空
CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP -- 创建时间,默认值为当前时间戳
);
案例二:订单表(Orders)与产品表(Products)
假设我们有一个产品表(Products),我们需要创建一个订单表(Orders)来存储订单信息,并包含与产品表相关联的外键。
产品表(Products)
sql
CREATE TABLE Products (
ProductID INT PRIMARY KEY, -- 产品ID,主键
ProductName VARCHAR(100), -- 产品名称
Price DECIMAL(10, 2) -- 价格,最多10位数字,2位小数
);
订单表(Orders)
sql
CREATE TABLE Orders (
OrderID INT PRIMARY KEY, -- 订单ID,主键
ProductID INT, -- 产品ID,外键
OrderDate DATE, -- 订单日期
Quantity INT, -- 数量
FOREIGN KEY (ProductID) REFERENCES Products(ProductID) -- 外键约束,引用 Products 表中的 ProductID
);
```### 案例三:文章表(Articles)
这是一个文章表,包含文章ID、标题、内容和发布状态等字段。文章ID是自动递增的主键。
```sql
CREATE TABLE Articles (
ArticleID INT AUTO_INCREMENT PRIMARY KEY, -- 文章ID,主键,自动递增
Title VARCHAR(255) NOT NULL, -- 标题,非空
Content TEXT, -- 内容
Published BOOLEAN DEFAULT FALSE -- 发布状态,默认为未发布
);
案例四:调查表(Surveys)与档案表(Profiles)
这两个表展示了如何使用枚举(ENUM)类型和集合(SET)类型来限制列的值。
调查表(Surveys)
sql
CREATE TABLE Surveys (
SurveyID INT AUTO_INCREMENT PRIMARY KEY, -- 调查ID,主键,自动递增
Question VARCHAR(255), -- 问题
Answer ENUM('Yes', 'No', 'Maybe') -- 答案,只能是 'Yes'、'No' 或 'Maybe' 中的一个
);
档案表(Profiles)
sql
CREATE TABLE Profiles (
ProfileID INT AUTO_INCREMENT PRIMARY KEY, -- 档案ID,主键,自动递增
Hobbies SET('Reading', 'Swimming', 'Hiking', 'Gaming') -- 爱好,可以是 'Reading'、'Swimming'、'Hiking' 和 'Gaming' 中的零个或多个值(以逗号分隔)
);
案例五:部门表(Departments)与员工表(Employees)
假设我们需要创建一个公司数据库,其中包含部门表和员工表。员工表将包含部门ID作为外键。
部门表(Departments)
sql
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY AUTO_INCREMENT, -- 部门ID,主键,自动递增
DepartmentName VARCHAR(100) NOT NULL -- 部门名称,非空
);
员工表(Employees,与前面案例略有不同,为了展示更多字段和约束)
sql
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY AUTO_INCREMENT, -- 员工ID,主键,自动递增
FirstName VARCHAR(50) NOT NULL, -- 名字,非空
LastName VARCHAR(50) NOT NULL, -- 姓氏,非空
BirthDate DATE, -- 出生日期
HireDate DATE NOT NULL, -- 入职日期,非空
Position VARCHAR(100), -- 职位
Salary DECIMAL(10, 2), -- 薪水,最多10位数字,2位小数
DepartmentID INT, -- 部门ID,外键
Email VARCHAR(100) UNIQUE, -- 电子邮件,唯一
Phone VARCHAR(20), -- 电话号码
FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID) -- 外键约束,引用 Departments 表中的 DepartmentID
);
这些案例展示了如何使用SQL语句创建不同类型的表,并定义了各种字段、数据类型和约束。你可以根据实际需求进行修改和扩展。