《TransactSQL语言》由会员分享,可在线阅读,更多相关《TransactSQL语言(79页珍藏版)》请在金锄头文库上搜索。
1、第2章 Transact-SQL语言学习目标o了解T-SQL语言的起源、组成o熟练使用SELECT、INSERT、UPDATE、 DELETE语句Transact-SQL语言概述 o问题我们需要对数据进行哪些维护操作?如何对数据进行 查询、统计?o结构化查询语言(Structured Query Language)是一种用于存取和查询数据,更新并管理关系数据库 系统的数据库查询和编程语言。这种语言的语法结构 类似于英语,易学易用,书写随意。ANSI SQL 92Transact-SQL1、数据定义语言DDL用来定义和管理数据库中的对象。DDL主要的语句有:CREATE TABLE/*创建表*/
2、ALTER TABLE/*修改表的属性*/DROP TABLE/*删除表*/Transact-SQL语言的组成2、数据操作语言DML用来操作数据库中的对象和数据,是T-SQL中最常用的部分。DML主要的语句有:SELECT/*从一个表或多个表中检索数据*/DELETE/*从表中删除数据*/INSERT /*向一个表中添加数据*/ UPDATE/*修改表中已有的数据*/3、数据控制语言DCL用来控制用户对数据库对象操作的权限。主要的命令有:GRANT/*授予权限*/ REVOKE/*回收所授予的权限*/第1节 操作数据单表查询o打开一个数据库USE XkGO oSELECT子句SELECT子句主
3、要用于检索数据,其基本格式为:SELECT 选择列表FROM 表的列表WHEAR 检索的条件【例】从Student表中检索学号为00000001的学生的 姓名(StuName),要求显示学生的学号和姓名。Use xkGoSelect StuNo,StuName from Student where StuNo=00000001GO【练习】要求检索系部编号为01的班级信息,要求显示班级编号和班级名称。1、使用*和列名在选择表中使用星号(*),则从FORM子句中指定的表或视图中检索并返回所有列。【例】从课程表中检索所有的信息。Use xkGoSelect * from CourseGo【练习】从学
4、生表中检索学生所在班的班级编码。2、使用DISTINCT消除重复值在Select之后使用Distinct关键字,会消除指定列的值都相同的那些行。【例】从课程表中检索课程分类,要求清除值相同的那些 行。/消除Kind列值都相同的那些重复行Select Distinct Kind from Course/消除Kind和Credit列值都相同的那些重复行 Select Distinct Kind,Credit from Course 3、使用TOP n PERCENT仅返回前n行使用TOP,可以从结果集中仅返回前n行。如果指定了PERCENT,则仅返回前n%行,此时n必须介于 0100之间。【例】从
5、学生表中检索所有的信息,要求只显示前6行数据。Select top 6 * from Student /返回6行 Select top 6 percent * from Student /返回1806114、修改检索结果中列的标题修改检索列标题有三种方式:(1)将要显示的列标题用单引号括起来后接等号(), 后接要检索的列名;(2)将要显示的列标题用单引号括起来后,写在列名后面,两者之间使用空格隔开;(3)将要显示的列标题用单引号括起来后,写在列名后面,两 者之间使用AS关键字。【问题】检索课程表中课程编码、课程名称、教师、上课 时间、限制选课人数和报名人数,并修改列标题。SELECT 课程编码
6、=CouNo,课程名称=CouName,教师 =Teacher,上课时间=SchoolTime,限制选课人数 =LimitNum,报名人数=WIllNumFROM Course【练习】使用其他两种方法5、在查询结果中显示字符串将要增加的字符串用单引号括起来,然后和列的名字 写在一起,中间用逗号隔开。 【问题】检索课程表的信息,要求给出检索结果为:课程名称 课程编码SQL Server实用技术 课程编码为: 001 SELECT 课程名称=CouName,课程编码为:,课程编码 =CouNo FROM Course6、使用WHERE限制检索的条件使用WHERE子句限制检索的范围,通常情况下,必须
7、定义一个或多个条件限制检索选择的数据行。【例】检索上“Linux操作系统”课程的教师名 。SELECT 教师=Teacher FROM CourseWHERE CouName=Linux操作系统7、表达式作为SELECT语句中的列SELECT子句中的选项列表可以是要指定的表达式或 列的列表,表达式可以是列名、函数或常数的列表。 【例】要求检索课程表的课程信息,并显示报名人数和限 制选课人数之比。 SELECT *,WillNum/LimitNum FROM Course【练习】检索课程表中最小的报名人数、最大的报名人数 以及平均报名人数。使用聚合函数AVG()、MAX()、MIN()、SUM(
8、)。聚合函数也可以出现在SELECT子句中。SELECT 最小的报名人数=MIN(WillNum),最大的报 名人数=MAX(WillNum),平均报名人数 =AVG(WillNum)FROM Course8、使用ORDER BY子句重新排列检索结果升序:使用ASC关键字或者省略。降序:使用DESC关键字。也可以在ORDER BY子句中指定多个列,检索结果首先 按第1列进行排序,对第1列值相同的那些数据行,再按 照第2行排序 ORDER BY要写在WHERE子句的后面。【例】检索课程表的教师名、课程号、课程名,要求检索 结果首先按教师名降序排列,教师名相同时,则按课 程号的升序排列。SELEC
9、T Teacher AS 教师名,CouNo AS 课程号 ,CouName AS 课程名FROM CourseORDER BY Teacher DESC,CouNo或者:SELECT Teacher AS 教师名,CouNo AS 课程号 ,CouName AS 课程名FROM CourseORDER BY 教师名 DESC,课程号9、使用IN(NOT IN)关键字【例】检索课程编码为001004013的课程名称方法一:使用逻辑运算符OR;SELECT CouName AS 课程名称FROM CourseWHERE CouNo=004 OR CouNo=007 OR CouNo=013 方法
10、二:使用IN关键字(比使用逻辑运算符更为简单)。SELECT CouName AS 课程名称FROM CourseWHERE CouNo IN(004,007,013)【练习】检索课程号不为004,007,013的课程号和课程名称。10、使用LIKE(NOT LIKE)关键字检索与给定的某些字符串相匹配的数据可以使用LIKE 关键字。LIKE与字符串相匹配,字符串表达式被定义为字符串和通配符。SQL的4个通配符:% 百分号,匹配包括0个或多个字符的字符串。_下划线,匹配任何一个字符。 排列通配符,匹配任何在范围内的单个字符,例如:m-p 匹配的是m、n、o、p单个字符。 不在范围之内的字符,匹
11、配任何不在范围内的单个字符, 例如:m-p、mnop匹配的是除了m、n、o、p之外的任 何字符。注:通配符和字符串要括在单引号中。【练习】解释下面的通配符表示的意义LIKED%匹配以字母D开始的字符串,LIKE制作 匹配的是以“制作”两字结尾的字符串;LIKE-宝匹 配的是第2个字为“宝”的字符串。如要查找通配符本身,需要将它们用方括号括起来。LIKE表示要匹配“”,LIKE5%表示要匹配“5”。【问题】检索以“制作”两字结尾的课程名(使用LIKE)SELECT * FROM CourseWHERE CouName LIKE %制作【问题】检索不姓“刘”的学生信息(使用NOT LIKE)SEL
12、ECT * FROM StudentWHERE StuName LIKE 刘% ORSELECT * FROM StudentWHERE StuName NOT LIKE 刘%11、使用IS NULL关键字检索列中没有赋值的行【问题】检索课程表中教师未定的课程名称和教师名。SELECT 课程名称=CouName,教师=Teacher FROM CourseWHERE Teacher IS NULL12、使用BETWEENAND(NOT BETWEENAND)关键 字用于检索在某一特定范围内的信息【问题】检索报名人数大于等于30并且小于等于40的课程信 息,要求显示课程名称和报名人数(使用 BE
13、TWEENAND);【注意】WHERE WillNum BETWEEN 30 AND 40包括30和 40这两个值。【问题】对上例使用NOT BETWEENAND也可以在WHERE字句中使用前面讲过的逻辑运算符检索某一范围内的信息。【练习】检索报名人数比限制选课人数多一倍以及一倍以 上的课程信息,要求显示课程名称、报名人数和限制 选课人数之比,并按该比例的降续排列。13、使用COMPUTE子句计算总计或进行分组小计【问题】检索课程表中课程分类为“信息技术”的课程编码、课程名称、课程分类、报名人数,并计算平均报名人数 。SELECT CouNo AS 课程编码,CouName AS 课程名称 ,
14、Kind AS 课程分类,WillNum AS 报名人数FROM CourseWHERE Kind=信息技术COMPUTE AVG(WillNum)【说明】总计值或小计值作为附加新行出现在检索结果中 。该子句用在WHERE子句之后。从检索结果可以看到:检索结果中有两个结果集。(1)包含选择的列的所有明细行;(2)包含COMPUTE子句中所指定的聚合函数的合计。14、使用COMPUTE BY子句使用COMPUTE BY对BY后面给出的列进行分组显示,并计 算该列的分组小计。使用COMPUTE BY必须使用ORDER BY 对COMPUTE BY中BY指定的列进行排序。【例】按类检索课程表中的课程
15、编码、课程名称、课程分类、报 名人数,并计算每类课程的平均报名人数。 SELECT CouNo AS 课程编码,CouName AS 课程名称,Kind AS 课程分类,WillNum AS 报名人数FROM Course ORDER BY KindCOMPUTE AVG(WillNum) BY Kind从检索结果可以看到:检索结果中有多个组,每个组有两个结果集; 这两个结果集中的内容同上。 【注意】必须使用ORDER BY排序要分组的列。 【练习】检索周二上课的课程名称和教师名,并对符合条 件的课程门数进行统计。 (提示:先完成前一部分,再使用聚合函数COUNT进行 统计)o问题COMPUTE子句是在一个明细行的基础上增加一个总 计或小计(有BY时),但如果只想统计每类课程的平均报名人数,该如何处理? 15、使用GROUP BY子句【问题】按课程分类统计每类课程的平均报名人数 SELECT Kind AS 课程分类,AVG(WillNum) AS 每类平均报名人数FROM CourseGROUP BY Kind与上面例子的区别:只有一个结果集说明:(1)该子句用于将检索结果按照GROUP BY后指定的列进行 分组,该子句写在WHERE子句后面。(2)G