1、第 5 章 关系数据库语言 SQL(下)第 5 章 关系数据库语言 SQL(下)5.1数据操作语言数据操作语言(DML)5.2数据查询语言数据查询语言(DQL)5.3数据控制语言数据控制语言(DCL)第 5 章 关系数据库语言 SQL(下)5.1数据操作语言数据操作语言(DML)5.1.1数据插入数据插入1.命令方式插入数据命令方式插入数据SQL 使用 insert 语句为数据表添加记录。insert 语句通常有两种形式:一种是一次插入一条记录,另一种是一次插入多条记录,即使用子查询批量插入。第 5 章 关系数据库语言 SQL(下)第 5 章 关系数据库语言 SQL(下)参数说明:insert
2、 into 是插入语句的命令关键词,其中 into 可以省略。tablename 指定要向其中插入数据的表的名称。columnlist 是列列表,用来指定要向其中插入数据的列,列和列之间用逗号分开。values 用于引出要插入的数据,columnvalue 是数据表达式列表,数据项之间需要用逗号分开。第 5 章 关系数据库语言 SQL(下)向表中插入数据应注意以下几点:(1)数据表达式列表 columnvalue 中的数据值应该与列列表 columnlist 中的列一一对应,数据类型也应该兼容。(2)必须为表中所有定义 not null 的列提供值,对于定义为 null 的列既可以提供值也可以
3、不提供值。(3)如果表中存在标识列,则不能向标识列中插入数据。如果表中有计算列,则不能向计算列中插入值。(4)因为主键所在列不允许有空值也不允许有重复值,所以插入数据时必须保证主键所在列中有值而且不能与该列中已经存在的值重复。第 5 章 关系数据库语言 SQL(下)(5)如果表中存在外键约束,则向表中插入数据时要注意避免违反参照完整性约束。在接下来的例子中将向表 books 中插入数据。先分析一下 books 表的特点,表中包括6 个列,即 bookid、title、isbn、author、unitprice 和 categorycode。其中:bookid 是主键、int 类型;title、
4、isbn 和 author 被定义成 not null、字符型;categorycode 是一个外键,父表是 categories,存放图书的类别,categories 表中已经存在数据,如图 5-1 所示。第 5 章 关系数据库语言 SQL(下)图 5-1 categories 表第 5 章 关系数据库语言 SQL(下)第 5 章 关系数据库语言 SQL(下)菜单方式插入数据菜单方式插入数据在 SSMS 中,除了用 insert 语句插入记录,还可以使用菜单方式插入记录。例 5-4 向 student 表中插入记录。其中有一个主键约束 PK_s#、一个检查约束 CK_student_emai
5、l(默认格式:email like%_%_._%)。第 5 章 关系数据库语言 SQL(下)操作步骤如下:(1)在“对象资源管理器”中,展开“数据库”节点和“表”节点,用鼠标右键单击student 表,在弹出的快捷菜单中选择“编辑前 200 行”,进入编辑界面,如图 5-2 所示。(2)依次输入各行字段的值,单击“保存”按钮。第 5 章 关系数据库语言 SQL(下)图 5-2“编辑前 200 行”工作界面第 5 章 关系数据库语言 SQL(下)5.1.2数据更新数据更新SQL 使用 update 语句更新或修改满足规定条件的记录。说明:将符合 where 条件的记录的一个或多个列修改为新值。若
6、省略 where,则全表更新。operator 即运算符。第 5 章 关系数据库语言 SQL(下)例 5-5 在数据库 studscore_ds1 中,将表 student 中 s#是 2018010103 的学生的 age 加 1。代码如下:update studentset age=age+1 where s#=2018010103说明:如果省略 where 条件,则所有记录加 1 岁。例 5-6 将学生 John 的性别改为“男”,年龄改为“23”。代码如下:update student set sex=男,age=23 where sname=John第 5 章 关系数据库语言 SQL
7、(下)5.1.3数据删除数据删除SQL 使用 delete 语句删除数据库表格中的行或记录。1.delete 语句语句语句格式如下:delete from where 说明:将符合 的记录从表中删除。例 5-7:在数据库 studscore_ds1 中,将表 student 中学号 s#为 2018010101 的学生删除。代码如下:delete from student where s#=2018010101说明:如果省略 where 条件,则删除表中所有的记录。第 5 章 关系数据库语言 SQL(下)2.truncate table 命令命令如果要删除表中的所有数据记录,则使用 trunc
8、ate table 命令比用 delete 命令快得多,这是因为 delete 命令除了删除数据外,还会对删除数据在事务处理日志中作出记录,以便删除失败时可以使用事务处理日志来恢复数据。而 truncate table 命令的功能相当于使用不带 where 子句的 delete 命令。语句格式如下:truncate table table_name第 5 章 关系数据库语言 SQL(下)例 5-8 删除学生成绩表 studscoreinfo 中的所有记录。代码如下:truncate table studscoreinfo需要指出的是,truncate table 命令不能用于有依赖关系的表,也
9、不能激发触发器。第 5 章 关系数据库语言 SQL(下)5.1.4merge 语句语句1.功能功能merge 关键字是在 SQL Server 2008 引入的 DML 关键字,它能将 insert、update、delete 简单地并为一句。MSDN 对 merge 的解释是:根据与源表连接的结果,对目标表执行插入、更新或删除操作。merge 的功能是:检查原数据表记录和目标表记录,如果记录在原数据表和目标表中均存在,则目标表中的记录将被原数据表中的记录更新(执行 update 操作);如果目标表中不存在的某些记录在原数据表中存在,则原数据表的这些记录将被插入到目标表中(执行 insert
10、操作)。第 5 章 关系数据库语言 SQL(下)2.语法格式及示例语法格式及示例第 5 章 关系数据库语言 SQL(下)参数说明:第一行 merge 子句:命名目标表并给出别名。第二行 using 子句:提供 merge 操作的数据源,并给出别名。第三行 on 子句:指定合并的条件。第四行 when matched then 子句:判断条件符合则对目标表更新或删除。第八行 when not matched then 子句:判断条件不符合则执行插入的操作。第 5 章 关系数据库语言 SQL(下)第 5 章 关系数据库语言 SQL(下)5.2数据查询语言数据查询语言(DQL)5.2.1SQL 简单
11、查询简单查询1.查询结构查询结构1)查询的语法格式第 5 章 关系数据库语言 SQL(下)上述语法中共有 7 个子句,其中 select 和 from 子句是必不可少的。各子句的功能如下:(1)select_list 子句用于指定希望查看的列,中间用逗号分隔。(2)into new_table_name 子句用于将检索出来的结果集创建一个新的数据表。(3)from table_list 子句用于指定检索数据的数据表的列表。(4)where 子句用于对数据行进行筛选,指定查询的条件,是一个条件表达式,只有满足条件的数据行才作为查询的对象。第 5 章 关系数据库语言 SQL(下)(5)group
12、by 子句用于指定要分组的列。(6)having 子句用于指定分组的条件。从结果集对记录进行筛选,只有满足条件表达式的组才作为查询的对象。(7)order by 子句用于对查询的结果排序。asc 表示升序排序,desc 表示降序排序。asc 是默认选项。第 5 章 关系数据库语言 SQL(下)2)select 查询的执行过程虽 然 select 查询的各个子句书写的顺序是 select from where group by having order by,但是在计算机中各个子句实际的执行顺序是 from where group by having select order by。也就是说首先
13、确定从哪个或哪些表(或视图)中查询数据,如有必要就筛选,如有必要就分组,还有必要再对分组进行筛选。接下来确定查询结果,如有排序要求就对查询结果进行排序。其过程如下:第 5 章 关系数据库语言 SQL(下)(1)读取 from 子句中基本表、视图的数据,执行笛卡尔积操作。例如,从两张表中取数,对比记录数、两张表记录数的乘积数,理解笛卡尔积。(2)选取满足 where 子句中给出的条件表达式的元组。(3)按照 group by 子句中指定列的值进行分组,同时提取满足 having 子句中组条件表达式的那些组。(4)按照 select 子句中给出的列名或列表达式求值输出。(5)order by 子句
14、对输出的目标表进行排序,按 asc(升序)排列,或按 desc(降序)排列。第 5 章 关系数据库语言 SQL(下)3)使用 select 查询应注意的问题(1)在数据库系统中,可能存在对象名称重复的现象。例如,两个用户同时定义了studinfo 的表,在引用用户 ID 为 stud 的用户定义的 studinfo 表时,需要使用用户 ID 限定数据表的名称。语法代码如下:select*from stud.studinfo第 5 章 关系数据库语言 SQL(下)(2)在使用 select 语句进行查询时,需要引用的对象所在的数据库不一定总是当前的数据库,在引用数据表时需要使用数据库来限定数据表
15、的名称。语法代码如下:select*from studscore_ds1.dbo.studinfoselect*from studscore_ds1.studinfo第 5 章 关系数据库语言 SQL(下)(3)在 from 子句中指定的数据表和视图可能包含有相同的字段名称,外键字段名称很可能与相应的主键字段名称相同。因此,为避免字段引用时的歧义,必须使用数据表或视图名称来限定字段名称。语法代码如下:select studinfo.studno,studname,classinfo.classid,classname from studinfo,classinfo where studinfo
16、.classid=classinfo.classid第 5 章 关系数据库语言 SQL(下)2.查询操作查询操作1)select 子句select 子句指定需要通过查询返回的表的列。第 5 章 关系数据库语言 SQL(下)参数说明:(1)all:指明查询结果中可以显示值相同的列,all 是系统默认的选项。(2)select_list:指所要查询的表的列的集合,多个列之间用逗号分开。(3)*:通配符,返回所有对象的所有列。(4)table_name|view_name|table_alias.*:限制通配符*的作用范围,凡是带*的项均返回其中所有的列。(5)column_name:指定返回的列名
17、。第 5 章 关系数据库语言 SQL(下)(6)expression:表达式可能为列名常量、函数或它们的组合。此时应给表达式指定一个别名,通常有 3 种方式:原列名 as 别名、原列名别名、别名=原列名。在一个查询语句中,也可以混合使用以上 3 种方式来定义别名。(7)identitycol:返回 identity 列。如果 from 子句中有多个表含有 identity 列,则在identitycol 选项前必须加上表名,如 table.identitycol。(8)rowguidcol:返回表的 rowguidcol 列,同 identitycol 选 项。当 要 指 定 多 个rowgu
18、idcol 列时,选项前要加上表名。第 5 章 关系数据库语言 SQL(下)(9)column_alias:在返回的查询结果中用此别名替代列的原名。column_alias 可用于order by 子句,但不能用于 where、groupby、having 子句。第 5 章 关系数据库语言 SQL(下)第 5 章 关系数据库语言 SQL(下)例 5-13查询学生信息表 studinfo 中不重复的性别记录。查询结果如图 5-3 所示。代码如下:select distinct studsex from studinfo图 5-3 distinct 关键字第 5 章 关系数据库语言 SQL(下)第
19、 5 章 关系数据库语言 SQL(下)2)into 子句into new_table_name 子句用于将查询的结果集创建一个新的表。新表的列由 select 子句中指定的列构成,且查询结果各列必须具有唯一的名称。新表中的数据是由 where 子句指定的,但如果 select 子句中指定了计算列,在新表中对应的列则不是计算列,而是一个实际存储在新表中的列,其中的数据由执行 selectinto 语句时计算得出。例 5-19查询表 studscoreinfo 中 courseid 为 a0101 的记录,并插入到新表 stscore_1。代码如下:select*into stscore_1 fr
20、om studscoreinfo where courseid=a0101第 5 章 关系数据库语言 SQL(下)3)from 子句from 子句主要用来指定检索数据的来源,指定数据来源的数据表和视图的列表,该列表中的表名和视图名之间用逗号分开。from 子句不可省略。语法格式如下:from,.n例 5-20使用表别名查询表 studinfo 中的记录。代码如下:select s.studno 学号,s.studname 姓名 from studinfo s第 5 章 关系数据库语言 SQL(下)4)where 子句where 子句用于对表中的数据记录进行筛选,其中构造筛选的条件表达式是重点。
21、需要强调的是,在 where 子句中不能使用聚合函数及别名。语法格式如下:where 功能:限制结果集内返回的行。第 5 章 关系数据库语言 SQL(下)查询的限制条件可以是比较运算符(=、=等)、范围说明(between and和 not between and)、可选值列表(in、not in)、模式匹配(like、not like)、是否为空值(is null 和 is not null)、上述条件的逻辑组合(and、or、not)。分别介绍如下:(1)使用比较查询条件。比较查询条件由表达式的双方和比较运算符组成,系统根据查询条件的真假来决定某一条记录是否满足查询条件。只有满足查询条件的
22、记录才会出现在最终结果集中。第 5 章 关系数据库语言 SQL(下)例 5-21查询成绩大于 70 的学生成绩信息。代码如下:select*from studscoreinfo where studscore70例 5-22查询 1981 年 1 月 1 日及以后出生的学生信息。代码如下:select*from studscoreinfo where studbirthday=1981/01/01第 5 章 关系数据库语言 SQL(下)(2)使用逻辑运算符。and 连接两个布尔表达式并当两个表达式都为 true 时返回“true”。or 将两个条件结合起来。not 用于反转查询条件的结果。其优
23、先级顺序是:括号最优先,其次 not and or。例 5-23查询学生成绩在 60 到 70 之间的所有记录。代码如下:select*from studscoreinfo where studscore =60 and studscore =70例 5-24查询学生成绩小于等于 70 或者大于等于 90 的所有记录。代码如下:select*from studscoreinfo where studscore =70 or studscore =90第 5 章 关系数据库语言 SQL(下)(3)使用范围查询条件。内含范围条件(betweenand)要求返回记录某个字段的值在两个指定值范围内,同
24、时包括这两个指定的值。排除范围条件(not betweenand)则相反。例 5-25查询学生成绩在 70 到 80 之间的记录。代码如下:select*from studscoreinfo where studscore between 70 and 80第 5 章 关系数据库语言 SQL(下)(4)使用列表查询条件。in 关键字的格式为:in(列表值 1,列表值 2,)。其功能是将返回所有与列表中的任意一个值匹配的记录。例 5-26查询课程代码 courseid 为 a0101、a0102 的学生成绩信息。代码如下:select*from studscoreinfo where cours
25、eid in(a0101,a0102)(5)使用模式查询条件(like 或 not like)。模式查询条件常用来返回符合某种格式的所有记录。模式匹配通配符是 like,另外还需要使用模式通配符,如表 5-1 所示。第 5 章 关系数据库语言 SQL(下)第 5 章 关系数据库语言 SQL(下)(6)使用空值判断查询。空值查询常用于查询某一字段为空值的记录,可以使用“is null”(是空值)或“is not null”(不是空值)关键字来指定查询条件。在表的某些列可能存在空值“null”。“null”不是一种值,表示一种未知或不确定的状态,它并不表示零、零长度的字符串或空白(字符值)。例 5
26、-29在班级信息表 classinfo 中,查询班级描述为空的班级情况。代码如下:select*from classinfo where classdesc is null第 5 章 关系数据库语言 SQL(下)5)group by 子句有时需要对表中的数据进行分组,然后对每个组单独进行统计计算,此时需要使用group by 子句。在按照指定的条件进行分类计算时,可以使用聚合函数计算各组的数据。语法格式如下:group by allgroup_by_expression,.n其中:group_by_expression 是对表执行分组的表达式,也称分组列。第 5 章 关系数据库语言 SQL(下
27、)常用的聚合函数及其含义如表 5-2 所示。第 5 章 关系数据库语言 SQL(下)第 5 章 关系数据库语言 SQL(下)6)having 子句having 子句用于指定分组搜索条件,是对分组之后的结果再次筛选。having 子句必须和 group by 子句一起使用,有 having 子句就必须有 group by 子句,但有 group by 子句可以没有 having 子句。having 和 where 类似,其区别在于 where 子句在进行分组操作之前对查询结果进行筛选,而 having 子句是对分组操作之后的结果再次筛选。作用的对象也不同,where 子句作用于表和视图,havi
28、ng 子句作用于组。第 5 章 关系数据库语言 SQL(下)第 5 章 关系数据库语言 SQL(下)7)order by 子句order by 子句指定查询结果的排序方式。其语法格式如下:order byorder_by_expressionasc|desc,.norder_by_expression 可以是表或视图的列的名称或别名。asc 表示升序(默认);desc表示降序。第 5 章 关系数据库语言 SQL(下)5.2.2SQL 高级查询高级查询1.关联表查询关联表查询SQL 简单查询是基于单个数据表来实现的。在数据库中,各个表存放着不同的数据,表和表之间存在着各种联系,往往需要用多个表中
29、的数据来组合查询,补充所需要的信息。所谓多表查询是相对于单表查询而言的,是指从多个关联表中查询数据,通常采用等值多表查询的方式,即在 where 子句中设置等值的条件来查询多个数据表中关联的数据。这种查询要求关联的多个数据表的某些字段具有相同的属性,即具有相同的数据类型和宽度。第 5 章 关系数据库语言 SQL(下)1)双表关联查询在 where 子句中,可以将具有相等的字段值的两张表连接起来,数据来源于两张表。例 5-38查询某班级学生的基本信息和成绩信息,数据来源于表 student 和表 sc,代码如下:select*from student,sc where student.s#=sc
30、.s#查询结果如图 5-4 所示。第 5 章 关系数据库语言 SQL(下)图 5-4等值查询第 5 章 关系数据库语言 SQL(下)例 5-39查询某班级学生的基本信息和成绩信息,包括 s#、sname、age、c#、score等字段,数据来源于 student 表和 sc 表。代码如下:select student.s#,sname,age,c#,score from student,sc where student.s#=sc.s#例 5-40使用别名、逻辑运算符查询满足复杂条件的记录,结果如图 5-5 所示。代码如下:select s.s#学 号,sname 姓 名,c#课程代码,sco
31、re 成 绩 from student s,sc where s.s#=sc.s#and c#=001第 5 章 关系数据库语言 SQL(下)图 5-5双表别名查询第 5 章 关系数据库语言 SQL(下)2)多表关联查询有时需要将多个表进行关联查询,才能比较完整地反映有关信息。超过两个表的关联查询称为多表查询,返回多个表中与连接条件相互匹配的记录,不返回不相匹配的记录。第 5 章 关系数据库语言 SQL(下)例 5-41根据图 5-6 所示的 student、sc 和 course 表,查询学生的基本信息,包括个人基本情况、课程信息和成绩。代码如下:select s.s#学号,sname 姓名
32、,sc.c#课程代码,ame 课程名称,c.credit 学分,score 成绩 from student s,course c,sc where s.s#=sc.s#and sc.c#=c.c#and sc.c#=001第 5 章 关系数据库语言 SQL(下)图 5-6 sc 表(s#和 c#是双属性主键,c#是外键)第 5 章 关系数据库语言 SQL(下)查询结果如图 5-7 所示。图 5-7多表关联查询结果第 5 章 关系数据库语言 SQL(下)3)关联表使用聚合函数在单表查询中,可以使用聚合函数进行统计,但统计结果的信息不够全面,需要使用多表查询补齐相关信息。在多表关联查询中,仍可以使
33、用聚合函数进行统计。第 5 章 关系数据库语言 SQL(下)例 5-42在 student、sc 等表中,查询学生的学号、姓名、平均分等字段信息。代码如下:select s.s#,s.sname,avg(score)as avgscore from student s,sc where s.s#=sc.s#group by s.s#,sname例 5-42 中,两表通过学号关联,因为两表均有学号字段,所以为 student 表指定别名,以别名对学号字段进行限制。使用了 group by 子句,只有 group by 后面的字段和聚合函数才能放在 select 子句后面,因此,除学号之外,姓名字
34、段也必须放在 group by 子句后面。第 5 章 关系数据库语言 SQL(下)2.使用使用 union 连接连接使用 union 运算符可以将两个或多个 select 子句的结果组合成一个结果集。使用 union 组合的结果集都必须满足三个条件:具有相同的结构,字段数目相同,结果集中相应字段的数据类型必须兼容。同时还要注意以下几点:(1)union 中每一个查询所涉及的列必须具有相同的列数、相同的数据类型,并以相同的顺序出现。(2)最后结果集里的列名来自第一个 select 语句。(3)若 union 中包含 order by 子句,则将对最后的结果集排序。第 5 章 关系数据库语言 SQ
35、L(下)(4)在合并结果集时,默认从最后的结果集中删除重复的行,除非使用 all 关键字。union 运算符的语法格式如下:select 子句unionallselect 子句例 5-43查询成绩在 60 70 分数段和 90 及以上区域的学生信息。代码如下:select*from sc where score=60 and score=90第 5 章 关系数据库语言 SQL(下)第 5 章 关系数据库语言 SQL(下)3.子查询子查询1)子查询的基本概念在 SQL 中,当一个查询语句嵌套在另一个查询的查询条件之中时,该查询称为嵌套查询,又称为子查询。在一个外层查询中包含有另一个内层查询,其中
36、外层查询称为主查询,内层查询称为子查询。第 5 章 关系数据库语言 SQL(下)使用子查询时应注意以下几点:(1)子查询的基本结构和基本查询一样,其中 select 子句和 from 子句是必需的,而where 子句、group by 子句和 having 子句是可选的。(2)子查询的 select 语句通常使用圆括号括起来。(3)子查询的 select 语句中通常只有一个列,不能使用 compute 子句。(4)除非在子查询中使用了 top 选项,否则子查询中不能使用 order by 子句。(5)如果某个数据表只出现在子查询中,而不出现在主查询中,那么在数据列表中不能包含该数据表中的字段。
37、第 5 章 关系数据库语言 SQL(下)2)子查询的使用(1)使用 in 关键字。当子查询的结果不唯一时,可以在子查询前使用运算符 in。in 关键字在大多数情况下应用于嵌套查询中,首先使用 select 语句选定一个范围,然后将选定的范围作为 in 关键字的符合条件的列表,从而得到最终的结果。语法格式如下:test_expressionnot in(subquery|expression,.n)第 5 章 关系数据库语言 SQL(下)参数说明:test_expression 是任何有效的 SQL Server 表达式。subquery 是包含某列结果集的子查询。expression 是一个表
38、达式列表,用来测试是否匹配。第 5 章 关系数据库语言 SQL(下)第 5 章 关系数据库语言 SQL(下)(2)使用比较运算符的子查询。使用比较运算符的子查询的结果必须是单值,即子查询的结果为单行单列的值。例 5-47查询 ISBN 为“978-7-1254-2487-1”的图书的订单号和订货数量。代码如下:第 5 章 关系数据库语言 SQL(下)(3)使用 some/any 关键字。some/any 关键字完全等价。通过比较运算符将一个表达式的值或列值与子查询返回的一列值中的每一个进行比较,如果哪行的比较结果为真,则满足条件立即返回该行。语法格式如下:scalar_expression=|
39、!=|=|!|=|!some|any(subquery)第 5 章 关系数据库语言 SQL(下)参数说明:scalar_expression:任何有效的 SQL Server 表达式。=|!=|=|!|=|!:任何有效的比较运算符。some|any:指定应进行比较。当子查询的结果为多值时,使用 some|any 表示匹配子查询结果中的任意一个值即可。subquery:包含某列结果集的子查询。所返回列的数据类型必须是与 scalar_expression 相同的数据类型。第 5 章 关系数据库语言 SQL(下)(4)使用 all 关键字。all 的子查询是把列值与子查询结果进行比较,但是它要求所
40、有列的查询结果都为真,否则不返回行。使用 all 表示匹配子查询的所有值才可以。语法格式如下:scalar_expression=|!=|=|!|=|!、=、=、!和。自然连接。在连接条件中使用等于(=)运算符比较被连接列的列值,查询所涉及的两个关系模式有公共属性,且公共属性值相等,相同的公共属性只在结果关系中出现一次。内连接查询的语法格式如下:select select_list from,.n on 第 5 章 关系数据库语言 SQL(下)参数说明:参与连接操作的表名,可以是一张表,也可以是多张表。=innerouterjoin on:连接操作中的 on 子句指出连接条件,它由被连接表中的
41、列和比较运算符、逻辑运算符等构成。注意:注意:无论哪种连接,都不能对 text、ntext 和 image 数据类型列进行直接连接。第 5 章 关系数据库语言 SQL(下)第 5 章 关系数据库语言 SQL(下)图 5-8内连接查询结果第 5 章 关系数据库语言 SQL(下)(2)外连接查询。外连接分为左连接、右连接和全连接三种。与内连接不同的是,外连接不仅列出与连接条件相匹配的行,而还会列出左表(左外连接时)、右表或两个表中所有符合搜索条件的数据行。注意,此时以 on 给出搜索条件。外连接查询的语法格式如下:select select_list from,.n on 第 5 章 关系数据库语
42、言 SQL(下)参数说明:=left|right|fullouterjoin 左外连接。左外连接(left outer join 或 left join)的结果集包括 left join 或 left outer join 子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。第 5 章 关系数据库语言 SQL(下)例 5-56在表 student、sc 中,查询表 student 的所有学生的基本信息和成绩信息。代码如下:select student.s#,student.sname,student.cla
43、ssid,sc.c#,sc.scorefrom student left outer join sc on student.s#=sc.s#查询结果如图 5-9 所 示。第 5 章 关系数据库语言 SQL(下)图 5-9左外连接查询结果第 5 章 关系数据库语言 SQL(下)右外连接。右外连接(right outer joinon或 right joinon)使用 right join 或right outer join 子句,是左向外连接的反向连接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。例 5-57在表 student、sc 中,查询所有学生的基本信息和成
44、绩信息。代码如下:select student.s#,student.sname,student.classid,sc.c#,sc.scorefrom student right outer join sc on student.s#=sc.s#从查询结果看,只包括图 5-9 的前 12 条记录,也就是有成绩的数据行。第 5 章 关系数据库语言 SQL(下)全连接。全连接(full outer joinon或 full joinon)使用 full join 或 full outer join 子句返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表
45、之间有匹配行,则整个结果集行包含基表的数据值。例5-58在表student、sc中,查询出现在两个表中的所有学生的基本信息和成绩信息。代码如下:select student.s#,student.sname,student.classid,sc.c#,sc.scorefrom student full outer join sc on student.s#=sc.s#第 5 章 关系数据库语言 SQL(下)(3)交叉连接查询。交叉连接(cross join)没有 where 子句,它返回连接表中所有数据行的笛卡尔积,是指两个关系中所有元组的所有组合,其结果集合中的数据行数等于第一个表中符合查询
46、条件的数据行数乘以第二个表中符合查询条件的数据行数。例 5-59使用交叉连接查询学生的基本信息和成绩信息。代码如下:select*from student cross join sc下面的语句,执行结果同上。select*from student,sc第 5 章 关系数据库语言 SQL(下)5.实用实用 SQL 语句的使用语句的使用1)使用 compute by 子句分类统计compute 子句是 T-SQL 中特有的一个子句,使用 compute 子句允许用户同时观察查询所得的各列数据的细节以及综合各列数据所产生的总和。通过 compute 子句既可以计算数据分类后的和,也可以计算所有数据的
47、总和。语法格式如下:computesum|avg|count|max|min(expression),.nby expression,.n第 5 章 关系数据库语言 SQL(下)参数说明:(1)expression 用于指定需要统计的列的名称,此列必须包含于 select 列表中,且不能使用别名。该子句不能使用 text、ntext、image 数据类型。(2)by expression 用于在查询结果中生成分类统计的行。如果使用此选项,则必须同时使用 order by 子句。expression 对应 order by 子句的 expression 的子集或全集。第 5 章 关系数据库语言
48、SQL(下)例 5-60在表 books 中,查询显示所有图书的编号、书名、单价和类别代码,最后显示所有图书的总价。代码如下:select bookid,title,unitprice,categorycode from books order by categorycode compute sum(unitprice)查询结果如图 5-10 所示。在结果的最后添加了一行表示所有图书单价之和。第 5 章 关系数据库语言 SQL(下)图 5-10 compute 子句查询结果第 5 章 关系数据库语言 SQL(下)例 5-61在表 books 中,查询显示所有图书的编号、书名、单价和类别代码,并
49、显示每类图书的总价和所有图书的总价。代码如下select bookid,title,unitprice,categorycode from books order by categorycode compute sum(unitprice)by categorycode在 compute 子句中使用关键字 by 可以实现数据行分组后再对每个组分别进行统计的功能。查询结果如图 5-11 所示。第 5 章 关系数据库语言 SQL(下)图 5-11使用 compute by 查询结果第 5 章 关系数据库语言 SQL(下)2)使用关联表统计(1)在关联表统计中使用计算列。例 5-62在表 stude
50、nt、sc 中,对学生的成绩信息进行统计计算,代码如下:select d.s#,d.sname,sum(score)as sumscore,cast(avg(score)as numeric(5,1)avgscore,max(score)as maxscore,min(score)as minscore,coursecount=count(*)from student d,sc s where d.s#=s.s#group by d.s#,d.sname计算结果如图 5-12 所示。第 5 章 关系数据库语言 SQL(下)图 5-12使用计算列第 5 章 关系数据库语言 SQL(下)(2)在关