数据库系统概论 3.关系数据库标准语言SQL

3.1SQL概述

3.1.1SQL的发展

SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统SystemR上实现。由于它具有功能丰富、使用方便灵活、语言简洁易学等突出的优点,深受计算机工业界和计算机用户的欢迎。1980年10月,经美国国家标准局(ANSI)的数据库委员会X3H2批准,将SQL作为关系数据库语言的美国标准,同年公布了标准SQL,此后不久,国际标准化组织(ISO)也作出了同样的决定。
目前没有一个数据库能够支持SQL标准的所有概念和特性;同时各大软件厂商对SQL基本命令集还进行了不同程度的扩充和修改,又可以支持标准以外的一些功能特性。

3.1.2SQL的特点

SQL从功能上可以分为3部分:数据定义、数据操纵和数据控制。
其主要特点包括:
1.综合统一
数据描述、操纵、控制等功能一体化,可以独立完成数据库生命周期中的全部活动,包括:定义和修改、删除关系模式,定义和删除视图,插入数据,建立数据库;对数据库中的数据进行查询和更新;数据库重构和维护;数据库安全性、完整性控制,以及事务控制;嵌入式SQL和动态SQL定义。
2.高度非过程化
非关系数据库使用的是过程化语言,需要制定存储路径来完成请求,SQL非过程化,存取路径对用户是透明的。
3.面向集合的操作方式
操作对象、查询结果可以是元组的集合;插入、删除、更新操作的对象也是元组的集合。
4.以同一种语法结构提供多种使用方式
SQL即使独立的语言,又是嵌入式语言,可以嵌入到高级语言中。
5.语言简洁,易学易用
完成核心功能只用了9个动词,接近英语口语,易于学习使用。

3.1.3SQL的基本概念

支持SQL的关系数据库管理系统同样支持数据库三级模式结构。
在这里插入图片描述

3.2学生-课程数据库(样例)

学生-课程模式S-T
学生表:Student(Sno,Sname,Ssex,Sage,Sdept)
课程表:Course(Cno,Cname,Cpno,Ccredit)
学生选课表:SC(Sno,Cno,Grade)
表数据如下:
在这里插入图片描述

3.3数据定义

SQL的数据定义功能包括模式定义、表定义、视图和索引的定义。

3.3.1模式的定义与删除

定义模式:
CREATE schema 模式名 AUTHORIZATION 用户名;
如果要创建模式,那么该用户必须有数据库管理员权限或获得了数据库管理员授予的CREATE schema权限。
例:为用户WANG定义一个模式:S-T
CREATE schema “S-T” AUTHORZATION WANG;
用户还可以在创建模式时创建表:
例:为用户WANG创建一个模式TEST,并定义一个表TAB
CREATE schema “TEST” AUTHORZATION WANG
CREATE TABLE TAB(COL1 INT,
COL2 CHAR(20)
);
删除模式:
DORP schema 模式名 CASCDE|RESTRICT;
其中CASCDE|RESTRICT必选其一,CASCDE(级联):在删除模式时把该模式的所有数据库对象全部删除;RESTRICT(限制):如果删除模式时,该模式已经定义了下属的数据库对象(表、视图)则拒绝执行删除。
例:删除模式TEST
DROP schema “TEST” CASCDE;
则表TAB也被删除,如果执行DROP schema “TEST” RESTRICT;则模式不会被删除。

3.3.2基本表的定义、删除和修改

定义基本表:
创建了模式就创建了一个数据库的命名空间,一个框架,而基本表则是这个命名空间中的数据,基本表的创建格式如下:
CREATE table 表名(列名1 数据类型 列级完整性约束条件,
列名2 数据类型 列级完整性约束条件
……
表级约束条件
);
例:建立一个学生表Student
CREATE table Student(Sno CHAR(9) PRIMARY KEY, /列级完整性约束条件,Sno为主码/
Sname CHAR(20) UNIQUE, /列级完整性约束条件,Sname值唯一/
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
FOREIGN KEY(参照列名) REFERENCES 被参照表名(被参照列名)/表级完整性约束条件/
);
数据类型:
(1)二进制数据类型
二进制数据包括 Binary、Varbinary 和 Image
Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。
Binary[(n)] 是 n 位固定的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储空间的大小是 n + 4 个字节。
Varbinary[(n)] 是 n 位变长度的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储空间的大小是 n + 4个字节,不是n 个字节。
在 Image 数据类型中存储的数据是以位字符串存储的,不是由 SQL Server 解释的,必须由应用程序来解释。例如,应用程序可以使用BMP、TIEF、GIF 和 JPEG 格式把数据存储在 Image 数据类型中。
(2)字符数据类型
字符数据的类型包括 Char,Varchar 和 Text
字符数据是由任何字母、符号和数字任意组合而成的数据。
Varchar 是变长字符数据,其长度不超过 8KB。Char 是定长字符数据,其长度最多为 8KB。超过 8KB 的ASCII 数据可以使用Text数据类型存储。例如,因为 Html 文档全部都是 ASCII字符,并且在一般情况下长度超过 8KB,所以这些文档可以 Text 数据类型存储在SQL Server 中。
(3)Unicode 数据类型
Unicode 数据类型包括 Nchar,Nvarchar 和Ntext
在 Microsoft SQL Server 中,传统的非 Unicode 数据类型允许使用由特定字符集定义的字符。在 SQL Server安装过程中,允许选择一种字符集。使用 Unicode 数据类型,列中可以存储任何由Unicode 标准定义的字符。在 Unicode 标准中,包括了以各种字符集定义的全部字符。使用Unicode数据类型,所占用的空间是使用非Unicode数据类型所占用的空间大小的两倍。
在 SQL Server 中,Unicode 数据以 Nchar、Nvarchar 和 Ntext 数据类型存储。使用这种字符类型存储的列可以存储多个字符集中的字符。当列的长度变化时,应该使用Nvarchar字符类型,这时最多可以存储 4000 个字符。当列的长度固定不变时,应该使用 Nchar字符类型,同样,这时最多可以存储4000 个字符。当使用 Ntext 数据类型时,该列可以存储多于 4000 个字符。
(4)日期和时间数据类型
日期和时间数据类型包括 Datetime 和 Smalldatetime两种类型
日期和时间数据类型由有效的日期和时间组成。例如,有效的日期和时间数据包括“4/01/98 12:15:00:00:00 PM”和“1:28:29:15:01AM 8/17/98”。前一个数据类型是日期在前,时间在后;后一个数据类型是时间在前,日期在后。在 Microsoft SQL Server中,日期和时间数据类型包括Datetime 和 Smalldatetime 两种类型时,所存储的日期范围是从 1753 年 1 月 1 日开始,到9999 年12 月 31 日结束(每一个值要求 8 个存储字节)。使用 Smalldatetime 数据类型时,所存储的日期范围是 1900年 1 月 1日 开始,到 2079 年 12 月 31 日结束(每一个值要求 4 个存储字节)。
日期的格式可以设定。设置日期格式的命令如下:
Set DateFormat {format | @format _var|
其中,format | @format_var 是日期的顺序。有效的参数包括 MDY、DMY、YMD、YDM、MYD 和 DYM。在默认情况下,日期格式为MDY。
例如,当执行 Set DateFormat YMD 之后,日期的格式为年 月 日 形式;当执行 Set DateFormat DMY 之后,日期的格式为日 月有年 形式
(5)数字数据类型
数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数
整数由正整数和负整数组成,例如 39、25、0-2 和 33967。在 Microsoft SQL Server 中,整数存储的数据类型是 Int,Smallint和 Tinyint。Int 数据类型存储数据的范围大于 Smallint 数据类型存储数据的范围,而 Smallint 据类型存储数据的范围大于Tinyint 数据类型存储数据的范围。使用 Int 数据类型存储数据的范围是从 -2 147 483 648 到 2 147 483 647(每一个值要求4个字节存储空间)。使用 Smallint 数据类型时,存储数据的范围从 -32 768 到 32 767(每一个值要求2个字节存储空间)。使用Tinyint 数据类型时,存储数据的范围是从0 到255(每一个值要求1个字节存储空间)。
精确小数数据在 SQL Server 中的数据类型是 Decimal 和 Numeric。这种数据所占的存储空间根据该数据的位数后的位数来确定。Decimal 数据类型使用128位来表示值来用作数值计算。
在SQL Server 中,近似小数数据的数据类型是 Float 和 Real。例如,三分之一这个分数记作0.333333,当使用近似数据类型时能准确表示。因此,从系统中检索到的数据可能与存储在该列中数据不完全一样。
(6)货币数据类型
在 Microsoft SQL Server 中,货币数据的数据类型是Money 和 Smallmoney
Money数据类型要求 8 个存储字节,Smallmoney 数据类型要求 4 个存储字节。
(7)特殊数据类型
特殊数据类型包括前面没有提过的数据类型。特殊的数据类型有3种,即 Timestamp、Bit 和 Uniqueidentifier。
Timestamp 用于表示SQL Server 活动的先后顺序,以二进投影的格式表示。Timestamp 数据与插入数据或者日期和时间没有关系。Timestamp 类型的字段是一个基于系统时钟在数据行被创建或修改时由SQL Server自动填充的值。
Bit 由 1 或者 0 组成。当表示真或者假、ON 或者 OFF 时,使用 Bit 数据类型。例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。
Uniqueidentifier 由 16字节的十六进制数字组成,表示一个全局唯一的。当表的记录行要求唯一时,GUID是非常有用。例如,在客户标识号列使用这种数据类型可以区别不同的客户。
模式与表:
每一个基本表都属于某一种模式,一个模式包含多个基本表,定义基本表时可以指定其模式;方法一:在表名中明显的给出模式名,例:CREATE table “S-T”.Student(……);这样就知道Student表属于S-T模式;方法二:在创建模式的同时直接创建表;方法三:设置所属的模式,这样在创建表时,表名中不必给出模式名。
如果不给定模式名,数据库管理系统会根据搜索路径的结果,获取数据库中的模式列表,并将此表划入模式列表中的第一个模式中;使用SHOW search_path;会显示当前的搜索路径,默认值为$user.PUBLIC,数据库管理员也可以设置搜索路径:SET search_path TO “S-T”,PUBLIC;这样不说明模式创建表时,机会优先划入S-T模式中。
修改基本表:
ALTER TABLE 表名
例:向Student表中加入入学时间列,数据类型为日期型
ALTER TABLE Student ADD S_entrance DATE;
例:将年龄的数据类型由字符型改为整数型
ALTER TABLE Student ALTER COLUMN Sage INT;
例:增加课程名称为唯一值的约束条件
ALTER TABLE Course ADD UNIQUE(Cname);
删除基本表:
DROP TABLE 表名 CASCDE|RESTRICT;

3.3.3索引的建立与删除

索引:提供多种存取路径,加快查找速度。
索引的多种类型:
顺序文件上的索引:按指定属性值升序或降序存储的关系,在该属性上建立一个顺序索引文件,索引文件由属性值和相应的元组指针组成。
B+树索引:将索引属性组织成B+树的形式,B+树的叶节点为属性值和相应的元组指针,具有动态平衡的特点。
散列索引:建立若干个桶,将索引属性按照其散列函数值映射到相应的桶中,桶中存放索引属性值和相应的元组指针,查找速度快。
位图索引:用位向量记录索引属性中可能出现的值,每个位向量对应一个可能值。
索引需要占用一定的存储空间,用户不必也不能显式选择索引,索引一般由建表人创建,属于内模式范畴。
建立索引:
CREATE (UNIQUE)(CLUSTER) INDEX 索引名 ON 表名(列名 次序,列名 次序……);
UNIQUE:此索引的每一个索引值只对应唯一的数据记录;
CLUSTER:建立聚簇索引;
次序可以为ASC(升序)、DESC(降序),默认值为ASC。
修改索引:
ALTER INDEX 旧索引名 RENAME TO 新索引名;
删除索引:
DROP INDEX 索引名;

3.3.4数据字典

数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明,使用数据字典为简单的建模项目。简而言之,数据字典是描述数据的信息集合,是对系统中使用的所有数据元素的定义的集合。
数据字典(Data dictionary)是一种用户可以访问的记录数据库和应用程序元数据的目录。主动数据字典是指在对数据库或应用程序结构进行修改时,其内容可以由DBMS自动更新的数据字典。被动数据字典是指修改时必须手工更新其内容的数据字典。

3.4数据查询

数据查询是数据库的核心操作。

3.4.1单表查询

一般格式:
USE 数据库名
SELECT 目标表达式
FROM 表名
WHERE 查询条件
1.查询指定列
例:查询全体学生的学号与姓名
SELECT Sno,Sname
FROM Student;
执行流程:从Student表中取出一个元组,取出该元组在输赢Sno和Sname上的值,形成一个新的元组作为输出,对表中的所有元组做相同的处理,最后形成一个结果关系作为输出。
SELECT后的列的先后顺序可以与表中的顺序不一致。
2.查询全部列
例:查询全体学生的详细信息
SELECT *
FROM Student;
(如果显示的顺序和表中列的顺序相同就可以用号直接输出)
3.查询经过计算的值
SELECT后的目标表达式不仅仅可以是表中的属性列,也可以是表达式。
例:查询全体学生的姓名以及出生年份
SELECT Sname,2019-Sage BIRTHDAY /用当前年份减去年龄得出生年份,空格后的字符串可以用来表示这个表达式的值的名称/
FROM Student;
运行结果:
Sname BIRTHDAY
李勇 1999
刘晨 2000
王敏 2001
张立 1999
补充:
小写表示系名:LOWER(Sdept)
每个元组的某一列都显式的表示出YEAR OF BIRTH:’YEAR OF BIRTH’
4.消除取值重复的行
重复的元组可以用DISTINCT消除;
例:查询选修了课程的学生学号(不重复)
SELECT DISTINCT Sno
FROM SC;
(一般的默认值为ALL,默认全部显示)
5.查询满足条件的元组
(1)比较大小
常用的比较运算符:=、>、<、>=、<=、!=、!>、!<
例:查询计算机科学系全体学生的名单
SELECT Sname
FROM Student
WHERE Sdept=’CS’;
数据库可能的执行过程:对FROM中的表进行扫描,取出一个元组就检查元组的Sdept属性的值是否为CS,如是则取出。
(2)确定范围
常用BETWEEN…AND…和NOT BETWEEN…AND…
例:查询年龄在20-23岁之间的学生的姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
(3)确定集合
常用谓词IN、NOT IN
例:查询计算机科学系(CS)、数学系(MA)、信息系(IS)学生的姓名和性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN(‘CS’,’MA’,’IS’);
(4)字符匹配
一般格式:(NOT) LIKE ‘匹配串’ ESCAPE ‘换码字符’
匹配串可以含通配符%和_:
%:代表任意长度的字符串
_:代表任意单个单词
例:查询所有姓刘的学生的姓名、学号、性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE ‘刘%’;
例:查询所有名字第二个字为阳的学生的姓名、学号、性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE ‘_阳’;
当匹配串中的字符和通配符冲突时,就需要使用换码字符;
例:查询DB_Design课程的课程号和学分
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE ‘DB_Design’ ESCAPE ‘\’;
(当ESCAPE规定\为换码字符后,匹配串中如果出现\,则后面一个字符不会被当做通配符读取。)
(5)涉及空值的查询
例:查询缺少考试成绩的学生的学号、课程号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;
(6)多重条件查询
可以使用逻辑运算符AND或者OR,AND优先级高于OR,但可以用括号来改变优先级;
例:查询计算机科学系年龄在20岁以下的学生姓名
SELECT Sname
FROM Student
WHERE Sdept = ‘CS’ AND Sage < 20;
6.ORDER BY子句
用户可以使用ORDER BY子句对查询结果按照一个或多个属性列的升序或降序排列,默认为升序。
例:查询全体学生的情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
7.聚集函数
聚集函数是以值是一个集合(集或者多重集)为输入、返回单个值得函数。SQL提供了五个固有聚集函数:平均值:avg(DISTINCT|ALL 列名)、最小值:min(DISTINCT|ALL 列名)、最大值:max(DISTINCT|ALL 列名)、总和:sum(DISTINCT|ALL 列名)、计数:count(DISTINCT|ALL 列名);
当聚集函数遇到空值时,除COUNT(
)外,都跳过空值处理非空值。
8.GROUP BY子句
GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组;
GROUP BY中出现的字段,必须同时在SELECT中出现;
SELECT中出现的,为使用聚合函数的字段,必须同时出现在GROUP BY后(比如HAVING字段)
WHERE作用于基本表或者视图,HAVING短语作用于组,作用对象不同。
例:查询选修了三门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) > 3;

3.4.2连接查询

等值与非等值连接查询:
连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:
表名1.列名1 比较运算符 表名2.列名2
当连接字符为=时,称为等值连接,使用其他运算符时称为非等值连接;连接谓词中的列名称为连接字段;连接条件中的各连接字段类型必须是可比的,名字可以不同。
例:查询每个学生及其选修课程的情况
SELECT Student.,SC.
FROM Student,SC
WHERE Student.Sno=SC.Sno;
嵌套循环连接算法:
首先在Student表中找到第一个元组,再从头扫描SC表,逐一查找与Student第一个元组Sno相等的SC元组,找到后就将两个元组拼接,形成结果表中的一个元组;后续仿照此法运行,得到结果表。
若在等值连接中,把目标列中重复的属性列去掉则为自然连接。
例:查询每个学生及其选修课程的情况
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno;
自身连接:
一个表与其自己进行连接,称为表的自身连接。
例:查询每一门课的间接先修课(先修课的先修课)
将Course表与自身相连,并且为Course表取两个别名,一个叫FIRST,一个叫SECOND;
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND /为Course表取别名/
WHERE FIRST.Cpno=SECOND.Cno;
外连接:
在第二章2.4.2中讲解过外连接的概念
例:查询每个学生的修课情况,未修课显示空值(使用左外连接)
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);
多表连接:
可以与两个及以上的表进行连接。
例:查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;

3.4.3嵌套查询

一个SELECT-FROM-WHERE语句称为一个查询块;将一个查询块嵌入到另一个查询块的WHERE或HAVING语句中的查询叫做嵌套查询;上层的查询块叫做外层查询或父查询,下层查询块叫做内层查询或子查询;SQL允许多层嵌套,子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY只能对最终结果表进行排序。
带有IN谓词的子查询
例:查询与“刘晨”同在一个系的学生
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname=’刘晨’
);
该查询结构中,子查询的查询条件不依赖于父查询,称为不相关子查询。
例:查询选修了课程名为“信息系统”的学生学号和姓名
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Con IN
(SELECT Cno
FROM Course
WHERE Cname=’信息系统’
)
);
如果查询结构中的子查询结果依赖于父查询,则称为相关子查询,整个查询语句称为相关嵌套子查询。
带有比较运算的子查询:
父查询与子查询之间用比较运算符进行连接。
例:找出没给给学生超过他自己选修课程平均成绩的课程号
SELECT Sno,Cno
FROM SC x
WHERE Grade >=(SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno);
此例为相关子查询。
带有ANY(SOME)或ALL谓词的子查询:
子查询返回单值时可以用比较运算符,而使用ANY或ALL谓词时则必须同时使用比较运算符,其语义为:

ANY 大于子查询结果的某个值
ALL 大于子查询结果中的所有值
<ANY 小于子查询结果中的某个值
<ALL 小于子查询结果中的所有值
=ANY 大于等于子查询结果中的某个值
=ALL 大于等于子查询结果中的所有值
<=ANY 小于等于子查询结果中的某个值
<=ALL 小于等于子查询结果中的所有值
=ANY 等于子查询结果中的某个值
=ALL 等于子查询结果中的所有值(通常没有实际意义)
!=(或<>)ANY 不等于子查询结果中的某个值
!=(或<>)ALL 不等于子查询结果中的任何一个值
例:查询其他系中比信息系某一学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<ANY(SELECT Sage
FROM Student
WHERE Sdept=‘IS’)
AND Sdept<>‘IS’;
用聚集函数实现子查询通常比直接用ANY或ALL查询效率要高。
带有EXISTS谓词的子查询:
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
例:查询所有选修了1号课程的学生
SELECT Sname
FROM Student
WHERE EXISTS(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno=’1‘);

3.4.4集合查询

集合操作主要包括并操作UNION、交操作INTERSECT和差操作EXCEPT。
并操作UNION:
例:查询计算机科学系的学生及年龄不大于19岁的学生
SELECT *
FROM Student
WHERE Sdept=’CS’
UNION
SELECT *
FROM Student
WHERE Sage<=19;
交操作INTERSECT:
例:查询计算机科学系的学生与年龄不大于19岁的学生
SELECT *
FROM Student
WHERE Sdept=’CS’
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19;
差操作EXCEPT:
例:查询计算机科学系的学生与年龄不大于19岁的学生的差集
SELECT *
FROM Student
WHERE Sdept=’CS’
EXCEPT
SELECT *
FROM Student
WHERE Sage<=19;

3.5数据更新

3.5.1插入数据

插入元组格式:
INSERT
INTO 表名(属性列名1,属性列名2…)
VALUES (常量1,常量2…);
如果INTO子句中没有出现的属性列,那么新元组中会补上空值NULL,如果属性列有NOT NULL的限定,则插入元组时必须赋值。
例:插入一条选课记录(‘201215128’,’1’)(SC表中有Sno,Cno,Grade三列)
INSERT
INTO SC(Sno,Cno)
VALUES(‘201215128’,’1’,NULL);
等价于:
INSERT
INTO SC(Sno,Cno)
VALUES(‘201215128’,’1’);
插入子查询结果:
语句格式:
INSERT
INTO 表名(属性名1,属性名2…)
子查询;
例:对每一个系,求学生的平均年龄,并把结果存入数据库。
INSERT
INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;

3.5.2修改数据

基本格式:
UPDATE 表名
SET 列名1=表达式1,列名2=表达式2…
WHERE 条件语句
例:将学生201215121的年龄改为22岁
UPDATE Student
SET Sage=22
WHERE Sno=’201215121’;
例:将所有学生的年龄增加1岁
UPDATE Student
SET Sage=Sage+1;
带子查询的修改语句:
例:将计算机科学系全体学生的成绩置零
UPDATE SC
SET Grade=0
WHERE Sno IN
(SELETE Sno
FROM Student
WHERE Sdept=’CS’);

3.5.3删除数据

语句的一般格式:
DELETE
FROM 表名
WHERE 条件语句;
其中,DELETE只是删除表中的数据,不改变表中的定义。
例:删除学号为201215128的学生记录
DELETE
FROM Student
WHERE Sno=’201215128’;
例:删除所有学生的选课记录
DELETE
FROM SC;
带子句的删除语句:
例:删除计算机科学系所有学生的选课记录
DELETE
FROM SC
WHERE Sno IN(SELETE Sno
FROM Student
WHERE Sdept=’CS’);

3.6视图

视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
SQL CREATE VIEW 语法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
SQL CREATE VIEW 实例
可以从某个查询内部、某个存储过程内部,或者从另一个视图内部来使用视图。通过向视图添加函数、join 等等,我们可以向用户精确地提交我们希望提交的数据。
样本数据库 Northwind 拥有一些被默认安装的视图。视图 “Current Product List” 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
我们可以查询上面这个视图:
SELECT * FROM [Current Product List]
Northwind 样本数据库的另一个视图会选取 Products 表中所有单位价格高于平均单位价格的产品:
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)
我们可以像这样查询上面这个视图:
SELECT * FROM [Products Above Average Price]
另一个来自 Northwind 数据库的视图实例会计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 “Product Sales for 1997” 的视图那里选取数据:
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName
我们可以像这样查询上面这个视图:
SELECT * FROM [Category Sales For 1997]
我们也可以向查询添加条件。现在,我们仅仅需要查看 “Beverages” 类的全部销量:
SELECT * FROM [Category Sales For 1997]
WHERE CategoryName=‘Beverages’
SQL 更新视图
您可以使用下面的语法来更新视图:
SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
现在,我们希望向 “Current Product List” 视图添加 “Category” 列。我们将通过下列 SQL 更新视图:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No
SQL 撤销视图
您可以通过 DROP VIEW 命令来删除视图。
SQL DROP VIEW Syntax
DROP VIEW view_name

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值