【例1-1】查询XSCJ数据库中所有学生基本信息。
使用查询分析器实现这个查询的具体步骤如下:
①依照本章1.3.1节中介绍的方法登录到服务器,打开查询分析器窗口,如图1-26所示。
②在查询编辑窗口中用户可以输入SQL语句如下:
USEXSCJ
GO
SELECT*FROM学生基本信息表
GO
例1-2】查询学生成绩信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM成绩表
GO
【例1-2】查询pubs示例数据库中authors表的信息。
USEpubs
GO
SELECT*FROMauthors
GO
【例2-1】在数据库XSCJ中定义一个长度为12的字符串类型变量@student,对该变量进行赋值,并且查询出“学生基本信息表“中该变量所指定的学生信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
DECLARE@studentCHAR(12)
SET@student='王倩倩'
SELECT*FROM学生基本信息表WHERE=@student
【例2-2】在数据库XSCJ中定义两个日期时间类型的变量@max_csrq、@min_csrq,分别用于查询“学生基本信息表”中“出生日期”的最大值、最小值。
USEXSCJ
GO
DECLARE@max_csrqDATETIME,@min_csrqDATETIME
SELECT@max_csrq=MAX(出生日期),@min_csrq=MIN(出生日期)FROM学生基本信息表
PRINT@max_csrq
PRINT@min_csrq
【例2-3】计算XSCJ数据库中“学生基本信息表”的总行数。
USEXSCJ
GO
SELECTCOUNT(*)AS'学生总人数'FROM学生基本信息表
GO
【例2-4】计算XSCJ数据库中课程编号为003的课程总成绩和平均成绩。
USEXSCJ
GO
SELECTSUM(成绩)AS'课程总分',AVG(成绩)AS'课程平均分'
FROM成绩表WHERE课程编号='003'
GO
【例2-5】在成绩表中查询课程编号为003的课程的最高分和最低分。
USEXSCJ
GO
SELECTMAX(成绩)AS'最高分',MIN(成绩)AS'最低分'
FROM成绩表
WHERE课程编号='003'
GO
【例2-6】分别输出2的3次幂、-1的绝对值、2的平方、3.14的整数部分。
PRINTPOWER(2,3)
PRINTABS(-1)
PRINTSQUARE(2)
PRINTFLOOR(3.14)
GO
【例2-7】使用LEN函数显示字符串常量以及字符串变量的长度。
提示:LEN函数用于计算字符串中所包含的字符个数,如果字符串尾部含有空格则会被忽略。
PRINTLEN('computerdepartment')
DECLARE@s1char(10)
DECLARE@s2char(10)
SET@s1='welcome'
SET@s2='hellow'
PRINTLEN(@s1)
PRINTLEN(@s2)
【例2-8】给定一个字符串’haveagoodtime’,判断字符’g’在整个字符串中的位置。
提示:CHARINDEX函数用于在规定字符串中对子字符串进行查询。当返回值大于零时表示子字符串的起始位置,返回值为0时表明没有查询结果。
DECLARE@sCHAR(20)
SET@s='haveagoodtime'
PRINTCHARINDEX('g',@s)
【例2-9】获取系统时间信息,在查询分析器中分别显示系统时间中的年份、月份以及日期。
提示:GETDATE函数用于返回当前的系统时间,YEAR,MONTH,DAY函数可以取得时间中的年、月、日的数值。
在查询分析器中运行如下命令:
DECLARE@xtsjDATETIME
SET@xtsj=GETDATE()
SELECTYEAR(@xtsj)
SELECTMONTH(@xtsj)
SELECTDAY(@xtsj)
【例2-10】通过对“学生基本信息表”中的“出生日期”字段进行计算,查询每一位学生的年龄。
提示:利用DATEDIFF函数可以计算出两个日期之间的距离,该函数含有三个参数,第一个参数通常可以为yy(年)或mm(月)或dd(日),若第一个参数为yy时,该函数返回值为后两个日期参数之间年份的差距。在本例中,当前的日期由GETDATE函数获得后,计算与每一位学生的出生日期之间年份的差距,从而获得学生的年龄并在查询结果中显示。
SELECT,,DATEDIFF(yy,出生日期,GETDATE())from学生基本信息表
【例2-11】查询“学生基本信息表”中的、、年龄,并且将这三个字段通过“+”运算符进行连结显示在查询结果中。
提示:由于计算学生年龄的结果为整数,而、均为字符串类型的值,因而在运算之前,需要将年龄的计算结果转化为字符串,即CAST(DATEDIFF(yy,出生日期,GETDATE())ASCHAR(2))。
SELECT++'年龄:'+CAST(DATEDIFF(yy,出生日期,GETDATE())ASCHAR(2))
FROM学生基本信息表
【例2-12】将常量3.14分别转换为整数类型以及字符串类型并且输出结果。
PRINTCONVERT(INTEGER,3.14)
PRINTCONVERT(CHAR(4),3.14)
【例2-13】取得系统当前时间,并且将其转化为mm/dd/yyyy格式的字符串并且显示结果。
提示;由于mm/dd/yyyy格式所对应的参数为101,所以在使用CONVERT函数时,日期格式样式参数设定为101。
DECLARE@xtsjDATETIME
SET@xtsj=GETDATE()
PRINTCONVERT(CHAR(50),@xtsj,101)
【例2-14】显示XSCJ数据库信息。
sp_helpdbXSCJ
【例2-15】创建一个名称为somename的数据库,利用sp_renamedb存储过程将该数据库重命名为newname
CREATEDATABASEsomename
GO
sp_renamedb'somename','newname'
GO
【例2-16】显示超级用户dbo的用户信息。
sp_helpuserdbo
【例2-17】在系统中添加一个名为test、密码为1234的登录帐号。
sp_addlogintest,1234
【例2-18】在SQLServer中添加一个名称为test的用户。
sp_addlogintest
GO
sp_addusertest
GO
【例2-19】删除名称为test的用户。
sp_dropusertest
【例2-20】添加一个名为myrole的角色,并将test用户加入该角色中。
sp_addrolemyrole
GO
sp_addmembermyrole,test
GO
【例2-21】删除已有的角色myrole。
sp_droprolemyrole
【例2-22】执行批处理程序,依次查询系部表、系部总数、班级表、班级总数。
USEXSCJ
GO
SELECT*FROM系部表
SELECTCOUNT(*)FROM系部表
SELECT*FROM班级表
SELECTCOUNT(*)FROM班级表
GO
【例2-23】在“学生基本信息表”中查询班级编号为20041001的班级中是否有党员。要求:如果有党员则显示党员的人数,否则,提示该班级没有党员。
USEXSCJ
GO
IF(SELECTCOUNT(*)FROM学生基本信息表WHERE班级编号='20041001'AND政治面貌='党员')>0
BEGIN
DECLARE@dyINTEGER
SELECT@dy=COUNT(*)FROM学生基本信息表WHERE班级编号='20041001'AND政治面貌='党员'
PRINT'党员的人数为:'
PRINT@dy
END
ELSE
PRINT'该班级没有党员'
【例2-24】根据系统时间判断当前日期所对应的星期值并且输出结果。
DECLARE@dtDATETIME
SET@dt=DATEPART(w,GETDATE())
SELECT
CASE@dt
WHEN1THEN'星期天'
WHEN2THEN'星期一'
WHEN3THEN'星期二'
WHEN4THEN'星期三'
WHEN5THEN'星期四'
WHEN6THEN'星期五'
WHEN7THEN'星期六'
END
【例2-25】取得系统时间,并且判断当前时间在一天中所处的时间段,并且在查询分析器中输出提示信息。
DECLARE@sjDATETIME
SET@sj=DATEPART(hh,GETDATE())
SELECT
CASE
WHEN@sj>=20and@sj<24THEN'晚上'
WHEN@sj>=14and@sj<20THEN'下午'
WHEN@sj>=12and@sj<14THEN'中午'
WHEN@sj>=10and@sj<12THEN'早晨'
WHEN@sj>=0and@sj<10THEN'临晨'
END
【例2-26】利用循环计算1+2+3+…+99+100的值。
DECLARE@sumint,@iint
SET@sum=0
SET@i=1
WHILE@i<=100
BEGIN
SET@sum=@sum+@i
SET@i=@i+1
END
PRINT@sum
【例2-27】利用WHILE循环计算当前时间距离2007年1月1日之间的天数。
DECLARE@numint,@sjDATETIME
SET@sj=GETDATE()
PRINT'当前时间为:'+CAST(@sjASCHAR(20))
SET@num=0WHILE1=1BEGIN
SET@sj=DATEADD(day,1,@sj)
SET@num=@num+1
IFDATEPART(yy,@sj)=2007
BREAK
END
PRINT'距离2007年1月1日还有'+CAST(@numASVARCHAR(10))+'天'
【例3-2】创建一个XJGL数据库,该数据库的主文件逻辑名称为XJGL_data,物理文件名为XJGL.mdf,初始大小为1MB,最大尺寸为3MB,增长速度为10%;数据库的日志文件逻辑名称为XJGL_log,物理文件名为XJGL.ldf,初始大小为1MB,最大尺寸为5MB,增长速度为1MB。文件存放在C:\下。
CREATEDATABASEXJGL
ON
(NAME=XJGL_Data,
FILENAME='C:\XJGL_Data.MDF',
SIZE=1,
MAXSIZE=3,
FILEGROWTH=10%)
LOGON
(NAME='XJGL_Log',
FILENAME='C:\XJGL_Log.LDF',
SIZE=1,
MAXSIZE=5,
FILEGROWTH=10%)
【例3-3】创建名为stu的数据库,它有3个数据文件组成,其中主文件为stu_data1.mdf,使用PRIMARY关键字指定。Stu_data2_.ndf、stu_data3.ndf是次文件,尺寸分别为5MB,3MB,2MB。事务日志文件有2个,分别为4MB、3MB。数据文件和事务日志文件的最大尺寸均为20MB,文件增量为2MB。
CREATEDATABASEstu
ON
PRIMARY(NAME=stu_data1,
FILENAME='C:\stu_data1.mdf',
SIZE=5MB,
MAXSIZE=20MB,
FILEGROWTH=2MB),
(NAME=stu_data2,
FILENAME='C:\stu_data2.ndf',
SIZE=3MB,
MAXSIZE=20MB,
FILEGROWTH=2MB),
(NAME=stu_data3,
FILENAME='C:\stu_data3.ndf',
SIZE=2MB,
MAXSIZE=20MB,
FILEGROWTH=2MB)
LOGON
(NAME=stu_log1,
FILENAME='C:\stu_log1.Ldf',
SIZE=4MB,
MAXSIZE=20MB,
FILEGROWTH=2MB),
(NAME=stu_log2,
FILENAME='C:\stu_log2.Ldf',
SIZE=3MB,
MAXSIZE=20MB,
FILEGROWTH=2MB)
【例3-6】将数据库的数据文件XSCJ_data和XSCJ_log分别由原先的1MB扩充为2MB。
USEXSCJ
GO
ALTERDATABASEXSCJ
MODIFYFILE
(NAME='XSCJ_DATA',
SIZE=2MB)
GO
ALTERDA
【例3-8】将stu数据库的数据文件stu_data1由5MB压缩为1MB。
USEstu
GO
DBCCSHRINKFILE(STU_DATA1,1)
TABASEXSCJ
MODIFYFILE(NAME='XSCJ_LOG',
SIZE=2MB)
【例3-9】将数据库stu更名为student。
sp_renamedb'stu','student'
GO
【例3-10】删除stu数据库
DROPDATABASEstu
【例4-3】使用SQL语句创建“班级表”、“课程信息表”、“成绩表”。
USEXSCJ
GO
CREATETABLE班级表
(
班级编号char(8)NOTNULL,
系部编号char(2)NOTNULL,
班级名称char(16)NOTNULL
)
GO
CREATETABLE课程信息表
(
课程编号char(4)NOTNULL,
课程名称char(30)NOTNULL,
学分decimal(5)NOTNULL,
学时decimal(5)NOTNULL,
考核类型char(6)NOTNULL,
任课教师char(12)NOTNULL,
系部编号char(2)NOTNULL,
上课时间char(40)NOTNULL
)
GO
CREATETABLE成绩表
(
char(8)NOTNULL,
课程编号char(4)NOTNULL,
成绩decimal(9)NOTNULL
)
GO
【例4-5】使用SQL语句把“课程信息表”的“课程编号”列设置为主键“PX_课程信息表”,再将其删除
USEXSCJ
GO
ALTERTABLE课程信息表
ADDCONSTRAINTPX_课程信息表
PRIMARYKEYCLUSTERED
(课程编号)
GO
【例4-6】向“学生基本信息表”中添加“Email:”列。
USEXSCJ
GO
ALTERTABLE学生基本信息表
ADDEmail:varchar(20)NULL
GO
【例4-7】将“学生基本信息表”中添加的“Email:”列删除。
USEXSCJ
GO
ALTERTABLE学生基本信息表
DROPCOLUMNEmail:
GO
【例4-8】将“学生基本信息表”中的“”列改为最大长度为20的varchar型数据,且不允许空值。
USEXSCJ
GO
ALTERTABLE学生基本信息表
ALTERCOLUMNvarchar(20)NOTNULL
GO
【例4-10】使用SQL命令将XSCJ数据库中的“学生成绩表”重新更名为“成绩表”。
USEXSCJ
GO
EXECsp_rename‘学生成绩表’,’成绩表’
GO
【例4-12】使用SQL语句删除XSCJ数据库中的“学生基本信息表”。
USEXSCJ
GO
DROPTABLE学生基本信息表
GO
【例4-13】向“班级表”中输入一行数据。
USEXSCJ
GO
INSERTINTO班级表
VALUES(‘20051004’,’01’,’05高职网络’)
GO
【例4-14】向“学生基本信息表”中输入一行数据。
USEXSCJ
GO
INSERTINTO学生基本信息表(,,家庭住址)
VALUES(‘000107’,’巴尔夏提’,’新疆库尔勒市’)
GO
【例4-16】删除“学生基本信息表”中为杨文利的学生记录。
USEXSCJ
GO
DELETEFROM学生基本信息表
WHERE=’杨文利’
GO
【例4-16】将刘瑞恒的出生日期改为1985/10/31。
USEXSCJ
GO
UPDATE学生基本信息表
SET出生日期='1985/10/31'
WHERE=’刘瑞恒’
GO
【例5-1】查询学生基本信息表中的所有信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
GO
【例5-2】在学生基本信息表中查询学生的、、性别和族别信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,,性别,族别FROM学生基本信息表
GO
【例5-3】从学生基本信息表中查询学生由几个民族构成。
从例2结果可知,学生的族别有多行重复,要快速查询学生的民族构成,实际上就是对相同值的族别只需要显示一行,可使用DISTINCT关键字实现。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTDISTINCT族别FROM学生基本信息表
GO
【例5-4】显示课程信息表中前5行的信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTTOP5*FROM学生基本信息表
GO
运行结果如图5-4所示,只显示查询结果的前5行数据。
【例5-5】从学生基本信息表中只显示5%的信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTTOP5PERCENT*FROM学生基本信息表
GO
【例5-6】从学生基本信息表中查询所有团员的信息资料,并形成新表为团员基本信息表。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*INTO团员基本信息表FROM学生基本信息表
WHERE政治面貌='团员'
GO
SELECT*FROM团员基本信息表
GO
【例5-7】从成绩表中查询学生成绩。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM成绩表
GO
【例5-8】从相关表中查询每一位学生的、、课程名称、成绩。
从各表数据可知,“”存在于“学生基本信息表”和“成绩表”,“”存在于“学生基本信息表”,“课程名称”存在于“课程信息表”,“成绩”存在于“成绩表”,要实现本例查询,则需要对“学生基本信息表”、“课程信息表”、“成绩表”进行多表检索,也可以来自不同的数据库。在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT学生基本信息表.,,课程名称,成绩FROM学生基本信息表,课程信息表,成绩表
WHERE学生基本信息表.=成绩表.AND课程信息表.课程编号=成绩表.课程编号
GO
【例5-9】在课程信息表中查找“Delphi程序设计”课程的任课老师。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT任课教师FROM课程信息表
WHERE课程名称='Delphi程序设计'
GO
【例5-10】查询少数民族学生的基本情况。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERE族别<>'汉族'
GO
【例5-11】检索1985年1月1日以后出生的女生基本信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERE出生日期>'1985-01-01'AND性别='女'
GO
【例5-12】查询每位同学的课程门数、总成绩、平均成绩。
查询每位学生的课程成绩情况,实际上就是按照“”列分类统计,可使用GROUPBY子句,统计课程门数、总成绩、平均成绩分别可以使用聚合函数COUNT(课程编号)、SUM(成绩)、AVG(成绩)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,COUNT(课程编号)AS'课程门数',SUM(成绩)AS'总成绩',AVG(成绩)AS'平均成绩'FROM成绩表
GROUPBY
GO
【例5-13】从学生基本信息表中统计各民族学生人数。
此例实际上是将要对学生按民族进行分类统计,可使用聚合函数COUNT(族别)实现功能。在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT族别,COUNT(族别)AS'学生人数'FROM学生基本信息表
GROUPBY族别
GO
【例5-14】从学生基本信息表中统计汉族学生的人数。
此例就是在上例统计出各民族学生人数的基础上进一步限定查询汉族学生人数,可在GROUPBY子句之后跟HAVING族别='汉族'子句实现此功能。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT族别,COUNT(族别)AS'学生人数'FROM学生基本信息表
GROUPBY族别
HAVING族别='汉族'
GO
此例也可使用WHERE子句完成功能。
USEXSCJ
GO
SELECT族别,COUNT(族别)AS'学生人数'FROM学生基本信息表
WHERE族别='汉族'
GROUPBY族别
GO
【例5-15】显示平均成绩大于等于80分以上的学生情况。
此例的限定条件是AVG(成绩)>=80,只能使用HAVING子句,如果使用WHERE子句限定条件,则系统会显示如图5-16所示的错误信息。
错误使用WHERE子句的SELECT语句如下:
USEXSCJ
GO
SELECT,AVG(成绩)AS'平均成绩'FROM成绩表
WHEREAVG(成绩)>=80
GROUPBY
GO
使用HAVING子句的正确语句如下:
USEXSCJ
GO
SELECT,AVG(成绩)AS'平均成绩'FROM成绩表
GROUPBY
HAVINGAVG(成绩)>=80
GO
【例5-16】将学生平均成绩按升序排序。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,AVG(成绩)AS'平均成绩'FROM成绩表
GROUPBY
ORDERBYAVG(成绩)
GO
【例5-17】查询成绩表中的全部信息,要求查询结果首先按升序排序,相同时,按成绩降序排序。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM成绩表
ORDERBY,成绩DESC
GO
【例5-18】按显示学生成绩,并计算每人的平均成绩和总成绩。
此例要求按人对课程及成绩进行分组显示,并计算每人的平均成绩、总成绩。则显示成绩应按分类,分组计算平均成绩、总成绩的语句为COMPUTEAVG(成绩),SUM(成绩)BY,使用COMPUTEBY子句首先要用ORDERBY子句对要分组的列排序,即ORDERBY。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*
FROM成绩表
ORDERBY
COMPUTEAVG(成绩),SUM(成绩)BY
GO
【例5-19】从系部表中检索系部名称,从班级表中检索班级名称。
从系部表中检索系部名称的SELECT语句为:SELECT系部名称FROM系部表,从班级表中检索班级名称的SELECT语句为:SELECT班级名称FROM班级表,合并这两个查询结果,需要使用UNION运算符。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT系部名称FROM系部表
UNION
SELECT班级名称FROM班级表
GO
【例5-20】查询1985年出生的学生基本信息。
1985年出生的学生即出生日期在1985年1月1日至12月31日之间的学生。在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERE出生日期BETWEEN'1985-01-01'AND'1985-12-31'
GO
【例5-21】查询不及格学生成绩信息。
查询不及格学生成绩信息,也就是查询0—59之间的学生成绩,可用BETWEEN关键字表示为:WHERE成绩BETWEEN0AND59。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM成绩表
WHERE成绩BETWEEN0AND59
GO
【例5-22】查询课程编号为002、003、007、014的课程编号、课程名称、任课教师和上课时间。
课程编号为002、003、007、014可以写成:WHERE课程编号IN('002','003','007','014'),也可写成WHERE课程编号=’002’OR课程编号=’003’OR课程编号=’007’OR课程编号=’014’。显然,使用IN关键字进行检索比使用3个OR运算符进行检索更为简单,而且易于理解和阅读。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT课程编号,课程名称,任课教师,上课时间FROM课程信息表
WHERE课程编号IN('002','003','007','014')
GO
在查询分析器中运行以下命令,也可得到相同的查询结果,但这种写法显然比较繁琐。
USEXSCJ
GO
SELECT课程编号,课程名称,任课教师,上课时间FROM课程信息表
WHERE课程编号=’002’OR课程编号=’003’OR课程编号=’007’OR课程编号=’014’
GO
【例5-23】检索所有姓刘的学生基本信息。
匹配所有姓刘的学生可以表示为:LIKE‘刘%’。在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERELIKE'刘%'
GO
【例5-24】检索包含“技术”两字的课程信息。
匹配“技术”两字的课程名称可以表示为:课程名称LIKE‘%技术%’。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM课程信息表
WHERE课程名称LIKE'%技术%'
GO
【例5-25】检索少数民族学生的基本信息。
少数民族学生或以表示为:WHERE族别NOTLIKE‘汉族’。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERE族别NOTLIKE'汉族'
GO
【例5-26】查询第2个字为“丽”的学生信息。
在学生基本信息表中,匹配第2个字为“丽”的学生应表示为:LIKE‘_丽%’。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERELIKE'_丽%'
GO
【例5-27】查询课程信息表中教师未定的课程信息。
课程信息表中教师未定的表达式可以表示为:WHERE任课教师ISNULL。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM课程信息表
WHERE任课教师ISNULL
GO
【例5-28】统计成绩表中各门课程的学生人数、总成绩、平均成绩。
统计成绩表中各门课程信息,需要将学生成绩按课程编号分组GROUPBY课程编号,统计学生人数、总成绩、平均成绩分别需要使用聚合函数COUNT()、SUM(成绩)、AVG(成绩)。因为新生成的学生人数、总成绩、平均成绩三列没有列名,所以可使用AS子句实现。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT课程编号,COUNT()AS'学生人数',SUM(成绩)AS'总成绩',AVG(成绩)AS'平均成绩'
FROM成绩表
GROUPBY课程编号
GO
【例5-28-1】检索单科成绩高于全班平均分的学生成绩信息。
此例中,全班平均成绩为SELECTAVG(成绩)AS'平均成绩'FROM成绩表,单科成绩高于全班平均分可以表述为WHERE成绩>(SELECTAVG(成绩)FROM成绩表)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTAVG(成绩)AS'平均成绩'FROM成绩表
GO
SELECT*FROM成绩表
WHERE成绩>(SELECTAVG(成绩)FROM成绩表)
GO
【例5-29】检索系部信息和班级信息。
此例要检索系部表和班级表的所有信息,即显示两个表的所有信息。可在SELECT子句中使用*、系部表.*或班级表.*,连接条件是两个表的系部编号的值要相等,即系部表.系部编号=班级表.系部编号。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM系部表,班级表
WHERE系部表.系部编号=班级表.系部编号
GO
使用ANSI连接语法的SELECT语句如下:
USEXSCJ
GO
SELECT*FROM系部表INNERJOIN班级表
ON系部表.系部编号=班级表.系部编号
GO
【例5-30】检索系部信息和班级信息,要求连接的列只显示一次。
本例与上例的区别是对连接的列只显示一列,用SELECT子句可以写成:SELECT系部表.*,班级编号,班级名称。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT系部表.*,班级编号,班级名称FROM系部表,班级表
WHERE系部表.系部编号=班级表.系部编号
GO
使用ANSI连接语法的SELECT语句如下:
USEXSCJ
GO
SELECT系部表.*,班级编号,班级名称FROM系部表INNERJOIN班级表
ON系部表.系部编号=班级表.系部编号
GO
【例5-31】检索没有录入成绩的课课程情况。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTDISTINCT课程信息表.*FROM课程信息表,成绩表
WHERE课程信息表.课程编号<>成绩表.课程编号
GO
【例5-32】使用左外连接检索学生成绩信息(,,课程名称)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,课程信息表.课程编号,课程信息表.课程名称,成绩
FROM课程信息表LEFTJOIN成绩表ON课程信息表.课程编号=成绩表.课程编号
GO
【例5-33】使用右外连接检索学生成绩信息(,,课程名称)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,课程信息表.课程编号,课程信息表.课程名称,成绩
FROM课程信息表RIGHTJOIN成绩表ON课程信息表.课程编号=成绩表.课程编号
GO
【例5-34】使用全外连接检索学生成绩信息(,,课程名称)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,课程信息表.课程编号,课程信息表.课程名称,成绩
FROM课程信息表FULLJOIN成绩表ON课程信息表.课程编号=成绩表.课程编号
GO
【例5-35】计算系部表和班级表的交叉连接。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM班级表CROSSJOIN系部表
GO
此例也可用FROM子句写成如下语句,运行结果相同。
USEXSCJ
GO
SELECT*FROM班级表,系部表
GO
【例5-36】查找同名同姓的学生信息。
该例是对学生基本信息表进行行自连接,这里将学生基本信息表分别定义别名为A1、A2,将FROM子句写成FROM学生基本信息表A1,学生基本信息表A2,连接条件为WHEREA1.=A2.ANDA1.<>A2.。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTA1.*FROM学生基本信息表A1,学生基本信息表A2
WHEREA1.=A2.ANDA1.<>A2.
GO
【例5-1】查询学生基本信息表中的所有信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
GO
【例5-2】在学生基本信息表中查询学生的、、性别和族别信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,,性别,族别FROM学生基本信息表
GO
【例5-3】从学生基本信息表中查询学生由几个民族构成。
从例2结果可知,学生的族别有多行重复,要快速查询学生的民族构成,实际上就是对相同值的族别只需要显示一行,可使用DISTINCT关键字实现。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTDISTINCT族别FROM学生基本信息表
GO
【例5-4】显示课程信息表中前5行的信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTTOP5*FROM学生基本信息表
GO
运行结果如图5-4所示,只显示查询结果的前5行数据。
【例5-5】从学生基本信息表中只显示5%的信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTTOP5PERCENT*FROM学生基本信息表
GO
【例5-6】从学生基本信息表中查询所有团员的信息资料,并形成新表为团员基本信息表。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*INTO团员基本信息表FROM学生基本信息表
WHERE政治面貌='团员'
GO
SELECT*FROM团员基本信息表
GO
【例5-7】从成绩表中查询学生成绩。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM成绩表
GO
【例5-8】从相关表中查询每一位学生的、、课程名称、成绩。
从各表数据可知,“”存在于“学生基本信息表”和“成绩表”,“”存在于“学生基本信息表”,“课程名称”存在于“课程信息表”,“成绩”存在于“成绩表”,要实现本例查询,则需要对“学生基本信息表”、“课程信息表”、“成绩表”进行多表检索,也可以来自不同的数据库。在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT学生基本信息表.,,课程名称,成绩FROM学生基本信息表,课程信息表,成绩表
WHERE学生基本信息表.=成绩表.AND课程信息表.课程编号=成绩表.课程编号
GO
【例5-9】在课程信息表中查找“Delphi程序设计”课程的任课老师。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT任课教师FROM课程信息表
WHERE课程名称='Delphi程序设计'
GO
【例5-10】查询少数民族学生的基本情况。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERE族别<>'汉族'
GO
【例5-11】检索1985年1月1日以后出生的女生基本信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERE出生日期>'1985-01-01'AND性别='女'
GO
【例5-12】查询每位同学的课程门数、总成绩、平均成绩。
查询每位学生的课程成绩情况,实际上就是按照“”列分类统计,可使用GROUPBY子句,统计课程门数、总成绩、平均成绩分别可以使用聚合函数COUNT(课程编号)、SUM(成绩)、AVG(成绩)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,COUNT(课程编号)AS'课程门数',SUM(成绩)AS'总成绩',AVG(成绩)AS'平均成绩'FROM成绩表
GROUPBY
GO
【例5-13】从学生基本信息表中统计各民族学生人数。
此例实际上是将要对学生按民族进行分类统计,可使用聚合函数COUNT(族别)实现功能。在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT族别,COUNT(族别)AS'学生人数'FROM学生基本信息表
GROUPBY族别
GO
【例5-14】从学生基本信息表中统计汉族学生的人数。
此例就是在上例统计出各民族学生人数的基础上进一步限定查询汉族学生人数,可在GROUPBY子句之后跟HAVING族别='汉族'子句实现此功能。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT族别,COUNT(族别)AS'学生人数'FROM学生基本信息表
GROUPBY族别
HAVING族别='汉族'
GO
此例也可使用WHERE子句完成功能。
USEXSCJ
GO
SELECT族别,COUNT(族别)AS'学生人数'FROM学生基本信息表
WHERE族别='汉族'
GROUPBY族别
GO
【例5-15】显示平均成绩大于等于80分以上的学生情况。
此例的限定条件是AVG(成绩)>=80,只能使用HAVING子句,如果使用WHERE子句限定条件,则系统会显示如图5-16所示的错误信息。
错误使用WHERE子句的SELECT语句如下:
USEXSCJ
GO
SELECT,AVG(成绩)AS'平均成绩'FROM成绩表
WHEREAVG(成绩)>=80
GROUPBY
GO
使用HAVING子句的正确语句如下:
USEXSCJ
GO
SELECT,AVG(成绩)AS'平均成绩'FROM成绩表
GROUPBY
HAVINGAVG(成绩)>=80
GO
【例5-16】将学生平均成绩按升序排序。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,AVG(成绩)AS'平均成绩'FROM成绩表
GROUPBY
ORDERBYAVG(成绩)
GO
【例5-17】查询成绩表中的全部信息,要求查询结果首先按升序排序,相同时,按成绩降序排序。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM成绩表
ORDERBY,成绩DESC
GO
【例5-18】按显示学生成绩,并计算每人的平均成绩和总成绩。
此例要求按人对课程及成绩进行分组显示,并计算每人的平均成绩、总成绩。则显示成绩应按分类,分组计算平均成绩、总成绩的语句为COMPUTEAVG(成绩),SUM(成绩)BY,使用COMPUTEBY子句首先要用ORDERBY子句对要分组的列排序,即ORDERBY。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*
FROM成绩表
ORDERBY
COMPUTEAVG(成绩),SUM(成绩)BY
GO
【例5-19】从系部表中检索系部名称,从班级表中检索班级名称。
从系部表中检索系部名称的SELECT语句为:SELECT系部名称FROM系部表,从班级表中检索班级名称的SELECT语句为:SELECT班级名称FROM班级表,合并这两个查询结果,需要使用UNION运算符。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT系部名称FROM系部表
UNION
SELECT班级名称FROM班级表
GO
【例5-20】查询1985年出生的学生基本信息。
1985年出生的学生即出生日期在1985年1月1日至12月31日之间的学生。在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERE出生日期BETWEEN'1985-01-01'AND'1985-12-31'
GO
【例5-21】查询不及格学生成绩信息。
查询不及格学生成绩信息,也就是查询0—59之间的学生成绩,可用BETWEEN关键字表示为:WHERE成绩BETWEEN0AND59。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM成绩表
WHERE成绩BETWEEN0AND59
GO
【例5-22】查询课程编号为002、003、007、014的课程编号、课程名称、任课教师和上课时间。
课程编号为002、003、007、014可以写成:WHERE课程编号IN('002','003','007','014'),也可写成WHERE课程编号=’002’OR课程编号=’003’OR课程编号=’007’OR课程编号=’014’。显然,使用IN关键字进行检索比使用3个OR运算符进行检索更为简单,而且易于理解和阅读。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT课程编号,课程名称,任课教师,上课时间FROM课程信息表
WHERE课程编号IN('002','003','007','014')
GO
在查询分析器中运行以下命令,也可得到相同的查询结果,但这种写法显然比较繁琐。
USEXSCJ
GO
SELECT课程编号,课程名称,任课教师,上课时间FROM课程信息表
WHERE课程编号=’002’OR课程编号=’003’OR课程编号=’007’OR课程编号=’014’
GO
【例5-23】检索所有姓刘的学生基本信息。
匹配所有姓刘的学生可以表示为:LIKE‘刘%’。在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERELIKE'刘%'
GO
【例5-24】检索包含“技术”两字的课程信息。
匹配“技术”两字的课程名称可以表示为:课程名称LIKE‘%技术%’。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM课程信息表
WHERE课程名称LIKE'%技术%'
GO
【例5-25】检索少数民族学生的基本信息。
少数民族学生或以表示为:WHERE族别NOTLIKE‘汉族’。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERE族别NOTLIKE'汉族'
GO
【例5-26】查询第2个字为“丽”的学生信息。
在学生基本信息表中,匹配第2个字为“丽”的学生应表示为:LIKE‘_丽%’。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERELIKE'_丽%'
GO
【例5-27】查询课程信息表中教师未定的课程信息。
课程信息表中教师未定的表达式可以表示为:WHERE任课教师ISNULL。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM课程信息表
WHERE任课教师ISNULL
GO
【例5-28】统计成绩表中各门课程的学生人数、总成绩、平均成绩。
统计成绩表中各门课程信息,需要将学生成绩按课程编号分组GROUPBY课程编号,统计学生人数、总成绩、平均成绩分别需要使用聚合函数COUNT()、SUM(成绩)、AVG(成绩)。因为新生成的学生人数、总成绩、平均成绩三列没有列名,所以可使用AS子句实现。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT课程编号,COUNT()AS'学生人数',SUM(成绩)AS'总成绩',AVG(成绩)AS'平均成绩'
FROM成绩表
GROUPBY课程编号
GO
【例5-28-1】检索单科成绩高于全班平均分的学生成绩信息。
此例中,全班平均成绩为SELECTAVG(成绩)AS'平均成绩'FROM成绩表,单科成绩高于全班平均分可以表述为WHERE成绩>(SELECTAVG(成绩)FROM成绩表)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTAVG(成绩)AS'平均成绩'FROM成绩表
GO
SELECT*FROM成绩表
WHERE成绩>(SELECTAVG(成绩)FROM成绩表)
GO
【例5-29】检索系部信息和班级信息。
此例要检索系部表和班级表的所有信息,即显示两个表的所有信息。可在SELECT子句中使用*、系部表.*或班级表.*,连接条件是两个表的系部编号的值要相等,即系部表.系部编号=班级表.系部编号。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM系部表,班级表
WHERE系部表.系部编号=班级表.系部编号
GO
使用ANSI连接语法的SELECT语句如下:
USEXSCJ
GO
SELECT*FROM系部表INNERJOIN班级表
ON系部表.系部编号=班级表.系部编号
GO
【例5-30】检索系部信息和班级信息,要求连接的列只显示一次。
本例与上例的区别是对连接的列只显示一列,用SELECT子句可以写成:SELECT系部表.*,班级编号,班级名称。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT系部表.*,班级编号,班级名称FROM系部表,班级表
WHERE系部表.系部编号=班级表.系部编号
GO
使用ANSI连接语法的SELECT语句如下:
USEXSCJ
GO
SELECT系部表.*,班级编号,班级名称FROM系部表INNERJOIN班级表
ON系部表.系部编号=班级表.系部编号
GO
【例5-31】检索没有录入成绩的课课程情况。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTDISTINCT课程信息表.*FROM课程信息表,成绩表
WHERE课程信息表.课程编号<>成绩表.课程编号
GO
【例5-32】使用左外连接检索学生成绩信息(,,课程名称)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,课程信息表.课程编号,课程信息表.课程名称,成绩
FROM课程信息表LEFTJOIN成绩表ON课程信息表.课程编号=成绩表.课程编号
GO
【例5-33】使用右外连接检索学生成绩信息(,,课程名称)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,课程信息表.课程编号,课程信息表.课程名称,成绩
FROM课程信息表RIGHTJOIN成绩表ON课程信息表.课程编号=成绩表.课程编号
GO
【例5-34】使用全外连接检索学生成绩信息(,,课程名称)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,课程信息表.课程编号,课程信息表.课程名称,成绩
FROM课程信息表FULLJOIN成绩表ON课程信息表.课程编号=成绩表.课程编号
GO
【例5-35】计算系部表和班级表的交叉连接。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM班级表CROSSJOIN系部表
GO
此例也可用FROM子句写成如下语句,运行结果相同。
USEXSCJ
GO
SELECT*FROM班级表,系部表
GO
【例5-36】查找同名同姓的学生信息。
该例是对学生基本信息表进行行自连接,这里将学生基本信息表分别定义别名为A1、A2,将FROM子句写成FROM学生基本信息表A1,学生基本信息表A2,连接条件为WHEREA1.=A2.ANDA1.<>A2.。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTA1.*FROM学生基本信息表A1,学生基本信息表A2
WHEREA1.=A2.ANDA1.<>A2.
GO
【例5-1】查询学生基本信息表中的所有信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
GO
【例5-2】在学生基本信息表中查询学生的、、性别和族别信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,,性别,族别FROM学生基本信息表
GO
【例5-3】从学生基本信息表中查询学生由几个民族构成。
从例2结果可知,学生的族别有多行重复,要快速查询学生的民族构成,实际上就是对相同值的族别只需要显示一行,可使用DISTINCT关键字实现。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTDISTINCT族别FROM学生基本信息表
GO
【例5-4】显示课程信息表中前5行的信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTTOP5*FROM学生基本信息表
GO
运行结果如图5-4所示,只显示查询结果的前5行数据。
【例5-5】从学生基本信息表中只显示5%的信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTTOP5PERCENT*FROM学生基本信息表
GO
【例5-6】从学生基本信息表中查询所有团员的信息资料,并形成新表为团员基本信息表。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*INTO团员基本信息表FROM学生基本信息表
WHERE政治面貌='团员'
GO
SELECT*FROM团员基本信息表
GO
【例5-7】从成绩表中查询学生成绩。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM成绩表
GO
【例5-8】从相关表中查询每一位学生的、、课程名称、成绩。
从各表数据可知,“”存在于“学生基本信息表”和“成绩表”,“”存在于“学生基本信息表”,“课程名称”存在于“课程信息表”,“成绩”存在于“成绩表”,要实现本例查询,则需要对“学生基本信息表”、“课程信息表”、“成绩表”进行多表检索,也可以来自不同的数据库。在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT学生基本信息表.,,课程名称,成绩FROM学生基本信息表,课程信息表,成绩表
WHERE学生基本信息表.=成绩表.AND课程信息表.课程编号=成绩表.课程编号
GO
【例5-9】在课程信息表中查找“Delphi程序设计”课程的任课老师。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT任课教师FROM课程信息表
WHERE课程名称='Delphi程序设计'
GO
【例5-10】查询少数民族学生的基本情况。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERE族别<>'汉族'
GO
【例5-11】检索1985年1月1日以后出生的女生基本信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERE出生日期>'1985-01-01'AND性别='女'
GO
【例5-12】查询每位同学的课程门数、总成绩、平均成绩。
查询每位学生的课程成绩情况,实际上就是按照“”列分类统计,可使用GROUPBY子句,统计课程门数、总成绩、平均成绩分别可以使用聚合函数COUNT(课程编号)、SUM(成绩)、AVG(成绩)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,COUNT(课程编号)AS'课程门数',SUM(成绩)AS'总成绩',AVG(成绩)AS'平均成绩'FROM成绩表
GROUPBY
GO
【例5-13】从学生基本信息表中统计各民族学生人数。
此例实际上是将要对学生按民族进行分类统计,可使用聚合函数COUNT(族别)实现功能。在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT族别,COUNT(族别)AS'学生人数'FROM学生基本信息表
GROUPBY族别
GO
【例5-14】从学生基本信息表中统计汉族学生的人数。
此例就是在上例统计出各民族学生人数的基础上进一步限定查询汉族学生人数,可在GROUPBY子句之后跟HAVING族别='汉族'子句实现此功能。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT族别,COUNT(族别)AS'学生人数'FROM学生基本信息表
GROUPBY族别
HAVING族别='汉族'
 , ;GO
此例也可使用WHERE子句完成功能。
USEXSCJ
GO
SELECT族别,COUNT(族别)AS'学生人数'FROM学生基本信息表
WHERE族别='汉族'
GROUPBY族别
GO
【例5-15】显示平均成绩大于等于80分以上的学生情况。
此例的限定条件是AVG(成绩)>=80,只能使用HAVING子句,如果使用WHERE子句限定条件,则系统会显示如图5-16所示的错误信息。
错误使用WHERE子句的SELECT语句如下:
USEXSCJ
GO
SELECT,AVG(成绩)AS'平均成绩'FROM成绩表
WHEREAVG(成绩)>=80
GROUPBY
GO
使用HAVING子句的正确语句如下:
USEXSCJ
GO
SELECT,AVG(成绩)AS'平均成绩'FROM成绩表
GROUPBY
HAVINGAVG(成绩)>=80
GO
【例5-16】将学生平均成绩按升序排序。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,AVG(成绩)AS'平均成绩'FROM成绩表
GROUPBY
ORDERBYAVG(成绩)
GO
【例5-17】查询成绩表中的全部信息,要求查询结果首先按升序排序,相同时,按成绩降序排序。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM成绩表
ORDERBY,成绩DESC
GO
【例5-18】按显示学生成绩,并计算每人的平均成绩和总成绩。
此例要求按人对课程及成绩进行分组显示,并计算每人的平均成绩、总成绩。则显示成绩应按分类,分组计算平均成绩、总成绩的语句为COMPUTEAVG(成绩),SUM(成绩)BY,使用COMPUTEBY子句首先要用ORDERBY子句对要分组的列排序,即ORDERBY。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*
FROM成绩表
ORDERBY
COMPUTEAVG(成绩),SUM(成绩)BY
GO
【例5-19】从系部表中检索系部名称,从班级表中检索班级名称。
从系部表中检索系部名称的SELECT语句为:SELECT系部名称FROM系部表,从班级表中检索班级名称的SELECT语句为:SELECT班级名称FROM班级表,合并这两个查询结果,需要使用UNION运算符。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT系部名称FROM系部表
UNION
SELECT班级名称FROM班级表
GO
【例5-20】查询1985年出生的学生基本信息。
1985年出生的学生即出生日期在1985年1月1日至12月31日之间的学生。在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERE出生日期BETWEEN'1985-01-01'AND'1985-12-31'
GO
【例5-21】查询不及格学生成绩信息。
查询不及格学生成绩信息,也就是查询0—59之间的学生成绩,可用BETWEEN关键字表示为:WHERE成绩BETWEEN0AND59。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM成绩表
WHERE成绩BETWEEN0AND59
GO
【例5-22】查询课程编号为002、003、007、014的课程编号、课程名称、任课教师和上课时间。
课程编号为002、003、007、014可以写成:WHERE课程编号IN('002','003','007','014'),也可写成WHERE课程编号=’002’OR课程编号=’003’OR课程编号=’007’OR课程编号=’014’。显然,使用IN关键字进行检索比使用3个OR运算符进行检索更为简单,而且易于理解和阅读。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT课程编号,课程名称,任课教师,上课时间FROM课程信息表
WHERE课程编号IN('002','003','007','014')
GO
在查询分析器中运行以下命令,也可得到相同的查询结果,但这种写法显然比较繁琐。
USEXSCJ
GO
SELECT课程编号,课程名称,任课教师,上课时间FROM课程信息表
WHERE课程编号=’002’OR课程编号=’003’OR课程编号=’007’OR课程编号=’014’
GO
【例5-23】检索所有姓刘的学生基本信息。
匹配所有姓刘的学生可以表示为:LIKE‘刘%’。在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERELIKE'刘%'
GO
【例5-24】检索包含“技术”两字的课程信息。
匹配“技术”两字的课程名称可以表示为:课程名称LIKE‘%技术%’。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM课程信息表
WHERE课程名称LIKE'%技术%'
GO
【例5-25】检索少数民族学生的基本信息。
少数民族学生或以表示为:WHERE族别NOTLIKE‘汉族’。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERE族别NOTLIKE'汉族'
GO
【例5-26】查询第2个字为“丽”的学生信息。
在学生基本信息表中,匹配第2个字为“丽”的学生应表示为:LIKE‘_丽%’。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM学生基本信息表
WHERELIKE'_丽%'
GO
【例5-27】查询课程信息表中教师未定的课程信息。
课程信息表中教师未定的表达式可以表示为:WHERE任课教师ISNULL。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM课程信息表
WHERE任课教师ISNULL
GO
【例5-28】统计成绩表中各门课程的学生人数、总成绩、平均成绩。
统计成绩表中各门课程信息,需要将学生成绩按课程编号分组GROUPBY课程编号,统计学生人数、总成绩、平均成绩分别需要使用聚合函数COUNT()、SUM(成绩)、AVG(成绩)。因为新生成的学生人数、总成绩、平均成绩三列没有列名,所以可使用AS子句实现。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT课程编号,COUNT()AS'学生人数',SUM(成绩)AS'总成绩',AVG(成绩)AS'平均成绩'
FROM成绩表
GROUPBY课程编号
GO
【例5-28-1】检索单科成绩高于全班平均分的学生成绩信息。
此例中,全班平均成绩为SELECTAVG(成绩)AS'平均成绩'FROM成绩表,单科成绩高于全班平均分可以表述为WHERE成绩>(SELECTAVG(成绩)FROM成绩表)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTAVG(成绩)AS'平均成绩'FROM成绩表
GO
SELECT*FROM成绩表
WHERE成绩>(SELECTAVG(成绩)FROM成绩表)
GO
【例5-29】检索系部信息和班级信息。
此例要检索系部表和班级表的所有信息,即显示两个表的所有信息。可在SELECT子句中使用*、系部表.*或班级表.*,连接条件是两个表的系部编号的值要相等,即系部表.系部编号=班级表.系部编号。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM系部表,班级表
WHERE系部表.系部编号=班级表.系部编号
GO
使用ANSI连接语法的SELECT语句如下:
USEXSCJ
GO
SELECT*FROM系部表INNERJOIN班级表
ON系部表.系部编号=班级表.系部编号
GO
【例5-30】检索系部信息和班级信息,要求连接的列只显示一次。
本例与上例的区别是对连接的列只显示一列,用SELECT子句可以写成:SELECT系部表.*,班级编号,班级名称。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT系部表.*,班级编号,班级名称FROM系部表,班级表
WHERE系部表.系部编号=班级表.系部编号
GO
使用ANSI连接语法的SELECT语句如下:
USEXSCJ
GO
SELECT系部表.*,班级编号,班级名称FROM系部表INNERJOIN班级表
ON系部表.系部编号=班级表.系部编号
GO
【例5-31】检索没有录入成绩的课课程情况。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTDISTINCT课程信息表.*FROM课程信息表,成绩表
WHERE课程信息表.课程编号<>成绩表.课程编号
GO
【例5-32】使用左外连接检索学生成绩信息(,,课程名称)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,课程信息表.课程编号,课程信息表.课程名称,成绩
FROM课程信息表LEFTJOIN成绩表ON课程信息表.课程编号=成绩表.课程编号
GO
【例5-33】使用右外连接检索学生成绩信息(,,课程名称)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,课程信息表.课程编号,课程信息表.课程名称,成绩
FROM课程信息表RIGHTJOIN成绩表ON课程信息表.课程编号=成绩表.课程编号
GO
【例5-34】使用全外连接检索学生成绩信息(,,课程名称)。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT,课程信息表.课程编号,课程信息表.课程名称,成绩
FROM课程信息表FULLJOIN成绩表ON课程信息表.课程编号=成绩表.课程编号
GO
【例5-35】计算系部表和班级表的交叉连接。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM班级表CROSSJOIN系部表
GO
此例也可用FROM子句写成如下语句,运行结果相同。
USEXSCJ
GO
SELECT*FROM班级表,系部表
GO
【例5-36】查找同名同姓的学生信息。
该例是对学生基本信息表进行行自连接,这里将学生基本信息表分别定义别名为A1、A2,将FROM子句写成FROM学生基本信息表A1,学生基本信息表A2,连接条件为WHEREA1.=A2.ANDA1.<>A2.。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECTA1.*FROM学生基本信息表A1,学生基本信息表A2
WHEREA1.=A2.ANDA1.<>A2.
GO
【例6-3】创建一个名为“V_计算机系课程信息”的视图,要求显示系部编号为01的课程信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
CREATEVIEWV_计算机系课程信息
AS
SELECT*FROM课程信息表WHERE系部编号='01'
GO
【例6-4】使用SELECT语句查看“V_计算机系课程信息”视图的返回结果。
在查询分析器中运行如下命令:
USEXSCJ
GO
SELECT*FROM
GO
【例6-6】使用系统存储过程sp_helptext查看“V_计算机系课程信息”视图的定义信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
EXECsp_helptextV_计算机系课程信息
GO
【例6-7】使用系统存储过程sp_help显示视图“V_05GZYY”特征。
在查询分析器中运行如下命令:
USEXSCJ
GO
sp_helpV_05GZYY
GO
【例6-8】使用系统存储过程sp_depends显示视图“V_05GZYY”所依赖的对象。
在查询分析器中运行如下命令:
USEXSCJ
GO
sp_dependsV_05GZYY
GO
【例6-10】使用ALTERVIEW语句修改视图“V_计算机系课程信息”,使其只显示“课程编号”、“课程名称”、“考核类型”、“任课教师”信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
ALTERVIEWV_计算机系课程信息
AS
SELECT课程编号,课程名称,考核类型,任课教师FROM课程信息表WHERE系部编号='01'
GO
【例6-12】使用系统存储过程sp_rename将视图“V_05高职应用”改回为“V_05GZYY”。
在企业管理器中运行如下命令:
USEXSCJ
GO
sp_renameV_05高职应用,V_05GZYY
GO
【例6-14】使用DROPVIEW语句删除视图“V_计算机系课程信息”、“V_少数民族信息”。
在企业管理器中运行如下命令:
USEXSCJ
GO
DROPVIEWV_计算机系课程信息,V_少数民族信息
GO
【例6-16】使用CREATEINDEX语句在XSCJ数据库的“成绩表”上创建名为“IX_课号”的聚集、惟一、复合索引,该索引基于“”和“课程编号”列创建。
在查询分析器中运行如下命令:
USEXSCJ
GO
CREATEUNIQUECLUSTERED
INDEXIX_课号ON成绩表(,课程编号)
GO
【例6-17】使用系统存储过程sp_helpindex查看XSCJ数据库中“成绩表”的索引信息。
在查询分析器中运行如下命令:
USEXSCJ
GO
sp_helpindex'成绩表'
GO
【例6-18】使用系统存储过程将索引“PK_成绩表”更名为“IX_成绩表”。
在查询分析器中运行如下命令:
USEXSCJ
GO
EXECsp_rename'成绩表.PK_成绩表','IX_成绩表'
GO
【例6-19】删除“学生基本信息表”中名为“IX_学生”的索引。
在查询分析器中运行如下命令:
USEXSCJ
GO
DROPINDEX学生基本信息表.IX_学生
GO
【例7-13】在示例数据库Northwind中创建一个名为new_employees的新表,分别定义id_num列,数据类型为int,设置IDENTITY列,初始值和步长值分别取默认值,定义fname列,数据类型为varchar,长度20,定义minit列,数据类型为char,长度30。
USENorthwind
GO
CREATETABLEnew_employees
(
id_numintIDENTITY(1,1),
fnamevarchar(20),
minitchar(1),
lnamevarchar(30)
)
GO
【例7-14】在示例数据库Northwind中利用修改表doc_exe时增加一个IDENTITY列,初始值为3,步长为2
USENorthwind
GO
ALTERTABLEdoc_exeADD
column_aINTIDENTITY(3,2)
CONSTRAINTcolumn_a_pkPRIMARYKEY
GO
【例7-15】在数据库XSCJ中新建表iden,并向表中插入10条记录。
在查询分析器中执行如下命令:
①建立表iden
USEXSCJ
GO
CREATETABLEiden
(
IdintIDENTITY(1,2),
fnamevarchar(20),
sexchar(1),
lnamevarchar(30)
)
GO
②向表iden插入十条记录
INSERTINTOiden(fname,sex,lname)VALUES('zhang1','F','san')
INSERTINTOiden(fname,sex,lname)VALUES('zhang2','M','san')
INSERTINTOiden(fname,sex,lname)VALUES('zhang3','M','san')
INSERTINTOiden(fname,sex,lname)VALUES('zhang4','F','san')
INSERTINTOiden(fname,sex,lname)VALUES('zhang5','F','san')
INSERTINTOiden(fname,sex,lname)VALUES('zhang6','M','san')
INSERTINTOiden(fname,sex,lname)VALUES('zhang7','M','san')
INSERTINTOiden(fname,sex,lname)VALUES('zhang8','F','san')
INSERTINTOiden(fname,sex,lname)VALUES('zhang9','F','san')
INSERTINTOiden(fname,sex,lname)VALUES('zhang10','M','san')
③查询表iden
SELECT*FROMiden
GO
【例7-16】在数据库XSCJ中创建一个新数据类型ziptype(邮政编码类型),并将其定义为char数据类型,长度为6,可以为空,并将其应用到建立新表“职工表”中。
在查询分析器中执行如下命令:
USEXSCJ
GO
sp_addtypeziptype,’char(6)’,’null’
GO
CREATETABLE职工表
(
Varchar(10),
性别Char(1),
家庭住址Varchar(20),
邮政编码ziptype,
电话Char(15)
)
GO
【例7-17】删除【例7-16】所创建的数据类型ziptype。
在查询分析器中运行如下命令:
USEXSCJ
GO
DROPTABLE职工表
GO
sp_droptypeziptype
GO
【例7-18】在Northwind数据库中创建一个标量函数fn_NewRegion,用于检查如果是NULL值时,返回【不知道】。
在查询分析器中执行如下语句:
USENorthwind
GO
CREATEFUNCTIONfn_NewRegion(@inputnvarchar(30))
RETURNSnvarchar(30)
BEGIN
if@inputisNULL
set@input='不知道'
RETURN@input
END
GO
SELECTlastname,city,region,countryFROMemployees
SELECTlastname,city,dbo.fn_newregion(region)asregion,country
FROMemployees
GO
【例7-19】在Northwind数据库中创建内嵌表值函数量函数fn_customerNamesInRegion,使用其返回某区域的客户
在查询分析器中执行如下语句:
USENorthwind
GO--定义内嵌表值函数
CREATEFUNCTIONfn_customerNamesInRegion(@Regionnvarchar(30))
RETURNSTABLE
AS
RETURN
(SELECTcustomerID,companyName
FROMnorthwind.dbo.customers
WHEREregion=@Region
)
--使用内嵌表值函数
SELECT*FROMfn_customerNamesInRegion('WA')
SELECTcustomerID,companyname,regionFROMnorthwind.dbo.customers
WHEREregion='wa'
GO
【例7-21】在Northwind示例数据库中删除用户自定义函数fn_employees。
在查询分析器中执行如下语句:
USENorthwind
GO
DROPFUNCTIONfn_employees
GO
【例8-1】使用CREATEPROCEDURE语句创建一个名称为proc_bjrs的存储过程,用于检索现有班级及人数。
CREATEPROCEDUREproc_bjrsAS
SELECTDISTINCT(班级表.班级编号),班级表.班级名称,人数=COUNT(学生基本信息表.)
FROM学生基本信息表,班级表
WHERE班级表.班级编号=学生基本信息表.班级编号
GROUPBY班级表.班级编号,班级表.班级名称
GO
【例8-2】设计一个带有参数的存储过程,该参数用于传递班级编号,根据该参数在学生基本信息表中检索出某一个班级中所有学生的信息。
CREATEPROCEDUREproc_bjcx@bjbhVARCHAR(8)
AS
SELECT*FROM学生基本信息表WHERE班级编号=@bjbh
GO
【例8-3】修改已经创建的存储过程proc_bjcx及其功能,将其修改为可以根据系部编号来查询某一个系部中所有学生的信息。修改后将存储过程名称重命名为proc_xbcx。
在查询分析器中运行如下命令,即可完成重命名:
ALTERPROCEDUREproc_bjcx@xbbhVARCHAR(2)
AS
SELECT*FROM学生基本信息表
WHERE班级编号
IN(SELECT班级编号FROM班级表WHERE系部编号=@xbbh)
GO
SP_RENAME'proc_bjcx','proc_xbcx'
GO
【例8-4】同时删除当前数据库中的两个存储过程,proc_a和proc_b。
在查询分析器中运行如下命令,即可完成删除操作:
DROPPROCEDUREproc_a,proc_b
GO
【例8-5】在数据库XSCJ中设计一个触发器,该触发器的作用为:当在班级表中删除某一个班级时,在学生基本信息表中该班级所包含的学生信息也全部被删除。
提示:在此例中,由于涉及到了班级表的删除操作,因而需要设计一个DELETE类型的触发器。
USEXSCJ
GO
CREATETRIGGERdel_bjON班级表
AFTERDELETE
AS
DELETEFROM学生基本信息表WHERE班级编号
IN(SELECT班级编号FROMDELETED)
GO
【例8-6】在数据库XSCJ中设计一个触发器,该触发器能够保证在学生基本信息表中添加新的纪录时,新学生的班级编号必须已经存在于班级表中。
提示:设计该触发器有助于实现学生信息的完整性。在此例中由于涉及到了学生基本信息表中的添加操作,因而需要设计一个INSERT类型的触发器。
USEXSCJ
GO
CREATETRIGGERinsert_xsON学生基本信息表
AFTERINSERT
AS
IFEXISTS
(
SELECT*FROMINSERTED
WHERE班级编号IN(SELECT班级编号FROM班级表)
)
PRINT'添加成功!'
ELSE
BEGIN
PRINT'班级编号与现有的班级不符!'
ROLLBACKTRANSACTION
END
【例8-7】修改del_bj触发器,使得在班级表中删除某一个班级时,不仅在学生基本信息表中该班级所包含的学生信息将被删除,而且在成绩表中与学生相关的数据也将被删除。
在查询分析器中运行如下命令:
ALTERTRIGGERdel_bjON班级表
AFTERDELETE
AS
DELETEFROM成绩表WHERE
IN(SELECTFROM学生基本信息表WHERE班级编号
IN(SELECT班级编号FROMDELETED))
DELETEFROM学生基本信息表WHERE班级编号
IN(SELECT班级编号FROMDELETED)
【例8-8】删除触发器del_bj以及insert_xs。
USEXSCJ
GO
DROPTRIGGERdel_bj,insert_xs
【例9-1】声明一个游标jbxxb_cursor,用于访问数据库XSCJ中的“学生基本信息表”。
USEXSCJ
GO
DECLAREjbxxb_cursorCURSOR
FORSELECT*FROM学生基本信息表
【例9-2】使用游标查看数据库XSCJ中“学生基本信息表”中满足条件的记录个数。代码如下:
USEXSCJ
GO
DECLAREjbxxb_CursorCURSORFOR
SELECT,
FROMxscj.dbo.学生基本信息表
WHERE族别LIKE'哈萨克'
OPENjbxxb_Cursor
FETCHNEXTFROMjbxxb_Cursor
WHILE@@FETCH_STATUS=0
BEGIN
FETCHNEXTFROMjbxxb_Cursor
END
CLOSEjbxxb_Cursor
DEALLOCATEjbxxb_Cursor
【例9-3】为“学生基本信息表”中以“张”开头的行声明一个简单的游标jbxxb1_cursor,并使用FETCHNEXT逐个提取这些行。FETCH语句以单行结果集形式返回由DECLARECURSOR指定列的值。
USEXSCJ
GO
DECLAREjbxxb1_cursorCURSORFOR
SELECTFROM学生基本信息表
WHERELIKE'张%'
ORDERBY
OPENjbxxb1_cursor
FETCHNEXTFROMjbxxb1_cursor
WHILE@@FETCH_STATUS=0
BEGIN
FETCHNEXTFROMjbxxb1_cursor
END
CLOSEjbxxb1_cursor
DEALLOCATEjbxxb1_cursor
【例9-4】本例与上例相似,使用FETCH语句将值存入变量,但FETCH语句的值存储于局部变量而不是直接返回给基表。PRINT语句将变量组合成单一字符串并将其返回到基表。代码如下:
USEXSCJ
GO
DECLARE@varchar(40),@varchar(20)
DECLARExb_cursorCURSORFOR
SELECT,FROM学生基本信息表
WHERELIKE'张%'
ORDERBY
OPENxb_cursor
FETCHNEXTFROMxb_cursor
INTO@,@
WHILE@@FETCH_STATUS=0
BEGIN
PRINT'学生为:'+@+';为'+@
FETCHNEXTFROMxb_cursor
INTO@,@
END
CLOSExb_cursor
DEALLOCATExb_cursor
【例9-5】定义一事务charu(未提交)并将“学生基本信息表”中族别不是“汉族”的学生“族别”改成“少数民族”。代码如下:
USEXSCJ
GO
BEGINTRANSACTIONcharu
GO
UPDATE学生基本信息表
SET族别='少数民族'
WHERE族别!='汉族'
GO
【例9-6】事务的嵌套,通过本例可以知道嵌套事务中,内部事务所做的修改等提交完最外层事务之后才能生效。
USEXSCJ
GO
CREATETABLE综合表(INTPRIMARYKEY,CHAR(8),年龄int)
BEGINTRANSACTIONcharu
INSERTINTO综合表VALUES(1,'卡吾萨尔',18)
BEGINTRANSACTIONcharu1
INSERTINTO综合表VALUES(2,'夏尔巴提',20)
BEGINTRANSACTIONcharu2
INSERTINTO综合表VALUES(3,'张莉',19)
COMMITTRANSACTIONcharu2
COMMITTRANSACTIONcharu1
COMMITTRANSACTIONcharu
【例10-4】给public角色授予SELECT权限。然后,将特定的权限授予用户wang、zhangsan、tom。于是这些用户有了对“班级表”的所有权限。
在查询分析器中执行以下命令即可:
GRANTSELECTON班级表TOpublic
GRANTINSERT,UPDATE,DELETEON班级表TOwang,zhangsan,tom
上述过程既是分配对象权限的过程。
撤消权限只要将GRANT换为REVOKE,拒绝权限只要将GRANT换为DENY即可。
【例10-5】使用户wang和dss_ibm390x\zhangsan做建立数据库和建立表的工作。
在查询分析器中执行以下命令即可:
GRANTCREATEDATABASE,CREATETABLETOwang,[dss_ibm390x\zhangsan]
上述过程既是分配语句权限的过程。
撤消权限只要将GRANT换为REVOKE,拒绝权限只要将GRANT换为DENY即可。
【例11-3】在本地硬盘上创建一个备份设备,其逻辑名称为“data_backup”,物理名称为E:\back\data.bak】。相应的语句为:
USEMASTER
GO
EXECUTEsp_addumpdevice'disk','data_backup','e:\back\data.bak'
【例11-9】还原完整数据库备份和差异备份。下例还原完整数据库备份后还原差异备份。
RESTOREDATABASEXSCJ
FROMdata_backup
WITHNORECOVERY
RESTOREDATABASEXSCJ
FROMdata_backup
WITHFILE=1
【例11-10】还原数据库并将文件移动至C:\下的指定位置
USEMASTER
GO
RESTOREDATABASEXSCJ
FROMdatbackup
WITHNORECOVERY,
MOVE'XSCJ_data'TO'c:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\XSCJ_data.mdf',
MOVE'XSCJ_log'TO'c:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\XSCJ_log.ldf'
RESTORELOGXSCJ
FROMdata_backup
WITHRECOVERY