SQL高级查询和视图课件.ppt

上传人(卖家):三亚风情 文档编号:3293451 上传时间:2022-08-17 格式:PPT 页数:70 大小:1.04MB
下载 相关 举报
SQL高级查询和视图课件.ppt_第1页
第1页 / 共70页
SQL高级查询和视图课件.ppt_第2页
第2页 / 共70页
SQL高级查询和视图课件.ppt_第3页
第3页 / 共70页
SQL高级查询和视图课件.ppt_第4页
第4页 / 共70页
SQL高级查询和视图课件.ppt_第5页
第5页 / 共70页
点击查看更多>>
资源描述

1、ACCP V4.0第五章第五章高级查询2回顾q指出下列语句的错误:CREATE TABLE bank(userName VARCHAR(10),balance MONEY)INSERT INTO bank(cardNo,userName,balance)VALUES(张三,500)INSERT INTO bank(cardNo,userName,balance)VALUES(李四,700)DECLARE mymoney INT(4)mymoney=0SELECT mymoney=balance FROM bank建表语句后必须添加GO标志DECLARE mymoney INTSET mymon

2、ey=0WHERE userName=张三张三3回顾IF mymoney100 print 卡上目前余额不足100,请及时充值!print 卡上余额为:+mymoneyprint 您的年利息为:SELECT 利息=CASE WHEN balance 1000 THEN balance*0.20 WHEN ELSE balance*0.10 FROM bank WHERE userName=张三GO多条语句添加BEGIN-END去掉WHEN缺少配对的END转换:convert(varchar(5),mymoney)4目标q掌握模糊查询q掌握聚合函数q掌握分组汇总q掌握多表联接查询q掌握简单子查询

3、的用法q掌握IN子查询的用法q掌握EXISTS子查询的用法q应用T-SQL进行综合查询5SELECT语句的语法形式 SELECTSELECT ALL|DISTINCT 字段名列表AS 标题名 INTO TABLE|CURSOR新表名FROMFROM 数据库名1.AS,数据库名2.AS,WHEREWHERE 筛选条件GROUP BY 分组表达式HAVING 分组条件ORDER BY 排序表达式 ASC|DESC 6(1)SELECT(1)SELECT子句列出所有要求子句列出所有要求SELECTSELECT语句查询的数据项语句查询的数据项,如如指定指定ASAS,输出以指定的标题名作为字段名输出。如

4、指定,输出以指定的标题名作为字段名输出。如指定INTOINTO新表名,则将查询的结果作为新表保存;新表名,则将查询的结果作为新表保存;(2)FROM(2)FROM子句列出包含所要查询数据的表;子句列出包含所要查询数据的表;(3)WHERE(3)WHERE子句提供子句提供SQLSQL只查询某些行的数据,也就是执行查只查询某些行的数据,也就是执行查询的条件;询的条件;(4)GROUP BY(4)GROUP BY用以指定汇总查询,即不是对每一行产生一个用以指定汇总查询,即不是对每一行产生一个查询结果,而是行记录进行分组,再对每一组产生一个查询结果,而是行记录进行分组,再对每一组产生一个汇总结果;汇总

5、结果;(5)HAVING(5)HAVING子句告诉子句告诉SQLSQL只产生由只产生由GROUP BYGROUP BY得到的某些组的得到的某些组的结果;结果;(6)ORDER BY(6)ORDER BY子句将查询结果按照一列或多列中的数据排序。子句将查询结果按照一列或多列中的数据排序。75.1模糊查询LIKEq查询时,字段中的内容并不一定与查询内容完全匹配,只要字段中含有这些内容SELECT SName AS 姓名 FROM Students WHERE SName LIKE 张%张果老张果老张飞张飞张扬出去张扬出去思考:以下的SQL语句:SELECT*FROM 数据表 WHERE 编号 LI

6、KE 008%A,C%可能会查询出的编号值为()。A、9890ACDB、007_AFFC、008&DCGD、KK8C8模糊查询IS NULLq把某一字段中内容为空的记录查询出来SELECT student_Name As 姓名姓名,home_addr AS 地址地址 FROM Student WHERE home_addr IS NULL李红NULL左群声NULL猜一猜:把Student表中某些行的home_addr字段值删掉后:使用IS NULLIS NULL能查询出来这些数据行吗?怎么查询出这些行来?9模糊查询BETWEENq把某一字段中内容在特定范围内的记录查询出来SELECT Stud

7、ent_ID,grade FROM student_course WHERE course_id=dep04_s002 and grade BETWEEN 60 AND 80 g994020278g994020468g99402057810模糊查询INq把某一字段中内容与所列出的查询内容列表匹配的记录查询出来SELECT student_Name As 姓名姓名,home_addr AS 地址地址 FROM Student WHERE substring(home_addr,1,2)in(长沙长沙,南京南京,江苏江苏)李扬长沙长沙于紫电江苏江苏李青霜南京南京司马弓上海上海11课堂练习q查询教师

8、表teacher中职称为教授、副教授的记录q查询student表中年龄在20到25岁之间的记录q提示:year(getdate)-year(birth)算出年龄。Between andq查询student表中姓李的记录12问题成绩表中存储了所有学生的成绩,我想知道:学生的总成绩、平均成绩、有成绩的学生总共有多少名怎么办?135.2聚合函数SUMSELECT SUM(price)FROM bookAVG、MAX、MINSELECT AVG(grade)AS 平均成绩,MAX(grade)AS 最高分,MIN(grade)AS 最低分 From student_course WHERE grade

9、=60COUNTSELECT COUNT(*)AS 及格人数 From student_courseWHERE grade=6014SQLSQL语言支持五个集合函数语言支持五个集合函数 :函数函数功能功能AVGAVG(字段名)(字段名)求一列数据的平均值求一列数据的平均值SUMSUM(字段名)(字段名)求一列数据的和求一列数据的和COUNT(DISTINCT COUNT(DISTINCT 字段名字段名)输出查询的行数输出查询的行数 COUNT COUNT(*)MINMIN(字段名)(字段名)给出列中的最小值给出列中的最小值MAXMAX(字段名)(字段名)给出列中的最大值给出列中的最大值15q

10、集合函数是作用于一组值的函数,而不是只作用于一集合函数是作用于一组值的函数,而不是只作用于一个值上面的函数个值上面的函数 。q 所有集合函数可以操作一个变量,这个变量可以是列所有集合函数可以操作一个变量,这个变量可以是列或表达式或表达式(惟一的例外是惟一的例外是COUNT COUNT 函数的第二种形式:函数的第二种形式:COUNT(COUNT(*)q 每个集合函数的结果是个常量,它显示在结果中不同每个集合函数的结果是个常量,它显示在结果中不同的列上的列上 16问题如果不是统计所有人所有课程的总成绩而是想求每一门课的平均绩或者某个人的所有课的总成绩怎么办?175.3分组汇总q命令格式:命令格式:

11、GROUP BY 分组表达式分组表达式 HAVING 分组条件分组条件q说明:说明:1)分组表达式:一般为字段名,对指定的字段进行分组。2)分组条件:对分组汇总后数据进入结果集的筛选条件,一般为集合函数或常量.18不带不带HAVINGHAVING的的GROUP BYGROUP BY子句子句 q GROUP BY子句将一列或多列定义为一组,按组输出查询结果。q GROUP BY子句可以统计每一门课的平均绩或者某个人的所有课的总成绩19【例【例】统计每个人的平均成绩。SELECT student_id,AVG(grade)AS 平均成绩平均成绩 FROM student_course GROUP

12、BY student_id20注意事项q SQLSQL为每个定义的组产生一个列值,每个组只返回一行,为每个定义的组产生一个列值,每个组只返回一行,不返回详细信息。不返回详细信息。q 如果包括如果包括WHEREWHERE子句,子句,VFPVFP只分组统计满足只分组统计满足WHEREWHERE条件的行。条件的行。q 在包含在包含GROUP BYGROUP BY子句的查询语句中,子句的查询语句中,SELECTSELECT子句后的所有子句后的所有字段列表,除集合函数外,都应包含在字段列表,除集合函数外,都应包含在GROUP BYGROUP BY子句中,子句中,否则将出错。如上例中,只能是否则将出错。如

13、上例中,只能是student_idstudent_id.否则将否则将出错。出错。q 不要在含有空值的列上使用不要在含有空值的列上使用GROUPBYGROUPBY子句,因为空值将作子句,因为空值将作为一个组来处理。为一个组来处理。21分组查询思考SELECT student_id,course_id,AVG(grade)AS 平均成绩平均成绩 FROM student_course GROUP BY student_id思考:执行以下的T-SQL:结果如何?结果如何?22qHAVING子句定义应用到分组行分组行中的条件,HAVING子句对分组行的意义与WHERE子句对每个行的意义是相同的。带HA

14、VING的GROUP BY子句 23【例】【例】查询查询平均成绩大于80学生的学号和平均成绩。SELECT student_id,AVG(grade)AS 平均成绩平均成绩 FROM student_course GROUP BY student_id HAVING AVG(grade)80课堂练习:查询课程不及格的人数大于课堂练习:查询课程不及格的人数大于2的课程号和人数的课程号和人数SELECT course_id,count(*)FROM student_course group by course_id Having count(*)224分组查询对比WHEREGROUP BYHAVI

15、NGq WHERE子句从数据源中去掉不符合其搜索条件的数据q GROUP BY子句搜集数据行到各个组中,统计函数为各个组计算统计值q HAVING子句去掉不符合其组搜索条件的各组数据行25分组查询思考SELECT 部门编号,COUNT(*)FROM 员工信息表WHERE 工资=2000GROUP BY 部门编号HAVING COUNT(*)1思考:分析以下思考:分析以下T-SQL的含义的含义265.4多表联结查询问题每次查询成绩时显示的都是学生的学号信息,因为成绩表中只存储了学生的学号;实际上最好显示学生的姓名,而姓名存储在student表;如何同时从这两个表中取得数据?27多表联结查询分类q

16、内联结(INNER JOIN)q外联结左外联结 (LEFT JOIN)右外联结 (RIGHT JOIN)完整外联结(FULL JOIN)q交叉联结(CROSS JOIN)使用多个表多个表查询来产生检索结果。28内联结q内连接(INNER JOIN):内连接返回的结果集中只包括满足连接条件的行。q例:查询所有学生的姓名、课程号和成绩SELECT S.student_Name,C.Course_ID,C.gradeFrom student_course AS C INNER JOIN Student AS SON C.Student_ID=S.student_id29SELECT S.studen

17、t_Name,C.Course_ID,C.gradeFrom student_course AS C INNER JOIN Student AS SON C.Student_ID=S.student_idStudent_course(成绩表)(成绩表)122300100100200297896776300381猜一猜:这样写,返回的查询结果是一样的吗?猜一猜:这样写,返回的查询结果是一样的吗?SELECT S.student_Name,C.Course_ID,C.gradeFrom Student AS SINNER JOIN student_course AS CON C.Student_I

18、D=S.student_id再猜一猜:以下返回多少行?SELECT S.student_Name,C.Course_ID,C.gradeFrom Student AS SINNER JOIN student_course AS CON C.Student_ID S.student_id内联结-1Stundent(学生表)学生表)梅超风陈玄风陆乘风曲灵风1234查询结果查询结果梅超风陈玄风陈玄风陆乘风00100100200297896776陆乘风0038130内联结-2SELECT S.student_Name,C.Course_ID,C.gradeFrom student_course AS

19、C,Student AS SWhere C.Student_ID=S.student_idq基于WHERE子句的内连接语法形式31三表联结方法方法1:SELECT S.student_Name,L.Course_Name,C.gradeFrom student_course AS C,Student AS S,course as LWhere C.Student_ID=S.student_idand C.course_id=L.course_id方法方法2:SELECT S.student_Name,l.Course_Name,C.gradeFrom student_course AS C i

20、nner join Student AS S on C.Student_ID=S.student_idinner join course as L on C.course_id=L.course_id例:查询学生的姓名、课程名、成绩例:查询学生的姓名、课程名、成绩32Score122300100100200297896776300381左外联结Stundents梅超风梅超风陈玄风陈玄风陆乘风陆乘风曲灵风曲灵风1234查询结果查询结果梅超风梅超风陈玄风陈玄风陈玄风陈玄风陆乘风陆乘风00100100200297896776陆乘风陆乘风00381曲灵风曲灵风NULLNULLSELECT S.SNam

21、e,C.CourseID,C.Score From Students AS SLEFT JOIN Score AS CON C.StudentID=S.SCode猜一猜:这样写,返回的查询结果是一样的吗?SELECT S.SName,C.CourseID,C.Score From Score AS CLEFT JOIN Students AS SON C.StudentID=S.SCode左外连接除了包括满足连接条件的行外,还包括其中左表的全部行。左外连接除了包括满足连接条件的行外,还包括其中左表的全部行。33右外联结SELECT Titles.Title_id,Titles.Title,Pu

22、blishers.Pub_nameFROM titles RIGHT OUTER JOIN Publishers ON Titles.Pub_id=Publishers.Pub_id右外连接除了包括满足连接条件的行外,还包括其中右表的全部行。右外连接除了包括满足连接条件的行外,还包括其中右表的全部行。34课堂练习q1、查询每个老师的部门名称和姓名q2、查询部门名称为计算机科学的所有老师名单。q提示:部门名称在department表select teacher_name,department_name from teacher as tinner join department as d on

23、t.department_id=d.department_idwhere d.department_name=计算机科学计算机科学355.5子查询 学员信息表问题:问题:编写T-SQL语句,查看年龄比“李斯文”大的学员,要求显示这些学员的信息?分析:分析:第一步:求出“李斯文”的年龄;第二步:利用WHERE语句,筛选年龄比“李斯文”大的学员;36什么是子查询q 实现方法一:采用T-SQL变量实现 DECLARE age INT -定义变量,存放李斯文的年龄SELECT age=stuAge FROM stuInfo WHERE stuName=李斯文 -求出李斯文的年龄-筛选比李斯文年龄大的学

24、员SELECT*FROM stuInfo WHERE stuAgeage GO 37什么是子查询q 实现方法二:采用子查询实现 SELECT*FROM stuInfoWHERE stuAge(SELECT stuAge FROM stuInfo where stuName=李斯文)GO 子查询q子查询在WHERE语句中的一般用法:SELECT FROM WHERE 字段1(子查询)q 外面的查询称为父查询,括号中嵌入的查询称为子查询 qUPDATE、INSERT、DELETE一起使用,语法类似于SELECT语句 q将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个 38使用子查询

25、替换表连接3-1问题:问题:查询笔试刚好通过(60分)的学员名单。学员信息表和成绩表学员信息表和成绩表39使用子查询替换表连接3-2q 实现方法一:采用表连接 SELECT stuName FROM stuInfo INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo WHERE writtenExam=60GO内连接(等值连接)40使用子查询替换表连接3-3q 实现方法二:采用子查询实现方法二:采用子查询 SELECT stuName FROM stuInfo WHERE stuNo=(SELECT stuNo FROM stuMarks W

26、HERE writtenExam=60)GO子查询q 一般来说,表连接都可以用子查询替换,但有的子查询却不能用表连接替换q 子查询比较灵活、方便,常作为增删改查的筛选条件,适合于操纵一个表的数据q 表连接更适合于查看多表的数据41IN子查询 4-1问题:问题:查询笔试刚好通过的学员名单。如何解决?如何解决?42IN子查询 4-2q 解决方法:采用 IN 子查询 SELECT stuName FROM stuInfo WHERE stuNo IN (SELECT stuNo FROM stuMarks WHERE writtenExam=60)GO将号改为INqIN后面的子查询可以返回多条记录q

27、常用IN替换等于()的比较子查询43IN子查询 4-3问题:问题:查询参加考试的学员名单 学员信息表和成绩表(重抓本图)分析:分析:判断一个学员是否参加考试其实很简单,只需要查看该学员对应的学号是否在考试成绩表stuMarks中出现即可 44IN子查询 4-4/*-采用IN子查询参加考试的学员名单-*/SELECT stuName FROM stuInfo WHERE stuNo IN(SELECT stuNo FROM stuMarks)GO演示:使用IN子查询 q 参考语句45NOT IN子查询问题:问题:查询未参加考试的学员名单 分析:分析:加上否定的NOT 即可46查询未参加数据库开发

28、技术考试的名单分析:1、在course表中课程名称为数据库技术开发的course_idselect course_id from course where course_name=数据库开发技术2、在成绩表即student_course表中查询具有数据库开技术课程成绩的学生学号select student_id from student_course where course_id=(select course_id from course where course_name=数据库开发技术)3、最后在student表中查询所有在2步查询结果中没有的姓名。select student_name

29、 from student where student_id not in(select student_id from student_course where course_id=(select course_id from course where course_name=数据库开发技术)47课堂练习q1、用子查询来查询JWGL库中部门为计算机科学的教师名单q2、查询林红所有课程的成绩q3、查询JWGL库中数据库开发技术课程不及格的名单q提示:第3题可以结合内联接和子查询一起完成48EXISTS子查询 4-1例如:数据库的存在检测IF EXISTS(SELECT*FROM sysData

30、bases WHERE name=stuDB)DROP DATABASE stuDBCREATE DATABASE stuDB.建库代码略 49EXISTS子查询 4-2IF EXISTS(子查询)语句q EXISTS子查询的语法:q如果子查询的结果非空,即记录条数1条以上,则EXISTS(子查询)将返回真(true),否则返回假(false)qEXISTS也可以作为WHERE 语句的子查询,但一般都能用IN子查询替换50EXISTS子查询 4-3问题:问题:检查本次考试,本班如果有人笔试成绩达到80分以上,则每人提2分;否则,每人允许提5分 分析:分析:是否有人笔试成绩达到80分以上,可以采

31、用EXISTS检测 51EXISTS子查询 4-4/*-采用EXISTS子查询,进行酌情加分-*/IF EXISTS(SELECT*FROM stuMarks WHERE writtenExam80)BEGIN print 本班有人笔试成绩高于80分,每人加2分,加分后的成绩为:UPDATE stuMarks SET writtenExam=writtenExam+2 SELECT*FROM stumarks ENDELSE BEGIN print 本班无人笔试成绩高于80分,每人可以加5分,加分后的成绩:UPDATE stuMarks SET writtenExam=writtenExam+

32、5 SELECT*FROM stumarks ENDGO演示:使用EXISTS子查询q 参考语句52NOT EXISTS子查询 2-1问题:问题:检查本次考试,本班如果没有一人通过考试(笔试和机试成绩都60分),则试题偏难,每人加3分,否则,每人只加1分 分析:分析:没有一人通过考试,即不存在“笔试和机试成绩都60分”,可以采用NOT EXISTS检测 53NOT EXISTS子查询 2-2IF NOT EXISTS(SELECT*FROM stuMarks WHERE writtenExam60 AND labExam60)BEGIN print 本班无人通过考试,试题偏难,每人加3分,加分

33、后的成绩为:UPDATE stuMarks SET writtenExam=writtenExam+3,labExam=labExam+3 SELECT*FROM stuMarks ENDELSE BEGIN print 本班考试成绩一般,每人只加1分,加分后的成绩为:UPDATE stuMarks SET writtenExam=writtenExam+1,labExam=labExam+1 SELECT*FROM stuMarks ENDGO 演示:使用NOT EXISTS子查询q 参考语句545.6T-SQL语句的综合应用学员信息表和成绩表 应到人数:5人实到人数4人,缺考1人55T-S

34、QL语句的综合应用如何实如何实现?现?本次考试的缺考情况 比较笔试平均分和机试平均分,较低者进行循环提分,但提分后最高分不能超过97分。加分后重新统计通过情况统计通过率 56T-SQL语句的综合应用1.提示:使用子查询统计缺考情况:应到人数:SELECT count(*)FROM stuInfo实到人数:SELECT count(*)FROM stuMarks2.提取学员的成绩信息并保存结果,包括学员姓名、学号、笔试成绩、机试成绩、是否通过1)提取的成绩信息包含两表的数据,所以考虑两表连接,使用左连接(LEFT JOIN);SELECT stuNameFROM stuInfo LEFT JOI

35、N stuMarks 2)要求新加一列“是否通过(isPass)”,可采用CASE END。为了便于后续的通过率统计,通过则为1,没通过为0 SELECT isPass=CASE WHEN writtenExam=60 THEN 1 ELSE 0 END 3)要求保存提取(查询)的结果,可以使用我们曾学习过的SELECT INTO newTable语句,生成新表并保存数据 57T-SQL语句的综合应用3.比较笔试平均分和机试平均分,对较低者进行循环提分,但提分后最高分不能超过97分:1)使用IF语句判断笔试还是机试偏低,决定对笔试还是机试提分;2)使用WHILE循环给每个学员加分,缺考的除外,

36、当最高分超过97分时退出循环;3)因为给每位学员的笔试或机试提分了,有的学员可能提分后刚好通过了,所以需要更新isPass(是否通过)列。UPDATE newTable SET isPass=CASE WHEN writtenExam=60 and labExam=60 THEN 1 ELSE 0 END58T-SQL语句的综合应用4.提分后,统计学员的成绩和通过情况:1)使用别名实现中文字段名,即SELECT 姓名=stuName,学号=stuNo2)如果某个学员的成绩为NULL(空),则替换为”缺考”,否则原样显示;3)isPass列中的1替换为是,0替换为否;SELECT ,机试成绩=C

37、ASE WHEN labExam IS NULL THEN 缺考 ELSE convert(varchar(5),labExam)END ,是否通过=CASE WHEN isPass=1 THEN 是 ELSE 否 END59T-SQL语句的综合应用5.提分后统计学员的通过率情况:1)通过人数:因为通过用1表示,没通过用0表示,所以isPass列的累加和即是通过人数;2)通过率:同理,isPass列的平均值*100即是通过率;60T-SQL参考语句/*-本次考试的原始数据-*/-SELECT*FROM stuInfo-SELECT*FROM stuMarks/*-统计考试缺考情况-*/SELE

38、CT 应到人数=(SELECT count(*)FROM stuInfo),-应到人数为子查询表达式的别名 实到人数=(SELECT count(*)FROM stuMarks),缺考人数=(SELECT count(*)FROM stuInfo)-(SELECT count(*)FROM stuMarks)61T-SQL参考语句/*-统计考试通过情况,并将结果存放在新表newTable中-*/IF EXISTS(SELECT*FROM sysobjects WHERE name=newTable)DROP TABLE newTableSELECT stuName,stuInfo.stuNo,

39、writtenExam,labExam,isPass=CASE WHEN writtenExam=60 and labExam=60 THEN 1 ELSE 0 END INTO newTable FROM stuInfo LEFT JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo-SELECT*FROM newTable-查看统计结果,可用于调试 62T-SQL参考语句/*-酌情加分:比较笔试和机试平均分,决定加哪门-*/DECLARE avgWritten numeric(4,1)DECLARE avgLab numeric(4,1)SELECT

40、avgWritten=AVG(writtenExam)FROM newTable WHERE writtenExam IS NOT NULLSELECT avgLab=AVG(labExam)FROM newTable WHERE labExam IS NOT NULLIF avgWritten=97 BREAK ENDELSE 略-循环给笔试加分,最高分不能超过97分63T-SQL参考语句-因为提分,所以需要更新isPass(是否通过)列的数据UPDATE newTable SET isPass=CASE WHEN writtenExam=60 and labExam=60 THEN 1 E

41、LSE 0 END-SELECT*FROM newTable -可用于调试/*-显示考试最终通过情况-*/SELECT 姓名=stuName,学号=stuNo ,笔试成绩=CASE WHEN writtenExam IS NULL THEN 缺考 ELSE convert(varchar(5),writtenExam)END,机试成绩=CASE WHEN labExam IS NULL THEN 缺考 ELSE convert(varchar(5),labExam)END,是否通过=CASE WHEN isPass=1 THEN 是 ELSE 否 END FROM newTable 64T-S

42、QL参考语句/*-显示通过率及通过人数-*/SELECT 总人数=count(*),通过人数=SUM(isPass),通过率=(convert(varchar(5),AVG(isPass*100)+%)FROM newTable 65案例分析2要求q 一家银行发行了新的信用卡,刚开始的时候推广得很好,但是逐渐废卡也越来越多(卡上的余额少于2元,并且用户长时间不使用该卡),因此银行在二月份把这些少于2元的卡从都数据库表中删除了,但是很快问题就来了,用户发现他的卡再也不能使用而投诉,因此只能再把这些卡恢复。q 编写SQL,把CardID为23、30等在子表中没有的记录插入到子表中,插入的数据Sco

43、re项值为266案例分析2分析q 这是一个数据插入的操作,因此要使用INSERT语句来进行q 这种方式的数据插入,不是固定的数据项,而是从其它表中筛选数据再插入,因此要使用到INSERT INTOSELECT结构q 插入的数据项是子表中没有的,需要找到子表中没有的这些数据,我们可以把整个语句的INSERT(前半部分)不考虑,先只考虑SELECT(后半部分),SELECT的任务就是找出两个表中不同的项q 在前面的联结查询中,使用INNER JOINON可以找出相同的项,编写以下T-SQL:SELECT M.CardID,2 FROM M INNER JOIN S ON(S.CardIDM.Car

44、dID)q 以上把“=”简单地改为“”,不能找出不同的项,所找到的项比原来的要多很多,因为两个表之间是进行“交叉”对比的,而不是一一对比,所以会对比出很多“不同”的项来;因此,这种方法不可行q 考虑我们在上面的左外连接查询,能够查询出左表中存在而相关表不存在的数据项q 最后,子表中不存在的数据项,可以再加WHERE条件来进行筛选,S.CardID IS NULL可以判断其是否存在子表中存在67案例分析2T-SQLINSERT INTO S(S.CardID,S.Score)SELECT M.CardID,2 FROM M LEFT JOIN S ON(S.CardID=M.CardID)WHE

45、RE S.CardID IS NULL68总结q 使用LIKE、BETWEEN、IN关键字,能够进行模糊查询 条件不明确的查询q 聚合函数能够对列生成一个单一的值,对于分析和统计通常非常有用q 分组查询是针对表中不同的组,分类统计和输出,GROUP BY子句通常会结合聚合函数一起来使用q HAVING子句能够在分组的基础上,再次进行筛选q 多个表之间通常使用联结查询q 最常见的联结查询是内联结(INNER JOIN),通常会在相关表之间提取引用列的数据项69总结 q总结我们曾学习过的查询,合并多个表中的数据的方法有三种:q联合(Union)合并多个数据表中的行q子查询将一个查询包含到另一个查询中q联接合并多个数据表中的列q通过在子查询中使用EXISTS子句,可以对子查询中的行是否存在进行检查qIN子查询后面可跟随返回多条记录的子查询,用于检测某列的值是否在某个范围70作业q1、将所有课堂练习的SQL代码写在实验报告上q2、认真学习课件上最后一个综合应用并进行实验将代码写在作业本上

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(SQL高级查询和视图课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|