1、第四章 关系数据库标准语言SQLSQL Server 2008 表的创建与操作SQL语言概述第四章 SQL Server2008表的创建与操作掌握表的创建、修改和删除操作了解表的基本知识熟练掌握记录的插入、删除和修改操作了解索引的基本知识目标4.1 SQL Server 2008表的基本知识 表的基本概念表的基本概念1 表的类型表的类型2 表的数据类型表的数据类型3 表的完整性体现表的完整性体现41 表的设计表的设计54.1.1表的基本概念 表是数据库对象,用于存储实体集和实体间联系的表是数据库对象,用于存储实体集和实体间联系的数据。数据。SQL Server 2008表主要由列和行构成。关表
2、主要由列和行构成。关系模型的组成要素系模型的组成要素 列:每一列用来保存对象的某一类属性。列:每一列用来保存对象的某一类属性。行:每一行用来保存一条记录,是数据对象的一个实例行:每一行用来保存一条记录,是数据对象的一个实例。SQL Server 20084.1.1表的基本概念 例如:教务管理数据库EDUC中的学生Student表。4.1.2 表的类型SQL Server 2008除了提供了用户定义的标准表外,除了提供了用户定义的标准表外,还提供了一些特殊用途的表:分区表、临时表和系还提供了一些特殊用途的表:分区表、临时表和系统表。统表。分区表分区表 当表很大时,可以水平地把数据分割成一些单元,
3、放在同一个数据库的多个文件组中。用户可以通过分区快速地访问和管理数据的某部分子集而不是整个数据表,从而便于管理大表和索引。4.1.2 表的类型 临时表 局部临时表:只是对一个数据库实例的一次连接中的创建者是可见的。在用户断开数据库的连接时,局部临时表就被删除。全局临时表:对所有的用户和连接都是可见的,并且只有所有的用户都断开临时表相关的表时,全局临时表才会被删除。4.1.2 表的类型 系统表 用来保存一些服务器配置信息数据,用户不能直接查看和修改系统表,只有通过专门的管理员连接才能查看和修改。不同版本的数据库系统的系统表一般不同,在升级数据库系统时,一些应用系统表的应用可能需要重新改写。SQL
4、 Server 20084.1.3表的数据类型 下表列出了下表列出了SQL Server 2008中常用的数据类型:中常用的数据类型:数据类型系统数据类型数据类型系统数据类型二进制二进制image字符字符char(n)Binary(n)varchar(n)varbinary(n)text精精确确数数字字精确整数精确整数bigintUnicodenchar(n)intnvarchar(n)smallintntexttinyint日期和时间日期和时间Datetime精确小数精确小数Decimal(p,s)smalldatetimenumeric(p,s)Money近似数字近似数字float(n)s
5、mallmoneyreal用户自定义用户自定义用户自行命名用户自行命名特殊特殊bitTimestampuniqueidentifier4.1.4 表的完整性体现l主键约束体现实体完整性,即主键各列不能为空且主键作为行的惟一标识系统表l外键约束体现参照完整性l默认值和规则等体现用户定义的完整性4.1.5 表的设计 设计表时需要确定如下内容:n 表中需要的列以及每一列的类型(必要时还要有长度)n 列是否可以为空n 是否需要在列上使用约束、默认值和规则n 需要使用什么样的索引n 哪些列作为主键4.2创建数据库 使用使用SSMSSSMS创建数据库创建数据库1 使用使用T-SQLT-SQL语句创建数据库
6、语句创建数据库24.2.1使用SSMS创建数据库 从【开始】菜单中选择【程序】|Microsoft SQL Server 2008|SQL Server Management Studio命令,打开SQL Server Management Studio窗口,并使用Windows或SQL Server 身份验证建立连接。4.2.1使用SSMS创建数据库4.2.1使用SSMS创建数据库 (2)在【对象资源管理器】窗格中展开服务器,然后选择【数据库】节点。(3)在【数据库】节点上单击鼠标右键,从弹出的快捷菜单中选择【新建数据库】命令,如图所示。5.2.1使用SSMS创建数据库4.2.1使用SSMS
7、创建数据库(4)执行上述操作后,会弹出【新建数据库】对话框,如下图所示。这个对话框有3个页,分别是【常规】、【选项】和【文件组】。完成这3个选项中的内容之后,就完成了数据库的创建工作。5.2.1使用SSMS创建数据库4.2.1使用SSMS创建数据库 (5)在【数据库名称】文本框中输入要新建数据库的名称。如:student (6)在【所有者】文本框中输入新建数据库的所有者,如sa。根据数据库的使用情况,选择启用或者禁用【使用全文索引】复选框。(7)【数据库文件】列表包括两行,一行是数据文件,另一行是日志文件。通过单击相应的按钮,可以添加或删除相应的数据文件。4.2.1使用SSMS创建数据库(8)
8、完成以上操作后,就可以单击【确定】按钮关闭【新建数据库】对话框。这时,一个数据库成功的创建了,可以通过【对象资源管理器】窗格查看新建的数据库。4.2.1使用SSMS创建数据库 可以看到数据库student2数据库创建成功。4.2创建数据库2 使用使用SSMSSSMS创建数据库创建数据库1 使用使用T-SQLT-SQL语句创建数据库语句创建数据库14.2.2 使用T-SQL语句创建数据库CREATE DATABASE database_name /*指定数据库名*/ON子句 /*指定数据库文件和文件组属性*/LOG ON子句 /*指定日志文件属性*/其核心是CREATE DATABASE语句。该
9、语句的基本语法格式是:4.2.2 使用T-SQL语句创建数据库【例例】创建一个名为db_stu的数据库,其初始大小为5MB,最大大小50MB,允许数据库自动增长,增长方式是按10%比例增长;日志文件初始为2MB,最大可增长到5MB,按1MB增长。假设SQL Server服务已启动,并以Administrator身份登录计算机。4.2.2 使用T-SQL语句创建数据库 在“SQL Server Management Studio”窗口中单击“新建查询”按钮新建一个查询窗口,如图所示。T-SQL 语句输入及 执行结果返回窗口 单击新建一个 查询窗口 4.2.2 使用T-SQL语句创建数据库在T-S
10、QL语句输入窗口中输入如下语句:CREATE DATABASE db_stu ON(NAME=db_stuData,FILENAME=e:sqldataMSSQLDatadb_stu.mdf,SIZE=5MB,MAXSIZE=50MB,FILEGROWTH=10%)LOG ON(NAME=XSCJ1_Log,FILENAME=e:sqldataMSSQLDatadb_stu.ldf,SIZE=2MB,MAXSIZE=5MB,FILEGROWTH=1MB)GO4.3创建表 使用使用SSMSSSMS创建表创建表1 使用使用T-SQLT-SQL语句创建表语句创建表2SQL Server 20084.
11、3.1 使用SSMS创建表创建主 键约束创建唯一性约束 创建外键约束创建检查约束 保存表的定义创建表4.3.1使用SSMS创建表 例如:创建学生表Student,课程表Course,选课表SC。其中教务管理中的选课数据模型为:Student(SID,Sname,Sex,Birthday,Specialty)PK:SID Course(CID,Cname,Credit)PK:CID SC(SID,CID,Grade)PK:SID,CID FK:SID和CID 4.3.1 使用SSMS创建表 创建表:在创建表:在【对象资源管理器对象资源管理器】窗口中,展开窗口中,展开“数据库数据库”下的下的stu
12、dent节点,右击节点,右击“表表”节点,选择节点,选择“新建表新建表”命令,进入表设命令,进入表设计器,在表设计器的第一列中输入列名,第二列选择数据类型,计器,在表设计器的第一列中输入列名,第二列选择数据类型,第三列选择是否为空;第三列选择是否为空;例如:表例如:表StudentSQL Server 20084.3.1使用SSMS创建表表Course:表SC:4.3.1 使用SSMS创建表 创建主键约束:单击选择一列名,创建主键约束:单击选择一列名,SHIFT+单击选择连续的列单击选择连续的列名,名,CTRL+单击选择不相邻的列名,右键快捷菜单或工具栏按单击选择不相邻的列名,右键快捷菜单或工
13、具栏按钮钮“设置主键设置主键”;例:Student中的SID,Course中的CID,SC中的SID,CID 做法:单击选择一列名,SHIFT+单击选择连续的列名,CTRL+单击选择不相邻的列名,右键快捷菜单或工具栏按钮“设置主键”;4.3.1 使用SSMS创建表Student,Course表主键约束采用同样的方法设置;Course表的主键建立示意图如下:表的主键建立示意图如下:4.3.1 使用SSMS创建表 创建唯一性约束创建唯一性约束:例如:Student表中的Sname 做法:右键快捷菜单或工具栏按钮“索引/键”,在弹出的【索引/键】对话框中,单击“添加”按钮添加新的主/惟一键或索引;在
14、常规的“类型”右边选择“惟一键”,在“列”的右边单击省略号按钮,选择列名Sname和排序规律;4.3.1 使用SSMS创建表如图所示:如图所示:4.3.1 使用SSMS创建表创建外键约束创建外键约束例如:SC表中的SID和CID设置为外码。做法:(1)右键快捷菜单或工具栏“关系”,在弹出的【关系】对话框中,单击“添加”按钮添加新的约束关系;4.3.1 使用SSMS创建表(2 2)单击“表和列规范”左边的“”号,再单击“表和列规范”内容框中右边的省略号按钮,从弹出的【表和列】对话框中进行外键约束的表和列的选择,单击“确定”;4.3.1 使用SSMS创建表(3)回到【外键关系】对话框,将“强制外键
15、约束”选项选择为“是”,设置“更新规则”和“删除规则”的值;采用同样的方法添加外键采用同样的方法添加外键CIDCID;4.3.1使用SSMS创建表创建检查约束创建检查约束 例如:Student表中的Sex等于男或女。做法:右键菜单或工具栏“CHECK约束”,在打开的【CHECK约束】对话框中单击“添加”按钮,在表达式文本框中输入检查表达式,在表设计器中进行选项的设置;4.3.1 使用SSMS创建表保存表的定义保存表的定义(1 1)单击关闭表设计器窗口,弹出下图保存对话框,单击“是”钮;(2)输入表名,单击输入表名,单击“确定确定”按钮。按钮。4.3.2使用T-SQL语句创建表格式:格式:CRE
16、ATE TABLE表名表名 (列名1 数据类型 列级完整性约束,列名 2 数据类型 列级完整性约束,列名n 类型 约束,表级完整性约束,);4.3.2 使用T-SQL语句创建表约束:实现表的完整性 NULL/NOT NULL:空值/非空值约束。DEFAULT 常量表达式:默认值约束。UNIQUE:单值约束。PRIMARY KEY:主键约束,等价非空、单值。REFERENCES 父表名(主键):外键约束。CHECK(逻辑表达式):检查约束。4.3.2 使用T-SQL语句创建表例如:在图书管理系统中的数据库(Library)中,创建读者表(Reader),读者类型表(ReaderType),图书表
17、(Book)和借阅表(Borrow)。图书管理系统的数据模型:ReaderType(TypeID,Typename,LimitNum,LimitDays)PK:TypeIDReader(RID,Rname,TypeID,Lendnum)PK:RID FK:TypeIDBook(BID,Bname,Author,PubComp,PubDate,Price)PK:BIDBorrow(RID,BID,LendDate,ReturnDate)PK:RID,BID,LendDate FK:RID和BID SQL Server 20084.3.2 使用T-SQL语句创建表例1:创建读者类型表ReaderT
18、ypeCREATE TABLE ReaderType(TypeID int NOT NULL primary key,-类型编号,主键Typename char(8)NULL,-类型名称LimitNum int NULL,-限借数量LimitDays int NULL-借阅期限)SQL Server 20084.3.2 使用T-SQL语句创建表操作步骤:SQL Server 20084.3.2 使用T-SQL语句创建表输入后点击工具栏上的“执行”按钮,如果输入正确,就会创建相应的表,提示“命令已成功完成。”如果创建的表没有出现,在“表”节点上点击右键,选择“刷新”菜单。SQL Server 2
19、0084.3.2 使用T-SQL语句创建表输入后点击工具栏上的“执行”按钮,如果输入正确,就会创建相应的表,提示“命令已成功完成。”如果创建的表没有出现,在“表”节点上点击右键,选择“刷新”菜单。SQL Server 20084.3.2 使用T-SQL语句创建表例2:创建读者表Reader USE LibraryGOCREATE TABLE Reader(RID char(10)NOT NULL PRIMARY KEY,-读者编号,主键Rname char(8)NULL,-读者姓名TypeID int NULL,-读者类型Lendnum int NULL,-已借数量FOREIGN KEY(Ty
20、peID)REFERENCES ReaderType(TypeID)ON DELETE NO ACTION,-外键,不级联删除)SQL Server 20084.3.2 使用T-SQL语句创建表例3:创建图书表BookUSE LibraryCREATE TABLE Book(BID char(9)PRIMARY KEY,-图书编号,主键Bname varchar(42)NULL,-图书书名Author varchar(20)NULL,-作者PubComp varchar(28)NULL,-出版社PubDate datetime NULL,-出版日期Price decimal(7,2)NULL
21、CHECK(Price0)-定价,检查约束)SQL Server 20084.2.2 使用T-SQL语句创建表例4:创建图书借阅表Borrow(RID,BID,LendDate,ReturnDate)USE LibraryGOCREATE TABLE Borrow(RID char(10)NOT NULL-读者编号外键FOREIGN KEY REFERENCES Reader(RID)ON DELETE CASCADE,/*删除主表记录时级联删除子表相应记录*/BID char(9)NOT NULL-图书编号外键FOREIGN KEY REFERENCES Book(BID)ON DELETE
22、 NO ACTION,/*删除主表记录时不级联删除子表相应记录*/LendDate datetime NOT NULL DEFAULT(getdate(),/*借期,默认值为当前日期*/ReturnDate datetime NULL,-还期primary key(RID,BID,LendDate)-表级约束,主键4.3 修改表 使用使用SSMSSSMS修改表修改表1 使用使用T-SQLT-SQL语句修改表语句修改表24.3.1 使用SSMS修改表 在在【对象资源管理器对象资源管理器】窗口中,展开窗口中,展开“数据库数据库”节点节点 展开所选择的具体数据库节点,展开展开所选择的具体数据库节点,
23、展开“表表”节点节点 右键要修改的表,选择右键要修改的表,选择“设计设计”命令命令 进入表设计器即可进行表的定义的修改进入表设计器即可进行表的定义的修改4.3.2 使用T-SQL语句修改表格式:ALTER table 表名表名 (ALTER COLUMN 列名列名 列定义列定义,ADD 列名列名1 类型类型 约束,约束,DROP 列名列名 )*列定义包括列的数据类型和完整性约束列定义包括列的数据类型和完整性约束 4.3.2使用T-SQL语句修改表修改属性添加或删除列添加或删除约束4.3.2 使用T-SQL语句修改表 修改属性修改属性 例如:把表Book 中PubComp 的类型varchar(
24、28)改为varchar(30)USE Library GO ALTER TABLE Book ALTER COLUMN PubComp varchar(30)NOT NULL GO 4.3.2使用T-SQL语句修改表添加或删除列例1:为表Reader添加邮件地址 USE Library GO ALTER TABLE Reader ADD E-mail varchar(50)NULL CHECK(E-mail like%)GO 例2:为表Reader删除邮件地址。USE Library GO ALTER TABLE Reader DROP COLUMN E-mail GO说明:必须先删除其上的
25、约束说明:必须先删除其上的约束。4.3.2 使用T-SQL语句修改表添加或删除约束 例1:为表Borrow添加主键约束(假设还没有创建)。USE Library GO ALTER TABLE Borrow ADD PRIMARY KEY(RID,BID,LendDate)GO 例2:为表Borrow删除主键约束。USE Library GO ALTER TABLE Borrow DROP PRIMARY KEY(RID,BID,LendDate)GO 4.4 删除表 使用SSMS删除表1 使用T-SQL语句删除表24.4.1使用SSMS删除表 在在【对象资源管理器对象资源管理器】窗口中,展开窗
26、口中,展开“数据库数据库”节点节点 展开所选择的具体数据库节点,展开展开所选择的具体数据库节点,展开“表表”节节点点 右 键 要 删 除 的 表,选 择右 键 要 删 除 的 表,选 择“删 除删 除”命 令 或命 令 或DELETE键键4.4.2 使用T-SQL语句删除表格式:DROP TABLE 表名例如:先随便在数据库Library中建一个表Test,然后删除。USE Library GO DROP TABLE Test 4.5 插入记录 使用使用SSMSSSMS插入记录插入记录1 使用使用T-SQLT-SQL语句插入记录语句插入记录24.5.1 使用SSMS插入记录 在“对象资源管理器
27、”中展开“数据库”选择“Library”选择要进行操作的表,右击鼠标,在弹出的快捷菜单上选择“编辑前200行”菜单项,打开“表数据窗口”。插入记录 插入记录将新记录添加在表尾,可以向表中插入多条记录。插入记录的操作方法是:将光标定位到当前表尾的下一行,然后逐列输入列的值。每输入完一列的值,按回车键,光标将自动跳到下一列,便可编辑该列。若当前列是表的最后一列,则该列编辑完后按下回车键,光标将自动跳到下一行的第一列,此时上一行输入的数据已经保存,可以增加下一行。若表的某列不允许为空值,则必须为该列输入值.4.5.1 使用SSMS插入记录4.5.2 使用T-SQL语句插入记录格式:INSERT IN
28、TO(表名|视图名)列名表 VALUES(常量表)例1:插入一行所有列的值 USE Library GO INSERT into Reader VALUES(2008216001,赵成刚,3,2,)GO 例1:插入一行部分列 USE Library GO INSERT Reader(RID,Rname,TypeID)VALUES(2004060003,李亚茜,3)GO 4.6 修改记录 使用使用SSMSSSMS修改记录修改记录1 使用使用T-SQLT-SQL语句修改记录语句修改记录24.6.1 使用SSMS修改记录 在【对象资源管理器】窗口中,展开“数据库”节点 展开所选择的具体数据库节点,展
29、开“表”节点 右键要修改纪录的表,选择“编辑前200行”命令,即可修改纪录值。修改后回车保存修改。4.6.2 使用T-SQL语句修改记录格式:格式:UPDATE 表名表名 SET 列名列名1表达式表达式,列名列名n表达式表达式 where 逻辑逻辑表达式表达式例例1 1:把读者类型表:把读者类型表ReaderType中学生的限借数量中学生的限借数量5本增加本增加2本本 USE Library GO UPDATE ReaderType SET LimitNum=LimitNum+2 WHERE Typename=学生学生 GO 4.7 删除记录 使用使用SSMSSSMS删除记录删除记录1 使用使
30、用T-SQLT-SQL语句删除记录语句删除记录24.7.1 使用SSMS修改记录 在在【对象资源管理器对象资源管理器】窗口中,展开窗口中,展开“数据库数据库”节节点点 展开所选择的具体数据库节点,展开展开所选择的具体数据库节点,展开“表表”节点节点 右键要删除纪录的表,选择右键要删除纪录的表,选择“编辑前200行”命令,命令,右击要删除的行,选择右击要删除的行,选择“删除删除”命令即可删除纪录。命令即可删除纪录。4.7.2 使用T-SQL语句修改记录格式:DELETE 表名 WHERE 逻辑表达式例1:删除Borrow表中RID为2008216001的读者的借书记录USE LibraryGOD
31、ELETE Borrow WHERE RID=2008216001GO例2:删除test表中的所有记录USE LibraryGODELETE testSQL语言概述 SQL语言的特点数据定义语言数据查询语言数据操纵语言SQL语言特点 SQL语言的特点1.综合统一2.高度非过程化3.面向集合的操作方式4.以同一种语法结构提供两种使用方法5.语言简洁,易学易用5.语言简捷,易学易用数 据 定 义语言 定义基本表语句格式CREATE TABLE (,);:所要定义的基本表的名字:组成该表的各个属性(列):涉及相应属性列的完整性约束条件:涉及一个或多个属性列的完整性约束条件 例题 例1 建立一个“学生
32、”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。CREATE TABLE Student (Sno CHAR(5)NOT NULL UNIQUE,Sname CHAR(20)UNIQUE,Ssex CHAR(1),Sage INT,Sdept CHAR(15);定义基本表(续)常用完整性约束 主码约束:PRIMARY KEY 唯一性约束:UNIQUE 非空值约束:NOT NULL 参照完整性约束PRIMARY KEY与 UNIQUE的区别?例题(续)例2 建立一个“学生选课”表SC,
33、它由学号Sno、课程号Cno,修课成绩Grade组成,其中(Sno,Cno)为主码。CREATE TABLE SC(Sno CHAR(5),Cno CHAR(3),Grade int,Primary key(Sno,Cno);例题(续)SnoSnameSsexSageSdept 字字符符型型 字字符符型型 字字符符型型 整整数数 字字符符型型 长长度度为为5 5 长长度度为为2 20 0 长长度度为为1 1 长长度度为为1 15 5 不不能能为为空空值值删除基本表 DROP TABLE;基本表删除 数据、表上的索引都删除 表上的视图往往仍然保留,但 无法引用删除基本表时,系统会从数据字典中删去
34、有关该基本表及其索引的描述(标准中没有,认为表建立后就永久存在)例题例5 删除Student表 DROP TABLEStudent;修改基本表ALTER TABLE ADD 完整性约束 DROP ALTER ;:要修改的基本表 ADD子句:增加新列和新的完整性约束条件 DROP子句:删除指定的完整性约束条件 ALTER子句:用于修改列名和数据类型例题 例2 向Student表增加“入学时间”列,其数据类型为日期型。ALTER TABLE Student ADD Scome DATE;不论基本表中原来是否已有数据,新增加的列一律为空值。语句格式(续)删除属性列 直接/间接删除 把表中要保留的列及
35、其内容复制到一个新表中 删除原表 再将新表重命名为原表名直接删除属性列:(新)例:ALTER TABLE Student Drop Scome;例3 将年龄的数据类型改为半字长整数。ALTER TABLE Student MODIFY Sage SMALLINT;注:修改原有的列定义有可能会破坏已有数据例题 例4 删除学生姓名必须取唯一值的约束。ALTER TABLE Student DROP UNIQUE(Sname);数据查询语言 SQL语句命令格式单表查询连接查询小结 SQL语句命令格式 语句格式SELECT ALL|DISTINCT ,FROM,WHERE GROUP BY HAVIN
36、G ORDER BY ASC|DESC ;语句格式 SELECT子句:指定要显示的属性列 FROM子句:指定查询对象(基本表或视图)WHERE子句:指定查询条件 GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。HAVING短语:筛选出只有满足指定条件的组 ORDER BY子句:对查询结果表按指定列值的升序或降序排序 示例数据库 学生-课程数据库 学生表:Student(Sno,Sname,Ssex,Sage,Sdept)课程表:Course(Cno,Cname,Cpno,Ccredit)学生选课表:SC(Sno,Cno,Grade)数据
37、查询语言SQL语句命令格式单表查询连接查询小结 单表查询 查询仅涉及一个表,是一种最简单的查询操作一、选择表中的若干列二、选择表中的若干元组三、对查询结果排序四、使用集函数五、对查询结果分组 查询指定列(字段)例1 查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student;例2 查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,SdeptFROM Student;查询全部列例3 查询全体学生的详细记录。SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student;或SELECT *FROM Student;选择表中的若干
38、元组(记录)消除取值重复的行 查询满足条件的元组 1.消除取值重复的行 在SELECT子句中使用DISTINCT短语假设SC表中有下列数据 Sno Cno Grade -95001 1 92 95001 2 85 95001 3 88 95002 2 90 95002 3 80ALL 与 DISTINCT 例6 查询选修了课程的学生学号。(1)SELECT Sno FROM SC;或(默认 ALL)SELECT ALL Sno FROM SC;结果:Sno -95001 95001 95001 95002 95002 例题(续)(2)SELECT DISTINCT Sno FROM SC;结果
39、:Sno -95001 95002 例题(续)注意 DISTINCT短语的作用范围是所有目标列例:查询选修课程的各种成绩错误的写法SELECT DISTINCT Cno,DISTINCT GradeFROM SC;正确的写法 SELECT DISTINCT Cno,Grade FROM SC;查询满足条件的元组WHERE子句常用的查询条件(1)比较大小在WHERE子句的中使用比较运算符=,=,=,!=或,!,!,逻辑运算符NOT +比较运算符例8 查询所有年龄在20岁以下的学生姓名及其年龄。SELECT Sname,Sage FROM Student WHERE Sage=20;(2)确定范围
40、 使用谓词 BETWEEN AND NOT BETWEEN AND 例10 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。SELECT Sname,Sdept,SageFROM StudentWHERE Sage BETWEEN 20 AND 23;例题(续)例11 查询年龄不在2023岁之间的学生姓名、系别和年龄。SELECT Sname,Sdept,SageFROM StudentWHERE Sage NOT BETWEEN 20 AND 23;(3)确定集合使用谓词 IN,NOT IN :用逗号分隔的一组取值例12查询信息系(IS)、数学系(MA)和计算机科学系
41、(CS)学生的姓名和性别。SELECT Sname,SsexFROM StudentWHERE Sdept IN(IS,MA,CS);(3)确定集合例13查询既不是信息系、数学系,也不是计算 机科学系的学生的姓名和性别。SELECT Sname,SsexFROM Student WHERE Sdept NOT IN(IS,MA,CS);(4)字符串匹配 NOT LIKE ESCAPE :指定匹配模板 匹配模板:固定字符串或含通配符的字符串 当匹配模板为固定字符串时,可以用=运算符取代 LIKE 谓词 用!=或 运算符取代 NOT LIKE 谓词通配符w%(百分号)代表任意长度(长度可以为0)的
42、字符串 例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串 _(下横线)代表任意单个字符 例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串ESCAPE 短语:当用户要查询的字符串本身就含有%或 _ 时,要使用ESCAPE 短语对通配符进行转义。例题1)匹配模板为固定字符串 例14 查询学号为95001的学生的详细情况。SELECT*FROM Student WHERE Sno LIKE 95001;等价于:SELECT *FROM Student WHERE Sno=95001;例题(续)2)匹配模板为含通配
43、符的字符串例15 查询所有姓刘学生的姓名、学号和性别。SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE 刘%;例题(续)匹配模板为含通配符的字符串(续)例16 查询姓欧阳且全名为三个汉字的学生的姓名。SELECT Sname FROM Student WHERE Sname LIKE 欧阳_;例题(续)匹配模板为含通配符的字符串(续)例17 查询名字中第2个字为阳字的学生的姓名和学号。SELECT Sname,Sno FROM Student WHERE Sname LIKE _阳%;例题(续)匹配模板为含通配符的字符串(续)例18 查询所
44、有不姓刘的学生姓名。SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIKE 刘%;例题(续)3)使用换码字符将通配符转义为普通字符 例19 查询DB_Design课程的课程号和学分。SELECT Cno,Ccredit FROM Course WHERE Cname LIKE DB_Design ESCAPE 例题(续)使用换码字符将通配符转义为普通字符(续)例20 查询以DB_开头,且倒数第3个字符为 i的课程的详细情况。SELECT *FROM Course WHERE Cname LIKE DB_%i_ _ ESCAPE ;(5)涉
45、及空值的查询 使用谓词 IS NULL 或 IS NOT NULL “IS NULL”不能用“=NULL”代替例21 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。SELECT Sno,Cno FROM SC WHERE Grade IS NULL;例题(续)例22 查所有有成绩的学生学号和课程号。SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;(6)多重条件查询用逻辑运算符AND和 OR来联结多个查询条件 AND的优先级高于OR 可以用括号改变优先级可用来实现多种其他谓词 NOT IN N
46、OT BETWEEN AND 例题例23 查询计算机系年龄在20岁以下的学生姓名。SELECT Sname FROM Student WHERE Sdept=CS AND Sage=20 AND Sage=23;对查询结果排序 使用ORDER BY子句 可以按一个或多个属性列排序 升序:ASC;降序:DESC;缺省值为升序当排序列含空值时 ASC:排序列为空值的元组最后显示 DESC:排序列为空值的元组最先显示 对查询结果排序(续)例24 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。SELECT Sno,Grade FROM SC WHERE Cno=3 ORDER BY
47、Grade DESC;查询结果 Sno Grade -95010 95024 95007 92 95003 82 95010 82 95009 75 95014 61 95002 55对查询结果排序(续)例25 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。SELECT *FROM Student ORDER BY Sdept,Sage DESC;四、使用集函数 5类主要集函数 计数COUNT(DISTINCT|ALL*)COUNT(DISTINCT|ALL)计算总和SUM(DISTINCT|ALL)计算平均值AVG(DISTINCT|ALL)使用集函数(续)
48、求最大值MAX(DISTINCT|ALL)求最小值MIN(DISTINCT|ALL)DISTINCT短语:在计算时要取消指定列中的重复值 ALL短语:不取消重复值 ALL为缺省值使用集函数(续)例26 查询学生总人数。SELECT COUNT(*)FROM Student;例27 查询选修了课程的学生人数。SELECT COUNT(DISTINCT Sno)FROM SC;注:用DISTINCT以避免重复计算学生人数使用集函数(续)例28 计算1号课程的学生平均成绩。SELECT AVG(Grade)FROM SC WHERE Cno=1;例29 查询选修1号课程的学生最高分数。SELECT
49、MAX(Grade)FROM SC WHER Cno=1;五、对查询结果分组 使用GROUP BY子句分组 细化集函数的作用对象 未对查询结果分组,集函数将作用于整个查询结果 对查询结果分组后,集函数将分别作用于每个组 使用GROUP BY子句分组例30 求各个课程号及相应的选课人数。SELECT Cno,COUNT(Sno)FROM SC GROUP BY Cno;结果 Cno COUNT(Sno)1 22 2 34 3 44 4 33 5 48对查询结果分组(续)GROUP BY子句的作用对象是查询的中间结果表 分组方法:按指定的一列或多列值分组,值相等的为一组 使用GROUP BY子句后
50、,SELECT子句的列名列表中只能出现分组属性和集函数 使用HAVING短语筛选最终输出结果例31 查询选修了3门以上课程的学生学号。SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)3;例题例32 查询有3门以上课程是90分以上的 学生的学号及(90分以上的)课程数 SELECT Sno,COUNT(*)FROM SC WHERE Grade=90 GROUP BY Sno HAVING COUNT(*)=3;使用HAVING短语筛选最终输出结果 只有满足HAVING短语指定条件的组才输出 HAVING短语与WHERE子句的区别:作用对象不同 WH