您准备好开始使用结构化查询语言创建数据库和表吗?在本文中,我们将探讨使用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”,同时对用户定义的名称使用全部小写字母,如“人员”数据库名称。这些约定提供了易读性。 现在我们已经设计并创建了我们的数据库,我们已经准备好开始创建用于存储XYZ公司人员数据的三个表。 我们的第一个表格包含了我们公司每位员工的个人数据。我们需要包括每个员工的姓名,薪水,身份证和经理。将last和first名分隔成单独的字段以简化将来的数据搜索和排序是一种很好的设计实践。此外,我们将通过在每个员工记录中插入对经理的员工ID的引用来跟踪每个员工的经理。我们先来看一下所需的员工表。 ReportsTo属性存储每个员工的经理ID。从显示的样本记录中,我们可以确定Sue Scampi是Tom Kendall和John Smith的经理。但是,Sue的管理器上没有数据库中的信息,如行中的NULL条目所示。 现在我们可以使用SQL在人员数据库中创建表。在我们这样做之前,让我们通过发出USE命令来确保我们在正确的数据库中: 使用人员;
或者,“DATABASE人员”;命令将执行相同的功能。现在我们来看看用于创建员工表的SQL命令: CREATE TABLE员工 (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数据类型选项); 在前面的示例中,表名是employees,我们包含四个属性:employeeid,lastname,firstname和reportsto。数据类型指示我们希望在每个字段中存储的信息类型。员工ID是一个简单的整数,因此我们将对employeeid字段和reportsto字段使用INTEGER数据类型。员工姓名将是可变长度的字符串,我们不希望任何员工的姓氏长度超过25个字符。因此,我们将对这些字段使用VARCHAR(25)类型。 我们还可以在CREATE语句的options字段中指定NULL或NOT NULL。这只是告诉数据库在向数据库添加行时是否允许该属性使用NULL(或空)值。在我们的示例中,HR部门要求为每个员工存储员工ID和完整名称。但是,并非每个员工都有经理(CEO向任何人报告!)因此我们允许该字段中的NULL条目。请注意,NULL是默认值,省略此选项将隐式允许属性的NULL值。 现在让我们来看看地区表。从快速浏览一下这个数据看,我们需要存储一个整数和两个可变长度的字符串。与前面的示例一样,我们不希望Region ID占用超过25个字符。但是,我们的某些地区名称较长,因此我们会将该属性的允许长度扩展为40个字符。 我们来看看相应的SQL: CREATE TABLE地区 (territoryid INTEGER NOT NULL, 领土描述VARCHAR(40)NOT NULL, regionid VARCHAR(25)NOT NULL);
最后,我们将使用EmployeeTerritories表来存储员工和地区之间的关系。有关每个员工和地区的详细信息存储在前两个表中。因此,我们只需要在此表中存储两个整数标识号。如果我们需要扩展此信息,我们可以在数据选择命令中使用JOIN来从多个表中获取信息。 这种存储数据的方法减少了我们数据库中的冗余,并确保在存储驱动器上最佳地利用空间。我们将在以后的教程中深入介绍JOIN命令。这是实现我们的最终表的SQL代码: CREATE TABLE employeeterritories (employeeid INTEGER NOT NULL, territoryid INTEGER NOT NULL); 如果你今天特别精明,你可能已经注意到我们在实现数据库表时“意外地”省略了一个设计要求。 XYZ公司的人力资源总监要求数据库跟踪员工薪资信息,我们忽略了在我们创建的数据库表中提供此信息。 但是,一切都不会丢失。我们可以使用ALTER TABLE命令将此属性添加到现有数据库中。我们希望将薪水存储为整数值。语法与CREATE TABLE命令的语法非常相似,这里是: ALTER TABLE员工 ADD工资INTEGER NULL;
请注意,我们指定此属性允许使用NULL值。在大多数情况下,将列添加到现有表时没有选项。这是因为该表已包含没有此属性条目的行。因此,DBMS会自动插入NULL值以填充void。 创建我们的第一张表
属性和数据类型
NULL值
构建剩余表格
SQL提供的机制在创建后改变数据库的结构