资源简介 (共81张PPT)网站数据库应用技术SQL Server 2008(项目教程)6 项目六 数据查询数据查询是数据库系统应用的主要内容,保存数据就是为了使用,要使用数据首先查找到需要的数据。在T-SQL中使用SELECT语句来实现数据查询。用户通过SELECT语句可以从数据库中搜索用户所需要的数据,也可进行数据的统计汇总并返回给用户。SELECT语句是数据库操作中使用频率最高的语句,是SQL语言的灵魂6.1 任务1:简单查询6.1.1相关知识简单查询我们在使用SQL语句对数据库中的信息进行查询操作时,数据表在接受查询请求时,就可以简单地理解为“它将逐条判断”,判断是否符合查询条件。如果符合查询条件就提取出来,然后把所有的行组织在一起,形成另外一个类似表的结构,构成查询的结果,通常叫做记录集。相关知识简单查询 1.基本查询从表中查询某些列的值,这是最基本的查询语句。SELECT 列名1,列名2 FROM 表名相关知识简单查询 2.Where(条件)作用:按照一定的条件查询数据语法:SELECT 列名1,列名2 FROM 表名 WHERE 列名1 运算符 值 运算符…相关知识简单查询 Where(条件)相关知识简单查询 3.BETWEEN在两个值之间,比如从学生中查询1990--1996年出生学生信息的sql查询语句为:SELECT * FROM 学生表 WHERE 出生日期 BETWEEN ‘1990-01-01’ AND ‘1996-12-31’ 相关知识简单查询 4.LIKE作用:模糊查询。LIKE关键字与通配符一起使用(1)查询姓氏为张的学生信息SELECT * FROM 学生表 WHERE 姓名 LIKE '张%'(2)查询名字最后一个为“生”的同学SELECT * FROM 学生表 WHERE 姓名 LIKE '%生'(3)查询名字中含有“生”的学生信息SELECT * FROM 学生表 WHERE 姓名LIKE '%生%'(4)查询姓名为两个字,且姓张学生信息SELECT * FROM 学生表 WHERE 姓名 LIKE '张_'(5)查询姓氏为张、李的学生信息这个可以使用or关键字,但是使用通配符更简单高效SELECT * FROM 学生表 WHERE 姓名LIKE '[张李]%'(6)查询姓氏非张、李的学生信息这个也可以使用NOT LIKE 来实现,用下面方法更好。SELECT * FROM 学生表 WHERE 姓名LIKE '[^张李]%'或者:SELECT * FROM 学生表 WHERE 姓名LIKE '[!张李]%'相关知识简单查询 5.ANDAND 在 WHERE 子语句中把两个或多个条件结合起来。表示并且的意思,多个条件都成立。如查询姓张的学生信息的sql查询语句为:SELECT * FROM 学生表 WHERE 姓名 LIKE ‘张%’and 姓名 NOTLIKE ‘%李'相关知识简单查询 6.OR OR可在 WHERE 子语句中把两个或多个条件结合起来。或关系,表示多个条件,只有一个符合即可。如:查询姓氏为张、李的学生信息sql查询语句为:SELECT * FROM 学生表 WHERE 姓名LIKE '张%' OR 姓名 LIKE '李%'相关知识简单查询 7.NOTNOT对于条件的否定,取非。比如查询非张姓氏的学习信息的sql查询语句为:SELECT * FROM 学生表 WHERE 姓名 NOT LIKE '张%'相关知识简单查询 8.ORDER BY(1)查询学生信息表的学号、姓名、出生日期,并按“出生日期”升序排列SELECT * FROM 学生表 ORDER BY 出生日期e或指明ASCSELECT * FROM 学生表 ORDER BY 出生日期 ASC(2)查询学生信息,并按出生日期倒序排列SELECT * FROM 学生表 ORDER BY 出生日期 DESC 除了制定某个列排序外,还能指定多列排序,每个排序字段可以制定排序规则。说明:优先第一列排序,如果第一列相同,则按照第二列排序规则执行,以此类推。(3)查询学生的信息,按照总成绩倒序、学号升序排列SELECT * FROM 成绩表 ORDER BY 成绩 DESC,学号 ASC相关知识简单查询 8.ORDER BY相关知识简单查询 9.AS(Alias)可以为列名称和表名称指定别名(Alias)作用:我们可以将查询的列,或者表指定需要的名字。比如:SELECT 学号 AS 学生学号,姓名 AS 学生姓名 FROM 学生表相关知识简单查询 10.Distinct含义:不同的作用:查询时忽略重复值。语法:SELECT DISTINCT 列名称 FROM 表名称实例:SELECT DISTINCT 姓名 FROM 学生表相关知识简单查询 11.TOPTOP 子句用于规定要返回的记录的数目。对于大数据很有用的,在分页时也会常常用到。比如:SELECT TOP 3 姓名,学号 FROM 学生表6.1.2任务实施简单查询步骤1:在桌面上选择“开始”|“所有程序”|Microsoft SQL Server 2008|SQL Server Managerment Studio,打开SQL Server Managerment Studio窗口,设置服务器类型、服务器名称、身份验证、用户名和密码,单击“连接”按钮。任务实施简单查询步骤2:点击数据库栏目中的Student数据库中的表,找到班级表或学生表或课程表,用鼠标右键打开表,如下:任务实施简单查询任务实施简单查询步骤3:点击工具栏中的sql 按钮,如下:任务实施简单查询步骤4:右上角编写以下项目内容的不同sql代码,编写完后点击工具栏中的“!”按钮即可执行并查看运行结果。任务实施简单查询1.选择列表选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。任务实施简单查询1.选择列表(1)选择所有列例如,下面语句显示课程表中所有列的数据:SELECT * FROM 学生表任务实施简单查询1.选择列表(2)选择部分列并指定它们的显示次序查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。例如: SELECT 学号, 姓名, 性别, 出生日期, 政治面貌, 班级编号, 家庭住址, 邮编, 备注 FROM 学生表:任务实施简单查询1.选择列表(3)更改列标题在选择列表中,可重新指定列标题。定义格式为:列标题=列名,如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用英文显示列标题:SELECT 课程编号 AS No, 课程名称 AS Name, 课程类型 AS Type, 课程描述 AS describe FROM 课程表任务实施简单查询1.选择列表(4)删除重复行SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。例如:SELECT DISTINCT 课程类型 FROM 课程表(去掉重复)任务实施简单查询1.选择列表(5)限制返回的行数使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。例如:SELECT TOP 2 * FROM `课程表任务实施简单查询2. FROM子句FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。如下图所示从课程表中查询任务实施简单查询3.使用WHERE子句设置查询条件WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询出生年月在94年后的数据:SELECT * FROM 学生 WHERE (出生日期>= '1994-01-01')WHERE子句可包括各种条件运算符:任务实施简单查询3.使用WHERE子句设置查询条件(1)比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<范围运算符(表达式值是否在指定的范围):BETWEEN…AND…,NOT BETWEEN…AND…如:SELECT 学号, 姓名, 性别, 出生日期, 政治面貌, 班级编号, 家庭住址, 邮编, 备注 FROM 学生表WHERE (出生日期 BETWEEN '1994-01-01' AND '1995-12-31')任务实施简单查询3.使用WHERE子句设置查询条件(2)模式匹配符(判断值是否与指定的字符通配格式相符)LIKE、NOT LIKE常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。可使用以下通配字符:百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%任务实施简单查询3.使用WHERE子句设置查询条件(3)空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL如:SELECT * FROM 班级表 WHERE (院系编号 IS NOT NULL)任务实施简单查询3.使用WHERE子句设置查询条件(4)逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR 逻辑运算符:优先级为NOT、AND、OR如对教室编号在6以内而且为“考试”课进行课程查询,SQL语句为:SELECT 课程编号, 课程名称, 课程类型, 课程描述 FROM 课程表 WHERE (课程类型 = '考试') AND (课程编号< '006')任务实施简单查询4.查询结果排序使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:ORDER BY {column_name [ASC|DESC]} [,…n]其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排序。例如:SELECT * FROM 学生表 ORDER BY 学号,出生日期或者SELECT * FROM 学生表 ORDER BY 学号 Asc,出生日期 Asc6.2 任务2:SELECT语句的统计查询6.2.1相关知识SELECT语句的统计查询为了进一步方便用户,增强检索功能,SELECT语句中的统计功能可以对查询结果集进行求和、求平均值、求最大最小值等操作。统计的方法是通过集合函数和GROUP BY等子句组合来实现。相关知识SELECT语句的统计查询1.MAX/MINMAX 函数返回一列中的最大值。NULL 值不包括在计算中。MIN 函数返回一列中的最小值。NULL 值不包括在计算中。MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。(1)查询学生中最高的分数案例:SELECT MAX(成绩) FROM 成绩表(2)查询学生中最大年龄(出生日期最大的同学)案例:SELECT MIN(出生日期) FROM 学生表相关知识SELECT语句的统计查询2 .CASTCAST语句可以将SQL中字段类型转换成其它格式,如CAST(成绩 AS float)就是将其它格式类型转为数字类型,常用在数字型字符转换成数字以便进行统计相关知识SELECT语句的统计查询3.AVGAVG 函数返回数值列的平均值。案例:SELECT AVG(CAST(成绩 AS float)) AS 平均成绩 FROM 成绩表相关知识SELECT语句的统计查询4.GROUP BYGROUP BY语句用于结合合计函数,根据一个或多个列对结果集进行分组,如下面案例就是根据学号分组。案例:SELECT 学号 FROM 成绩表 GROUP BY 学号相关知识SELECT语句的统计查询5.HAVINGHAVING 子句是用于对分组设置条件,如下面案例就是只对平均成绩优秀的学生进行统计。案例:SELECT 学号, SUM(CAST(成绩 AS float)) AS 总成绩 FROM 成绩表 GROUP BY 学号HAVING (AVG(CAST(成绩 AS float)) >= 80)相关知识SELECT语句的统计查询6.SUM查询某列的合计值。如查询每位学生成绩各科的总分。案例:SELECT 学号, SUM(CAST(成绩 AS float)) AS 总成绩 FROM 成绩表GROUP BY 学号相关知识SELECT语句的统计查询7.COUNTCOUNT() 函数返回匹配指定条件的行数。案例:查询学生总人数:SELECT COUNT(学号) FROM 学生表6.2.2任务实施SELECT语句的统计查询按照任务1中的任务实施步骤进入T-SQL编写界面,在右上角输入如下的项目后,按工具栏中的“!”按钮进行统计查询。任务实施SELECT语句的统计查询1.最大值最小值的统计查询输入:SELECT 学号, MAX(成绩) AS 最高成绩 FROM 成绩表 GROUP BY 学号则查询结果能找到学生各学科中最高成绩如图6-35所示。任务实施SELECT语句的统计查询2.平均值的统计查询输入:SELECT 学号,AVG(CAST(成绩 AS float)) AS 平均成绩 FROM 成绩表 GROUP BY 学号则查询结果能统计出学生各学科的平均成绩任务实施SELECT语句的统计查询3.累计值的统计查询输入:SELECT 学号,SUM(CAST(成绩 AS float)) AS 总成绩 FROM 成绩表 GROUP BY 学号则查询结果能统计出学生各学科全部总成绩任务实施SELECT语句的统计查询4.项目数的统计查询输入:SELECT 课程编号 COUNT(课程编号) AS 已经录入的人数 FROM 成绩表 GROUP BY 课程编号则查询结果能统计出学生各科成绩已经录入的人数6.3 任务3 :SELECT语句中的多表连接6.3.1相关知识SELECT语句中的多表连接连接查询是关系数据库中最主要的查询方式。前面介绍的查询都是针对一张表进行的,但在实际工作中,所查询的内容往往涉及多张表。连接查询的目的是通过加载连接的字段条件将多个表连接起来,以便从多个表中检索用户所需要的数据。在SQL Server中连接查询类型分为交叉连接、内连接、外连接和自连接。连接查询就是关系运算的连接运算,它是从多个数据源间查询满足一定条件的记录 。相关知识SELECT语句中的多表连接1. 交叉连接交叉连接也称非限制连接,它是将两个表不加任何约束地组合起来。也就是将第一个表的所有行分别和第二个表的每一行形成一条新的记录,连接后该结果集的行数等于两个表的行数积,列数等于两个表列数的和。在数学上,就是两个表的笛卡儿积,在实际应用中一般是没有意义的,但在数据库的数学模型上有重要的作用。其语法结构如下:Select 列名列表 from 表名1 cross join 表名2或Select 列名列表 from 表名1, 表名2相关知识SELECT语句中的多表连接2. 内连接内连接也称自然连接,它是组合两个表的常用方法。内连接就是只包含满足连接条件的数据行,是交叉连接结果集按照连接条件进行过滤的结果。连接条件通常采用“主键=外键”的形式。内连接有以下两种语法格式。Select 列名列表 from 表名1 [inner] join表名2 on 表名1.列名=表名2.列名或Select 列名列表 from 表名1 [inner] join表名2 where 表名1.列名=表名2.列名相关知识SELECT语句中的多表连接3. 外连接在自然连接中,只有在两个表中匹配的才能在结果集合中出现。而在外连接中可以只限制一个表,而对另一个表不加限制(即另一个表中所有行都出现在结果中)。外连接分为左外连接、右外连接和全外连接。(1)左外连接左外连接是对连接条件中左边表不加限制,其语法格式如下:Select 列名列表 from 表名1 as A left [outer] join表名2 as B on A.列名=B.列名(2)右外连接右外连接是对连接条件中右边表不加限制,其语法格式如下:Select 列名列表 from 表名1 as A right [outer] join表名2 as B on A.列名=B.列名(3)全外连接全外连接是对两个表都不加限制,其语法格式如下:Select 列名列表 from 表名1 as A full [outer] join表名2 as B on A.列名=B.列名相关知识SELECT语句中的多表连接4. 自连接不仅可以在不同的表上进行操作,也可以在同一张表内进行自身连接,即将同一个表的不同行连接起来。自连接可以看作一张表的两个副本之间的连接。表名在from子句中出现两次,必须对表指定不同的别名进行限制,使之在逻辑上形成两张表。相关知识SELECT语句中的多表连接5. 合并查询合并查询也称联合查询,是将两个或两个以上的查询结果合并,形成一个具有综合信息的查询结果。采用UNION运算符可以将两个或两个以上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为:select_statement UNION [ALL] selectstatement [UNION [ALL] selectstatement][…n]相关知识SELECT语句中的多表连接合并查询selectstatement为待联合的SELECT查询语句。ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。在使用UNION运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。相关知识SELECT语句中的多表连接合并查询例如:查询1 UNION 查询2 UNION 查询3UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。UNION ALL 的语法如下:[SQL 语句 1]UNION ALL[SQL 语句 2]6.3.2任务实施SELECT语句中的多表连接按照任务1中的任务实施步骤进入SQL可输入界面,在右上角输入如下项目后,按工具栏中的“!”按钮进行统计查询6.3.2任务实施SELECT语句中的多表连接1.交叉连接查询我们将学生表和院系表进行交叉查询,输入如下SQL代码:SELECT 学生表.姓名, 学生表.学号, 院系表.院系编号, 院系表.院系名称 FROM 学生表 CROSS JOIN 院系表6.3.2任务实施SELECT语句中的多表连接2.内连接查询我们将学生表和院系表进行内连接查询,输入如图6-40所示的SQL代码:SELECT 学生表.姓名, 学生表.学号, 班级表.班级名称, 班级表.班级编号,班级表.院系编号 FROM 学生表,班级表 where 学生表.班级编号=班级表.班级编号6.3.2任务实施SELECT语句中的多表连接3.外连接我们将班级表和学生表进行左外部连接查询,输入如图6-41所示SQL代码:SELECT 班级表.班级名称, 班级表.班级编号, 班级表.院系编号, 学生表.姓名, 学生表.学号 FROM 班级表 LEFT OUTER JOIN 学生表 ON 学生表.班级编号 = 班级表.班级编号6.3.2任务实施SELECT语句中的多表连接4.联合查询Union联合查询要求表结构相同,在实现这个任务前我们需要提供相同表结构表或视图,本任务采用自己创建两个结构相同的视图(可参考视图相关章节)。步骤1:参考任务1中的任务实施登录Managerment Studio。步骤2:点击数据库栏目中的Student数据库中的视图,用鼠标右键打开新建视图。步骤3:弹出选择窗口点选关联表为学生表,然后点击“添加”按钮。步骤4:在右下写入如下代码SELECT * WHERE (性别 = '男'),并按下工具栏中的执行按钮“!”,退出时另存为视图名为“男同学”6.3.2任务实施SELECT语句中的多表连接联合查询步骤5:重新做步骤2和步骤3,在右下写入如下代码SELECT * WHERE (性别 = '女'),并按下工具栏中的执行按钮“!”,退出时另存为视图名为“女同学”6.3.2任务实施SELECT语句中的多表连接联合查询步骤6:点击数据库栏目中的Student数据库中的视图,找到“男同学”视图或“女同学”视图并打开该视图,然后点击工具栏中的sql 按钮,在右上角编写sql代码为:Select * from (Select * from 男同学 union all Select * from 女同学) ,编写完后点击工具栏中的“!”按钮即可执行并查看运行结果,如图6-46所示。结果是将2个分开的表重新合并成同样的学生表6.4 任务4:子查询6.4.1相关知识子查询在SQL语言中,一个SELECT…FROM…WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING子句的条件中的查询称为子查询。子查询总是写在圆括号中,可以用在使用表达式的任何地方。上层的查询块称为外层查询或父查询,下层的查询块称为内查询或子查询。SQL语言允许多层嵌套查询。即子查询中还可以嵌套其它子查询。但子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序相关知识子查询1.嵌套子查询嵌套子查询的执行不依赖于外部嵌套。其一般的求解方法是由里向外处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查询条件。相关知识子查询嵌套子查询(1)比较测试中的子查询(2)集合成员测试中的子查询(3)批量比较测试中的子查询 使用ANY关键字的比较测试 使用ALL关键词的比较测试相关知识子查询2.相关子查询相关子查询是指在子查询中,子查询的查询条件中引用了外层查询表中的字段值。相关子查询的结果集取决于外部查询当前的数据行,这一点与嵌套子查询不同。嵌套子查询和相关子查询在执行方式上也有不同。嵌套子查询的执行顺序是先内后外,即先执行子查询,然后将子查询的结果作为外层查询的查询条件的值。而在相关子查询中,首先选取外层查询表中的第一行记录,内层的子查询则利用此行中相关的字段值进行查询,然后外层查询结果集中。重复这一过程,直到处理完外层查询表中的每一行数据。通过对相关子查询执行过程的分析可知,相关子查询的执行次数是由外层查询的行数决定的。相关子查询的执行过程如下。 外部查询每查询一行,子查询即引用外部查询的当前值完整地执行一遍。 如果子查询有结果行存在,则外部查询结果集中返回当前查询的记录进行。 再回到第一步 ,直到处理完外部表的每一行。6.4.2任务实施子查询按照任务1中的任务实施步骤进入SQL可输入界面,在右上角输入如下项目后,按工具栏中的“!”按钮进行统计查询任务实施子查询1.求平均成绩不小于90的学生名单和相关信息输入SQL代码:SELECT * FROM 学生表 WHERE (学号 IN (SELECT 学号 FROM 成绩表 GROUP BY 学号 HAVING (AVG(CAST(成绩 AS float)) >= 90)))任务实施子查询2.找出年龄最大的学生和相关信息输入SQL代码:SELECT * FROM 学生表 WHERE (出生日期<= ALL (SELECT 出生日期 FROM 学生表 AS 学生表_1))项目小结本项目主要介绍数据查询,包括单表查询和多表连接查询。本项目内容为课程教学的重点内容,也是必须熟练掌握的内容。下面列出了本项目中的SELECT语句的完整语法为:SELECT[ALL|DISTINCT|DISTINCTROW|TOP] {*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]} FROM tableexpression[,…][IN externaldatabase] [WHERE…] [GROUP BY…][HAVING…] [ORDER BY…] [WITH OWNERACCESS OPTION] 用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。实 训 项 目综合实训:项目查询实训项目实训目的:掌握通过“SQL Server Management Studio”管理工具和T-SQL语句完成简单查询、统计查询、连接查询、子查询等操作。实训内容:在数据库“Library”中完成下列操作:书籍信息[book_Info]查询课程表信息[borrow_Info]查询按照书籍归还日期递减排序显示实训项目1操作:实训项目打开实习数据库的 书籍信息[book_Info]表中:(1)设置不同作者(2)设置不同出版社(3)设置不同刊号(4)设置显示顺序按照刊号递减排序点击查看查询结果实训项目2操作:实训项目打开实习数据库的 借书信息[borrow_Info]表中:(1)设置不同的借书日期(2)设置不同的归还日期(3)按照归还日期递减排序显示点击查看查询结果实训项目3操作:实训项目打开实习数据库进行如下操作:(1)创建视图1为表[borrow_Inf]中设置条件为已经归还的(2)创建视图2为表[borrow_Inf]中设置条件为没有归还的(3)对视图1和视图2进行联合查询(4)根据书的编号字段“booke_No”进行排序最后查看查询结果THANKS 展开更多...... 收起↑ 资源预览