资源简介 (共42张PPT)关系数据库标准语言SQL第3章目录01SQL概述02数据库的创建与管理03数据表及其操作04数据查询05视图06索引本章主要内容结构化查询语言(Structured Query Language,SQL)是关系数据库管理的标准语言,具有数据定义、数据查询、数据操纵和数据控制四个方面的功能。SQL结构简单,功能齐全,是目前广泛应用的关系数据库查询语言。本章主要介绍SQL Server 2019数据库管理系统各种工具的使用和SQL的使用。数据查询第3章043.4 数据查询在数据库应用系统中,表的查询是经常使用的操作。可以在SQL Server Management Studio中通过对象资源管理器查询数据,也可以使用SELECT语句完成查询操作。SQL Server 2019提供了SELECT语句较完整的语法形式,该语句具有灵活的使用方式和丰富的功能。当使用SELECT语句构造查询语句时,熟悉基本参数和选项能更有效地实现数据查询。SELECT语句是T-SQL从数据库中获取信息的一个基本语句。该语句可以实现从一个或多个数据库的一个或多个表中查询信息,并将结果显示为另外一个表(结果集)的形式。SELECT语句的基本语法格式如下。3.4 数据查询select_list:指明要查询的选择列表。table_source:指明查询的表或视图的名称。source_condition:指明查询要满足的条件。group_by_expression:根据指定列中的值对结果集进行分组。search_condition:对FROM、WHERE或GROUP BY子句中创建的中间结果集进行行的筛选,通常与GROUP BY子句一起使用。[ASC|DESC]:对查询结果集中的行重新排序。ASC和DESC关键字分别用于指定按升序或降序排序。如果省略ASC或DESC,则系统默认为升序。3.4.1 投影查询使用SELECT语句可以选择查询表或视图中的一列或者多列,当选择多列时,列之间要用“,”分隔。【例3.19】查询全体学生的学号、姓名和年龄。3.4.1 投影查询(1)使用星号(*)查询所有的列如果想从FROM子句指定的表或视图中查询返回所有的列,可以在选择列表中选择星号*,而不需要列出表或视图中所有的列。【例3.20】查询学生表student中的所有信息,即所有的行和所有的列。3.4.1 投影查询(2)使用DISTINCT消除重复值在SELECT语句的选择列表中使用DISTINCT关键字,可以从结果集中消除指定列的值重复的行。【例3.21】查询学生表student中学生的专业,消除重复的行。从第一部分语句的执行结果和第二部分语句的执行结果中,可以发现学生的院系编号有多行重复,使用DISTINCT关键字可以实现去掉重复的行。3.4.1 投影查询(3)使用TOP n[PERCENT]仅返回n行使用TOP关键字,可以从查询结果集中只返回前n行。如果指定了PERCENT关键字,则返回前n%行,此时n必须介于0~100。如果查询包括ORDER BY子句,则首先对行进行排序,然后从排序后的结果集中返回前n行或n%行。【例3.22】从学生表student中查询学生的所有信息,要求只返回前3行数据。【例3.23】从学生表student中查询学生的所有信息,要求只返回前20%行数据。3.4.1 投影查询(4)修改查询结果的列标题(别名)利用投影查询可以控制列名的顺序,并可通过指定别名改变查询结果中的列标题的名称。修改查询结果的列标题有如下两种方法。将要显示的列标题用单引号括起来后,写在列名后面,两者之间用空格或AS分隔开。将要显示的列标题用单引号括起来后接等号(=),以及要查询的列名。【例3.24】查询全体学生的学号、姓名和年龄,改变查询结果的列名显示。3.4.2 选择查询选择查询就是指定查询条件,然后在表中显示满足查询条件的记录。为了选择表中满足查询条件的某些行,可以使用SQL命令中的WHERE子句。WHERE子句后跟查询的逻辑表达式,通常情况下,必须定义一个或多个条件限制检索选择的数据行,结果集将返回表达式为真的数据行。在WHERE子句中,查询条件表达式可以包含比较运算符和逻辑运算符。(1)比较,包括<、<=、!<、>、>=、>!、=、!=、<>等。(2)范围,包括BETWEEN AND 和 NOT BETWEEN AND。(3)集合,包括IN和NOT IN等。(4)字符匹配,包括LIKE和NOT LIKE。(5)未知判断,包括IS NULL和IS NOT NULL。(6)组合条件,包括AND、OR、NOT等。3.4.2 选择查询(1)比较【例3.25】查询学生表student中性别为女的学生记录。【例3.26】查询学生表student中年龄大于20岁的学生记录。3.4.2 选择查询(2)范围在WHERE子句的查询筛选条件表达式中,可以使用BETWEEN…AND运算符查询某一指定范围的记录。NOT BETWEEN…AND检索不在某一范围内的信息。【例3.27】查询教师表teacher中在1990年1月1日到2000年1月1日之间入职的教师信息。3.4.2 选择查询(3)集合IN关键字允许用户选择与列表中的值相匹配的行,指定项必须用括号括起来,并用逗号隔开,表示“或”的关系。NOT IN表示的含义正好相反。【例3.28】查询选修了C01、C02或C03的学生的学号、课程号和成绩。3.4.2 选择查询(4)字符匹配LIKE关键字用于查询与指定的某些字符串表达式模糊匹配的数据行。LIKE后的表达式被定义为字符串,必须用半角单引号括起来,字符串中可以使用以下四种通配符。%:匹配任意类型和长度的字符串。例如,LIKE'张%'匹配以“张”开头的字符串。LIKE'%应用%'匹配的是前后字符串为任意,中间含有“应用”两个字的字符串。_(下画线):可以匹配任何单个字符。例如,LIKE'_伟%'匹配的是第二个字符为“伟”的任何字符串。[]:匹配任何在范围或集合之内的单个字符。例如,[a-i]匹配的是a、b、c、d、e、f、g、h、i单个字符。[^]:匹配不在指定范围之内或集合的任何单个字符。例如,LIKE'[^a-c]'匹配的是不为a、b、c的所有字符串。3.4.2 选择查询【例3.29】查询姓“刘”的教师的信息。【例3.30】查询第二个字为“明”的教师的姓名、性别和职称。【例3.31】首先向学生表输入一个学号为“S10”、姓名为“JAMES_TM”和院系编号为“08”的学生记录,然后查询姓名中含有下画线的学生的学号、姓名、院系编号。3.4.2 选择查询(5)未知判断某个字段没有值,称之为具有空值。通常某个列的值不确定,没有输入一个具体的值,该列的值就为空值。空值不同于零或者空格,其不占任何存储空间。涉及空值查询时,使用IS NULL或IS NOT NULL,这里的IS不能用“=”代替。【例3.32】某些学生选修课程后没有参加考试,所以有选修记录,没有考试成绩。查询缺少考试成绩的学生的学号和相应的课程号。3.4.2 选择查询(6)组合条件当WHERE子句中有多个查询条件时,可以使用逻辑运算符AND、OR和NOT连接多个查询条件,形成复杂的逻辑表达式。其优先级由高到低为:NOT、AND、OR。但可用括号改变优先级。【例3.33】查询学生表student中性别为男且年龄大于等于19岁的学生记录。3.4.3 排序查询通常情况下,SELECT语句可以返回的查询结果集的记录是按表中记录的物理顺序排列的。ORDER BY子句可以按照升序(ASC)或降序(DESC)排列各行或各列,如果省略,则系统默认为升序。需要注意的是,ORDER BY子句必须是SQL命令的最后一个语句,ORDER BY子句中不能使用NTEXT、TEXT和IMAGE列。【例3.34】查询选修了C01课程的学生的学号和成绩,并按照成绩降序排列。3.4.3 排序查询对于空值,排序时的显示顺序由具体系统的实现决定。例如,按升序排列,含空值的记录最后显示;按降序排列,含空值的记录则最先显示。各个系统的实现可以不同,只要保持一致就行。【例3.35】查询选修了C01~C06课程的学生的学号、课程号和成绩,3.4.4 使用聚合函数聚合函数实现数据统计等功能,用于对一组值进行计算并返回一个单一的值。除了COUNT(*)外,聚合函数遇到空值时都忽略空值,仅处理非空值。SQL提供了许多聚合函数,增强了基本的数据检索能力。其参数说明如下。ALL:对所有的值进行聚合函数运算。ALL是默认值。DISTINCT:指定只在每个值的唯一实例上执行,而不管该值出现多少次。表达式:是精确数值或近似数值数据类型的表达式。不允许使用聚合函数和子查询。3.4.4 使用聚合函数【例3.36】查询学生表student中学生的总数。【例3.37】查询选修了课程的学生人数。【例3.38】求课程的最高分、最低分及之间相差的分数。3.4.5 分组查询在大多数情况下,使用统计函数返回的是所有行数据的统计结果。如果需要按某一列数据的值进行分类,在分类的基础上再进行统计,就要使用GROUP BY子句。GROUP BY子句将查询结果按分组表达式的值进行分组,值相等的为一个组。使用HAVING子句可以对这些组进一步加以控制,筛选出满足分组筛选条件的分组,以便在查询结果中输出。当一个聚合函数和GROUP BY子句一起使用时,聚合函数的作用范围变为每组的所有记录。【例3.39】查询每个教师的教工号及任课门数。3.4.5 分组查询【例3.40】查询任课一门以上的教师的教工号及任课门数。【例3.41】查询至少选修两门课程且课程成绩为良好(大于80分)的学生的学号和最高分。3.4.6 连接查询前面的查询都是针对一个表进行的,若一个查询同时涉及两个及两个以上的表,则称为连接查询。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接查询可以实现多表查询。在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接查询实际上是通过各个表之间的共同列(字段)的关联性实现的,这种关联字段称为连接字段。连接操作给用户带来很大的灵活性,可以在任何时候添加新的数据类型,为不同实体创建新的表,然后通过连接进行查询。在SQL Server 2019中,可以使用两种连接语法形式。一种是ANSI连接语法形式,此时连接用在FROM子句中,另一种是使用SQL Server连接语法形式,此时连接用在WHERE子句中(仅内连接可使用,称为旧式内连接)。3.4.6 连接查询(1)WHERE子句中定义连接在SELECT后面使用多个数据表且有同名字段时,必须明确定义字段所在的数据表名称。连接操作符可以是=、!=、<>、>、<、>=、<=、!>、!<。当操作符是“=”时,表示等值连接。(2)FROM子句中定义连接其中,join_type指定连接的类型,可以是INNER JOIN(内连接)、OUTER JOIN(外连接)、CROSS JOIN(交叉连接)。3.4.6 连接查询(1)等值连接与非等值连接等值连接是指表之间的连接条件使用“=”运算符,而使用其他比较运算符的连接称为非等值连接。除了使用比较运算符>、>=、<、<=、< >等,非等值连接还可以使用BETWEEN AND之类的谓词。【例3.42】查询“王欣”同学选修的课程,结果显示学号、姓名、课程号。3.4.6 连接查询【例3.43】查询教师的教工号、教师姓名和讲授的课程名称。【例3.44】在TeachSystem数据库中创建一个grade表,然后查询所有学生的SNO、CNO和rank,具体T-SQL语句如下。本例使用BETWEEN AND条件式,即条件不是等值条件,而是限定在一个范围内,属于非等值连接方式。3.4.6 连接查询(2)自身连接连接操作不仅可以在两个或两个以上的表之间进行连接,也可以是一个表与其自身进行的连接,称为自身连接。【例3.45】查询比韩耀飞年龄大的学生的姓名、年龄及韩耀飞的年龄。本例使用FROM子句定义连接条件,具体T-SQL语句如下。3.4.6 连接查询(3)外连接在内连接中,只有在两个表中匹配的记录才能在结果集中出现。而外连接只限制一个表,对另外一个表不加限制。外连接会返回FROM子句中提到的至少一个表或视图的所有行,只要这些行符合任何WHERE或HAVING子句的筛选条件,将检索通过左连接引用的左表的所有行,以及通过右连接引用的右表的所有行。全外连接中两个表的行都将返回。① 左外连接左外连接又称左连接,对左边的表不加限制,用于显示符合条件的数据行及左表中不符合条件的数据行,此时右表中的数据行会以NULL显示。3.4.6 连接查询【例3.46】查询所有课程的任课老师,显示课程名和其对应的授课老师的姓名,无授课老师的课程则授课老师的姓名一栏显示NULL。② 右外连接右外连接又称右连接,用于显示符合条件的数据行及右表中不符合条件的数据行,此时左表中的数据行会以NULL显示。【例3.47】查询所有老师的任课情况,显示教师姓名和所授课程的课程名,如老师没有授课,则对应的课程名一栏显示NULL。为了观察右外连接的执行效果,首先使用INSERT语句向教师表T中添加一条记录,语句如下。3.4.6 连接查询下面使用右外连接进行查询。③ 全外连接全外连接又称全连接,全外连接对两个表都不加限制,用于显示符合条件的数据行及左表和右表中不符合条件的数据行,此时缺少数据的数据行会以NULL显示。【例3.48】查询所有老师的任课情况和所有课程的任课老师。3.4.6 连接查询(4)交叉连接使用关键字CROSS包含一个以上的表的连接称为交叉连接,不能使用WHERE子句。交叉连接的结果集中,两个表中每两个可能成对的行占一行。在数学上,就是表的笛卡儿积。第一个表的行数乘以第二个表的行数等于笛卡儿积结果集的大小。【例3.49】学生表student交叉连接课程表course。3.4.7 子查询子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句或其他子查询中的查询。包含子查询的语句称为外部查询或外部选择。子查询能够将比较复杂的查询分解为几个简单的查询,而且子查询可以嵌套。子查询的执行过程是:首先执行内部查询,其查询的结果并不显示出来,而是传递给外层语句,并作为外层语句的条件使用。子查询可以嵌套在外部SELECT、INSERT、UPDATE或DELETE语句的WHERE或HAVING子句内,也可以嵌套在其他子查询内。尽管根据可用内存和查询中其他表达式的复杂程度的不同,嵌套限制也有所不同,但嵌套到32层是可能的。3.4.7 子查询(1)返回单个值的子查询当子查询的返回值是单个值时,可以使用>、=、<、>=、<=、<>等比较运算符将外部查询与子查询连接起来。【例3.50】查询与“韩耀飞”同学院系相同的学生的学号、姓名和院系编号。3.4.7 子查询(2)返回一组值的子查询当子查询的返回值不止一个,而是一个集合时,则不能直接使用比较运算符,可以将ANY或ALL结合比较运算符使用,且ANY或ALL在比较运算符和子查询之间。使用ANY进行子查询【例3.51】查询选修了C01课程的学生的姓名和院系编号。先执行子查询,查询选修了C01课程的学生的学号,学号为一组值构成的集合;再执行外部查询。其中ANY的含义为任意一个,外部查询查询学号匹配内查询结果集中的任意一个。本例还可以使用IN实现查询,使用IN代替上面语句中的=ANY即可。3.4.7 子查询【例3.52】查询其他系比“06”系任意一个学生年龄大的学生的姓名和年龄。(2)使用ALL进行子查询【例3.53】查询其他系比“06”系所有学生年龄大的学生的姓名和年龄。3.4.7 子查询(3)使用EXISTS的子查询将EXISTS作用于一个子查询时,如果子查询至少返回一行则产生逻辑值“TRUE”,不返回任何行则产生逻辑值“FALSE”。NOT EXISTS与EXISTS的作用相反。由EXISTS引出的子查询,其选择列表通常使用“*”表示,因为带EXISTS的子查询只用于检查是否返回行,给出列名没有实际意义。【例3.54】查询选修了C01课程的学生的姓名和院系编号。当子查询中SC表中存在一行记录满足其WHERE子句的条件时,外部查询便得到一个学生的信息,重复执行以上过程,直到查询完成。本例中的子查询的条件依赖于外部查询的属性值student.SNO,子查询条件是否成立与这个属性的值有关,因此这类查询称为相关子查询。3.4.7 子查询相关子查询和普通子查询两者在执行方式上有很大的区别。普通子查询:首先执行子查询,然后把子查询的结果作为外部查询的查询条件的值。普通子查询只执行一次,而外部查询所涉及的所有记录行都与子查询的结果比较来确定最终结果集。相关子查询:首先选择外部查询的第一行记录,内部子查询利用此行中的某个属性值进行查询,然后外部查询根据子查询的返回结果判断此行是否满足查询条件。如果满足条件,则把该行放入父查询的查询结果集中。重复执行此过程,直到处理完父查询表中的每行记录。(4)UPDATE、DELETE和INSERT语句中的子查询除了嵌套在SELECT语句中,子查询还可以嵌套在UPDATE、DELETE和INSERT语句中。【例3.55】删除没有被选修的课程。3.4.8 集合查询SELECT语句的查询结果是元组的集合,因此多个SELECT语句的结果可以进行集合操作。集合操作主要包括并操作(UNION)、交操作(INTERSECT)和差操作(EXCEPT)。参加集合操作的各个查询结果的列数必须相同,对应的数据类型必须兼容。【例3.56】查询选修了课程C01或课程C02的学生集合的并集。使用UNION关键字,将多个查询的结果合并起来,系统会自动去掉重复的元组。如果要保留重复的元组,可以使用UNION ALL操作符。3.4.8 集合查询【例3.57】查询系别为“08”的学生与年龄大于18岁的学生的交集。【例3.58】查询系别为“08”的学生与年龄大于18岁的学生的差集。使用INTERSECT关键字,返回其左右两边的两个查询的结果集的交集。使用EXCEPT关键字,从其左边的查询结果中删除右边的查询结果中相同的记录,即两个查询做差运算。 展开更多...... 收起↑ 资源预览