广东财经大学唐冬清数据查询数据查询嵌套查询ORDERBY子句GROUPBY子句COMPUTE子句集合操作小结T-SQL查询简单查询条件查询汇总查询INTO子句连接查询查询请求查询结果集结果集T-SQL查询例如:查询查询籍贯为“山西省太原市的学生信息:T-SQL查询示例数据库的关系图(“教学成绩管理系统”)T-SQL查询基本语法SELECT[ALL|DISTINCT]目标列表达式1[,…目标列表达式n][INTO目标数据表]FROM源数据表或视图[,...n][WHERE条件表达式][GROUPBY分组表达式[HAVING搜索表达式]][ORDERBY排序表达式[ASC]|[DESC]][COMPUTE行聚合函数名(表达式)[,...n][BY表达式[,...n]]]T-SQL查询功能:从FROM列出的数据源表中,找出满足WHERE检索条件的记录,按SELECT子句的字段列表输出查询结果表,在查询结果表中可进行分组与排序。数据查询嵌套查询ORDERBY子句GROUPBY子句COMPUTE子句集合操作小结T-SQL查询简单查询条件查询汇总查询INTO子句连接查询选取全部列:*示例:查询学生基本信息SELECT*FROM学生信息表简单查询示例:查询学生姓名,性别,家庭地址和联系电话SELECT姓名,性别,家庭地址,联系电话FROM学生信息表选取指定列简单查询示例:查询学生的姓名,性别和年龄SELECT姓名,性别,年龄=DATEDIFF(YEAR,出生日期,GETDATE())FROM学生信息表使用别名:=或AS或空格SELECT姓名,性别,datediff(year,出生日期,getdate())AS年龄FROM学生信息表SELECT姓名,性别,datediff(year,出生日期,getdate())年龄FROM学生信息表简单查询选取全部记录:ALL示例:查询学生信息表中的所有年龄SELECTALL年龄=DATEDIFF(YEAR,出生日期,GETDATE())FROM学生信息表过滤重复记录:DISTINCT示例:查询学生信息表中的所有年龄SELECTDISTINCT年龄=DATEDIFF(YEAR,出生日期,GETDATE())FROM学生信息表ALL是默认选项,可省略简单查询示例1:查询学生信息表中前5条记录SELECTTOP5*FROM学生信息表仅返回前面若干条记录:TOP示例2:查询学生信息表中前20%条记录SELECTTOP20PERCENT*FROM学生信息表简单查询数据查询嵌套查询ORDERBY子句GROUPBY子句COMPUTE子句集合操作小结T-SQL查询简单查询条件查询汇总查询INTO子句连接查询示例:查询年龄在26岁以下的学生姓名,性别和年龄SELECT姓名,性别,年龄=DATEDIFF(YEAR,出生日期,GETDATE())FROM学生信息表WHEREDATEDIFF(YEAR,出生日期,GETDATE())=26比较表达式作查询条件条件查询示例:查询年龄为26岁的女学生姓名,性别和年龄SELECT姓名,性别,年龄=DATEDIFF(YEAR,出生日期,GETDATE())FROM学生信息表WHEREDATEDIFF(YEAR,出生日期,GETDATE())=26AND(性别='女')逻辑表达式作查询条件条件查询示例:查询工资在3000到5000的教师信息SELECT姓名,性别,职称,工资FROM教师信息表WHERE工资BETWEEN3000AND5000使用BETWEEN关键字表达式[NOT]BETWEEN表达式1AND表达式2条件查询示例:查询电话号码区号为0351、0354和0355的学生SELECT姓名,性别,联系电话FROM学生信息表WHERELEFT(联系电话,4)IN('0351','0354','0355')使用IN关键字表达式[NOT]IN(表达式1,表达式2[,…表达式n])条件查询示例:查询家庭地址为空行的学生学号,姓名和家庭地址SELECT学号,姓名,家庭地址FROM学生信息表WHERE家庭地址ISNULL使用IS(NOT)NULL关键字示例:查询没有输入家庭地址的学生学号,姓名和家庭地址SELECT学号,姓名,家庭地址FROM学生信息表WHERE家庭地址ISNULLOR家庭地址=''注意null和空字符串的区别条件查询示例:查询联系电话以0351、0354或0355开头的学生信息SELECT*FROM学生信息表WHERE联系电话LIKE'035[145]%'使用LIKE关键字(模糊查询)表达式[NOT]LIKE'格式串'其中格式串通常与通配符配合使用:%:表示从0到n个任意字符。_(下划线):表示单个的任意字符。[]:表示方括号里列出的任意一个字符。[^]:任意一个没有在方括号里列出的字符。条件查询数据查询嵌套查询ORDERBY子句GROUPBY子句COMPUTE子句集合操作小结T-SQL查询简单查询条件查询汇总查询INTO子句连接查询聚合函数函数名功能sum()对数值型列或计算列求总和avg()对数值型列或计算列求平均值min()返回一个数值列或数值表达式的最小值max()返回一个数值列或数值表达式的最大值count()返回满足指定的条件的记录的个数count(*)返回找到的行数汇总查询示例:查询学生的最高分数、最低分数、平均分数及总人数SELECTMAX(分数)最高分数,MIN(分数)最低分数,AVG(分数)平均分数,COUNT(*)总人数FROM教学成绩表汇总查询数据查询嵌套查询ORDERBY子句GROUPBY子句COMPUTE子句集合操作小结T-SQL查询简单查询条件查询汇总查询INTO子句连接查询示例:查询所有女生的信息并将结果保存名为[女生表]的数据表。SELECT*INTO女生表FROM学生信息表WHERE性别=‘女’INTO子句:保存查询结果示例:查询所有男生的信息并将结果存入临时表中。SELECT*INTO#tempdbFROM学生信息表WHERE性别='男'INTO子句数据查询嵌套查询ORDERBY子句GROUPBY子句COMPUTE子句集合操作小结T-SQL查询简单查询条件查询汇总查询INTO子句连接查询根据各个表之间的逻辑关系从两个或多个表中查询数据。如:查询学生的学号、姓名、课程名称和分数,涉及到的数据表有学生信息表、教学成绩表和课程信息表。连接查询内连接(INNERJOIN)外连接(OUTERJOIN)左外连接(LEFTOUTERJOIN)右外连接(RIGHTOUTERJOIN)全外连接(FULLOUTERJOIN)自连接(SELFJOIN)交叉连接(CROSSJOIN)连接查询内连接(自然连接)将两个表中满足连接条件的行组合起来作为结果集。FROM表1[INNER]JOIN表2ON条件表达式示例1:查询学生的学号、姓名、课程编号和分数。SELECT学生信息表.学号,姓名,课程编号,分数FROM学生信息表INNERJOIN教学成绩表ON学生信息表.学号=教学成绩表.学号学生信息表教学成绩表等价于连接查询联接查询SELECT教学成绩表.学号,姓名,课程编号,分数FROM教学成绩表,学生信息表WHERE教学成绩表.学号=学生信息表.学号等价于学生信息表教学成绩表表内联接示例2:查询学生的学号、姓名、课程名称和分数。SELECTxs.学号,姓名,名称,分数FROM学生信息表ASxsINNERJOIN教学成绩表AScjONxs.学号=cj.学号INNERJOIN课程信息表ASkcONcj.课程编号=kc.编号学生信息表教学成绩表课程信息表可为数据表指定别名联接查询在连接查询中筛选列名时,遇到公共字段时一般选择主键表的字段。如果所选的字段名只存在于一个表中,则字段名前可以不用表名作限定,如果所选的字段是多个表中的公共字段,则必须加以表名指定。外连接(OUTERJOIN)左外连接:对连接中左边的表不加限制示例:查询所有学生的学号、姓名、课程编号和分数。(包括没有参与考试的新生)SELECT学生信息表.学号,姓名,课程编号,分数FROM学生信息表LEFTJOIN教学成绩表ON学生信息表.学号=教学成绩表.学号FROM表1LEFT[OUTER]JOIN表2ON条件表达式左表右表连接查询共有241条记录其中有3条记录没有考试成绩教学成绩表,共有238行成绩记录学生信息表,共有3个学生没有成绩记录左外联接示例:查询学生的学号、姓名、课程名称和分数(包括还没有讲过的新课的名称)。SELECTxs.学号,姓名,kc.名称,分数FROM教学成绩表AScjJOIN学生信息表ASxsONcj.学号=xs.学号RIGHTJOIN课程信息表ASkcONcj.课程编号=kc.编号外连接(OUTERJOIN)右外连接:对连接中左边的表不加限制连接查询FROM表1RIGHT[OUTER]JOIN表2ON条件表达式联接查询教学成绩表右外连接没有开考的课程课程信息表示例:查询所有教师和学生的姓名并列出同姓的教师、学生。SELECTLEFT(xs.姓名,1)姓氏,xs.姓名学生姓名,js.姓名教师姓名FROM教师信息表ASjsFULLJOIN学生信息表ASxsONLEFT(js.姓名,1)=LEFT(xs.姓名,1)FROM表1FULL[OUTER]JOIN表2ON条件表达式外连接(OUTERJOIN)全外连接:两个联接表的所有行都被包含连接查询学生信息表,共82条记录教师信息表,共6条记录结果集包含89条记录全外连接示例:查询同名学生的姓名和学号。SELECTxs1.姓名,xs1.学号,xs2.学号FROM学生信息表ASxs1JOIN学生信息表ASxs2ONxs1.姓名=xs2.姓名WHERExs1.学号xs2.学号FROM表1AS表1别名JOIN表2AS表1别名ON条件表达式自连接(OUTERJOIN)在同一张表内进行自身连接(必须为表指定两个别名)连接查询交叉联接(CROSSJOIN)非限制连接,将两个表不加任何约束地组合起来,结果集的行数是两个联接表的行数的乘积。示例:查询每个学生的所有公共基础课程名称SELECT名称INTO#公共基础课表FROM课程信息表WHERE类别='公共基础课'SELECT姓名,名称FROM学生信息表CROSSJOIN#公共基础课表连接查询FROM表1CROSSJOIN表2或FROM表1,表2联接查询学生信息表,共82条记录公共基础课表(临时表),共3条记录结果集包含246条记录交叉连接数据查询嵌套查询ORDERBY子句GROUPBY子句COMPUTE子句集合操作小结T-SQL查询简单查询条件查询汇总查询INTO子句连接查询嵌套查询在SELECT语句的WHERE子句中嵌套另一条SELECT语句。SELECT列名FROM表名WHERE条件=|[NOT]IN|[NOT]EXISTS(SELECT列名FROM表名WHERE条件)嵌套查询无关子查询无关子查询的执行不依赖于外部嵌套。查询的执行过程为:首先执行子查询,子查询得到的结果集不被显示出来,而是传给外部查询,作为外部查询的条件使用,然后执行外部查询,并显示查询结果。通常用比较运算符或[NOT]IN关键字嵌套查询无关子查询示例1:查询学习杜一鸣老师所授课程的学生的学号、姓名、该课程名称及分数。SELECT学生信息表.学号,姓名,名称,分数FROM学生信息表,教学成绩表,课程信息表WHERE学生信息表.学号=教学成绩表.学号AND课程信息表.编号=教学成绩表.课程编号AND教师编号=(SELECT编号FROM教师信息表WHERE姓名=‘杜一鸣')等价于子查询只返回单个值嵌套查询SELECTxs.学号,姓名,名称,分数FROM学生信息表ASxsJ