在SQL中创建数据库和表

创建数据库

你准备好开始用结构化查询语言创建数据库和表吗? 在本文中,我们将探索使用CREATE DATABASE和CREATE TABLE命令手动创建表过程 。 如果您不熟悉SQL,您可能希望先查看我们的SQL基础知识文章。

业务需求

在我们坐下键盘之前,我们需要确保我们对客户的要求有一个很好的理解。 获得这种见解的最佳方式是什么? 当然,与客户交谈! 在与XYZ的人力资源总监坐下后,我们了解到他们是一个小部件销售公司,主要负责跟踪销售人员的信息。

XYZ公司将其销售力量分为东部和西部地区,其中每个地区被划分为许多由个体销售代表覆盖的地区。 人力资源部门希望跟踪每个员工所覆盖的领域以及每个员工的薪资信息和监督结构。 为了满足这些要求,我们设计了一个由三个表组成的数据库,如本页上的实体关系图所示

选择数据库平台

我们决定使用基于结构化查询语言(SQL)构建的数据库管理系统 (或DBMS)。 因此,我们所有的数据库和表创建命令都应该使用标准的ANSI SQL来编写。

作为一个额外的好处,使用符合ANSI的SQL将确保这些命令可以在任何支持SQL标准的 DBMS(包括Oracle和Microsoft SQL Server)上运行。 如果您尚未为数据库选择平台,那么文章数据库软件选项将引导您完成选择过程。

创建数据库

我们的第一步是创建数据库本身。 许多数据库管理系统在这一步提供了一系列用于定制数据库参数的选项,但我们的数据库只允许简单地创建数据库。 与我们的所有命令一样,您可能希望查阅DBMS的文档以确定您的特定系统支持的任何高级参数是否满足您的需求。 我们使用CREATE DATABASE命令来设置我们的数据库:

创建数据库人员

请特别注意上面示例中使用的大小写。 SQL程序员通常使用所有大写字母作为SQL关键字,例如“CREATE”和“DATABASE”,同时使用用户定义名称(如“personnel”数据库名称)的全部小写字母。 这些约定提供了易读性。

在我们为数据库创建表格时继续阅读本教程。

学习更多

如果您想了解更多关于结构化查询语言的内容 ,请阅读SQL入门或注册我们的免费学习SQL电子邮件课程。

现在我们已经设计并创建了我们的数据库,现在我们准备开始创建用于存储XYZ公司人事数据的三张表。 我们将实现我们在本教程前面部分中设计的表格。

创建我们的第一个表

我们的第一张表格包含我们公司每位员工的个人数据。 我们需要包括每个员工的姓名,工资,ID和经理。 将最后名字和名字分隔成单独的字段以简化未来的数据搜索和排序是一种很好的设计实践。 另外,我们会通过在每个员工记录中插入对经理的员工ID的引用来跟踪每位员工的经理。 我们先看看所需的员工表。

ReportsTo属性存储每个员工的经理ID。 从显示的样本记录中,我们可以确定Sue Scampi是Tom Kendall和John Smith的经理。 但是,Sue经理的数据库中没有任何信息,如其行中的NULL条目所示

现在我们可以使用SQL在人员数据库中创建表。 在我们这样做之前,让我们通过发出USE命令来确保我们在正确的数据库中:

使用人员;

或者,“数据库人员” 命令将执行相同的功能。 现在我们可以看看用于创建员工表的SQL命令:

CREATE TABLE employees(employeeid INTEGER NOT NULL,lastname VARCHAR(25)NOT NULL,firstname VARCHAR(25)NOT NULL,reportsto INTEGER NULL);

与上面的例子一样,请注意,编程约定规定我们将所有大写字母用于SQL关键字,小写字母用于用户命名的列和表。 上面的命令起初可能看起来很混乱,但实际上它背后有一个简单的结构。 下面是一个可以清理一些事情的概括性视图:

CREATE TABLE table_name(attribute_name数据类型选项,...,attribute_name数据类型选项);

属性和数据类型

在前面的示例中,表名是员工,我们包含四个属性:employeeid,lastname,firstname和reportsto。 数据类型表示我们希望在每个字段中存储的信息的类型。 员工ID是一个简单的整数,因此我们将为employeeid字段和reportsto字段使用INTEGER数据类型。 员工姓名将是可变长度的字符串,我们不希望任何员工的姓名长于25个字符。 因此,我们将在这些字段中使用VARCHAR(25)类型。

NULL值

我们也可以在CREATE语句的options字段中指定NULL或NOT NULL 。 这只是告诉数据库在向数据库添加行时是否允许该属性使用NULL(或空)值。 在我们的示例中,人力资源部门要求为每个员工存储员工ID和完整姓名。 然而,并不是每个员工都有一位经理 - 首席执行官向任何人报告! - 所以我们在该字段中允许NULL条目。 请注意,NULL是默认值,省略此选项将隐式地允许属性的NULL值。

建立剩余表格

现在我们来看看地区表。 从快速浏览这些数据看来,我们需要存储一个整数和两个可变长度的字符串。 和我们前面的例子一样,我们不期望Region ID消耗超过25个字符。 但是,我们的一些地区名称较长,因此我们会将该属性的允许长度扩展为40个字符。 我们来看看相应的SQL:

CREATE TABLE territories(territoryid INTEGER NOT NULL,territory说明VARCHAR(40)NOT NULL,regionID VARCHAR(25)NOT NULL);

最后,我们将使用EmployeeTerritories表来存储员工和地区之间的关系。 每个员工和地区的详细信息都存储在我们之前的两个表格中。 因此,我们只需要在此表中存储两个整数标识号。 如果我们需要扩展这些信息,我们可以在我们的数据选择命令中使用JOIN从多个表中获取信息。 这种存储数据的方法减少了我们数据库中的冗余,并确保了我们存储驱动器上空间的最佳利用。 我们将在未来的教程中深入介绍JOIN命令。 以下是实现我们的最终表的SQL代码:

CREATE TABLE employeeterritories(employeeid INTEGER NOT NULL,territoryid INTEGER NOT NULL);

机制SQL提供了在创建后改变数据库的结构

如果您今天特别精明,您可能已经注意到我们在执行数据库表时“意外”遗漏了一项设计要求。 XYZ公司的人力资源总监要求数据库跟踪员工的薪资信息,而我们忽略了在我们创建的数据库表中提供这些信息。

但是,一切都不会丢失。 我们可以使用ALTER TABLE命令将这个属性添加到我们现有的数据库中。 我们希望将工资存储为整数值。 语法与CREATE TABLE命令非常相似,在这里是:

ALTER TABLE employees雇员ADD salary INTEGER NULL;

请注意,我们指定了该属性允许使用NULL值。 在大多数情况下,将列添加到现有表时没有选项。 这是由于该表已经包含没有该属性条目的行。 因此,DBMS自动插入一个NULL值来填补空缺。

这就包含了我们对SQL数据库和表创建过程的看法。 经常检查我们的SQL教程系列中的新分期付款 。 如果您想在新的文章添加到关于数据库网站时收到电子邮件提醒,请务必订阅我们的通讯!