
在数据库的学习旅程中理论的讲解固然重要但若能配合上一行行真实可见、可以亲手敲下的代码那种学习的效果便会大不相同。代码是最为诚实、最为具体的语言它不含糊、不空泛每一个字符都对应着一个明确的含义和操作。今天我们就来一场货真价实的SQL数据定义实战不仅讲解思路更要给出一行行具体的代码手把手地带领大家用SQL语句亲手搭建起一个完整的数据库结构来。数据定义是SQL中负责创建和管理数据结构的功能家族它就像建筑工程队专门负责把存放数据的一张张表从无到有地建造出来。掌握数据定义是使用数据库的第一步也是后续一切数据操作的根基。下面就让我们以一个学生选课的场景为例从创建表开始到修改表、删除表一步一个脚印地走完数据定义的完整流程并在每一步都附上具体的代码和细致的讲解让大家能够真正地学以致用。一、热身先认识创建表语句的基本格式在动手敲代码之前我们先来认识一下创建表语句的基本格式做一个热身。创建表是数据定义中最核心的操作它使用的关键词是 CREATE TABLE意思就是创建表。它的基本格式大致是这样的。CREATETABLE表名(列名1数据类型 列级约束,列名2数据类型 列级约束,列名3数据类型 列级约束,...表级约束);我们来解读一下这个格式。开头的 CREATE TABLE 是固定的关键词表明我们要创建一张表。紧跟其后的是表名也就是我们给这张表起的名字。然后是一对圆括号括号里面是这张表所有列的定义每一列的定义占一行列与列之间用逗号隔开。每一列的定义包括三个部分依次是列名、该列的数据类型、以及针对该列的约束要求。最后在所有列定义之后还可以写上一些针对整张表的约束。整条语句以一个分号结束分号在SQL中表示一条语句的终结。认识了这个基本格式我们心里就有了底。接下来就让我们用这个格式去创建第一张真实的表。二、第一步创建学生表我们的第一个任务是创建一张学生表用来存放学生的基本信息。我们规划这张表包含四列分别是学号、姓名、年龄、院系。其中学号作为主键用来唯一标识每个学生。下面我们直接给出创建这张表的具体代码。CREATETABLEStudent(SnoCHAR(8)PRIMARYKEY,SnameVARCHAR(20)NOTNULL,SageINT,SdeptVARCHAR(20));这段代码就是创建学生表的完整SQL语句。让我们逐行来细细品味它的含义。第一行 CREATE TABLE Student表明我们要创建一张名为 Student 的表Student 就是学生表的英文名字。在实际的数据库中表名和列名通常使用英文这是一种常见的习惯。第二行 Sno CHAR(8) PRIMARY KEY定义了第一列。Sno 是列名代表学号。CHAR(8) 是这一列的数据类型表示它存放的是固定长度为八个字符的字符串因为学号通常是八位的编号用字符型来存放最为合适。最后的 PRIMARY KEY是一个约束意思是主键它把 Sno 这一列指定为这张表的主键。被指定为主键之后Sno 这一列的值就不能重复也不能为空从而能够唯一地标识每一个学生。第三行 Sname VARCHAR(20) NOT NULL定义了第二列。Sname 是列名代表姓名。VARCHAR(20) 是数据类型表示它存放的是可变长度的字符串最长不超过二十个字符。与 CHAR 不同VARCHAR 存放的字符串长度可以变化比较节省空间适合用来存放姓名这种长度不固定的信息。最后的 NOT NULL是一个约束意思是不能为空它要求这一列必须有值不允许空缺因为一个学生总得有姓名。第四行 Sage INT定义了第三列。Sage 是列名代表年龄。INT 是数据类型表示整数因为年龄是一个整数。这一列后面没有写任何约束意味着它没有特别的要求可以为空也可以重复。第五行 Sdept VARCHAR(20)定义了第四列。Sdept 是列名代表院系。VARCHAR(20) 表示它存放最长二十个字符的可变长字符串。这一列同样没有特别的约束。最后的右括号和分号表示列的定义到此结束整条语句也到此终结。当我们把这段代码交给数据库执行之后数据库就会在内部创建出一张名为 Student 的空表它有 Sno、Sname、Sage、Sdept 这四列每一列的数据类型和约束都按照我们的规定设置妥当。这张表此刻虽然还没有任何数据但它的骨架已经稳稳地立了起来随时准备接纳学生数据的入住。我们的第一栋数据房屋就这样建成了。三、第二步创建课程表有了学生表我们接着来创建一张课程表用来存放课程信息。我们规划这张表包含三列课程编号、课程名称、学分其中课程编号作为主键。下面给出具体代码。CREATETABLECourse(CnoCHAR(4)PRIMARYKEY,CnameVARCHAR(40)NOTNULL,CreditINT);这段代码的结构和创建学生表如出一辙相信有了前面的基础理解起来已经轻车熟路了。第一行表明要创建一张名为 Course 的表Course 是课程的英文名。第二行定义课程编号 Cno数据类型是固定长度四个字符的字符串并把它指定为主键保证课程编号唯一且不为空。第三行定义课程名称 Cname数据类型是最长四十个字符的可变长字符串并要求它不能为空因为一门课总得有名字。第四行定义学分 Credit数据类型是整数。执行这段代码之后一张名为 Course 的空课程表就建好了。至此我们已经有了学生表和课程表两栋房子。四、第三步创建选课表并建立表间关联现在到了最为关键、也最为精彩的一步。我们要创建一张选课表用来记录哪个学生选了哪门课、取得了什么成绩。更重要的是我们要在这张表里建立起它与学生表、课程表之间的真实关联。下面给出具体代码。CREATETABLESC(SnoCHAR(8),CnoCHAR(4),GradeINT,PRIMARYKEY(Sno,Cno),FOREIGNKEY(Sno)REFERENCESStudent(Sno),FOREIGNKEY(Cno)REFERENCESCourse(Cno));这段代码比前两段要复杂一些因为它涉及了表与表之间的关联让我们格外仔细地来解读它。第一行表明要创建一张名为 SC 的表SC 是选课的英文缩写。第二行定义学号 Sno数据类型是固定长度八个字符的字符串。注意这里的 Sno 要和学生表里的 Sno 保持类型一致因为它将要引用学生表的学号。第三行定义课程编号 Cno数据类型是固定长度四个字符的字符串同样要和课程表里的 Cno 类型一致。第四行定义成绩 Grade数据类型是整数。接下来的三行是这张表的精华所在它们都是表级约束写在所有列定义之后。第五行 PRIMARY KEY (Sno, Cno)定义了这张表的主键。与前面的表不同选课表的主键不是单独一列而是由学号和课程编号这两列共同组成的。这叫做组合主键。为什么要这样设计呢因为在选课表中单凭一个学号无法唯一标识一条记录因为一个学生选了多门课会有多条记录单凭一个课程编号也不行因为一门课被多个学生选也会有多条记录。只有把学号和课程编号组合起来也就是某个学生选了某门课这样的组合才能唯一地标识出一条选课记录。所以这里用两列共同作为主键。第六行 FOREIGN KEY (Sno) REFERENCES Student(Sno)这是一个外键约束也是表达表间关联的核心所在。它的意思是把本表的 Sno 这一列声明为外键它参照的是 Student 表里的 Sno 列。FOREIGN KEY 表示外键REFERENCES 表示参照。这条约束建立起来之后数据库就会自动地保证凡是往选课表里填入的学号都必须是学生表里确实存在的学号否则就不允许填入。这就杜绝了一个根本不存在的学生出现在选课记录里的荒唐情况保证了数据的真实可靠。第七行 FOREIGN KEY (Cno) REFERENCES Course(Cno)同样是一个外键约束它把本表的 Cno 列声明为外键参照课程表里的 Cno 列。它保证了凡是填入选课表的课程编号都必须是课程表里真实存在的课程杜绝了引用不存在课程的矛盾。通过这段代码我们不仅创建了选课表更重要的是借助两个外键约束把选课表与学生表、课程表牢牢地、可靠地关联了起来。这就好比我们在三栋房子之间架设起了坚固而规范的通道让它们既彼此连通又秩序井然谁也不能凭空引用不存在的对象。至此一个能够管理学生选课信息的完整数据库骨架就由学生表、课程表、选课表这三张相互关联的表共同搭建完成了。五、第四步改造已有的表数据库的结构并非一成不变。假设运行一段时间后学校希望在学生信息中增加一项联系电话这就需要修改已有的学生表结构。修改表使用的关键词是 ALTER TABLE意思是更改表。下面给出给学生表增加一列的具体代码。ALTERTABLEStudentADDSphoneCHAR(11);这段代码的意思是更改 Student 表给它增加一列。ALTER TABLE Student 表明要修改的是学生表ADD 表示增加Sphone CHAR(11) 表示新增的这一列名叫 Sphone代表联系电话数据类型是固定长度十一个字符的字符串因为手机号通常是十一位的。执行这条语句之后学生表就会多出 Sphone 这一列而原先已有的数据不受任何影响新列暂时为空等待填入。反过来如果某一列不再需要也可以用 ALTER TABLE 配合删除的关键词把它去掉。假设我们想删掉刚才增加的联系电话列代码如下。ALTERTABLEStudentDROPCOLUMNSphone;这段代码的意思是更改 Student 表删除其中的 Sphone 这一列。DROP COLUMN 表示删除列。执行之后Sphone 这一列连同它所存放的数据就一并从表中消失了。通过 ALTER TABLE我们可以灵活地改造已有表的结构让它随着需求的变化而不断演进。六、第五步拆除不需要的表最后当某张表彻底完成使命、再也用不着时我们可以把它整个删除。删除表使用的关键词是 DROP TABLE意思是丢弃表。假设我们要删除选课表代码如下。DROPTABLESC;这段代码的意思非常直接就是丢弃 SC 这张表。执行之后选课表连同它里面的全部数据就会从数据库中彻底消失不复存在。这里要特别提醒DROP TABLE 是一个极其彻底、不可挽回的操作一旦执行表和数据就再也找不回来了。所以使用它时务必慎之又慎要再三确认这张表确实毫无用处、里面也没有任何需要保留的数据方可执行以免造成无法弥补的损失。另外还要注意由于选课表通过外键参照了学生表和课程表如果存在这种参照关系删除被参照的表时还可能受到限制这也提醒我们删除表时要考虑表之间的关联。七、完整代码回顾为了让大家有一个整体的印象我们把搭建这个学生选课数据库的核心代码完整地汇总在一起以便回顾。-- 创建学生表CREATETABLEStudent(SnoCHAR(8)PRIMARYKEY,SnameVARCHAR(20)NOTNULL,SageINT,SdeptVARCHAR(20));-- 创建课程表CREATETABLECourse(CnoCHAR(4)PRIMARYKEY,CnameVARCHAR(40)NOTNULL,CreditINT);-- 创建选课表并建立与学生表、课程表的关联CREATETABLESC(SnoCHAR(8),CnoCHAR(4),GradeINT,PRIMARYKEY(Sno,Cno),FOREIGNKEY(Sno)REFERENCESStudent(Sno),FOREIGNKEY(Cno)REFERENCESCourse(Cno));这段汇总的代码中每一段前面用两个连字符开头的文字是注释注释是给人看的说明文字数据库执行时会忽略它们它能帮助我们理解每一段代码的用途。通过这三条创建表的语句一个结构合理、约束严谨、关联清晰的学生选课数据库骨架就完整地搭建起来了。八、结语行文至此我们通过一行行真实具体的代码完整地走完了SQL数据定义的实战流程。我们从认识创建表语句的基本格式开始依次亲手创建了学生表、课程表又通过组合主键和外键约束创建了与前两张表紧密关联的选课表搭建起了一个完整的数据库骨架。我们还学会了用 ALTER TABLE 来给表增加列、删除列灵活地改造表结构以及用 DROP TABLE 来彻底删除不需要的表并牢记了谨慎操作的准则。回顾这场实战我们能够深切地体会到代码的力量。那些原本抽象的概念比如数据类型、主键、外键、约束一旦落实到具体的代码中便变得无比清晰和真切。CHAR 和 VARCHAR 规定着列存放什么样的字符PRIMARY KEY 立起了唯一标识的规矩FOREIGN KEY 架起了表与表之间真实可靠的桥梁。每一个关键词都各司其职每一行代码都精确无误地表达着我们的设计意图。这正是SQL作为一门精确语言的魅力所在。当我们今天能够独立地写出这样一段段规范的数据定义代码从无到有地搭建起一个结构严谨、关联清晰的数据库时我们便真正迈出了驾驭关系数据库坚实而关键的一步。希望大家不要满足于读懂这些代码更要亲自动手在真实的数据库环境中把这些代码一行行敲下去、运行起来亲眼看着一张张表在自己手中诞生。唯有如此亲历亲为这门搭建数据世界骨架的精巧技艺才能真正内化为我们自己的本领成为我们在数据天地中继续探索、大展身手的稳固根基。