SQLServer2000网络数据库教程SQL查询语句基础1SELECT条件列表2FROM子句3WHERE子句4统计5利用查询结果创建新表6使用UNION运算符实现多查询联合7连接8子查询●本章要点:•掌握简单的Transact-SQL查询语句。•学会对查询结果进行分组统计、合计和排序等复杂的SELECT语句操作。SQLServer2000网络数据库教程1SELECT条件列表一、基本结构SELECT[记录显示范围]字段列表[INTO新表名][FROM表名或表名列表及其连接方式][WHERE条件表达式][GROUPBY分组字段名列表[HAVING分组条件表达式]][ORDERBY排序字段名列表[ASC|DESC]][{COMPUTE集合函数(列名1)[BY列名2]}[…n]]说明:SELECT语句中各子句的顺序:SELECT→[记录范围]→字段列表→[INTO]→[FROM]→[WHERE]→[GROUPBY→[HAVING]]→[ORDERBY→[COMPUTE]]lFROM用于指定数据来源:单表查询简单格式:FROM表名多表查询时的格式:FROM表名列表及其连接方式lCOMPUTE子句不能与INTO子句或GROUPBY子句同时使用。SQLServer2000网络数据库教程SELECT条件列表(1)SELECT子句:指明目标列(字段、表达式、函数表达式、常量)。基本表中相同的列名表示为:〈表名〉.〈列名〉(2)FROM子句:指明数据源。表间用“,”分割。数据源不在当前数据库中,使用“〈数据库名〉.〈表名〉”表示。一表多用,用别名标识。定义表别名:〈表名〉〈别名〉(3)WHERE子句:元组选择条件。(4)GROUPBY子句:结果集分组。当目标列中有统计函数,则统计为分组统计,否则为对整个结果集统计。子句后带上HAVING子句表达组选择条件(带函数的表达式)。(5)ORDERBY子句:排序。当排序要求为ASC时升序排序;排序要求为DESC时降序排列。SQLServer2000网络数据库教程2.SELECT语句的操作符(1)算术操作符+(加号)、-(减号)、*(乘号)和/(除号)。(2)比较操作符=(等于)、(大于)、(小于)、=(小于等于)、=(大于等于)、!=(不等于)、(小于大于)、!(不大于)和!(不小于),共9种操作符。SQLServer2000网络数据库教程(3)逻辑操作符语义操作符使用格式或示例在[不在]其中[NOT]IN〈字段〉IN(〈数据表|子查询〉)任何一个ANY〈字段〉〈比较符〉ANY(数据表|子查询)全部(每个)ALL〈字段〉〈比较符〉ALL(数据表|子查询)[不]存在EXISTSEXISTS(〈子查询〉)在[不在]范围BETWEEN…AND…〈字段〉BETWEEN小值AND大值是[不是]空值IS[NOT]NULL〈字段〉IS[NOT]NULL模式比较[NOT]LIKE〈字段〉LIKE〈字符常数〉其中,“_”单字符通配符和“%”多字符通配符与运算AND〈条件1〉AND〈条件2〉或运算OR〈条件1〉OR〈条件2〉非运算NOTNOT〈条件〉SQLServer2000网络数据库教程组合查询操作符查询1〉〈组合操作符〉〈查询2〉1)UNION:并查询,并在结果集中去掉重复行。2)MINUS:差查询操作。3)INTERSECT:交查询操作。SQLServer2000网络数据库教程一些关键字*:取全部字段。格式为:*或〈表名〉.*ALL:全部。保留重复值(有统计函数时要求计算重复值)。格式为:ALL〈字段〉或ALL〈字段组〉DISTINCT:去掉重复值。在结果集中去掉重复值,或在统计函数中不计重复值。–格式为:DISTINCT〈字段〉或DISTINCT〈字段组〉SQLServer2000网络数据库教程SELECT条件列表—选择表中的若干列–查询全部列•星号*:按关系模式中属性的顺序排列。•显式列出属性名:按用户顺序排列。•显示雇员表中所有列的数据。–SELECT*from学生•显示雇员表中的雇员ID和姓名列的内容–SELECT学号,姓名From学生SELECT*from图书SELECT书号,书名From图书SQLServer2000网络数据库教程数据查询实例【例5-9】求数学系学生的学号和姓名。SELECT学号,姓名FROM学生WHERE所在系=‘数学系’;【例5-10】求选修了课程的学生学号。SELECTDISTINCT学号FROM选课;SQLServer2000网络数据库教程选择表中的若干列更名–为结果集中的某个属性改名–使结果集更具可读性其格式为;列标题=列名或者:列名AS列标题SELECT类别=书目分类,作者AS姓名From图书SQLServer2000网络数据库教程消除取值重复的行Select子句的缺省情况是保留重复元组–(ALL),可用Distinct去除重复元组SELECT出版社From图书SELECTDISTINCT出版社From图书SQLServer2000网络数据库教程指定当前数据库在缺省情况下,FROM子句不指定数据库名称,查询的数据库为当前数据库。使用USE语句可以将其他数据库设置为当前数据库,USE语句的格式为:–USE数据库名SQLServer2000网络数据库教程3WHERE子句SELECT语句中的WHERE子句用来指定查询条件。【例5-11】求选修C1课程的学生学号和成绩,并要求对查询结果按成绩的降序排列,如果成绩相同则按学号的升序排列。SELECT学号,成绩FROM选课WHERE课程号='C1'ORDERBY成绩DESC,学号ASC;dessentSQLServer2000网络数据库教程Where子句——确定范围BETWEEN关键字指定WHERE子句的搜索范围,其格式为:–BETWEENXANDY•查询时,它要求表达式的值大于等于X小于等于Y。【例5-12】求选修课程C1且成绩在80~90之间的学生学号和成绩,并将成绩乘以系数0.8输出。SELECT学号,成绩*0.8FROM选课WHERE课程号='C1'AND成绩BETWEEN80AND90;SQLServer2000网络数据库教程Where子句——确定集合谓词IN可以用来查找属性值属于指定集合的元组。NOTIN用来查找属性值不属于指定集合的元组。【例5-13】求数学系或计算机系姓张的学生的信息。SELECT*FROM学生WHERE所在系IN('数学','计算机')AND姓名LIKE'张%';SQLServer2000网络数据库教程关于空值空值意味着用户没有输入值,它既不代表空格也不为0,空值与任何数据运算或比较时,其结果仍为空,空值之间也不能匹配。所以在WHERE子句不能使用比较运算符对空值进行比较判断,而只能使用空值判断符IS[NOT]NULL来判断表达式的值是否为空。【例5-14】求缺少了成绩的学生的学号和课程号。update选课set成绩=nullwhere学号='s2'and课程号='c2‘update选课set成绩=nullwhere学号='s3'and课程号='c1'SELECT学号,课程号FROM选课WHERE成绩ISNULL;SQLServer2000网络数据库教程Where子句——模式匹配符Like模式匹配符[NOT]LIKE常用于模糊查询,它判断列值是否与指定的字符串格式匹配。在SQLServer中可使用的匹配符有以下几种:百分号(%):可匹配任意类型和长度的字符。下划线(_):匹配单个任意字符。方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任何一个。[^]:与[]取值相同,但要求所匹配的对象为指定范围以外的任何一个字符。SQLServer2000网络数据库教程示例例6.15:利用通配符%来查找雇员表中姓“张”的雇员的所有列信息。–SELECT*FROM学生WHERE姓名LIKE'张%‘–SELECT*FROM学生–WHERE所在系IN('数学','计算机')AND姓名LIKE'张%';利用通配符”%”和”_”来查找学生表中姓名的第二个字为“雪”的学生的所有列信息。–SELECT*FROM学生–WHERE姓名LIKE'_明%‘SQLServer2000网络数据库教程示例利用通配符”%”和[,]来查找学生表中姓名的第一个字为“张”或者“王”或者“赵”或者“孙”的学生的所有列信息。–SELECT*FROM学生WHERE姓名LIKE'[张,王,赵,孙]%‘利用通配符”%”和”_”来查找学生表中姓名的第二个字不是“雪”的学生的所有列信息。SELECT*FROM学生WHERE姓名notLIKE'_明%'SQLServer2000网络数据库教程OrderBy子句(对查询结果排序)指定结果集中元组的排列次序耗时ASC(缺省)、DESC对于空值,若升序,含空值的元组最先显示;若降序,则反之。按成绩高低来排序?按姓名排序:–SELECT*FROM学生orderby姓名SQLServer2000网络数据库教程2.连接查询若一个查询同时涉及两个以上的表,则称之为连接查询,包括:–内连接–自连接–外连接–复合条件连接SQLServer2000网络数据库教程2.连接查询连接查询中的连接条件通过WHERE子句表达,连接条件和元组选择条件之间用AND(与)操作符衔接。(1)等值连接和非等值连接[〈表名1〉.]〈列名1〉〈比较运算符〉[〈表名2〉.]〈列名2〉–比较运算符:=、、、=、=、!=;–列名称为连接字段。【例5-15】查询每个学生的情况以及他(她)所选修的课程。SELECT学生.*,选课.*FROM学生,选课WHERE学生.学号=选课.学号;SQLServer2000网络数据库教程内连接(自然连接)自然连接,只将两个表中满足指定条件的记录连接成一条新记录,舍弃所有不满足条件没有进行连接的记录。格式一:SELECT列名列表FROM表名1{[inner]Join表名2ON表名1.列名=表名2.列名}[…n]格式二:SELECT列名列表FROM表名1,表名2[,…]WHERE表名1.列名=表名2.列名[and…]SQLServer2000网络数据库教程例子【例5-16】求学生的学号、姓名、选修的课程名及成绩。–SELECT学生.学号,姓名,课程名,成绩–FROM学生,课程,选课–WHERE学生.学号=选课.学号AND课程.课程号=选课.课程号【例5-17】求选修C1课程且成绩为90分以上的学生学号、姓名及成绩。–SELECT学生.学号,姓名,成绩–FROM学生,选课–WHERE学生.学号=选课.学号AND课程号='C1‘AND成绩90;SQLServer2000网络数据库教程自连接自内连接简称自连接,是一张表自己对自己的内连接,即在一张表的两个副本之间进行内连接。用自连接可以将同一个表的不同行连接起来。使用自连接时,必须为两个副本指定别名,使之在逻辑上成为两个表。语法格式:SELECT列名列表FROM表名[AS]别名1join表名.别名2ON别名1.列名=别名2.列名SQLServer2000网络数据库教程查询每一门课的间接先行课。例如,课程表中的先行课是在上学期应开设的,先行课的先行课,即间接先行课应提前一学年开设。如果求查询某门课的间接先行课或全部课程的间接先行课,就需要对课程表进行自身连接。SELECTA.课程号,A.课程名,B.先行课FROM课程A,课程BWHEREA.先行课=B.课程号SQLServer2000网络数据库教程例子课程号课程名先行课C1计算机引论—C2PASCAL语言C1C3数据结构C2C4数据库C3C5软件工程C4课程的先行关系链为:C5→C4→C3→C2→C1,课程的间接关系链为:C5→C3→C1。SQLServer2000网络数据库教程课程号课程名先行课课程号课程名先行课C1计算机引论C1计算机引论C2Pascal语言C1C2Pascal语言C1C3数据结构C2C3数据结构C2C4数据库C3C4数据库C3C5软件工程C4C5软