1、任务:任务:使用T-SQL语句和SSMS对数据库JXGL进行数据查询。通过单表的简单查询、多表的连接查询以及高级嵌套查询等多种方式查询得到用户需要的信息。5.1 了解T-SQL的常用函数5.2 分析“高职院校教学管理系统”中的数据查询 5.3 简单查询5.4 连接查询5.5 嵌套查询5.6 使用SSMS进行数据查询5.7 知识进阶 项目实训任务五任务五 应用数据库中的数据应用数据库中的数据 SQL Server 2005中的数据查询 了解T-SQL的常用函数 使用T-SQL进行单表的简单查询 使用T-SQL进行多表的内连接和外连接,了解多表的交叉连接 使用T-SQL进行嵌套查询 使用SSMS进
2、行数据查询学习目标学习目标SQL Server 2005中的数据查询 5.1 5.1 了解了解T-SQLT-SQL的常用函数的常用函数 任务任务:了解常用的SQL函数,掌握常用集合函数、字符串函数和日期时间函数。SQL Server 2005中的数据查询1.数学函数:数学函数:实现各种数学运算和三角运算。如:ABS、SQRT、CEILING/FLOOR、RAND、ROUND、POWER、LOG等。2.字符串函数:字符串函数:实现对字符串数据的分析、查找、转化等。如:CHAR、SPACE、STR、LOWER、UPPER等。3.日期时间函数:日期时间函数:实现对日期时间类型数据的各种操作。如:GE
3、TDATE、DATEADD、DATEDIFF、DATEPART等。4.集合函数:集合函数:用于计算SELECT语句查询结果行的统计值,在查询结果集中生成汇总值。如:COUNT、MAX、MIN、SUM等。5.系统函数系统函数:用于获取有关计算机系统、用户、数据库和数据库对象等当前运行环境的系统信息。如:HOST_ID、CURRENT_USER、IS_MEMBER等T-SQL的常用函数的常用函数SQL Server 2005中的数据查询T-SQL的常用函数的常用函数6.用户自定义函数:用户自定义函数:自定义的函数包含标量值函数、内联表值函数和多语句表值函数三种。标量值函数。该函数返回单个数据值,数
4、据类型是在RETURNS子句中指定的。内联表值函数。该函数指定table作为返回类型,可以通过内联表值函数实现参数化视图功能。多语句表值函数。该函数是视图与存储过程的集合应用,返回table类型。【例5-4】定义一个函数stu_score,求出并返回学生成绩的70%。CREATE FUNCTION stu_score(tempscore AS numeric(9)RETURNS numeric(9)AS BEGIN RETURN(tempscore*0.7)ENDGO SQL Server 2005中的数据查询5.2 5.2 分析分析“高职院校教学管理系统高职院校教学管理系统”中的数据查中的数
5、据查询询 任务:任务:分析“高职院校教学管理系统”中的数据 查询需求。SQL Server 2005中的数据查询1.从查询类型角度分析:从查询类型角度分析:单表查询。针对没有外键的基本表。多表查询。通过外键列将分属于多个表的信息进 行连接查询或嵌套查询后放在一起显示。数据的汇总统计查询。通过单表查询或多表的关联查询对相应的数据行汇总和统计。2.从系统的管理应用角度分析:从系统的管理应用角度分析:学生基本信息查询。学籍信息查询。学生成绩查询。学生选课信息查询。教材信息查询。5.3 5.3 简单查询简单查询 任务:任务:掌握SELECT语句的基本语法,按查询需求,应用WHERE条件及各关键字实现对
6、“高职院校教学管理系统”的各类基本数据查询。5.3.1 认识SELECT语句5.3.2 最基本的SELECT语句5.3.3 数据汇总及空值查询5.3.4 使用WHERE进行条件查询5.3.5 使用ORDER BY排序查询结果5.3.6 使用GROUP BY分组统计5.3.7 使用COMPUTE BY显示子集明细5.3.8 使用查询结果创建新表5.3.9 使用UNION联合多个查询SQL Server 2005中的数据查询5.3.1 认识SELECT语句 使用T-SQL 的SELECT语句从一个或多个表或视图中,对存在于数据库中的数据按照特定的组合、条件表达式和次序进行查询,并可对数据进行筛选、
7、分组、统计、排序等处理。基本语法:SELECT ALL|DISTINCT|TOP n|TOP n PERCENT select_listINTO new_table_name FROM table_listWHERE search_conditions GROUP BY group_by_list HAVING search_conditions ORDER BY order_list ASC|DESC COMPUTE aggregate_functions BY compute_by_list 各子句说明各子句说明 SELECT:关键字,表示从数据库中查询数据。ALL|DISTINCT|TO
8、P n|TOP n PERCENT:关键字,对查询结果集的数据行进行控制。select_list:需要在结果集中显示的列,是由逗号分隔的表字段或表达式列表。INTO new_table_name:将查询结果集存放到一个新创建的表中。FROM table_list:指定要查询的表或视图的数据源列表。WHERE search_conditions:指定查询时的筛选条件。GROUP BY group_by_list:按照指定的列对结果集进行分组。HAVING search_conditions:指定用于分组后的筛选条件。ORDER BY order_list ASC|DESC:指定结果集需要依据哪些
9、列来进行排序后显示。COMPUTE aggregate_functions BY compute_by_list:对查询结果集中的所有记录进行汇总统计,并显示所有参加汇总统计的详细子集,即统计明细。SQL Server 2005中的数据查询5.3.2 最基本的SELECT语句 最简单的查询是不附加任何查询条件,即只由必须的SELECT和FROM子句组成,而不使用WHERE、GROUP BY、HAVING、ORDER BY等其他可选的子句。基本语法如下:SELECT*|column_name,.n FROM table_name;例:从表student_info中查询出全体学生的学号、姓名、性别
10、和班级等基本信息。代码如下:SELECT stud_id,stud_name,gender,class_idFROM student_infoGOSQL Server 2005中的数据查询需要说明的是:在SELECT关键字后出现的列名顺序决定了查询结果集中列的顺序。当SELECT关键字后用“*”,则显示数据源中所有列,且显示列序为数据表中列的定义顺序。通过命名别名的方式改变结果集中列的标题,有“列标题名=列名”和“列名AS 列标题”两种方式。【例5-5】从表student_info中查询出全体学生的详细信息。SELECT *FROM student_infoGO【例5-6】从表student_
11、info中查询出全体学生的学号、姓名、性别和班级等基本信息。SELECT stud_id,stud_name,gender,class_idFROM student_infoGO【例5-7】从表student_info中查询出所有学生的姓名、性别、学号、班级等基本信息,并用相应的中文标题显示。SELECT 姓名=stud_name,性别=gender,stud_id AS 学号,class_id AS 班级FROM student_infoGO。5.3.2 最基本的SELECT语句SQL Server 2005中的数据查询5.3.3 数据汇总及空值查询 通过使用SQL的集合函数可以对数据进行各
12、种统计,大大简化了数据的查询。例2:从表student_info中查询出全体学生的姓名和年龄。代码如下:SELECT stud_name AS 姓名,YEAR(GETDATE()-YEAR(birthday)AS 年龄FROM student_infoGO 提示:提示:YEAR(GETDATE()-YEAR(birthday)是一个计算列,取得系统日期中的年份,减去学生出生日期列中的年份,即年龄。SQL Server 2005中的数据查询【例5-10】从表student_info中查询出所有学生的民族信息。代码如下:图5-6 学生的民族信息SELECT DISTINCT nationFROM
13、student_infoGO【例5-11】从表book_info中查询出最贵和最便宜的书。代码如下:SELECT MIN(price),MAX(price)FROM book_infoGO【例5-12】从表teacher _info中查询出教师及其职称,如果职称为空,则默认显示为“讲师”。代码如下:SELECT teac_name,ISNULL(profession,N 讲师)FROM teacher_infoGO5.3.3 数据汇总及空值查询 提示提示:使用DISTINCT关键字消除了查询结果中重复的信息。提示:提示:教师职称的值为NULL时,通过ISNULL()函数进行了特殊处理。SQL
14、Server 2005中的数据查询5.3.4 使用WHERE进行条件查询 用户可以使用WHERE子语句实现从表中筛选出满足特定条件的一部分记录。WHERE子语句中常用的查询条件见书表5-7。1基于比较运算的基于比较运算的WHERE子句子句【例5-15】从表student_info中查询出2年前入学的所有学生的详细信息。代码如下:SELECT*FROM student_infoWHERE enter_date=DATEADD(year,-2,GETDATE()GO 提示:提示:进行条件比较的可以是表中的单个列,也可以是计算列或函数。字符串类型或日期时间类型的列,使用比较条件时,要用单引号引起来。
15、WHERE子句中使用的字段也可以出现在SELECT关键字中。SQL Server 2005中的数据查询4基于基于LIKE关键字的关键字的WHERE子句子句 当只知道查询对象的部分值且不知道准确形式的时候,就要使用LIKE运算符和通配符相匹配的模糊查询,见书表5-8和5-9。【例5-22】从表book_info中查询出书名中包含“SQL Server_”的教材信息。代码如下:SELECT *FROM book_infoWHERE book_name LIKE NSQL Server/_%ESCAPE/GO5.3.4 使用WHERE进行条件查询 提示:提示:LIKE子句中紧跟在符号“/”后面的字符
16、“_”被定义为匹配字符,而不再是通配符。SQL Server 2005中的数据查询5基于空值判断的基于空值判断的WHERE子句子句 空值用NULL表示,它是一个符号,既不等于0,也不是空格,不能进行算术运算。6多个条件的组合查询多个条件的组合查询【例5-24】从表student_info中查询出家住“济南”或名字为“卓玛”的少数民族学生的信息。代码如下:SELECT*FROM student_infoWHERE (nation!=N汉族)AND (home_addr LIKE N%济南%OR stud_name LIKE N%卓玛)GO5.3.4 使用WHERE进行条件查询 建议:建议:不要使
17、用逻辑运算符默认的优先级顺序,而是采用括号来明确需要的执行顺序,以增强程序的可读性。SQL Server 2005中的数据查询5.3.5 使用ORDER BY排序查询结果使用ORDER BY指定对最终的查询结果按照一个或多个列进行升序(ASC)或降序(DESC)排列后显示。默认为升序,即ASC可以缺省。语法为:ORDER BY 列名 ASC|DESC,n【例5-26】从表student_grade中查询“考试”课的信息,只显示成绩最高的前10条记录。代码如下:SELECT TOP 10*FROM student_gradeWHERE form=N考试ORDER BY grade DESCGO提
18、示:提示:本例中,TOP关键字可指定返回查询结果中的前n行,或前一个百分数的行数。SQL Server 2005中的数据查询5.3.6 使用GROUP BY分组统计1不含条件的分组统计不含条件的分组统计 GROUP BY子句与集合函数一起,将查询结果按某一列或多列的取值进行分组,列的取值相同的行为一组,对每一组进行统计。基本语法为:GROUP BY 列名,HAVING 分组条件表达式【例5-28】对表student_grade中“考查”课的每门课程的成绩进行统计,统计内容包括参加考试的学生个数、平均成绩、最高成绩和最低成绩。代码如下:SELECT course_id AS 课程,count(s
19、tud_id)AS 学生数,avg(grade)AS 平均成绩,max(grade)AS 最高成绩,min(grade)AS 最低成绩 FROM student_gradeWHERE form!=N 考试GROUP BY course_idGOSQL Server 2005中的数据查询5.3.6 使用GROUP BY分组统计2使用使用HAVING子句设置分组条件子句设置分组条件 “HAVING分组条件表达式”用来对分组后生成的中间结果集进行条件筛选。【例5-28】对表student_grade中各学生的“考试”课的考试成绩进行统计,查询出平均分不及格的学生的学号和平均成绩。代码如下:SELEC
20、T stud_id,AVG(grade)AS 平均成绩FROM student_gradeWHERE form=N考试GROUP BY stud_idHAVING AVG(grade)90GOSELECT*FROM#temp_student_gradeGOSQL Server 2005中的数据查询5.3.9 使用UNION联合多个查询UNION运算符将两个或多个查询结果组合为一个结果集,该结果集包含查询的全部行。语法如下:select_statement UNION ALL select statementUNION ALL select statement n【例5-33】对表student
21、_info和表teacher_info分别进行查询,并把结果放在一起显示,使用户可以看到所有学生和老师的编号、姓名和身份(“学生”或“教师”)。代码如下:SELECT stud_id AS id,stud_name AS name,N学生 AS person_type FROM student_infoUNIONSELECT teac_id AS id,teac_name AS name,N教师 AS person_type FROM teacher_infoGO 使用UNION组合查询时需要注意以下几点:(1)UNION联合的所有查询语句必须具有相同的列,且数据类型必须兼容。(2)合并后结果
22、集的列名使用第一个SELECT语句中的列标题。若要定义列标题,必须在第一个SELECT语句中定义。若要对联合查询结果排序,也必须使用第一个SELECT语句中的列。(3)在包括多个查询的UNION语句中,其执行顺序是自左至右,而使用括号可以改变这一执行顺序。(4)如果要将合并后的结果集保存到一个新表中,INTO语句必须放在第一个SELECT语句中。(5)只可以在最后一条SELECT语句中使用ORDER BY 和COMPUTE子句。SQL Server 2005中的数据查询 5.4 5.4 连接查询连接查询 任务任务:理解内连接、自连接、外连接和交叉连接的含义,应用内连接,外连接和交叉连接对“高职
23、院校教学管理系统”进行数据查询。5.4.1 使用内连接查询数据5.4.2 使用外连接查询数据5.4.3 使用交叉连接查询数据SQL Server 2005中的数据查询连接查询连接查询是涉及到两个或多个表之间的关联查询,连接关系 的建立有以下两种方式。在WHERE子句中建立连接关系,基本语法如下:FROM join_table join_type join_table WHERE join_condition 在FROM子句中建立连接关系,基本语法如下:FROM join_table join_type join_table ON join_conditionSQL Server 2005中的数
24、据查询其中:其中:join_table指定参与连接操作的表。join_type指定连接类型,包括内连接、外连接和交叉连接三种。join_condition指定多个连接表之间的连接条件5.4.1 使用内连接查询数据 内连接是通过INNER JOIN关键字或者JOIN关键字把多表 进行连接。内连接将多个表中都满足条件的记录联合成一条新记录。如果一个表中的某条记录按照连接条件在另外一个表中没有找到任何匹配的记录,则这条记录就不会出现在结果集中。内连接查询的基本语法如下:SELECT FROM INNER JOIN ON.,在使用内连接进行数据查询的时候,需要注意以下几点:(1)可以在FROM子句指定
25、表的同时定义表的别名,格式为“表名 AS 表别名”。(2)当一个表与它自身进行连接操作时,称为表的自连接(3)如果多个表中有相同名称的字段时,在SELECT后面指定字段名时必须加上表名(或表别名)作为前缀,即用“表名.列名”或“表别名.列名”表示。(4)如果在FROM子句中为表定义了别名后,则在SELECT关键字后以及WHERE、ORDER BY等各个子句中,都必须使用“表别名.列名”格式,而不允许再使用“表名.列名”格式。(5)进行连接查询的多表之间必然存在主键和外键关系,只要主外键关系列出,就可以确定连接条件。SQL Server 2005中的数据查询【例5-36】在表student_gr
26、ade中,查询与学号为J06020345的同学选修了相同课程的其他同学的成绩信息。代码如下:SELECT DISTINCT a.stud_id,a.course_id,a.grade,a.stud_creditFROM student_grade a,student_grade bWHERE a.course_id=b.course_id AND a.stud_id!=J06020345 AND b.stud_id=J06020345 GO5.4.1 使用内连接查询数据SQL Server 2005中的数据查询5.4.2 使用外连接查询数据(1)左外连接的结果集返回了左表中的所有匹配行。(2)
27、右外连接和左外连接相反,它将返回右表的所有匹配行。(3)全外连接则返回左表和右表中的所有匹配行。【例5-37】左外连接表book_info和表course_info,查询出各个教材所对应的课程。即使教材没有在任何课程中使用,也在结果集中显示。代码如下:SELECT a.book_id,a.book_name,b.course_id,b.course_name FROM book_info AS a LEFT OUTER JOIN course_info AS b ON a.book_id=b.book_id GO SQL Server 2005中的数据查询5.4.3 使用交叉连接查询数据使用交
28、叉连接查询数据交叉连接交叉连接(CROSS JOIN)指在进行多表查询时不指定任何连接条件,它返回连接表中所有数据行的笛卡尔积,结果集中的数据行数为第一个表中符合查询条件的数据行乘以第二个表中符合查询条件的数据行。SQL Server 2005中的数据查询 5.5 5.5 嵌套查询嵌套查询 任务任务:理解嵌套查询的概念及语法,使用比较运算符及IN或NOT IN、EXISTS或NOT EXISTS谓词对“高职院校教学管理系统”进行数据查询。5.5.1 使用比较运算符连接的嵌套查询5.5.2 使用IN谓词连接的嵌套查询5.5.3 使用EXISTS谓词连接的嵌套查询SQL Server 2005中的
29、数据查询 嵌套查询 在SELECT语句的WHERE或HAVING 子句中嵌套另一个SELECT 语句的查询称为嵌套查询,又称子查询。嵌套查询还可以嵌套在INSERT、UPDATE、DELETE语句或其他嵌套查询中。嵌套查询的执行流程是,首先执行内部嵌套的子查询语句,查询的结果并不被显示,而是传递给外层的SELECT语句作为该查询语句的查询条件使用。在不影响理解的情况下,也可以称子查询形成的结果作为父查询的条件。嵌套查询可以最多嵌套32层。SQL Server 2005中的数据查询5.5.1 使用比较运算符连接的嵌套查询使用比较运算符连接SELECT子查询时,子查询只能是单列、单值子查询语句。【
30、例5-39】使用嵌套查询列出表student_info中大于学生平均年龄的学生信息。代码如下:SELECT*FROM student_info WHERE YEAR(GETDATE()-YEAR(birthday)(SELECT AVG(YEAR(GETDATE()-YEAR(birthday)FROM student_info )GOSQL Server 2005中的数据查询对于单列、单值子查询,可以使用比较运算符与外部查询进行连接。但对单列、多值的子查询,则不能使用比较运算符,只能使用IN或NOT IN进行嵌套连接。【例5-40】使用嵌套查询列出表teacher_class_course中
31、职称为“副教授”的排课信息。代码如下:SELECT *FROM teacher_class_courseWHERE teac_id IN (SELECT teac_id FROM teacher_info WHERE profession=N副教授)GO5.5.2 使用IN谓词连接的嵌套查询SQL Server 2005中的数据查询5.5.3 使用EXISTS谓词连接的嵌套查询EXISTS和NOT EXISTS关键字用来确定数据是否在查询结果集中存在。EXISTS表示子查询至少返回一行时条件成立,NOT EXISTS表示子查询中没有任何记录返回时条件成立。【例5-41】使用嵌套查询列出表tea
32、cher_class_course中所有在名称为“阶梯教室1”上课的课程信息。代码如下:SELECT*FROM teacher_class_courseWHERE EXISTS (SELECT*FROM classroom_info WHERE classroom_info.croom_id=teacher_class_course.croom_id AND classroom_info.croom_name=N阶梯教室1)GOSQL Server 2005中的数据查询 5.6 5.6 使用使用SSMSSSMS进行数据查询进行数据查询 任务任务:使用SSMS对“高职院校教学管理系统”进行数据查
33、询。SQL Server 2005中的数据查询 使用SSMS进行数据查询 使用SSMS对“高职院校教学管理系统”进行数据查询,操作步骤略。SQL Server 2005中的数据查询 5.7 5.7 知识进阶知识进阶 任务任务:掌握在数据操作语句中使用查询,了解联合查询和分布式查询。5.7.1 在数据操作语句中使用查询5.7.2 分布式查询SQL Server 2005中的数据查询5.7.1 在数据操作语句中使用查询在“嵌套查询”中已经提到,一个SELECT查询语句除了可以嵌套在另一个SELECT 语句中外,还可以嵌套在INSERT、UPDATE 或 DELETE等数据操作语句中。此时相当于将嵌
34、套查询语句的结果集返回给数据操作语句,作为操作条件或数据来源。【例5-43】对表student_info和表student_grade进行连接查询,并将查询结果插入到新建表t_student_score中。INSERT INTO t_student_score (stud_id,stud_name,class_id,course_id,grade)(SELECT a.stud_id,a.stud_name,a.class_id,b.course_id,b.grade FROM student_info AS a INNER JOIN student_grade AS b ON a.stud_i
35、d=b.stud_id )GOSQL Server 2005中的数据查询分布式查询是指任何引用了一个或多个外部 OLE DB 数据源中表或行集的 SELECT、INSERT、UPDATE 或 DELETE 语句。所有分布式查询的执行方案都有以下六种操作:(1)建立连接和查询属性操作。(2)表名解析和查询元数据操作。(3)事务管理操作。(4)数据类型处理操作。(5)错误处理操作。(6)安全性操作。分布式查询中的数据类型使用下列两种映射方式之一进行处理:(1)使用端映射。(2)导出端映射。5.7.2 分布式查询SQL Server 2005中的数据查询项目实训项目实训 1实训题目实训题目查询“销售合同管理系统”数据库中的数据。2实训目的实训目的(1)了解常用的T-SQL函数。(2)利用SQL语句进行简单查询、连接查询和嵌套查询。(3)掌握使用SSMS进行数据查询的方法。3实训内容实训内容(1)向数据库各表输入数据。(2)使用SSMS查询所有部门信息,并按部门编号排序。(3)使用T-SQL语句实现各种数据查询。SQL Server 2005中的数据查询