简介数据库系统概论第4章“关系数据库标准语言——SQL语言”讲稿的前半部分适合高校数据库课程学习者、备考研究生及需要夯实SQL基础的开发者。整个压缩包仅含1个PPT文件容量约428KB轻量便携兼顾移动端预览与课堂投影展示。课件从SQL概述切入先解释SQL作为结构化查询语言的含义再梳理Oracle、SQL Server、DB2等主流数据库对它的支持情况并系统归纳SQL一体化、简捷易学、面向集合操作、高度非过程化、两种使用方式五大特点逐一列出CREATE、DROP、ALTER、INSERT、UPDATE、DELETE、SELECT、GRANT、REVOKE这9个核心动词。随后进入数据定义部分重点讲解CREATE TABLE建表语法、INTEGER、CHAR、VARCHAR、DATE等常见数据类型以及主键、外键、非空、唯一、CHECK等完整性约束条件并辅以职工表、部门表两个建表实例直观展示关系模式从定义到约束的完整设计过程。目前已有100人学习下载适合用于课前预习、课堂同步或考前系统复习。1. 数据库系统概论里的关键一章SQL语言学什么、怎么学不少学数据库课程的人都有同一种感受教材翻到第四章“关系数据库标准语言——SQL”突然从理论开始上代码节奏变了。这一章恰恰是整个数据库系统概论里最“保命”的内容后面的事务管理、查询优化、数据库设计全都建立在“你能否写出一张正确的表”之上。这份PPT正是把这一章的前半部分拆开了SQL是什么、核心动词有哪些、CREATE TABLE怎么写、数据类型怎么选、五种完整性约束怎么用。适合三类人正在跟教材走的学生刚转做数据开发想补基础的从业者以及准备面试前想快速过一遍SQL基础的人。2. SQL语言是什么九个动词、两种使用方式与面向集合的操作逻辑2.1 从“结构化查询语言”到关系数据库的标准语言SQL全称Structured Query Language结构化查询语言名字里有“查询”但实际功能远不止查询。PPT里说得明确SQL集数据定义、查询、更新和控制功能于一体一个语言搞定数据库生命周期里的全部主要活动。这不是夸张你建表、改表、删表、插数据、查数据、授权、回滚全在SQL的范畴内。从应用覆盖面看Oracle、Sybase、Informix、Ingres、DB2、SQL Server这些大型数据库管理系统都完整实现了SQL语言Dbase、Foxpro、Access这类PC端数据库则是部分实现。后者当年受限于文件型数据库架构很多SQL标准功能支持不完整这也是为什么你在Access里写SQL和Oracle里写SQL体感差异很大。还有一个容易被忽略的点SQL可以嵌入HTML中通过WWW访问数据库也可以在VC、VB、Delphi、PB这类开发工具中嵌入SQL语句。这解释了为什么SQL这么多年没被淘汰——它不是某个数据库产品的私有语言而是关系数据库的公共接口。Oracle搞的PL/SQLProcedure Language and SQL就是对SQL的过程化扩展本质上还是在SQL内核外面包了一层编程能力。对学习者的启示你学的不是“Oracle的SQL”或“SQL Server的SQL”而是关系数据库通用语言。换数据库时80%的SQL知识能直接迁移剩下20%是各家的方言差异和数据类型差异。2.2 九个核心动词一张表把SQL功能边界划清楚PPT里给了一个很实用的记忆框架SQL核心功能只用了9个动词。这是个很反直觉的事实——一门能完成数据库全生命周期操作的语言核心关键词居然一只手数得过来。SQL功能命令动词数据定义CREATE、DROP、ALTER数据操纵INSERT、UPDATE、DELETE数据查询SELECT数据控制GRANT、REVOKE对照这个表能看清自己处在学习的哪个阶段。数据定义对应建表、删表、改表结构数据操纵对应增删改数据查询只有SELECT一个词但它的复杂度上限极高嵌套查询、连接查询、分组聚合全挂在它名下数据控制则是权限相关。注意PPT后面的分类表里数据控制一行写的是GRANT、REVOKE、COMMIT、ROLLBACK四个动词与前文“九个动词”的说法略有出入。这个细节其实是教材口径差异严格说COMMIT和ROLLBACK属于事务控制不算SQL核心动词但很多教材把它们归类在“数据控制”大范畴下。考试如果问到九大动词以CREATE、DROP、ALTER、INSERT、UPDATE、DELETE、SELECT、GRANT、REVOKE为准如果问SQL功能分类则按四大类来。2.3 五大特点每一个都直接决定你写SQL的方式SQL的五个特点不是考试填空那么简单它们直接解释了你写SQL时的每一个习惯。一体化的语言数据定义、查询、更新、控制集于一身还要能完成合并、求差、相交、乘积、投影、选择、连接等所有关系运算。这意味着你不需要学第二门语言去操作同一个数据库。语言简捷易学接近英语口语或自然语言。这点新手体会最深——“SELECT name FROM emp WHERE sal 5000”读起来就是一句英文句子不需要额外的语法转换。面向集合的操作方式这条最反直觉也最重要。SQL的增删改查操作对象是集合一次INSERT可以插入多行一次UPDATE可能改动多行一次DELETE可能删掉一批记录。新手最容易在这里翻车以为UPDATE只改一行结果忘了加WHERE整张表的数据全被改了。这种事故我从没见过哪本教材会当重点警告但它就是SQL新手最常见的生产事故。高度非过程化你只需指明“做什么”不需要告诉数据库“怎么做”。SELECT怎么写、表怎么连接、走哪个索引由数据库优化器决定。好处是入门门槛低坏处是排查性能问题时感觉像对着黑匣子——同样的SQL数据量小的时候秒回数据量大了就慢得离谱因为执行计划变了。同一种语法结构两种使用方式既可以作为交互式语言独立使用也可以作为子语言嵌入宿主语言。而且两种方式语法结构一致。这意味着你在命令行里写的SQL粘到Python或Java代码里语义基本不变这对工程实践是个巨大的友好设计。3. 建表语法与数据类型CHAR、VARCHAR2、NUMBER到底怎么选3.1 CREATE TABLE的三段式结构先看懂语法骨架PPT里建表部分从基本表开始语法原型如下CREATE TABLE 基本表名 ( 列名 数据类型 [列级完整性约束条件], 列名 数据类型 [列级完整性约束条件], ... [, 表级完整性约束条件] );这个语法的核心是三个组成部分表名、列定义、约束条件。表名和括号是必须写的每一列必须有列名和数据类型约束条件可选。注意中括号里的内容是可选项方括号不是要写进去的符号。拆开看表名是这张表在数据库里的唯一标识每列定义由“列名数据类型可选约束”组成列级约束写在列定义内部只作用于这一列。如果一个约束条件涉及多个属性列比如复合主键、复合外键就必须写到表级。这一点在考试里常考判断某个约束该写在列级还是表级依据就是“是否涉及多列”。涉及两列及以上的约束列级写不下必须表级。3.2 建表的命名规则与注意事项30个字符、保留字、大小写PPT列出的建表注意事项每一条都来自真实报错经验提前记住能少踩很多坑。表名或列名不得超过30个字符。第一个字符必须是字母后面可以跟字母、数字、_、$、#三个特殊符号。表名或列名中不能包含空格。一个用户中表名要唯一一个表中列名要唯一。表名和列名不区分大小写但显示出来都是大写。保留字不能用作表名或列名。最后一条是新手重灾区。SELECT、ORDER、GROUP、WHERE这些词被当成列名或表名数据库直接报语法错误。解决办法是改名或者用双引号把保留字括起来转义。但我的习惯是命名时从源头避开保留字比如给订单表起名orders而不是order因为order是排序关键字任何数据库里碰它都容易出问题。3.3 数据类型选型一个表把五类数据说清楚PPT把数据类型分成数值、字符、位串、时间、布尔五类建表时最常打交道的其实就前三类加一个日期。分类类型说明建表建议数值型INTEGER / INT整数类型计数、序号用数值型SMALLINT短整数取值范围小的整数用数值型NUMERIC(p, s)定点数p为总有效位s为小数位金额、单价用必须给精度数值型FLOAT(p)浮点数p为精度科学计算类场景数值型REAL浮点数精度由执行机构确定对精度要求不高的场景数值型DOUBLE PRECISION双精度浮点精度由执行机构确定大范围浮点计算字符型CHAR(n)定长字符串n为固定长度定长编码如身份证号字符型VARCHAR(n)可变长字符串最大长度n名字、地址等长度不固定的文本位串型BIT(n)二进制位串长度n按位存储的标志字段位串型BIT VARYING(n)可变长二进制位串位可变标志集合时间型DATE日期YYYY-MM-DD生日、下单日期时间型TIME时间HH:MM:SS打卡时间、日志时间布尔型BOOLEANTRUE或FALSE是否生效、是否删除几个选型经验CHAR和VARCHAR的选择。CHAR(n)是定长的存“abc”和存“abc ”占的空间一样VARCHAR(n)是变长的按实际长度存。名字、地址、备注这类长度不定的用VARCHAR固定长度编号比如身份证号、手机号、学号用CHAR。不要无脑全部VARCHAR定长字段用定长类型查询匹配效率更高。NUMERIC(p,s)用于金额p是总有效位数s是小数位。NUMERIC(8,2)表示最多6位整数加2位小数。金额字段绝不用FLOAT或DOUBLE浮点精度误差在金额场景是不可接受的这是血泪教训。VARCHAR2是Oracle特有的它是VARCHAR的方言变体。标准SQL里只有VARCHAR但这个PPT是Oracle风格的教学例子所以出现多次varchar2。你在MySQL、SQL Server里建表时写VARCHAR就好VARCHAR2在这些数据库里是语法错误。3.4 两个建表示例逐行拆解emp与deptPPT给了两张表的完整建表语句。第一张是职工表CREATE TABLE emp ( eno NUMBER(10), ename VARCHAR2(10), dno VARCHAR(6), sex VARCHAR(2), birthday DATE );第二张是部门表CREATE TABLE dept ( dno VARCHAR2(6), dname VARCHAR(8), loc VARCHAR(10) );这两张表连着看更有意思emp表的dno列指向dept表的dno列这是典型的外键参照关系雏形。注意细节——emp表里dno用的是VARCHAR(6)dept表里dno用的是VARCHAR2(6)。VARCHAR和VARCHAR2在Oracle里行为不完全相同混着用做外键容易出现类型不一致问题后面避坑章会专门展开。另外注意emp表里eno用了NUMBER(10)这是Oracle风格的数值类型写法等价于标准SQL里的NUMERIC(10,0)——整数部分10位有效数字。如果你用的是MySQL或SQLite改成INT或BIGINT更顺手细节以目标数据库为准。3.5 理解了语法就能看懂别人建的表看懂建表语句是数据库从业者的基本技能。面试考SQL、接手老项目、写数据字典第一步都是“读得懂别人写的CREATE TABLE”。语法骨架就那三段表名、列定义、约束位置。拿到一张建表语句先看表名和列名含义再看每个列的类型和约束最后看表级约束里有没有复合主键或复合外键。这套流程走完表结构的主干就清楚了。4. 完整性约束主键、外键、CHECK怎么用才不翻车4.1 三类完整性实体、参照、用户定义完整性约束不是SQL的可选装饰它是关系数据库保证数据不出错的最后一道闸门。PPT把约束对应到三类完整性上主键约束PRIMARY KEY体现实体完整性。实体完整性要求表中的每一行都能被唯一识别所以主键列的值既不能为空也不能重复。空值代表“未知”一个未知的主键无法唯一标识一行自然不能允许。外键约束FOREIGN KEY体现参照完整性。外键的取值要么是NULL要么引用父表的主键值。这个约束保证子表里的引用不会“悬空”——不会出现某个员工的部门编号在部门表里根本不存在的情况。属性约束体现用户定义的完整性包括NOT NULL非空约束、UNIQUE唯一约束、CHECK检查约束。这三类约束共同把某一列的取值范围限制在业务规则允许的区间内。理解这个分类的意义在于约束不是随便加的每一类约束解决的是不同层面的数据一致性问题。没有主键表里可能出现两行完全一样的数据查询结果直接失真没有外键脏引用会悄悄混进业务数据没有CHECK工资可能是负数年龄能写到200岁。4.2 五种约束的写法与生效范围一张表记住规则约束类型作用能否列级能否表级PRIMARY KEY列值唯一且非空能能FOREIGN KEY取值参照父表主键能能NOT NULL列值不允许为空能不能UNIQUE列值不允许重复能能CHECK限制列值范围能能注意这个表里唯一不对称的一项NOT NULL只能作为列级约束。逻辑也好理解——非空约束天然是针对某一列的属性它没法描述“这一组列都不为空”这样的复合条件所以语法上不允许它出现在表级位置。其他四种约束都可以升降级而有没有“多列参与”是选择级别的判断依据。检查约束多用于数值范围比如工资必须在1000到10000之间就写CHECK(sal BETWEEN 1000 AND 10000)。4.3 列级约束与表级约束复合主键场景下的分水岭先看列级约束的完整写法。PPT里的emp表带全约束是这样CREATE TABLE emp ( eno NUMBER(6) PRIMARY KEY, ename VARCHAR2(10) UNIQUE, sex VARCHAR2(3) NOT NULL, dno VARCHAR2(10) REFERENCES dept(dno), sal NUMBER(6) CHECK(sal 1000 AND sal 10000) );逐行拆eno是主键不能为空且不能重复ename不允许重复但允许NULL——注意UNIQUE和PRIMARY KEY的区别前者允许空值后者不允许sex不能为空性别字段必须填dno参照dept表的dno列这是列级外键sal的取值被限制在1000到10000之间用AND连接两个条件闭区间。再看表级写法CREATE TABLE emp ( eno NUMBER(6), ename VARCHAR2(10), sex VARCHAR2(3) NOT NULL, dno VARCHAR2(10), sal NUMBER(6), PRIMARY KEY(eno), UNIQUE(ename), FOREIGN KEY(dno) REFERENCES dept(dno), CHECK(sal BETWEEN 1000 AND 10000) );功能上这张表和上一张等价但写法上把约束集中到了表定义末尾。列级写法更紧凑直观表级写法便于统一查看约束清单。实际项目里怎么选我的习惯是单列约束跟着列走写列级可读性好涉及多列或习惯集中管理约束的表统一写表级维护起来一目了然。什么时候必须表级当主键或外键由多个列组成时。比如订单明细表主键是“订单号行号”复合主键就必须写成PRIMARY KEY(order_no, line_no)放在表级单个列都不满足唯一性。4.4 Student表完整示例五种约束一次写全PPT最后给了一个综合示例把五种约束全部放进一张表CREATE TABLE Student ( Sno CHAR(8) PRIMARY KEY, /* 主键约束 */ Sname CHAR(10) UNIQUE, /* 唯一约束 */ Sex CHAR(3) NOT NULL, /* 非空约束 */ Age INT CHECK(Age 16), /* 检查约束 */ Dept VARCHAR(15) );逐段解释Sno是学号定长8位作主键约束最严格Sname是姓名唯一约束保证不重名Sex性别不能为空Age年龄要求必须大于16Dept院系列没有约束允许为空也允许重复。这张表是典型的课堂示范用最简单的场景覆盖全部五种约束考试里类似题目出现的概率很高。一个容易被忽略的点UNIQUE约束和PRIMARY KEY的区别。主键隐含非空和唯一两个性质唯一约束只保证不重复、不保证不为空。换句话说UNIQUE列可以有多行NULL主键列一行NULL都不能有。5. 避坑记录建表约束最常见的五个翻车现场5.1 VARCHAR和VARCHAR2混用导致外键建不上现象照抄PPT里的emp和dept建表发现emp表里的dno列建外键时直接报错提示找不到父表列或数据类型不一致。原因PPT的emp表里dno写的是VARCHAR(6)dept表里dno写的是VARCHAR2(6)。这两个类型在Oracle里语义不同VARCHAR是标准SQL类型VARCHAR2是Oracle的私有类型长度语义、存储行为都有差别。外键要求子表列和父表列的数据类型必须完全匹配混用就是匹配不上。解决统一类型。以目标数据库为准Oracle里统一用VARCHAR2MySQL和SQLite里统一用VARCHAR。建表之前先把外键关联列的字段类型对着看一遍别想当然以为“都是字符串就行”。5.2 把NOT NULL写进表级约束语法直接报错现象按表级约束的格式把NOT NULL挪到约束区像PRIMARY KEY(eno)那样写NOT NULL(sex)数据库报语法错误。原因非空约束只能作为列级约束不能作为表级约束。这不是某个数据库的差异是标准SQL的语法限制。PPT里明确写了“非空约束不可以作为表级完整性约束条件”但实操中总有人犯这个错。解决NOT NULL必须紧跟列定义写比如sex VARCHAR2(3) NOT NULL。它描述的是单列属性语法上不属于表级约束的范畴。5.3 CHECK约束在部分数据库里被静默忽略现象建表时写了CHECK(sal 1000)插入一条sal为500的数据竟然成功了没有任何报错。原因MySQL在8.0版本之前解析到CHECK约束直接忽略不报错也不生效。SQLite在3.3.0之前对CHECK的支持也不完整。如果教学演示用的老版本数据库CHECK约束就等于形同虚设。解决先确认目标数据库的版本和文档。MySQL 8.0及以上才真正执行CHECK约束更早版本里要限制取值范围只能靠应用层校验或使用触发器。写CHECK之前先验证数据库确实支持并在执行否则这个约束就是心理安慰。5.4 删除父表时被外键卡住一直报删除失败现象删dept部门表数据库报错提示有外键约束依赖删不掉。原因emp表里有外键参照dept(dno)数据库为了保住参照完整性不允许直接删除被引用的父表。解决先删子表再删父表或者用DROP TABLE dept CASCADE CONSTRAINTS把依赖该表的外键约束一并删掉再删表。生产环境里对CASCADE要谨慎它会静默删掉多个相关联的约束影响范围比想象中大。我一般会先查依赖关系再决定怎么删。5.5 表名用了保留字建表语句反复报错现象建一张订单表名字叫order执行CREATE TABLE order(...)数据库报语法错误检查了好几遍SQL都没发现问题。原因order是SQL的排序关键字属于保留字不能直接用作表名。类似的还有select、group、where、user这些高危词汇单看都像正常的业务名词但在SQL里全是保留字。解决改表名比如orders、t_order、order_info或者用双引号把保留字括起来order变成“order”数据库会把它当普通标识符处理。但我的经验是改名比转义省心——转义写法在后续每个引用点都要加引号忘一次就报一次错后患无穷。6. 把讲义里的例子跑起来从Student表开始的验证路线6.1 用SQLite把Student表重建一遍没有Oracle环境也能验证这张表。SQLite轻量免安装语法上与标准SQL兼容度高最适合做课堂练习CREATE TABLE Student ( Sno CHAR(8) PRIMARY KEY, Sname CHAR(10) UNIQUE, Sex CHAR(3) NOT NULL, Age INT CHECK(Age 16), Dept VARCHAR(15) );注意SQLite对INTEGER PRIMARY KEY有特殊行为但这里Sno是CHAR类型主键不受影响。建表成功后用. schema Student命令能看到表结构确认每条约束都已生效。6.2 验证约束是否真的在拦截错误数据表建好后手动喂几条违反约束的数据看数据库的报错反应INSERT INTO Student(Sno, Sname, Sex, Age, Dept) VALUES (20230001, 张三, 男, 18, CS); INSERT INTO Student(Sno, Sname, Sex, Age, Dept) VALUES (20230001, 李四, 男, 20, CS);第二条Sno重复会触发主键冲突报错。再试一条年龄小于16的CHECK约束会抛异常。有些数据库里主键冲突会回滚整个事务插入前先确认表里没有同主键数据这也是排查拿到奇怪错误时最先该怀疑的方向。6.3 补上DML操作把集合操作的体感练出来建表之后顺势验证数据操纵UPDATE Student SET Age Age 1 WHERE Sno 20230001; DELETE FROM Student WHERE Dept CS; INSERT INTO Student(Sno, Sname, Sex, Age, Dept) VALUES (20230002, 王五, 女, 19, IS);这三句分别对应UPDATE、DELETE、INSERT三个核心动词。执行时注意UPDATE没写WHERE会更新全表DELETE没写WHERE会清空全表——集合操作的优势是一句话处理一批数据风险也是一句话误伤整批数据。每条语句执行完用SELECT确认影响行数这是个值得坚持的好习惯。这套验证走完第四章前半部分的建表和约束内容就串起来了。后来我每次在新环境里建表都强制自己过一遍检查清单主键有没有外键类型是否完全一致CHECK有没有被数据库静默忽略保留字有没有混进命名。这套动作帮我少踩了很多坑希望帮到你。本文还有配套的精品资源点击获取