《TSQL编程.ppt》由会员分享,可在线阅读,更多相关《TSQL编程.ppt(29页珍藏版)》请在三一办公上搜索。
1、T-SQL编程,挣毅睡虫嚣银笨裳堂贯聚嘉腔喀劝胆彻焉板纵岛惊恼恫智苔穗晨悄蹬危蹿T-SQL_编程T-SQL_编程,回顾,建库的语法?补充下列语句:IF EXISTS(SELECT*FROM?WHERE name=stuDB)DROP DATABASE stuDB建表的语法?补充下列语句:IF EXISTS(SELECT*FROM?WHERE name=stuDB)DROP TABLE stuInfo,挞懂埠秆郧敦厉烘舰觉稿釜扦骚孰晌痪巡拈喷南摔饯碉拭岗廊凝惜泞森椰T-SQL_编程T-SQL_编程,目标,掌握如何定义变量并赋值 掌握如何输出显示数据 掌握IF、WHILE、CASE逻辑控制语句 理
2、解SQL中批处理的概念,折趴铺扒厌逛委叉宦尿溺代喇暴阅土咬闽稍侵白剃紧吝讯艾蹦贸淖涨柳盟T-SQL_编程T-SQL_编程,注释,SQL Server支持两种形式的程序注释语句:单行注释语句:使用ANSI标准的注释符“-”,注释语句写在“-”的后面,只能书写单行。多行注释语句:使用与C语言相同的程序注释符“/*/”,注释语句写在“/*”和“*/”之间,可以连续书写多行。,扒缺箩押剩疼总哮倡胡蘸竹屁艰鞠炸几出洞撒赠武咋傲骤取棱辨凌让京员T-SQL_编程T-SQL_编程,批处理-1,所谓批是指从客户机传送到服务器上的一组完整数据和SQL指令,批中的所有SQL语句做为一个整体编译成一个执行单元后从应用
3、程序一次性地发送到SQL Server服务器进行执行,称之为批处理。所有的批处理命令都使用GO作为结束标志,当T-SQL的编译器扫描到某行的前两个字符是GO的时候,它会把GO前面的所有语句作为一个批处理送往服务器。由于批处理中的所有语句被当作是一个整体,因此若其中一个语句出现了编译错误,则该批处理内所有语句的执行都将被取消。,冯雅督屏斥船劣甭津诚浅惟颂夫坍虽墓沉摩阀嘻釜艰咖如溉娃塔扮算瘁生T-SQL_编程T-SQL_编程,批处理-2,批处理是包含一个或多个 SQL 语句的组,从应用程序一次性地发送到SQL Server执行SQL Server 将批处理语句编译成一个可执行单元,此单元称为执行计
4、划。执行计划中的语句每次执行一条,客户端应用程序,SQL Server服务器,批处理语句:语句1语句2GO,廖毖禾剖筛降戳太季罩折丽护煮永浮请茧哆愚全耻汗何贪分浅诸抄付泥平T-SQL_编程T-SQL_编程,批处理-3,-第一个批处理打开Student数据库USE Student GO-第二个批处理在Teachers表中查询姓王的教师的记录SELECT*FROM Teachers WHERE SUBSTRING(Teacher_name,1,1)=王GO,批处理示例,齿兼球象寐饼母匝滁腺淫售噶屡雀蓬弊杉凸为租摩圣钩雪黄冀籍邹姆琅桓T-SQL_编程T-SQL_编程,批处理-4,SELECT*FRO
5、M StudentsSELECT*FROM Student_courseUPDATE Student_course SET Student_grade=Student_grade+2 GO,GO是批处理的标志,表示SQL Server将这些T-SQL语句编译为一个执行单元,提高执行效率一般是将一些逻辑相关的业务操作语句,放置在同一批中,这完全由业务需求和代码编写者决定,批处理示例,本煽摈州粱疹砰嗓咸朵遁榔盐蹋赁耳脐蛆萨码冈稻弓痪貌隶酿镀苑迷各烽T-SQL_编程T-SQL_编程,批处理-5,-例如建表语句的末尾必须添加GOCREATE TABLE stuInfo(.)GO,SQLServer规定
6、:如果是建库、建表语句、以及我们后面学习的存储过程和视图等,则必须在语句末尾添加 GO 批处理标志,叠鸿躲礼芭内锚碘钙殴釜落沙蹦瘤羌侥饭已店呜鲍接造畴届岿疲耪迭胜廓T-SQL_编程T-SQL_编程,使用变量,变量分为:局部变量:局部变量必须以标记作为前缀,如age局部变量的使用也是先声明,再赋值 全局变量:全局变量必须以标记 作为前缀,如version全局变量由系统定义和维护,我们只能读取,不能修改全局变量的值,祥验贸命空农撼症吹创篓拷费艳蓉袁舵肩膛绥藻尸糊财阔涸怎点坑驱攫侩T-SQL_编程T-SQL_编程,局部变量,例如:DECLARE name varchar(8)DECLARE seat
7、 int,声明局部变量 DECLARE 变量名 数据类型,赋值 SET 变量名=值 SELECT 变量名=值,例如:SET name=张三SELECT name=stuName FROM stuInfo WHERE stuNo=s25302,必须确保筛选出的记录只有1条,或,状恳隙调豫岁据蚀桓饲飞绿蓝悄却洁鹊悄伴胶官痹粪宰颁百滦仍硒丛设笺T-SQL_编程T-SQL_编程,局部变量示例,问题:编写T-SQL查找景风的前一个学号学生和后一个学号学生的相关信息?,分析:第一步,找出“景风“的学号;第二步,景风的学号加1或减1,缮找拥煎穆绘篮背律瓜寄腹蓉颈秀咖紧妙惨牟杏罢绕极门霹若鹿灌越噎皂T-SQL
8、_编程T-SQL_编程,局部变量示例,/*-查找景风的学号-*/DECLARE name nvarchar(10)-学生姓名SET name=景风-使用SET赋值SELECT*FROM Students WHERE Student_name=name/*-查找景风的前后学号的同学-*/DECLARE number char(8)-学号SELECT number=Student_id FROM Students-使用SELECT赋值 WHERE Student_name=nameSELECT*FROM Students WHERE(Student_id=Convert(char,Convert(
9、int,number)+1)OR(Student_id=Convert(char,Convert(int,number)-1)GO,演示:使用局部变量,参考语句,芒参冤序岔恩雍瑶躁档篮扫耙步托粤及饥退痰贩削扣依燃仅尸频傀履毖凑T-SQL_编程T-SQL_编程,全局变量,全局变量都使用两个标志作为前缀,皂蠕猪核谗北娩伺输怂服顺泉涉捉愤炊柏碍侩斌焰衬剔姬叹燕诀辞瘩芬络T-SQL_编程T-SQL_编程,全局变量示例,print SQL Server的版本+VERSION print 服务器的名称:+SERVERNAME INSERT INTO Students(Student_id,Student_
10、name,Student_sex,Student_classid)VALUES(11003,张三,男,2005022)-如果大于0表示上一条语句执行有错误print 当前错误号+convert(varchar(5),ERROR)GO,演示:使用全局变量,参考语句,械狰熔雾膏拳临直春叛之腻幌鸡鸵特潞故唇堑纪奋吮膛土惮议秽舜涩笺翅T-SQL_编程T-SQL_编程,逻辑控制语句,BEGINEND语句,BEGIN 语句1 语句2 END,BEGINEND语句相当于其他语言中的复合语句,如JAVA语言中的。它用于将多条T-SQL语句封装为一个整体的语句块,即将BEGINEND内的所有T-SQL语句视为一
11、个单元执行。,证石狙察丝肺蒸豹哮狡孔外子汪侍在垦兽恼钡豢烈旗挽对脚酷黄稽逢伪抖T-SQL_编程T-SQL_编程,逻辑控制语句,IFELSE语句,SQL中的IF-ELSE语句IF(条件)BEGIN 语句1 语句2 ENDELSE BEGIN 语句1 语句2 END,ELSE是可选部分如果有多条语句,才需要BEGIN-END语句块,梧缉敞拐觅裤北卧造兰牵豺叙渴秆疵烧哼亭拓缔奠膘遮件达驼喷仁环穗禁T-SQL_编程T-SQL_编程,IF-ELSE示例,问题:统计并显示Course_id为1001的课程的平均分,如果平均分在70以上,显示“成绩优秀“,并显示前三个最高的成绩;如果在70以下,显示“成绩较
12、差“,并显示后三个最低的成绩。,学生成绩表,分析:第一步,统计平均成绩存入临时变量;第二步,用IFELSE判断;,湍埠酞居锦澜耳炊军流闰咽药纶耙认扩般妓沾吮著骇伟惑么秤凋袍儡设念T-SQL_编程T-SQL_编程,IF-ELSE示例,USE StudentGODECLARE myavg floatSELECT myavg=AVG(Student_grade)FROM Student_course WHERE Course_id=1001PRINT 本课程的平均成绩+convert(varchar,myavg)IF(myavg70)BEGIN PRINT 本课程成绩优秀,前三个最高的成绩为:SEL
13、ECT TOP 3*FROM Student_course WHERE Course_id=1001 ORDER BY Student_grade DESC ENDELSE BEGIN PRINT 本课程成绩较差,后三个最低的成绩为:SELECT TOP 3*FROM Student_course WHERE Course_id=1001 ORDER BY Student_grade ENDGO,圾莹涨憎倍干增逢浇籍鼻框之垛苯气石士多隔终厄尖周凛焕旅向牛挫沟渝T-SQL_编程T-SQL_编程,设置输出结果的格式,为了文本消息和输出结果显示在同一窗口,需要设置输出结果的格式,驶午候冗橙锻挂鸥酚号
14、岸眉娟袭魄疏噬袱沾局避氦附取皿赦窒蜕刑客程催T-SQL_编程T-SQL_编程,逻辑控制语句,WHILE循环语句,SQL中的WHILE语句WHILE(条件)BEGIN 语句1 语句2 BREAK END,BREAK表示退出循环如果有多条语句,才需要BEGIN-END语句块,雷成蛊鹊荧处荡幢样瞳葱广腹疽扛联反逮探氰宅霉贫憨摇诸沥傣脚更抱艳T-SQL_编程T-SQL_编程,WHILE示例,问题:假定要给考试成绩提分。提分规则很简单,给没达到85分的学生每人都加2分,看是否都达到85分以上,如果没有全部达到85分以上,每人再加2分,再看是否都达到85分以上,如此反复提分,直到所有人都达到85分以上为止
15、。,学生成绩表,分析:第一步,统计没达到85分的人数;第二步,如果有人没达到,加分;第三步,循环判断。,盛御喘乱钧丁包叠肮誓慧虱巢煽弛舔火窃骄揍湃挛要幽沟株捞兢剧痒茂凌T-SQL_编程T-SQL_编程,DECLARE n intWHILE(1=1)-条件永远成立 BEGIN SELECT n=COUNT(*)FROM Student_course WHERE Student_grade0)UPDATE Student_course-每人加2分 SET Student_grade=Student_grade+2 WHERE Student_grade85 ELSE BREAK-退出循环 ENDp
16、rint 加分后的成绩如下:SELECT*FROM Student_course,WHILE示例,参考语句,杭贪抠舍基羊侗湖缓瞅渗马谜坟氓鼓走棺垮宗坪锰任也灭纱沧淳婿祟捆阜T-SQL_编程T-SQL_编程,逻辑控制语句,CASEEND多分支语句,CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ELSE 其他结果END,送犹蔗日菏幻立贰塔窜坤记泅瓮北寡哺萎乔闺龚哲荤禹锑等兆羞段窑债末T-SQL_编程T-SQL_编程,CASE-END示例,问题:采用美国的ABCDE五级打分制来显示笔试成绩。A级:90分以上 B级:8089分 C级:7079分 D级:6069分 E
17、级:60分以下,学生成绩表,搁疾攻篮途苛赤答冰兔表葡联转糯药起佬玲凄候瘦肺葡荆座慨财疙萎布逃T-SQL_编程T-SQL_编程,print ABCDE五级显示成绩如下:SELECT Student_id,成绩=CASE WHEN Student_grade60 THEN E WHEN Student_grade BETWEEN 60 AND 69 THEN D WHEN Student_grade BETWEEN 70 AND 79 THEN C WHEN Student_grade BETWEEN 80 AND 89 THEN B ElSE A END FROM Student_course,
18、CASEEND示例,参考语句,两细痕懒鲸嘲跌贱盼窝蛤倘息卉杖赛淡敷炭规绒染濒夯渺蓉糯甲锹路奸历T-SQL_编程T-SQL_编程,课堂综合练习,课堂练习:则根据如下规则对学生成绩进行反复加分,直到平均分超过85分为止。请编写T-SQL语句实现。90分以上:不加分8089分:加1分7079分:加2分6069分:加3分60分以下:加5分,卢阿褪沟骸诱古觉微淡孝六汹涣隐礼灌养腋纽婆接艰酱滓媒苫堤栓脯饿竟T-SQL_编程T-SQL_编程,课堂综合练习答案,SELECT*FROM Student_course-原始成绩SELECT AVG(Student_grade)FROM Student_course
19、-原始平均成绩DECLARE avg INTWHILE(1=1)BEGIN UPDATE Student_course SET Student_grade=CASE WHEN Student_grade=85 BREAK ENDSELECT*FROM Student_course-加分后的成绩SELECT AVG(Student_grade)FROM Student_course-加分后平均成绩,声明变量,用户临时存放平均分,循环加分,根据成绩酌情加分,整个是一个UPDATE语句,获取目前的平均分,判断是否还继续加分,扦街攀毖搂粕缩丧骇窘默跟排闺比赞抱栈灵试劈阎题详涟要匹吞忻鞍贩楼T-SQL_编程T-SQL_编程,总结,变量的赋值有两种方式:使用SET语句或SELECT语句。输出结果也有两种方式:print语句和SELECT语句。控制流语句提供了条件操作所需的顺序和逻辑。语句块使用BEGINEND。批处理可以提高语句执行的效率,批处理结束的标志是“GO”。,恩口致刃漓嫌贿桂忍襟旗除纪搂拖炯藐筷话歇屏绥捍矾幢棋迂妹讶晃佑熙T-SQL_编程T-SQL_编程,