《第四章关系数据库查询语.ppt》由会员分享,可在线阅读,更多相关《第四章关系数据库查询语.ppt(111页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第4 章 关系数据库查询语言SQL 要点要点:SQL基本概念、特点基本概念、特点数据定义语句、数据查询语句、数据操纵语句数据定义语句、数据查询语句、数据操纵语句视图视图 嵌入式嵌入式SQL 存储过程与函数存储过程与函数 SQL的基本概念 SQL的发展 1974年由Boyce和Chamberlin首先提出其后经历了ANSI(美国国家标准机构)SQL、SQL-92、SQL-99、SQL-2003、SQL-2006和SQL-2008等标准SQL的特点 SQL功能强大集数据定义语言(DDL)、数据操纵语言(DML)和数据控制语言(DCL)于一体,使用统一的语法形式,完成数据定义、数据查询、数据更新和数
2、据控制功能,易学易用。对SQL语句的解释由DBMS完成,语句对在何处断行没有特别的要求,对大小写不敏感。SQL的操作对象和操作结果都是元组的集合。SQL是高度非过程化的语言。SQL数据类型 字符串:CHAR(n),NCHAR(n),VARCHAR(n),NVARCHAR(n)整数:SHORTINT、INT(或INTEGER)浮点数:FLOAT,REAL,DOUBLE定点数:DECIMAL(n,d)或NUMERIC(n,d)表示由n位有效数字(不包括符号和小数点)组成的十进制定点数,小数点后有d位数字。日期和时间:分别用DATE和TIME表示,实际上是某个特定格式的字符串,日期形如YYYY-MM
3、-DD(年-月-日),时间形如HH:MM:SS(时:分:秒)。其它类型:大文本TEXT,BLOB大二进制,Geometry等数据定义语句DDL(Data Definition Language,数据定义语言)定义和修改关系数据库的逻辑结构,包括基本表(关系模式)、视图、索引和域。定义信息保存在数据字典中。SQL Server 中 以 sys 开始的一系列表数据字典是数据库系统中各类数据描述的一个集合。关系模式的定义与删除CREATE TABLE表名表名(属性列名数据类型属性列名数据类型列级完整性约束列级完整性约束 ,属性列名数据类型属性列名数据类型列级完整性约束列级完整性约束 ,表级完整性约束
4、表级完整性约束);数据定义语言DDL完整性约束的定义形式主要有以下5种:NOT NULL:列级完整性约束,表示某个属性不能取空值。UNIQUE:列级完整性约束,表示某个属性的取值必须唯一。PRIMARY KEY:可以作为列级完整性约束,表示某个属性为主码;也可以作为表级完整性约束,用PRIMARY KEY()子句来定义,表示属性列表共同构成这个表的主码;数据定义语言DDL CHECK()子句:作为表级完整性约束,说明每个进入表中的元组必须满足的条件。FOREIGN KEY()REFERENCES(属性名2)子句:作为表级完整性约束,说明表的外码,表示所定义表中的属性(即“属性名1”)与另一个表
5、中的属性(即“属性名2”)相对应。服装销售 数据库 数据数据定义语言 Create Table【例4-1】建立第3章服装销售系统数据库中的各个表。CREATE TABLE 服装服装(服装编号服装编号 char(4)NOT NULL UNIQUE,品牌品牌 char(20),型号型号 char(5),颜色颜色char(2),价格价格 unsigned int,PRIMARY KEY(服装编号服装编号);/与与NOT NULL UNIQUE等价,可省略等价,可省略数据定义语言 Create TableCREATE TABLE 顾客顾客(顾客编号顾客编号 char(4),姓名姓名 char(20),
6、性别性别 char(2),年龄年龄 unsigned int,电话电话 char(11),PRIMARY KEY(顾客编号顾客编号);CREATE TABLE 顾客顾客(顾客编号顾客编号 char(4)PRIMARY KEY,姓名姓名 char(20),性别性别 char(2),年龄年龄 unsigned int,电话电话 char(11);数据定义语言 Create TableCREATE TABLE 购买记录购买记录(服装编号服装编号 char(4),顾客编号顾客编号 char(4),购买日期购买日期 date,数量数量 unsigned int,PRIMARY KEY(服装编号服装编号,
7、顾客编号顾客编号),FOREIGN KEY(服装编号服装编号)REFERENCES 服装服装(服装服装编号编号),FOREIGN KEY(顾客编号顾客编号)REFERENCES 顾客顾客(顾客顾客编号编号);数据定义语言 Drop TableDROP TABLE;用DROP TABLE语句将某个基本表删除后表中的数据连同表的结构都从数据库中消失了。【例4-2】删除顾客关系。DROP TABLE 顾客顾客;数据定义语言 Alter Table基本表建立以后,可根据实际需要对其结构进行修改,如增加列或删除约束等。增加列默认为空,不能使用NOT NULL约束。ALTER TABLE ADD 完整性约
8、束完整性约束1,完整性约束完整性约束n DROP MODIFY();数据定义语言 Alter Table【例4-3】向顾客关系中增加“地址”属性。ALTER TABLE 顾客顾客 ADD 地址地址 char(50);【例4-4】修改顾客关系属性姓名为30位定长字符串。ALTER TABLE 顾客顾客 MODIFY 姓名姓名 char(30);域定义域约束是最基本的完整性约束形式。当向数据库中插入数据时,数据库管理系统会检测插入的数据是否符合域的约束。域定义语句的语法如下:CREATE DOMAIN NOT NULL DEFAULT CHECK;【例4-5】定义地址域,允许为空值。CREATE
9、DOMAIN 地址地址 CHAR(50)NULL;索引Index 索引的定义有利于提高查询速度,SQL可以创建和删除索引文件。基本表建立以后,数据库管理员或表的建立者可以根据需要在基本表上建立一个或多个索引文件,以提供多种存取路经,加快存取速度。索引Index 索引的定义:CREATE UNIQUE CLUSTER INDEX索引名索引名 ON表名表名(属性列名属性列名ASC|DESC ,属性列名属性列名ASCDESC);UNIQUE表示索引的每一个索引值只对应唯一的数据记录CLUSTER:建聚簇索引,即索引项顺序与表中记录的物理顺序一致,一个基表只能建一个聚簇索引ASC(升序,缺省)、DES
10、C(降序)索引建立后由系统使用和维护,不需用户干预索引Index【例4-6】为顾客关系按姓名的升序建立聚簇索引。CREATE CLUSTERED INDEX IdxCname ON 顾客顾客(姓姓名名);【例4-7】为购买记录关系按顾客编号的升序、服装编号的降序建立索引文件。CREATE INDEX IdxCCID ON购买记录购买记录(顾客编号顾客编号,服装编号服装编号 DESC);【例4-8】为服装关系按价格的降序建立唯一性索引。CREATE UNIQUE INDEX IdxCprice ON 服装服装(价格价格 DESC);索引Index索引的删除:当一个索引不再需要时,就可以用DROP
11、 INDEX语句将其删除,格式如下:DROP INDEX;【例4-9】删除会员信息关系的索引IdxCname。DROP INDEX IdxCname;数据查询语句 所谓数据查询,就是从数据库所保存的众多数据中挑出符合某种条件的一部分数据,或者将这些数据挑出来之后对它们进行适当的运算,然后得到某种汇总结果(即统计信息)。数据查询的对象可以是基本表,也可以是视图查询语句的基本结构 SELECT ALL|DISTINCT,FROM,WHERE GROUP BY HAVING ORDER BY ASC|DESC;数据查询整个SELECT语句的含义是,1.根据WHERE子句的条件表达式,从FROM子句指
12、定的基本表或视图中找出满足条件的元组,2.再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。3.如果有GROUP BY子句,则将结果按“列名1”的值进行分组,该属性列值相等的元组为一个组。通常会对每组中的记录用集函数。4.如果有GROUP子句带HAVING短语,则只有满足指定条件的组才予输出。5.如果有ORDER BY子句,则结果表还要按“列名2”的值的升序(ASC,系统默认值)或降序(DESC)排序。简单SQL查询简单查询又叫单表查询,是指查询条件和内容都只涉及一个基本表的查询。【例4-10】查询所有顾客的信息。SELECT*FROM 顾客顾客;SELECT子句指出被选择的
13、目标列表的名称,“*”表示表的所有属性,FROM子句指出表的名称,查询结果就是会员信息关系中所有顾客的信息。简单SQL查询【例4-11】查询所有顾客的编号、姓名及电话。SELECT 顾客编号顾客编号,姓名姓名,电话电话 FROM 顾客顾客;简单SQL查询DISTINCT【例4-12】查询购买了服装的顾客编号。SELECT DISTINCT 顾客编号顾客编号 FROM 购买记录购买记录;用DISTINCT去掉重复行。如果没有指定DISTINCT短语,则默认为ALL,即保留结果表中取值重复的行。简单SQL查询WHERE子句 WHERE用来设定关系中的元组选择条件,只有满足这些条件的元组才能出现在结
14、果中,相当于关系代数中的选择操作。WHERE子句常用的查询条件可以是关系表达式或逻辑表达式,可以使用(NOT)IN、IS(NOT)NULL、(NOT)BETWEEN AND、(NOT)LIKE等谓词。简单SQL查询 复合条件【例4-13】查询20岁以下的女顾客的编号和姓名。SELECT 顾客编号顾客编号,姓名姓名 FROM 顾客顾客 WHERE 年龄年龄20 AND 性别性别=女女;查询条件可以是使用=、(或!=)、=、=B AND A=C”。与之相对的表达式是“A NOT BETWEEN B AND C”,用于查找属性值不在指定范围内的元组。简单SQL查询 in【例4-15】查询来自“佐丹奴
15、”和“李宁”两个品牌的服装的信息。SELECT*FROM 服装服装 WHERE 品牌品牌 IN(佐丹奴佐丹奴,李宁李宁);谓词IN用来确定集合,可以用来查找属性值属于指定集合的元组。与之相对的谓词是NOT IN,用于查找属性值不属于指定集合的元组。简单SQL查询 Like【例4-16】查询所有姓王的顾客的信息。SELECT*FROM 顾客顾客 WHERE 姓名姓名 LIKE 王王%;使用使用LIKE谓词,可以查询指定的属性列值与谓词,可以查询指定的属性列值与相匹配的元组。其格相匹配的元组。其格式如下:式如下:NOT LIKE ESCAPE 可以是一个完整的字符串,也可以含有通配符可以是一个完整
16、的字符串,也可以含有通配符“%”或或“_”。“%”表示可以用任意长度的字符串替代。表示可以用任意长度的字符串替代。“_”表示可以用任意单个字符替代。表示可以用任意单个字符替代。如如acb、aaccb、ab等都与匹配串等都与匹配串“a%b”匹配,匹配,acb、adb等都与匹配串等都与匹配串“a_b”匹配。匹配。简单SQL查询字符 _%【例4-17】查询所有姓李但全名为两个字的顾客的信息。SELECT*FROM 顾客顾客WHERE 姓名姓名 LIKE李李_ _;注意:一个汉字要占两个字符的位置,所以匹配串李后面需要跟两个空格。【例4-18】查询所有不姓李的顾客的信息。SELECT*FROM 顾客顾
17、客WHERE 姓名姓名 NOT LIKE 李李%;简单SQL查询字符_%转意但当“%”或“_”不是作为匹配串而是数据库中某字符串属性值的组成部分时,就需要告诉系统“%”或“_”需要进行转义。转义的方法是使用“ESCAPE”短语,用户可以自己设定换码字符,如“”、“y”等。例如,“LIKE%ESCAPE”中使用了“ESCAPE”短语,就表明“”是换码字符,匹配串“%”中的“%”指的是普通字符“%”,因此该匹配串将匹配所有以“%”开始并以“%”结束的字符串。简单SQL查询字符_%转意【例4-19】查询姓名包含Kim_Jae的顾客的信息。SELECT*FROM 顾客顾客 WHERE 姓名姓名 LIK
18、E%Kim_Jae%ESCAPE;通过转义,“”后面的“_”作为一个普通字符使用。简单SQL查询NULL空值判断属性值或输入值是否为空值,可以用谓词IS NULL和IS NOT NULL,这里的“IS”不能用“”代替。【例4-20】查询电话是空值的顾客的姓名和性别。SELECT 姓名姓名,性别性别 FROM 顾客WHERE 电话电话 IS NULL;【例4-21】查询电话不是空值的顾客的姓名和性别。SELECT 姓名姓名,性别性别 FROM 顾客WHERE 电话电话 IS NOT NULL;简单SQL查询ORDER BY 返回查询结果时,元组的排列顺序与数据的存储顺序相同。如果用户需要按照某种
19、指定的顺序来显示查询结果,就需要使用ORDER BY子句。该子句只作用于查询结果,并不会改变数据库中的实际存储顺序。排序的依据可以是基于一个或多个属性数据。当依据多个属性排序时,如果第一个属性值相等,就按照第二个属性值排序,以此类推。简单SQL查询ORDER BY【例4-22】查询所有顾客的姓名和年龄,并按照年龄降序排列。SELECT 姓名,年龄 FROM 顾客 ORDER BY 年龄 DESC;【例4-23】查询顾客C001的购买记录,按购买日期降序排列,相同购买日期的按数量升序排列。SELECT*FROM 购买记录 WHERE 顾客编号=C001 ORDER BY 购买日期 DESC,数量
20、;简单SQL查询聚集函数聚集函数(聚集函数(Aggregation Function)是一组对查询结果中的某属性列进行统)是一组对查询结果中的某属性列进行统计的函数,包括:计的函数,包括:COUNT(DISTINCT):统计该属性列中值的个数,如果加:统计该属性列中值的个数,如果加DISTINCT,表示统计时不考虑重复值;,表示统计时不考虑重复值;COUNT(*):统计关系中元组的个数。统计关系中元组的个数。SUM(DISTINCT):统计该属性列中值的总和。该属性必须是:统计该属性列中值的总和。该属性必须是数值型的。数值型的。AVG(DISTINCT):统计该属性列中值的平均。该属性必须是:
21、统计该属性列中值的平均。该属性必须是数值型的。数值型的。MAX():统计该属性列中的最大值。:统计该属性列中的最大值。MIN():统计该属性列中的最小值。:统计该属性列中的最小值。特别地,除特别地,除COUNT(*)之外,聚集函数在做统计之前,都先把属性列中的空之外,聚集函数在做统计之前,都先把属性列中的空值去掉。如果该属性列中都是空值,则值去掉。如果该属性列中都是空值,则COUNT函数返回函数返回0,其他函数返回,其他函数返回NULL。简单SQL查询聚集函数【例4-24】查询顾客的最低年龄。SELECT MIN(年龄年龄)FROM 顾客顾客;【例4-25】查询女顾客的平均年龄。SELECT
22、AVG(年龄年龄)FROM 顾客顾客 WHERE 性别性别=女女;【例4-26】查询顾客的总人数。SELECT COUNT(*)FROM 顾客顾客;【例4-27】查询购买了服装的顾客总人数。SELECT COUNT(DISTINCT 顾客编号顾客编号)FROM 购买记录购买记录;简单SQL查询GROUP BY使用GROUP BY子句的查询称为分组查询。GROUP BY子句将一个表按照指定属性组值相等的记录进行分组,再对每个组的数据进行相应的操作。当查询语句中使用聚集函数时,GROUP BY子句将控制聚集函数运算的范围。通常,与GROUP BY子句一起使用的还有一个HAVING子句。与WHERE
23、子句相同的是,HAVING子句也描述条件,不同的是,HAVING子句描述的是分组条件,只有满足分组条件的组才选出来处理。简单SQL查询GROUP BY【例4-28】查询每天的购买记录数。SELECT 购买日期购买日期,COUNT(*)购买记录数购买记录数 FROM 购买记录购买记录 GROUP BY 购买日期购买日期;简单SQL查询GROUP BY【例4-29】查询购买记录数在20笔以上的购买日期。SELECT 购买日期购买日期 FROM购买记录购买记录 GROUP BY 购买日期购买日期 HAVING COUNT(*)20;【例4-30】查询平均价格低于300元的品牌及其平均价格。SELEC
24、T 品牌品牌,AVG(价格价格)FROM 服装服装GROUP BY 品牌品牌 HAVING AVG(价格价格)300;连接查询又称为多关系查询。包括等值连接、自然连接、非等等值连接、自然连接、非等值连接、自身连接、外连接查询值连接、自身连接、外连接查询等类型。1等值与非等值连接查询 将两个表中对应属性列值相等的行连接起来,即当连接条件运算符为“=”时,称为等值连接等值连接。使用其他运算符称为非等值连接。若在等值连接中把目标列中重复的属性去掉则为自然连接。连接查询内连接【例4-31】查询购买了任意服装的顾客的编号和姓名。SELECT DISTINCT 顾客顾客.顾客编号顾客编号,姓名姓名 FRO
25、M 顾客顾客,购买记录购买记录 WHERE 顾客顾客.顾客编号顾客编号=购买记录购买记录.顾客编号顾客编号;SELECT子句和子句和WHERE子句中都用到了子句中都用到了“表名表名.列名列名”这种格式来表示某这种格式来表示某一列属于哪个表,以消除属性列的二义性。但是如果某一列名在参加连接一列属于哪个表,以消除属性列的二义性。但是如果某一列名在参加连接的各表中是唯一的,那么该列名前的表名是可以省略的。的各表中是唯一的,那么该列名前的表名是可以省略的。利用利用SELECT语句进行表的连接时,必须在语句进行表的连接时,必须在WHERE子句中指明连接条件,子句中指明连接条件,否则就是做两个表的笛卡儿积
26、,其连接结果一般是无意义的。否则就是做两个表的笛卡儿积,其连接结果一般是无意义的。SELECT DISTINCT 顾客顾客.顾客编号顾客编号,姓名姓名 FROM 顾客顾客,购买记录购买记录连接查询自身连接2自身连接 连接操作可以在不同的表之间进行,也可以在同一个表中进行。对同一个表进行的连接查询称为自身连接查询。【例4-32】查询跟张珊年龄相同的顾客ID和姓名。SELECT C1.顾客编号顾客编号,C1.姓名姓名FROM 顾客顾客 C1,顾客顾客 C2 WHERE C1.年龄年龄=C2.年龄年龄 AND C2.姓名姓名=张珊张珊;FROM子句中会员信息被打开两次,为区分两者所以分别赋以不同的别
27、名C1、C2。连接查询外连接3外连接外连接(Outer Join)内连接的查询结果都是满足连接条件的元组。但是,在内连接的查询结果中,一些重要的信息可能会因为连接条件不满足而被丢失。如果允许结果关系中出现的不满足连接条件的某些元组,这种连接称为外连接。外连接的表示方法为 SELECT,FROM LEFT/RIGHT/FULL OUT JOIN ON 约束条件约束条件;左外连接列出左边关系中所有的元组,右外连接列出右边关系中所有的元组。连接查询外连接【例4-33】查询每个顾客的基本信息及其购物信息。若顾客没有购物,则显示基本信息,其购物信息用空值表示。SELECT 顾客顾客.顾客编号顾客编号,姓
28、名姓名,性别性别,年龄年龄,电话电话,服装编服装编号号,购买日期购买日期,数量数量 FROM 顾客顾客 LEFT JOIN 购买记录购买记录 ON(顾客顾客.顾客编号顾客编号=购买记录购买记录.顾客编号顾客编号);连接查询外连接SELECT 顾客顾客.顾客编号顾客编号,姓名姓名,性别性别,年龄年龄,电话电话,服装编服装编号号,购买日期购买日期,数量数量 FROM 顾客顾客 LEFT OUT JOIN 购买记录购买记录 ON(顾客顾客.顾客编号顾客编号=购买记录购买记录.顾客编号顾客编号);连接查询多表4多表连接查询多表连接查询 如果查询涉两个以上的表,则称为多表连接查询。要注意定义表之间的连接
29、条件。【例4-34】查询每个顾客的基本信息、购物信息及其所购服装的详细信息,结果按顾客编号升序排列。SELECT*FROM 顾客顾客,购买记录购买记录,服装服装 WHERE 顾客顾客.顾客编号顾客编号=购买记录购买记录.顾客编号顾客编号 AND 购买记录购买记录.服装编号服装编号=服装服装.服装编号服装编号 ORDER BY 顾客顾客.顾客编号顾客编号;连接查询多表【例4-35 查询购买过“李宁”服装的顾客信息。SELECT DISTINCT 顾客顾客.*FROM 顾客顾客,购买记录购买记录,服装服装 WHERE 顾客顾客.顾客编号顾客编号=购买记录购买记录.顾客编号顾客编号 AND 购买购买
30、.服装编号服装编号=服装服装.服装编号服装编号 AND 品牌品牌=李宁李宁;子查询(Subquery)在一个查询语句的WHERE或HAVING条件子句中嵌入另一个查询,这种具有层次关系的查询称为嵌套查询。两个查询互相称为父查询和子查询。嵌套查询可以是多层的。【例4-36】查询购买了“W003”服装的顾客姓名和电话。SELECT 姓名姓名,电话电话 FROM 顾客顾客 WHERE 顾客编号顾客编号 IN (SELECT 顾客编号顾客编号 FROM 购买记录购买记录 WHERE 服装编号服装编号=W003);子查询不相关子查询:子查询的条件中不涉及父查询中的属性列系统对子查询先行求值,然后把子查询
31、的结果作为父查询的条件组成部分,进行父查询的处理。子查询只执行一次,处理过程较为简单。相关子查询:子查询的条件中涉及父查询中的属性列逐一考察父查询中的每个元组(当前元组),得到相应属性值后传入子查询作为条件,执行子查询,子查询得到的结果又作为父查询的条件组成部分,继续对当前元组进行处理。依此类推,直至父查询中所有元组被处理完。子查询多次运行,每次执行都是针对父查询中的一个元组。子查询根据父查询与子查询之间的连接符的不同,可以将子查询分为:带有比较运算符的子查询,带有IN谓词的子查询,带有ANY或ALL谓词的子查询,带有EXISTS谓词的子查询。子查询比较运算符1带有比较运算符的子查询 当确定子
32、查询返回的结果是单值时,可以使用比较运算符(、=、=、=、)来连接父查询与子查询。【例4-37】查询跟张珊年龄相同的顾客编号和姓名。SELECT 顾客编号顾客编号,姓名姓名 FROM 顾客顾客C1 WHERE C1.年龄年龄=(SELECT 年龄年龄 FROM 顾客顾客C2 WHERE C2.姓名姓名=张珊张珊);子查询IN谓词2带IN谓词的子查询 当子查询的查询结果包含多个值时,经常会使用IN谓词来连接子查询和父查询。【例4-38】查询购买了“李宁”服装的顾客姓名。SELECT 姓名姓名 FROM 顾客顾客 WHERE 顾客编号顾客编号 IN(SELECT 顾客编号顾客编号 FROM 购买记
33、录购买记录 WHERE 服装编号服装编号 IN(SELECT 服装编号服装编号 FORM 服装服装 WHERE 品牌品牌=李宁李宁);有些嵌套查询可以用连接运算替代,到底采用哪种方法,用户可以根据自己的习惯确定。子查询ANY/ALL谓词3带有ANY或ALL谓词的子查询 ANY谓词表示子查询结果中的某个值,ALL谓词表示子查询结果中的所有值。ANY或ALL谓词必须与比较运算符一起使用。【例4-39】查询没有购买W001 服装的顾客姓名。SELECT 姓名姓名 FROM 顾客顾客 WHERE 顾客编号顾客编号ALL (SELECT 顾客编号顾客编号 FROM 购买记录购买记录 WHERE 服装编号
34、服装编号=W001);这个查询可以用另一种形式表示:SELECT 姓名姓名 FROM 顾客顾客 WHERE 顾客编号顾客编号 NOT IN (SELECT 顾客编号顾客编号 FROM 购买记录购买记录 WHERE 服装编号服装编号=W001);子查询ANY/ALL谓词【例4-40】查询比“佐丹奴”任意一款服装价格低的服装ID。SELECT 服装编号服装编号 FROM 服装服装 WHERE 价格价格 ANY (SELECT 价格价格 FROM 服装服装 WHERE 品牌品牌=佐丹奴佐丹奴);这个查询可以用另一种形式表示:SELECT 服装编号服装编号 FROM 服装服装 WHERE 价格价格 (
35、SELECT MAX(价格价格)FROM 服装服装 WHERE 品牌品牌=佐丹奴佐丹奴);子查询ANY/ALL谓词事实上,用比较运算符与ANY 或ALL 谓词配合使用所表示的子查询,其查询效果等价于用集函数或INANY 或ALL 谓词来表示的子查询。其对应关系如下图所示。子查询EXISTS谓词4带有EXISTS 谓词的子查询 EXISTS 谓词用于判断是否有值存在。如果在一个子查询之前加EXISTS 谓词,则子查询不管返回的结果是什么,只要有值返回,就取“真”。与之对应的是NOT EXISTS 谓词,放在子查询之前,表示当子查询没有任何值返回时就取“真”。子查询EXISTS谓词【例4-41】查
36、询没有购买过任何服装的顾客的顾客编号和姓名。SELECT 顾客编号顾客编号,姓名姓名 FROM 顾客顾客 WHERE NOT EXISTS (SELECT*FROM 购买记录购买记录 WHERE 购买记录购买记录.顾客编号顾客编号=顾客顾客.顾客编号顾客编号);显然,这个查询是相关子查询,子查询的每次执行都与父查询中某个特定元组相关。子查询EXISTS谓词在SQL 中只有对应于存在量词的EXIST 谓词,而没有对应于“所有”、“全部”等全称量词的谓词。要实现全称量词的查询,只能借助存在量词,依据等价转换原则来实现,即 子查询EXISTS谓词【例4-42】查询购买了所有服装的顾客的姓名。即查询这
37、样一些顾客的姓名,没有一种服装他没有购买。SELECT 姓名姓名 FROM 顾客顾客 WHERE NOT EXISTS (SELECT*FROM 服装服装 WHERE NOT EXISTS (SELECT*FROM 购买记录购买记录 WHERE 顾客编号顾客编号=顾客顾客.顾客编号顾客编号 AND 服装编号服装编号=服装服装.服装编号服装编号);SELECT FROM 顾客顾客 WHERE NOT EXISTS (SELECT*FROM 服装服装 WHERE NOT EXISTS (SELECT*FROM 购买记录购买记录 WHERE );集合查询 SQL 查询的结果是元组的集合,所以多个查询
38、的结果可以进行集合操作。集合操作主要包括:并UNION交INTERSECT差EXCEPT参加集合操作的各查询结果的列数必须相同,对应列的数据类型也必须相同。默认按照集合处理,先去重复,然后进行集合计算集合查询UNION 1并UNION【例4-43】查询女顾客和年龄小于30岁的顾客的信息。SELECT*FROM 顾客顾客 WHERE 性别性别=女女 UNION SELECT*FROM 顾客顾客 WHERE 年龄年龄30;以上查询可以等价的表示如下:SELECT*FROM 顾客顾客 WHERE 性别性别=女女 OR 年龄年龄30;集合查询INTERSECT 2交INTERSECT【例4-44】查询
39、女顾客和年龄小于30岁的顾客的交集。SELECT*FROM 顾客顾客 WHERE 性别性别=女女 INTERSECT SELECT*FROM 顾客顾客 WHERE 年龄年龄30;以上查询可以等价地表示如下:SELECT*FROM 顾客顾客 WHERE 性别性别=女女 AND 年龄年龄30;集合查询EXCEPT 3差EXCEPT【例4-45】查询女顾客和年龄小于30岁的顾客的差集。SELECT*FROM 顾客顾客 WHERE 性别性别=女女 EXCEPT SELECT*FROM 顾客顾客 WHERE 年龄年龄=30;数据操纵语句数据操纵是指对数据库中的对象(基本表和视图)进行更新,即修改、插入和
40、删除等操作。UPDATE、INSERT和DELETE语句来完成的。数据操纵语句 INSERT1插入数据(1)用VALUES子句向表中插入一条记录 INSERT语句形式为:INSERT INTO,VALUES(,)“列名”是将要输入值的列名,它们与VALUES子句中的值要相对应。如果缺省“列名”,则必须由VALUES子句提供所有列的值。尤其要注意的是,被定义为NOT NULL的列必须给值。【例4-46】把顾客赵陆的记录加入到会员信息中。INSERT INTO 顾客顾客 VALUES(C004,赵陆赵陆,男男,27,15998475638);数据操纵语句DML INSERT(2)用子查询向表中插入
41、多条记录 INSERT语句形式为:INSERT INTO (,)SELECT,FROM WHERE 这种形式的INSERT语句可把取自其他表中的数据插入到一个表中,不限制插入的行数。同时,SELECT语句可以是简单的查询,也可以是复杂查询,其查询结果即是插入的数据。数据操纵语句DML INSERT【例4-47】创建服装及其购买者平均年龄的表,并根据数据库中数据填入内容。CREATE TABLE 服装服装_顾客年龄顾客年龄(服装编号服装编号CHAR(4),顾客平均年龄顾客平均年龄 int,PRIMARY KEY(服装编号服装编号);INSERT INTO 服装服装_顾客年龄顾客年龄(服装编号服装
42、编号,顾客平均年龄顾客平均年龄)SELECT 服装编号服装编号,AVG(年龄年龄)FROM 顾客顾客,购买记录购买记录 WHERE 顾客顾客.顾客编号顾客编号=购买记录购买记录.顾客编号顾客编号 GROUP BY 服装编号服装编号;数据操纵语句 UPDATE2更新数据 更新数据库中的记录用UPDATE语句。语法如下:UPDATE SET=,=,WHERE;SET子句提供要修改的列名和将要存储的新值。如果指定WHERE子句,则将确定这些列中的哪些行将被修改;如果WHERE子句缺省,则这些列中的所有行都将被修改。数据操纵语句 UPDATE(1)修改单个元组的值【例4-48 修改顾客张珊的电话号码为
43、“13598364798”。UPDATE 顾客顾客 SET 电话电话=13598364798 WHERE 姓名姓名=张珊张珊;(2)修改多个元组的值【例4-49 把所有顾客的年龄加1岁。UPDATE 顾客顾客 SET 年龄年龄=年龄年龄+1;数据操纵语句 UPDATE(3)带子查询的修改 在标准SQL中,UPDATE语句中的WHERE子句可以包含子查询,用于构造修改的条件。【例4-50 把在“20100516”这一天有过销售记录的服装价格减20。UPDATE 服装服装 SET 价格价格=价格价格-20 WHERE 服装编号服装编号 IN (SELECT 服装编号服装编号 FROM 购买记录购买
44、记录 WHERE 购买日期购买日期=20100516);数据操纵语句 DELETE3删除数据 删除数据的语句格式为:DELETE FROM WHERE;DELETE命令用于删除表中指定的某些行,如果有WHERE子句,则所有满足条件的行全被删除;如果没有,则表中所有行都被删除。如果省略WHERE子句,表示删除表中全部元组,但表的定义仍在数据字典中。也就是说,DELETE语句删除的是表中的数据,而不是关于表的定义。数据操纵语句 DELETE【例4-51】删除所有的购买记录。DELETE FROM 购买记录购买记录;子查询同样也可以嵌套在DELETE语句中,用以构造执行删除操作的条件。删除数据时,应
45、该考虑删除掉相关联的信息,保证数据库中数据的完整性。【例4-52】删除“李宁”牌服装及其所有购买记录。DELETE FROM 购买记录购买记录 WHERE 服装编号服装编号 IN(SELECT 服装编号服装编号 FROM 服装服装 WHERE 品牌品牌=李宁李宁);DELETE FROM 服装服装 WHERE 品牌品牌=李宁李宁;数据操纵语句DML数据更新语句INSERT、UPDATE和DELETE,事项:更新操作一次只能对一个表进行,如果希望更新多个表,则必须做多次更新操作。在进行更新操作时,必须考虑数据库的完整性。如例4-49中两个语句如果交换顺序,会破坏数据库的参照完整性。视图View
46、视图的概念:视图是从一个或几个基本表(或视图)导出的表,与基本表不同,视图是从一个或几个基本表(或视图)导出的表,与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。据,这些数据仍存放在原来的基本表中。基本表中的数据发生变化,从视图中查询出的数据也就随之改变基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。了。视图就像一个窗口,透过它,可以看到数据库中自己感兴趣的数视图就像一个窗口,透过它,可以看到数据库中自己感兴趣的数据及其变化。据及其变化。视图一经定义,就可以和基本表
47、一样被查询、被删除,我们也可视图一经定义,就可以和基本表一样被查询、被删除,我们也可以在一个视图之上再定义新的视图,但对视图的更新(增加、删除、以在一个视图之上再定义新的视图,但对视图的更新(增加、删除、修改)操作则有一定的限制。修改)操作则有一定的限制。视图View 视图的作用:视图是关系数据库系统提供给用户以多种角度观察数据库中的数据的重要机制。视图可以简化数据库用户的操作。视图给数据库的安全性控制带来方便。视图为数据库系统提供了一定程度的逻辑独立性。视图View创建 语句格式如下:CREATE VIEW 视图名视图名(视图列名表视图列名表)AS WITH CHECK OPTION;视图的
48、数据是子查询的结果。视图列名表是个可选项,当不选该项时,新生成视图的列名与SELECT命令所选择数据列的名称相同。如果选择该项时,则给SELECT命令所选择的数据重新起个名字作为视图的列名,它们的对应关系是按顺序对应。“WITH CHECK OPTION”也是一个选择项,当选择该项时,用户必须保证在向视图中插入数据时,该数据能够满足视图定义中SELECT命令所指定的条件。视图View创建 【例4-53】创建一个视图,显示“李宁”牌服装的信息。CREATE VIEW 服装服装_李宁李宁 AS SELECT 服装编号服装编号,型号型号,颜色颜色,价格价格 FROM 服装服装 WHERE 品牌品牌=
49、李宁李宁;视图View 组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。如果省略了视图的各属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。但在下列三种情况下必须明确指定组成视图的所有列名:某个目标列不是单纯的属性名,而是集函数或列表达式。多表连接时选出了几名同名列作为视图的字段。需要在视图中为某个列启用新的更适合的名字。视图View【例4-54】建立一个30岁以上顾客的ID、姓名、性别、出生年份的视图。CREATE VIEW 顾客顾客1(顾客编号顾客编号,姓名姓名,性别性别,出生年份出生年份)AS SELECT顾客编号顾客编号,姓名姓名,性别性别,2010-年
50、龄年龄 FROM 顾客顾客 WHERE 年龄年龄30;如果希望今后可以对视图进行正确的更新操作,还必须在定义视图时加上WITH CHECK OPTION子句,如上面的语句可以改为:CREATE VIEW 顾客顾客1(顾客编号顾客编号,姓名姓名,性别性别,出生年份出生年份)AS SELECT顾客编号顾客编号,姓名姓名,性别性别,2010-年龄年龄 FROM 顾客顾客 WHERE 年龄年龄30 WITH CHECK OPTION;视图View【例4-55】建立一个30岁以上女顾客的编号、姓名、出生年份的视图。CREATE VIEW 顾客顾客2 AS SELECT顾客编号顾客编号,姓名姓名,出生年份