1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,SQL教程四PPT讲座,回顾,SQL分为数据操作语言、数据控制语言和数据定义语言;T-SQL是SQL的扩展,通配符经常与LIKE一起使用来进行非精确的限制;,标识列不能插入指定的数据值,使用UPDATE更新数据,一般都有限制条件,使用DELETE删除数据时,不能删除被外键值所引用的数据行,使用TRUNCATE TABLE来删除所有数据时,效率要比DELETE语句高,上面的数据操作语句在程序中会经常使用到,2,2,目标,理解查询的机制,使用SELECT语句进行条件查询,在查询中返回限制行、进行查询排序,在
2、查询中使用表达式、运算符和函数,3,3,什么是查询?,Application Logic,客户程序,查询请求,查询结果集,SQL SERVER,A B C D E F G,SELECT*FROM SALES,查询产生一个虚拟表,看到的是表形式显示的结果,但结果并不真正存储,每次执行查询只是现从数据表中提取数据,并按照表的形式显示出来,4,4,怎么查的?,学员编号,学员姓名,地址,所在班级,.,001,张明全,湖南长沙,S201,002,李菲,湖北宜昌,S202,003,于寄谦,甘肃天水,S204,004,刘国正,山东荷泽,S201,005,周接轮,台湾新竹,S204,006,巩小妹,香港龙湾,
3、S203,007,巩大妹,香港龙湾,S203,008,张明敏,北京顺义,S202,009,矛十八,四川棉阳,S204,010,罗林光,陕西临潼,S202,011,司马坡,新疆喀什,S201,S202,陕西临潼,罗林光,010,S202,湖北宜昌,李菲,002,S202,北京顺义,张明敏,008,SELECT*FROM StudentsH,WHERE,所在班级,=S202,5,5,编写查询语句之前,6,6,查询,SELECT,FROM,WHERE,ORDER BY,ASC或DESC,列名称,SELECT,SCode,SName,SAddress,表名,FROM,Students,过滤条件,WHE
4、RE,SSEX=0,排序条件,ORDER BY,SCode,SELECT,SCode,SName,SAddress,FROM,Students,WHERE,SSEX=0,ORDER BY,SCode,7,7,数据查询-基础,查询全部的行和列,SELECT,*,FROM Students,查询部分行,SELECT,SCode,SName,SAddress FROM Students,WHERE,SAddress=,河南新乡,SELECT,SCode,SName,SAddress FROM Students,WHERE,SAddress ,河南新乡,8,8,数据查询-列名,使用AS来命名列,SEL
5、ECT SCode,AS,学员编号,SName AS,学员姓名,SAddress AS,学员地址,FROM Students,WHERE SAddress,河南新乡,SELECT FirstName+.,+,LastName,AS,姓名,FROM Employees,使用=来命名列,SELECT,姓名,=,FirstName+.+LastName,FROM Employees,9,9,数据查询-空行常量列,查询空行,SELECT SName FROM Students WHERE SEmail,IS NULL,使用常量列,SELECT,姓名,=SName,地址,=SAddress,河北新龙,A
6、S,学校名称,FROM Students,思考:非空行怎么查?,10,10,数据查询-限制行数,限制固定行数,SELECT,TOP 5,SName,SAddress,FROM Students WHERE SSex=0,返回百分之多少行,SELECT,TOP 20 PERCENT,SName,SAddress,FROM Students WHERE SSex=0,11,11,数据查询-排序 2-1,升序排列,SELECT StudentID As,学员编号,(Score*0.9+5)As,综合成绩,FROM Score,WHERE(Score*0.9+5)60,ORDER BY,Score,降
7、序排列,SELECT Au_Lname+.+Au_fName AS EMP,From Authors,Union,SELECT fName+.+LName AS EMP,From Employee,ORDER BY EMP DESC,12,12,数据查询-排序 2-2,按多列排序,SELECT StudentID As,学员编号,Score As,成绩,FROM Score,WHERE Score60,ORDER BY Score,CourseID,思考:排序中的字段,可以使用表达式吗?,如果不可以,请说明原因;,如果可以,请举例说明;,13,13,SQL Server中的函数,相当于C语言中
8、的内部函数,字符串函数,日期函数,数学函数,系统函数,14,14,日期函数,SELECT DATEPART(day,01/15/2000),返回:,15,日期中指定日期部分的整数形式,DATEPART,SELECT GETDATE(),返回:今天的日期,取得当前的系统日期,GETDATE,举例,描述,函数名,SELECT DATEADD(mm,4,01/01/99),返回:以当前的日期格式返回,05/01/99,将指定的数值添加到指定的日期部分后的日期,DATEADD,SELECT DATEDIFF(mm,01/01/99,05/01/99),返回:,4,两个日期之间的指定日期部分的区别,DA
9、TEDIFF,SELECT DATENAME(dw,01/01/2000),返回:,Saturday,日期中指定日期部分的字符串形式,DATENAME,15,15,字符串函数,SELECT STUFF(ABCDEFG,2,3,我的音乐我的世界),返回:A我的音乐我的世界EFG,在一个字符串中,删除指定长度的字符,并在该位置插入一个新的字符串,STUFF,SELECT,CHARINDEX,(btest,My btest Course,1),返回:,4,用来寻找一个指定的字符串在另一个字符串中的起始位置,CHARINDEX,举例,描述,函数名,SELECT LEN(SQL Server课程),返回
10、12,返回传递给它的字符串长度,LEN,SELECT LOWER(SQL Server课程),返回:sql server课程,把传递给它的字符串转换为小写,LOWER,SELECT,UPPER(sql server课程),返回:SQL SERVER课程,把传递给它的字符串转换为大写,UPPER,SELECT LTRIM(周智宇 ),返回:周智宇 (后面的空格保留),清除字符左边的空格,LTRIM,SELECT RTRIM(周智宇 ),返回:周智宇(前面的空格保留),清除字符右边的空格,RTRIM,SELECT RIGHT(买卖提.吐尔松,3),返回:吐尔松,从字符串右边返回指定数目的字符,R
11、IGHT,SELECT REPLACE(莫乐可切.杨可,可,兰),返回:莫乐兰切.杨兰,替换一个字符串中的字符,REPLACE,16,16,数学函数,SELECT SQRT(9),返回:,3,取浮点表达式的平方根,Sqrt,SELECT ABS(-43),返回:,43,取数值表达式的绝对值,ABS,举例,描述,函数名,SELECT CEILING(43.5),返回:,44,返回大于或等于所给数字表达式的最小整数,CEILING,SELECT POWER(5,2),返回:,25,取数值表达式的幂值,POWER,SELECT ROUND(43.543,1),返回:,43.5,将数值表达式四舍五入为
12、指定精度,ROUND,SELECT SIGN(-43),返回:,-1,对于正数返回,+1,,对于负数返回,-1,,对于,0,则返回,0,Sign,SELECT FLOOR(43.5),返回:,43,取小于或等于指定表达式的最大整数,FLOOR,17,17,系统函数,SELECT USER_NAME(1),返回:从任意数据库中返回“,dbo”,从给定的用户,I D,返回用户名,USER_NAME,SELECT CONVERT(VARCHAR(5),,,12345),返回,:字符串12345,用来转变数据类型,CONVERT,举例,描述,函数名,SELECT CURRENT_USER,返回:你登录
13、的用户名,返回当前用户的名字,CURRENT_USER,SELECT DATALENGTH(,中国,A,盟,),返回:,7,返回用于指定表达式的字节数,DATALENGTH,SELECT HOST_NAME(),返回:你所登录的计算机的名字,返回当前用户所登录的计算机名字,HOST_NAME,SELECT SYSTEM_USER,返回:你当前所登录的用户名,返回当前所登录的用户名称,SYSTEM_USER,18,18,案例分析1要求,某公司印了一批充值卡,卡的密码是随机生成的,现在出现这个问题:,卡里面的“O和0”(哦和零)“i和1”(哎和一),用户反映说看不清楚,公司决定,把存储在数据库中的
14、密码中所有的“哦”都改成“零”,把所有的“i”都改成“1”;,请编写SQL语句实现以上要求;,数据库表名:Card;密码字段名:PassWord;,19,19,案例分析1分析,这是更新语句,需要使用UPDATE语句;,因为牵涉到字符串的替换,需要使用到SQL Server中的函数Replace;,20,20,案例分析1T-SQL,两行SQL语句,Update Card Set PassWord=Replace(密码,O,0),Update Card Set PassWord=Replace(密码,i,1),一行SQL语句,Update,Card,Set,PassWord=,Replace,(,
15、Replace,(密码,O,0),i,1),21,21,案例分析2要求,在数据库表中有以下字符数据,如:,13-1、13-2、13-3、13-10、13-100、13-108、13-18、13-11、13-15、14-1、14-2,现在希望通过SQL语句进行排序,并且首先要按照前半部分的数字进行排序,然后再按照后半部分的数字进行排需,输出要排成这样:,13-1、13-2、13-3、13-10、13-11、13-15、13-18、13-100、13-108、14-1、14-2,数据库表名:SellRecord;字段名:ListNumber;,22,22,案例分析2分析,这是查询语句,需要使用SE
16、LECT语句,需要使用到ORDER BY进行排序,并且在ORDER BY的排序列中,也需要重新计算出排序的数字来,前半部分的数字,可以从先找到“-”符号的位置,然后,取其左半部分,最后再使用Convert函数将其转换为数字:,Convert(int,Left(ListNumber,CharIndex(-,ListNumber)-1),后半部分的数字,可以先找到“-”符号的位置,然后把从第一个位置到该位置的全部字符替换为空格,最后再使用Convert函数将其转换为数字:,Convert(int,Stuff(ListNumber,1,Charindex(-,ListNumber),),23,23,
17、案例分析2T-SQL,SELECT,ListNumber,FROM,SellRecord,ORDER BY,Convert,(int,Left,(ListNumber,CharIndex,(-,ListNumber)-1),Convert,(int,Stuff,(ListNumber,1,Charindex,(-,ListNumber),),思考:还有其他的计算出排序列方法吗?,24,24,思考,在上一章我们学习了对表的数据的操作,其中学到了Insert语句,但Insert每次只能插入一行记录,如果我们要进行多行数据插入,能行吗?,25,25,插入多行数据 4-1,INSERT INTO,To
18、ngXunLu,(姓名,地址,电子邮件),SELECT,SName,SAddress,SEmail,FROM,Students,INSERT INTO,(新表列名),SELECT,FROM,当新表中的表结构与旧表的表结构相同时,可以用下面语句把旧表中的所需数据一次性插入到新表中,26,26,插入多行数据 4-2,SELECT,Students.SName,Students.SAddress,Students.SEmail,INTO,TongXunLu,FROM,Students,SELECT,(源表列名),INTO,FROM,猜一猜:该语句可以执行两次吗?,我要对一张表作测试工作,但又不想破坏
19、表的数据,怎么办?,-把这张表复制出来,27,27,插入多行数据 4-3,SELECT Students.SName,Students.SAddress,Students.SEmail,,IDENTITY,(int,1,1),As,StudentID,INTO TongXunLuEX,FROM Students,紧接上面的问题,当我复制了源表相应的列出来后,发现没有适合做主键的列,怎么?,-插入新的标识列,SELECT IDENTITY,(数据类型,标识种子,标识增长量),AS,列名,INTO,新表,FROM,原始表,28,28,插入多行数据 4-4,INSERT STUDENTS(SName
20、SGrade,SSex),SELECT,测试女生1,7,0 UNION,SELECT,测试女生,2,7,0 UNION,SELECT,测试男生,4,7,1 UNION,SELECT,测试男生,5,7,1,INSERT INTO,(列名),SELECT,UNION,SELECT,UNION,前面讲的多行插入都是有源数据存在,那么我想自己输入新的数据进去,但只想用一条Insert语句,能成功吗?,29,29,总结,查询将逐行筛选表中的数据,最后符合要求的记录重新组合成“记录集”,记录集的结构类似于表结构,判断一行中的数据项是否为空,使用IS NULL,使用ORDER BY进行查询记录集的排序,并且可以按照多个列进行排序,在查询中,可以使用常量、表达式、运算符,在查询中使用函数,能够像在程序中那样处理查询得到的数据项,30,30,






