资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,第,70,页,四川农业大学 潘勇浩 制作,SQL,(,Structured Query Language,)是一种面向问题的,结构化查询语言,,是一种非过程化语言。,SQL,集,数据定义,(,Definition,),、,数据查询,(,Query,),、,数据操纵,(,Manipulation,),和,数据控制,(,Control,),功能于一体,语言简捷自然,易学易用。,GRANT,,,REVOKE,数据控制,DCL,INSERT,,,UPDATE,,,DELETE,数据操纵,DML,CREATE,,,DROP,,,ALTER,数据定义,DDL,SELECT,数据查询,DQL,动 词,功能,5.1 TSQL,概述,5.1 TSQL,概述,T-SQL,语言,在标准,SQL,语言的基础上增加了变量定义、流程控制等编程语句,从而可以实现流程化数据操纵。,SQL,语句,一个分支流程控制语句,5.1 TSQL,概述,这里编辑命令,命令运行的结果,命令工具,提示:可以选择部分命令执行,5.2 TSQL,数据查询语句,最基本的,SELECT,语句的语法结构,5.2 TSQL,数据查询语句,“,画”,SELECT,语句,待查询的表,构造结果列与条件等,构造出的查询语句,5.2 TSQL,数据查询语句,投影查询,SELECT,子句,制定结果的列,用,“*”,选择所有列,原始数据,查询结果有所有列,5.2 TSQL,数据查询语句,投影查询,SELECT,子句,制定结果的列,指定只查某几列,列之间用逗号分隔,原始数据,查询结果只有指定的这几列,5.2 TSQL,数据查询语句,投影查询,SELECT,子句,制定结果的列,结果中的列另取列名,原始数据,三种引导方式都可以,5.2 TSQL,数据查询语句,投影查询,SELECT,子句,制定结果的列,列可为任意表达式,原始数据,查询结果,GetDate( ),得出当前时间,Year(D),求出日期,D,的年,5.2 TSQL,数据查询语句,投影查询,SELECT,子句,制定结果的列,用,DISTINCT,消除查询中结果重复的行,原始数据,只有这,5,种不同的职称取值,5.2 TSQL,数据查询语句,选择查询,WHERE,子句,如何选择源数据行,简单比较,格式为:,NOT,表达式,其中,可以是:,=,=,!,原始数据,查询结果,5.2 TSQL,数据查询语句,选择查询,WHERE,子句,如何选择源数据行,限定范围,格式为:,NOT BETWEEN AND ,原始数据,其实条件就是:,1200,工资,2000,否定时只需写成:,工资,Not Between,5.2 TSQL,数据查询语句,选择查询,WHERE,子句,如何选择源数据行,集合检查,格式为:,NOT IN (,值列表,),其中各个值之间用逗号分隔,原始数据,其实条件就是:,工资,=800 or,工资,=1200 or,工资,=1500,5.2 TSQL,数据查询语句,选择查询,WHERE,子句,如何选择源数据行,空值检查,格式为:,IS NOT NULL,原始数据,注意空值和空白的区别,对允许为空的列才有意义!,5.2 TSQL,数据查询语句,选择查询,WHERE,子句,如何选择源数据行,字符匹配,用于匹配字符、日期,格式为:,NOT LIKE ESCAPE ,转义符,串模式中可出现以下通配符:,“,%,”,匹配任意多个任意字符,(,包括空字符,),;,“,_,”,匹配一个任意字符(不能是空字符);,“,字符序列,”,匹配指定字符序列中的一个字符;,“,字符序列,”,匹配不包含在字符序列中的任一字符。,例如,To%,代表,Tool,、,Toy,、,To,等以,To,开头的任意字符串;又如,B_T,可代表,BIT,、,BaT,等头为,B,尾为,T,的只有,3,个字符的任意串,但不能代表,BoaT,等。,5.2 TSQL,数据查询语句,选择查询,WHERE,子句,如何选择源数据行,字符匹配示例,原始数据,姓刘不就是以“刘”字开头的姓名吗,5.2 TSQL,数据查询语句,选择查询,WHERE,子句,如何选择源数据行,字符匹配示例,原始数据,查询出只有,1,人,名字最后一字为“明”的实际有,4,人,5.2 TSQL,数据查询语句,选择查询,WHERE,子句,如何选择源数据行,字符匹配示例,原始数据,查询结果,5.2 TSQL,数据查询语句,选择查询,WHERE,子句,如何选择源数据行,字符匹配示例,原始数据,否定时可以是下面两种格式,:,姓名,Not Like ,陈王潘楚,%,姓名,Like ,陈王潘楚,%,5.2 TSQL,数据查询语句,选择查询,WHERE,子句,如何选择源数据行,字符匹配中转义符的用法,如果查询的串中要包含“,%”,等通配符,则必须用转义符告诉,SQL,解释器将通配符转义为实实在在的字符,这里的下划线是要匹配的实际字符所以要转义,转义符可以为除通配符以外的任意字符,如上例条件亦可为,:,姓名,LIKE %,_% ESCAPE ,5.2 TSQL,数据查询语句,选择查询,WHERE,子句,如何选择源数据行,复合条件,用,AND,OR,联接多个条件组成逻辑表达式,即性别为男且职称为讲师,或者性别为女且职称为助教的教师,5.2 TSQL,数据查询语句,排序查询,ORDER BY,子句,ASC,(缺省)表示升序,DESC,表示降序。,原始数据,工资从小到大排列,Order by Twage DESC,就可实现降序排列,5.2 TSQL,数据查询语句,排序查询,ORDER BY,子句,ASC,(缺省)表示升序,DESC,表示降序。,原始数据,每个排序字段都有独立的排序方式,不要误解成按工资和生日的降序排列,5.2 TSQL,数据查询语句,使用聚合函数,COUNT(DISTINCT *),聚合函数的一般格式:,函数名,(,DISTINCT,列名,),COUNT,函数还可以为:,按列统计,按行计数,列统计方式下是不会统计空值的!,5.2 TSQL,数据查询语句,使用聚合函数,使用聚合函数示例,原始数据,*即整行的意思,只有,Count,才能用*,5.2 TSQL,数据查询语句,使用聚合函数,使用聚合函数示例,原始数据,按不重复的职称列的值计数,注意空值不计数,实际有这,5,种职称值,5.2 TSQL,数据查询语句,使用聚合函数,使用聚合函数示例,原始数据,多项统计可以在一条命令中实现。,ound,(,N,)表示对数值,M,四舍五入到,N,位小数,5.2 TSQL,数据查询语句,分组统计查询,所谓分组就是查询时将分组列值相同的行归为一组。,分组后查询的单位是,组,而非行,对各组只能投影其分组列,而非分组列只能用聚合函数进行统计。,查询有各个系的人数:,SELECT,系名,Count(*),FROM ST,GROUP BY,系名,ST,学号,姓名,性别,年龄,系名,98001,张三,男,20,CS,98002,李四,女,18,IS,98003,王五,女,17,MA,系名,学号,姓名,性别,年龄,CS,98001,张三,男,20,IS,98002,李四,女,18,MA,98003,王五,女,17,分组列,非分组列,5.2 TSQL,数据查询语句,分组统计查询,原始数据,所以只有这,5,组结果,职称,工号,姓名,NULL,0101,古洪明,副教授,0301,潘强,助教,0704,刘军,分组示意,因为只有这,5,种职称,使用,GROUP BY,子句进行分组,可以,By,多个列名来实现多级分组,5.2 TSQL,数据查询语句,分组统计查询,用,Having,子句限定只查询满足条件的,Group by,分组,条件是分组中的行数不小于,5,按职称分组统计的人数,HAVING,后跟的条件必须是跟分组有关的条件,5.2 TSQL,数据查询语句,分组统计查询,用,With Cube/Rollup,子句汇总,Group by,分组,Group by,分组的结果,With Cube,统计的结果,5.2 TSQL,数据查询语句,分组统计查询,用,COMPUTE,子句完成查询后再进行统计。,跟平常一样的查询,Compute,出的结果,5.2 TSQL,数据查询语句,分组统计查询,用,COMPUTE BY,子句附加分组计算,注意被分组的列必须要排序。,男讲师,女讲师,附加统计的男教师的平均工资,附加统计的女教师的平均工资,分组字段要排序,多表连接查询,5.2 TSQL,数据查询语句,多表查询指在两张以上的相关表中进行查询,从而实现将存储于不同表中的数据连接成完整的查询信息。,SELECT ST.,姓名, C.,课名,FROM,ST,C,WHERE,ST.,课号,= C.,课号,学号,姓名,课号,98001,张三,K01,98002,李四,K02,98003,王五,K01,98004,赵六,K01,98005,孙七,K03,ST,C,课号,课名,学分,K01,数据结构,3,K02,软件工程,4,K03,数据库,3,K04,C,语言,3,姓名,课名,张三,数据结构,李四,软件工程,王五,数据结构,赵六,数据结构,孙七,数据库,按名称查询哪位学生选了哪几门课,多表连接查询,5.2 TSQL,数据查询语句,最基础的连接是交叉连接,(,笛卡尔积,),,即以行为单位对各表中的行进行排列组合,结果的行数为各表行数之积,结果的列数为各表列数之和。,SELECT ST.*, C.*,FROM,ST,C,学号,姓名,ST.,课号,C.,课号,课名,98001,张三,K01,K01,数据结构,98001,张三,K01,K02,软件工程,9800,2,李四,K02,K01,数据结构,9800,2,李四,K02,K02,软件工程,9800,3,王五,K01,K01,数据结构,9800,3,王五,K01,K02,软件工程,结果有,32=6,行,ST,的列,C,的列,学号,姓名,课号,98001,张三,K01,98002,李四,K02,98003,王五,K01,ST,C,课号,课名,K01,数据结构,K02,软件工程,多表连接查询,5.2 TSQL,数据查询语句,真正有意义的连接应该是对基础连接的结果进行投影和选择,SELECT ST.,姓名, C.,课名,FROM,ST,C,WHERE,ST.,课号,= C.,课号,姓名,课名,张三,数据结构,李四,软件工程,王五,数据结构,学号,姓名,课号,98001,张三,K01,98002,李四,K02,98003,王五,K01,ST,课号,课名,学分,K01,数据结构,3,K02,软件工程,4,K03,数据库,3,C,学号,姓名,ST.,课号,C.,课号,课名,98001,张三,K01,K01,数据结构,98001,张三,K01,K02,软件工程,9800,2,李四,K02,K01,数据结构,9800,2,李四,K02,K02,软件工程,9800,3,王五,K01,K01,数据结构,9800,3,王五,K01,K02,软件工程,ST,与的交叉连接,课号相等才有意义吧,多表连接查询,5.2 TSQL,数据查询语句,T-SQL,多表连接查询的一般格式,:,SELECT ,FROM,表,1,表,2,WHERE,连接条件,ANSI,多表连接查询的一般格式,:,SELECT ,FROM,表,1,连接方式,JOIN,表,2,ON,连接条件,其中连接方式可以为内连接,(,INNER,),、左外连接,(,LEFT OUTER,),、右外连接,(,RIGHT OUTER,),、全外连接,(,FULL OUTER,),一般用于内连接,可以实现各种方式的连接,多表连接查询,5.2 TSQL,数据查询语句,一般情况下的连接都是,内连接,,即只连接完全符合条件的行,SELECT ST.,姓名, C.,课名,FROM,ST,C,WHERE,ST.,课号,= C.,课号,SELECT,姓名,课名,FROM ST,INNER,JOIN,C,ON,ST.,课号,= C.,课号,等价,学号,姓名,课号,98001,张三,K01,98002,李四,K02,98003,王五,K01,98004,赵六,98005,孙七,K01,ST,课号,课名,学分,K01,数据结构,3,K02,软件工程,4,K03,数据库,3,K04,C,语言,3,C,姓名,课名,张三,数据结构,李四,软件工程,王五,数据结构,孙七,数据结构,查询学生姓名及其所学课程的名称,赵六呢?,C,语言和数据库课呢?,多表连接查询,5.2 TSQL,数据查询语句,要查询其中一张连接表的所有行时就需要用,外连接,,结果中用空值,(NULL),来填充无法连接的数据,学号,姓名,课号,98001,张三,K01,98002,李四,K02,98003,王五,K01,98004,赵六,98005,孙七,K01,课号,课名,学分,K01,数据结构,3,K02,软件工程,4,K03,数据库,3,K04,C,语言,3,ST,C,SELECT,姓名,课名,FROM ST,LEFT OUTER JOIN,C,ON,ST.,课号,= C.,课号,姓名,课名,张三,数据结构,李四,软件工程,王五,数据结构,赵六,NULL,孙七,数据结构,结果包含了左表的所有行的连接称为,左外连接,查询出所有学生的选课情况,不管他是否有课,多表连接查询,5.2 TSQL,数据查询语句,要查询其中一张连接表的所有行时就需要用,外连接,,结果中用空值,(NULL),来填充无法连接的数据,学号,姓名,课号,98001,张三,K01,98002,李四,K02,98003,王五,K01,98004,赵六,98005,孙七,K01,课号,课名,学分,K01,数据结构,3,K02,软件工程,4,K03,数据库,3,K04,C,语言,3,ST,C,SELECT,姓名,课名,FROM ST,RIGHT OUTER JOIN,C,ON,ST.,课号,= C.,课号,结果包含了右表的所有行的连接称为,右外连接,查询出所有课程与学生的关系,不管它是否有学生选,姓名,课名,张三,数据结构,王五,数据结构,孙七,数据结构,李四,软件工程,NULL,数据库,NULL,C,语言,多表连接查询,5.2 TSQL,数据查询语句,左,/,右外连接是相对而言的,是可以相互转换的,!,学号,姓名,课号,98001,张三,K01,98002,李四,K02,98003,王五,K01,98004,赵六,98005,孙七,K01,课号,课名,学分,K01,数据结构,3,K02,软件工程,4,K03,数据库,3,K04,C,语言,3,ST,C,SELECT,姓名,课名,FROM ST,LEFT OUTER JOIN,C,ON,ST.,课号,= C.,课号,SELECT,姓名,课名,FROM C,RIGHT OUTER JOIN,ST,ON,C.,课号,= ST.,课号,等价,姓名,课名,张三,数据结构,李四,软件工程,王五,数据结构,赵六,NULL,孙七,数据结构,多表连接查询,5.2 TSQL,数据查询语句,左,/,右外连接的并集就是,全外连接,!,SELECT,姓名,课名,FROM ST,FULL OUTER JOIN,C,ON,ST.,课号,= C.,课号,学号,姓名,课号,98001,张三,K01,98002,李四,K02,98003,王五,K01,98004,赵六,98005,孙七,K01,课号,课名,学分,K01,数据结构,3,K02,软件工程,4,K03,数据库,3,K04,C,语言,3,ST,C,姓名,课名,张三,数据结构,王五,数据结构,赵六,NULL,孙七,数据结构,李四,软件工程,NULL,数据库,NULL,C,语言,查询出所有课程与所有学生的选课关系,5.2 TSQL,数据查询语句,交叉联接,无条件将两表的行联接,其实就是前面所说的基础联接,学号,姓名,ST.,课号,C.,课号,课名,98001,张三,K01,K01,数据结构,98001,张三,K01,K02,软件工程,9800,2,李四,K02,K01,数据结构,9800,2,李四,K02,K02,软件工程,9800,3,王五,K01,K01,数据结构,9800,3,王五,K01,K02,软件工程,学号,姓名,课号,98001,张三,K01,98002,李四,K02,98003,王五,K01,ST,C,课号,课名,K01,数据结构,K02,软件工程,SELECT *,FROM ST,CROSS JOIN,C,SELECT *,FROM ST,,,C,等价,5.2 TSQL,数据查询语句,自联接,表自己和自己联接,课号,课名,先修课号,1,数据库,5,2,数学,3,信息系统,1,4,操作系统,6,5,数据结构,7,6,数据处理,7,C,语言,6,C,PRE,SELECT C.,课名,PRE.,课名,AS,先修课,FROM C,C AS PRE,WHERE C.,先修课号,= PRE.,课号,课名,先修课,数据库,数据结构,信息系统,数据库,操作系统,数据处理,数据结构,C,语言,C,语言,数据处理,信息都在此表中,相当于另一张与,C,相同的表,课号,课名,先修课号,1,数据库,5,2,数学,3,信息系统,1,4,操作系统,6,5,数据结构,7,6,数据处理,7,C,语言,6,多表连接查询,5.2 TSQL,数据查询语句,查询学生选修的课程及老师,学号,姓名,课号,98001,张三,K01,98002,李四,K02,98003,王五,K01,98004,赵六,K01,98005,孙七,K03,98006,刘九,K02,ST,姓名,课名,教师名,张三,数据结构,刘浩,李四,软件工程,赵勇,王五,数据结构,刘浩,赵六,数据结构,刘浩,孙七,数据库,潘明,刘九,软件工程,赵勇,工号,教师名,职称,1,钟伟,讲师,2,潘明,助教,3,刘浩,讲师,4,赵勇,副教授,5,孙勤,助教,T,课号,课名,教师,K01,数据结构,3,K02,软件工程,4,K03,数据库,2,K04,C,语言,1,C,SELECT ST.,姓名,C.,课名,T.,教师名,FROM ST,C,T,WHERE,ST.,课号,= C.,课号,AND,C.,教师,= T.,工号,仔细分析各表间的内在联系!,T-SQL,方式,多表连接查询,5.2 TSQL,数据查询语句,查询学生选修的课程及老师,学号,姓名,课号,98001,张三,K01,98002,李四,K02,98003,王五,K01,98004,赵六,K01,98005,孙七,K03,98006,刘九,K02,ST,姓名,课名,教师名,张三,数据结构,刘浩,李四,软件工程,赵勇,王五,数据结构,刘浩,赵六,数据结构,刘浩,孙七,数据库,潘明,刘九,软件工程,赵勇,工号,教师名,职称,1,钟伟,讲师,2,潘明,助教,3,刘浩,讲师,4,赵勇,副教授,5,孙勤,助教,T,课号,课名,教师,K01,数据结构,3,K02,软件工程,4,K03,数据库,2,K04,C,语言,1,C,仔细分析各表间的内在联系!,SELECT ST.,姓名,C.,课名,T.,教师名,FROM,ST JOIN,C JOIN T ON,C.,教师,= T.,工号,ON ST.,课号,= C.,课号,ANSI,级联式,多表连接查询,5.2 TSQL,数据查询语句,查询学生选修的课程及老师,学号,姓名,课号,98001,张三,K01,98002,李四,K02,98003,王五,K01,98004,赵六,K01,98005,孙七,K03,98006,刘九,K02,ST,姓名,课名,教师名,张三,数据结构,刘浩,李四,软件工程,赵勇,王五,数据结构,刘浩,赵六,数据结构,刘浩,孙七,数据库,潘明,刘九,软件工程,赵勇,工号,教师名,职称,1,钟伟,讲师,2,潘明,助教,3,刘浩,讲师,4,赵勇,副教授,5,孙勤,助教,T,课号,课名,教师,K01,数据结构,3,K02,软件工程,4,K03,数据库,2,K04,C,语言,1,C,仔细分析各表间的内在联系!,SELECT ST.,姓名,C.,课名,T.,教师名,FROM,C JOIN ST,ON ST.,课号,= C.,课号,JOIN T,ON C.,教师,= T.,工号,ANSI,一对多式,5.2 TSQL,数据查询语句,学号,姓名,性别,年龄,系,98001,张三,男,20,CS,98002,李四,女,19,IS,98003,王五,女,18,MA,98004,赵六,男,19,IS,ST,集合查询,SQL Server 2008,提供了并,(UNION),、差,(EXCEPT),和交,(INTERSECT),三种集合操作。,查询,CS,系及,MA,系的学生,SELECT,*,FROM ST,WHERE,系,= CS,UNION,SELECT,*,FROM ST,WHERE,系,= MA,等价,SELECT * FROM ST,WHERE,系,= CS,OR,系,= MA,嵌套查询,5.2 TSQL,数据查询语句,在一条查询语句的某一个子句(多数为,WHERE,)中又包含有一个查询语句的查询称为嵌套查询。,被包含的查询称为子查询或内层查询。,包含子查询的查询称为外层查询或父查询。,SQL-Server 2005,支持,32,层嵌套查询。,子查询必须写在一对圆括号中。,SELECT,姓名,FROM,学生表,WHERE,系名,=,( SELECT,系名,FROM,学生表,WHERE,姓名,=,刘安邦, ),子查询,外查询,嵌套查询,5.2 TSQL,数据查询语句,用,构造单值(,1,行,1,列)条件,其中,为,=,=,=,!=,等比较运算符。,学号,姓名,性别,年龄,系名,98001,张明,男,29,CS,98002,李华,女,30,MA,98003,王军,男,28,IS,98004,孙六,女,27,IS,ST,设不允许学生重名,查询与王军同一个系的学生姓名,SELECT,姓名,FROM ST,WHERE,系名,=,(,SELECT,系名,FROM ST,WHERE,姓名,= ,王军, ),系名,IS,子查询得到王军所在的系名,想一想为什么要不准学生重名?,嵌套查询,5.2 TSQL,数据查询语句,学号,姓名,性别,年龄,系名,98001,张明,男,29,CS,98002,李华,女,30,MA,98003,王军,男,28,IS,98004,孙六,女,27,IS,ST,SELECT,姓名,年龄,FROM ST,WHERE,年龄,( SELECT,年龄,FROM ST,WHERE,姓名,= ,陈东, ),年龄,30,李华的年龄,年龄,22,陈东的年龄,设不允许学生重名,查询比李华年龄小但比陈东年龄大的学生的姓名和年龄,嵌套查询,5.2 TSQL,数据查询语句,学号,姓名,性别,年龄,系名,98001,张明,男,29,CS,98002,李华,女,30,MA,98003,王军,男,28,IS,98004,孙六,女,27,IS,ST,SELECT,学号,姓名,FROM ST,WHERE,系,=,(,SELECT,系,FROM ST,WHERE,年龄,=,(,SELECT,MIN(,年龄,),FROM ST ),),Min_,年龄,19,最小的年龄,系,MA,最小年龄学生的系,设,ST,中的年龄都不相同,查询与年龄最小的学生同在一个系的学生的学号和姓名,嵌套查询,5.2 TSQL,数据查询语句,学号,姓名,性别,选修,98001,张三,男,K01,98002,李四,男,K02,98003,王五,女,K01,98004,赵六,男,K01,98005,孙七,女,K03,98006,刘九,男,K02,ST,课号,课名,K01,数据结构,K02,软件工程,K03,数据库,K04,C,语言,C,查询选了“软件工程”课程的学生的学号和姓名,SELECT,学号,姓名,FROM ST,WHERE,选修,=,(,SELECT,课号,FROM C,WHERE,课名,=,软件工程, ),课号,K02,软件工程课的课号,嵌套查询,5.2 TSQL,数据查询语句,用, ANY/ALL,构造多值(多行,1,列)条件,其中,为,=,=,=,!=,等比较运算符。,姓名,选修,张三,K01,张三,K02,李四,K01,王五,K02,王五,K03,赵六,K03,孙七,K03,吴八,K04,ST,查询至少有一门课和张三相同的学生姓名,且结果中不能有张三,SELECT DINSTINCT,姓名,FROM ST,WHERE,选修,= ANY,( SELECT,选修,FROM ST,WHERE,姓名,=,张三, ),AND,姓名,!= ,张三,选修,K01,K02,张三选修的课,嵌套查询,5.2 TSQL,数据查询语句,查询其它系中年龄比CS系全体教师年龄都小的教师姓名,SELECT,姓名,FROM T,WHERE,年龄,=,=,!=,等比较运算符。,嵌套查询,5.2 TSQL,数据查询语句,IN,等价于,= ANY,SELECT,姓名,FROM ST,WHERE,选修,IN,(,SELECT,选修,FROM ST,WHERE,姓名,= ,张三, ),AND,姓名,!= ,张三,姓名,选修,张三,K01,张三,K02,李四,K01,李四,K02,李四,K03,王五,K02,王五,K03,赵六,K03,孙七,K03,吴八,K04,ST,查询至少有一门课和张三相同的学生姓名,且结果中不能有张三,选修,K01,K02,张三选修的课,嵌套查询,5.2 TSQL,数据查询语句,EXISTS,引导的子查询不返回数据,而是,返回,是否存在子查询元组的,判断,。,对,EXISTS,来说,若子查询的结果非空,则返回真,否则返回假;对,NOT EXISTS,来说,若子查询的结果非空,则返回假,否则返回真。,查询时,主查询根据子查询返回的真假来取舍元组,。,构造子查询的查询条件时要引用父查询表的某个属性列,这种查询称为,相关子查询,。,子查询中指定列名无实际意义,(,分组子查询除外,),。,嵌套查询,5.2 TSQL,数据查询语句,查询至少有一门课不及格的学生姓名,学号,姓名,性别,年龄,系,98001,张三,男,20,CS,98002,李四,女,19,IS,98003,王五,女,18,MA,98004,赵六,男,19,IS,ST,学号,课号,成绩,98001,1,92,98001,2,47,98001,3,88,98002,2,90,98002,3,80,SC,SELECT,姓名,FROM ST,WHERE,EXISTS,(SELECT * FROM SC,WHERE SC.,学号,= ST.,学号,AND SC.,成绩, 60 ),每一个学生都要做判断,查询该学生的不及格的课程,嵌套查询,5.2 TSQL,数据查询语句,查询所有课程都及格了的学生姓名,学号,姓名,性别,年龄,系,98001,张三,男,20,CS,98002,李四,女,19,IS,98003,王五,女,18,MA,98004,赵六,男,19,IS,ST,学号,课号,成绩,98001,1,92,98001,2,47,98001,3,88,98002,2,90,98002,3,80,SC,SELECT,姓名,FROM ST,WHERE,NOT EXISTS,(SELECT * FROM SC,WHERE SC.,学号,= ST.,学号,AND SC.,成绩, 60),其实就是不存在该学生的不及格的课程,嵌套查询,5.2 TSQL,数据查询语句,查询选了所有课程的学生姓名,SELECT,姓名,FROM ST,WHERE,NOT EXISTS,(SELECT * FROM C,WHERE,NOT EXISTS,(SELECT * FROM SC,WHERE SC.,学号,=ST.,学号,AND SC.,课号,=C.,课号,),),语义可以理解为不存在该学生有一门课没有选。,学号,姓名,性别,年龄,系,98001,张三,男,20,CS,98002,李四,女,19,IS,98003,王五,女,18,MA,98004,赵六,男,19,IS,ST,学号,课号,成绩,98001,1,92,98001,2,85,98001,3,88,98002,2,90,98002,3,80,SC,课号,课名,1,数据库,2,数据结构,3,操作系统,C,该学生选了这门课,该学生没选的课,嵌套查询,5.2 TSQL,数据查询语句,查询学生的姓名及其所选课程的数量,学号,姓名,性别,年龄,系,98001,张三,男,20,CS,98002,李四,女,19,IS,98003,王五,女,18,MA,98004,赵六,男,19,IS,ST,学号,课号,成绩,98001,1,92,98001,2,47,98001,3,88,98002,2,90,98002,3,80,SC,嵌在,SELECT,子句中,SELECT,姓名,(,SELECT COUNT(*),FROM SC,WHERE SC.,学号,=ST.,学号,),AS,课程数,FROM ST,嵌套查询,5.2 TSQL,数据查询语句,查询学生的姓名及其所选课程的数量,学号,姓名,性别,年龄,系,98001,张三,男,20,CS,98002,李四,女,19,IS,98003,王五,女,18,MA,98004,赵六,男,19,IS,ST,学号,课号,成绩,98001,1,92,98001,2,47,98001,3,88,98002,2,90,98002,3,80,SC,SELECT Tmp.,姓名,COUNT(,课号,) AS,课程数,FROM,(,SELECT,姓名,课号,FROM ST LEFT JOIN SC,On SC.,学号,=ST.,学号,),AS Tmp,GROUP By Tmp.,姓名,嵌在,FROM,子句中,5.2 TSQL,数据查询语句,学号,姓名,性别,年龄,系,98001,张三,男,20,CS,98002,李四,女,19,IS,98003,王五,女,18,MA,98004,赵六,男,19,IS,ST,SELECT,姓名,性别,系,INTO student_m,FROM ST,WHERE,性别,=,男,SELECT,子句,INTO,FROM,子句,其它子句,查询,男,学生的姓名,、性别和系,并将结果存储到名为“,student_m”,的新表中。,存储查询结果,插入行,5.3 TSQL,数据操纵语句,插入单个元组,INSERT,INTO, (,.),VALUES,( ,.),INSERT INTO S,VALUES(98004,陈宇,女,19,IS,成都),为,IS,系增加一名学号为,98004,,来自成都的名叫陈宇的,19,岁女学生。,INSERT INTO S(,姓名,学号,),VALUES(,邓红,98005,),增加一名学号为,98005,,名叫邓红的学生。,学号,姓名,性别,年龄,系,籍贯,99001,张军,男,21,CS,成都,99002,刘华,女,20,MA,重庆,99003,伍松,男,20,IS,雅安,S,插入行,5.3 TSQL,数据操纵语句,INSERT INTO S_N,SELECT,学号,姓名,FROM S,WHERE,系,=CS,将,CS,系学生的学号和姓名填进,S_N,表,INSERT INTO DGA,SELECT,系,AVG(,年龄,) FROM S,GROUP BY,系,将各系的平均年龄填进,DGA,表,学号,姓名,性别,年龄,系,籍贯,99001,张军,男,21,CS,成都,99002,刘华,女,20,MA,重庆,99003,伍松,男,20,IS,雅安,S,插入子查询的结果,INSERT,INTO, (,.),子查询语句,学号,姓名,S_N,系,平均年龄,DGA,事先得有这些表,修改数据,5.3 TSQL,数据操纵语句,学号,姓名,年龄,系,籍贯,99001,张军,21,CS,成都,99002,刘华,20,MA,重庆,99003,伍松,20,IS,雅安,S,学号,补助,99001,120,99002,200,98001,120,98002,200,99003,140,S_BZ,无,WHERE,时修改范围为全部行,UPDATE,SET,=,n,FROM, ,联接条件, ,WHERE,UPDATE S,SET,姓名,=,王浩,年龄,=22,WHERE,学号,=99002,将,98002,号学生改名为王浩,年龄改为,22,岁,把所有人的补助清,0,UPDATE S_BZ SET,补助,=0,修改数据,5.3 TSQL,数据操纵语句,学号,姓名,年龄,系,籍贯,99001,张军,21,CS,成都,99002,刘华,20,MA,重庆,99003,伍松,20,IS,雅安,S,学号,补助,99001,120,99002,200,98001,120,98002,200,99003,140,S_BZ,UPDATE S_BZ SET,补助,=,补助,+50,FROM S_BZ inner join S,ON S_BZ.,学号,= S.,学号,AND S.,籍贯,=,成都,将补助表,(S_BZ),中来自成都的所有学生的补助,(Bz),值增加,50,UPDATE S_BZ SET,补助,=,补助,+50,WHERE,学号,IN (,SELECT,学号,FROM S WHERE,籍贯,=,成都 ),等价,删除数据,5.3 TSQL,数据操纵语句,无,WHERE,时删除范围为全部行,DELETE FROM S,WHERE,籍贯,=,重庆,删除,重庆来的,学生,学号,姓名,年龄,系,籍贯,99001,张军,21,CS,成都,99002,刘华,20,MA,重庆,99003,伍松,20,IS,雅安,S,学号,补助,99001,120,99002,200,98001,120,98002,200,99003,140,S_BZ,DELETE FROM S,_BZ,删除,所有补助,DELETE,FROM,FROM, ,联接条件, ,WHERE,DELETE S,_BZ,等价,删除数据,5.3 TSQL,数据操纵语句,DELETE FROM S_BZ,WHERE,学号,= ANY (,SELECT,学号,FROM S WHERE,年龄,25,),从补助表(S_BZ)中删除年龄大于25岁的学生,的,补助,DELETE S_BZ FROM S_BZ,S,WHERE S.,学号,=S_BZ.,学号,AND S.,年龄,25,学号,姓名,年龄,系,籍贯,99001,张军,21,CS,成都,99002,刘华,20,MA,重庆,99003,伍松,20,IS,雅安,S,学号,补助,99001,120,99002,200,98001,120,98002,200,99003,140,S_BZ,等价,
展开阅读全文