不合法的变量名:A1,1a,&变量1,姓名,#m,##n,@@@abc##
6.SQL Server 2005所使用的运算符类别有哪些?
答:SQL Server 2005系统中,可以使用的运算符可以分为算术运算符、逻辑运算符、赋值运算符、字符串串联运算符、按位运算符、一元运算符及比较运算符等。 7.利用T-SQL语句计算下列表达式,并给出运算结果。 (1)9-3*5/2+6%4 (2)5&2|4 (3)'你们'+'好' (4)~10
答:(1)4 (2)4 (3)你们好 (4)-11
8.给出以下T-SQL语句的运行结果。 DECLARE @d SMALLDATETIME SET @d='2007-1-26' SELECT @d+10,@d-10
答:2007-02-05,2007-01-16
9.什么是批处理?使用批处理有何限制?批处理的结束符是什么?
答:批处理是包含一个或多个T-SQL语句的集合,从应用程序一次性地发送到SQL Server 2005进行执行,因此可以节省系统开销。SQL Server 将批处理的语句编译为一个可执行单元,称为执行计划,批处理的结束符为“GO”。 10.注释有几类,它们分别是什么? 答:在T-SQL中可使用两类注释符:
(1) ANSI标准的注释符“--”用于单行注释;
(2) 与C语言相同的程序注释符号,即“/*……*/”,“/*”用于程序注释开头,“*/”用语程序注释结尾,可以在程序中多行文字标示为注释。
8.5 习题
1.简述数据库的两种存储结构。 答:数据库的物理存储结构指的是保存数据库各种逻辑对象的物理文件是如何在磁盘上存储的,数据库在磁盘上是以文件为单位存储的,SQL Server 2005将数据库映射为一组操作系统文件。
逻辑存储结构:数据库是存储数据的容器,即数据库是一个存放数据的表和支持这些数据的存储、检索、安全性和完整性的逻辑成分所组成的集合。 2.数据库由哪几种类型的文件组成?其扩展名分别是什么?
答:(1) 主数据文件:主数据文件是数据库的起点,指向数据库中的其他文件。主数据文件的推荐文件扩展名是 .mdf。
(2) 辅助数据文件:除主数据文件以外的所有其他数据文件都是辅助数据文件。辅助数据文件的推荐文件扩展名是 .ndf。
16
(3) 事务日志文件:日志文件包含着用于恢复数据库的所有日志信息。日志文件的推荐文件扩展名是 .ldf。
3.简述SQL Server 2005中文件组的作用和分类。 答:为了便于管理和分配数据而将文件组织在一起,通常可以为一个磁盘驱动器创建一个文件组(File Group),将多个数据库文件集合起来形成一个整体。
SQL Server中的数据库文件组分为主文件组(Primary File Group)和用户定义文件组(user_defined Group)。
4.使用SQL Server Management Studio创建名为“仓库库存”的数据库,并设置数据库主文件名为仓库库存_data,大小为10MB,日志文件名为仓库库存_log,大小为2MB。 答:略。
5.删除习题4创建的数据库,使用T-SQL语句再次创建该数据库,主文件和日志文件的文件名同上,要求:仓库库存_data最大尺寸为无限大,增长速度为20%,日志文件初始大小为2MB,最大尺寸为5MB,增长速度为1MB。 答:CREATE DATABASE仓库库存
(NAME = '仓库库存_data',
FILENAME = 'F:\\仓库库存_data.MDF' , SIZE = 10MB,
FILEGROWTH = 20%) LOG ON
(NAME ='仓库库存_log',
FILENAME = 'F:\\仓库库存_log. LDF', SIZE = 2MB, MAXSIZE = 5MB,
FILEGROWTH = 1MB)
6.请分别使用SQL Server Management Studio和T-SQL语句创建数据库Student,要创建的数据库的要求如下所示:数据库名称为Student,包含3个20MB的数据库文件,2个10MB的日志文件,创建使用一个自定义文件组,主文件为第一个文件,主文件的后缀名为.mdf,次要文件的后缀名为.ndf;要明确地定义日志文件,日志文件的后缀名为.ldf;自定义文件组包含后两个数据文件,所有的文件都放在目录“C:\\DATA”中。 答:略。
7.在数据库“仓库库存”中完成下列操作。 (1)创建“商品”表,表结构如表1:
表1 商品表
列名 商品编号 商品名称 单价
数据类型 Char Varchar Float 长度 6 20 是否允许为空值 NOT NULL NOT NULL, 说明 主键 17
生产商 Varchar 30
(2)创建“仓库”表,表结构如表2:
表2 仓库表 列名 仓库编号 仓库地址
数据类型 Char Varchar 长度 3 20 是否允许为空值 NOT NUL NOT NULL 说明 主键 (3)创建“库存情况”表,表结构如表3:
表3 库存情况表 列名 仓库编号 商品编号 数量 数据类型 Char Char int 长度 3 6 是否允许为空值 NOT NULL NOT NUL 说明 主键 主键 答:(1)USE仓库库存 GO
CREATE TABLE 商品
(商品编号 char(6) NOT NULL PRIMARY KEY, 商品名称 char(20) NOT NULL, 单价 Float,
生产商 Varchar (30) ) (2),(3)略。 8.建立“商品”表、“仓库”表和“库存情况”表三表之间的关系图。 答:略。
9.分别给“商品”表、“仓库”表和“库存情况”表添加数据。 答:略。
9.4 习题
针对“教学库”中的三个表,完成1~5题。
1.试用SQL语句在学生表中加入“年龄”字段,要求:年龄为tinyint类型,可以为空。然后为所有学生输入年龄数据。
2.试用SQL的查询语句实现下列查询: (1)统计有学生选修的课程门数。
答:SELECT COUNT(DISTINCT 课程号) FROM 选课 (2)求选修C004课程的学生的平均年龄。 答:SELECT AVG(年龄) FROM 学生,选课
18
WHERE 学生.学生号=选课.学生号 and 课程号=?C004? (3)求学分为3的每门课程的学生平均成绩。
答:SELECT 课程.课程号,AVG(成绩) FROM 课程,选课
WHERE 课程.课程号=选课.课程号and 学分=3 GROUP BY 课程.课程号
(4)统计每门课程的学生选修人数,超过3人的课程才统计。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。 答:SELECT 课程号,COUNT(*) FROM 选课
GROUP BY 课程号 HAVING COUNT(*) >3
ORDER BY COUNT(*) DESC, 课程号
(5)检索学号比王非同学大,而年龄比他小的学生姓名。 答:SELECT姓名 FROM 学生
WHERE 学生号>(SELECT学生号 FROM学生
WHERE 姓名=?王非?)
and 年龄<(SELECT年龄 FROM学生
WHERE 姓名=?王非?)
(6)检索姓名以王打头的所有学生的姓名和年龄。 答:SELECT 姓名,年龄 FROM 学生 WHERE 姓名 LIKE ?王%?
(7)在选课表中检索成绩为空值的学生学号和课程号。 答:SELECT 学生号,课程号 FROM 选课 WHERE 成绩 IS NULL
(8)求年龄大于女同学平均年龄的男学生姓名和年龄。 答:SELECT 姓名,年龄 FROM 学生
WHERE 性别=?男?
and 年龄 >(SELECT AVG(年龄) FROM 学生
WHERE 性别=?女?)
(9)求年龄大于所有女同学年龄的男学生姓名和年龄。 答:SELECT 姓名,年龄 FROM 学生
WHERE 性别=?男?
and 年龄 > all (SELECT 年龄 FROM 学生
WHERE 性别=?女?)
(10)检索所有比王华年龄大的学生姓名、年龄和性别。 答:SELECT 姓名,年龄,性别 FROM 学生
WHERE 年龄 > (SELECT 年龄 FROM 学生
WHERE 姓名=?王华?)
(11)检索选修课程C002的学生中成绩最高的学生的学号。
19
答:SELECT 学生号 FROM 选课
WHERE 课程号=?C002? and 成绩=(SELECT MAX(成绩) FROM选课 WHERE课程号=?C002?) (12)检索学生姓名及其所选修课程的课程号和成绩。 答:SELECT 姓名, 课程号, 成绩 FROM 学生,选课 WHERE学生.学生号=选课.学生号
(13)检索选修4门以上课程的学生总成绩(不统计不及格的课程),并要求按总成绩的降序排列出来。
答:SELECT 学生号,SUM(成绩) FROM 选课
WHERE 成绩>=60 GROUP BY学生号
HAVING COUNT(*)>=4
ORDER BY SUM(成绩) DESC
3.利用控制流语句,查询学号为0101001的学生的各科成绩,如果没有这个学生的成绩,就显示“此学生无成绩”。
答:IF EXISTS ( SELECT * FROM 选课 WHERE 学号='0101001')
SELECT 课程号,成绩 FROM 选课 WHERE 学号='0101001' ELSE
PRINT '此学生无成绩'
4.用函数实现:求某个专业选修了某门课的学生人数。
答:CREATE FUNCTION renshu(@p char(10),@cn char(4)) RETURNS float
AS
BEGIN
DECLARE @cout float
SELECT @cou=( SELECT count(*) FROM 学生,选课
WHERE学生.学生号=选课.学生号 and课程号=@cn
and 专业=@p)
RETURN @cou END
5.用函数实现:查询某个专业所有学生所选的每门课的平均成绩。 答:CREATE FUNCTION average (@p char(10)) RETURNS float
AS
BEGIN
DECLARE @aver float
SELECT @aver=( SELECT 课程号,avg(成绩) FROM 学生,选课
WHERE学生.学生号=选课.学生号 and 专业=@p
GROUP BY 课程号)
20