1.答:
表约束(Constraint)是SQL Server提供的一种强制实现数据完整性的机制,包括主键(PRIMARY KEY)约束、惟一性(UNIQUE)约束、检查(CHECK)约束、默认(DEFAULT)约束`和外键(FOREIGN KEY)约束。
2.答:
规则(Rules)是一种SQL Server对象,它用于执行一些与CHECK约束相同的功能。CHECK约束比规则更简明,一个列只能应用一个规则,但是却可以应用多个CHECK约束。CHECK 约束作为CREATE TABLE语句的一部分进行指定,而规则以单独的对象创建,然后绑定到列上。
3.答
连接查询包括内连接、外连接和交叉连接等。
内连接使用比较运算符(最常使用的是等号,即等值连接)根据每个表共有列的值匹配两个表中的行。只有每个表中都存在相匹配列值的记录才出现在结果集中。在内连接中,所有表是平等的,没有主次之分。
与内连接相对,参与外连接的表有主次之分。以主表的每一行数据去匹配从表中的数据列,符合连接条件的数据将直接返回到结果集中,对那些不符合连接条件的列,将被填上NULL值后再返回到结果集中。
在交叉连接查询中,两个表中的每两行都可能互相组合成为结果集中的一行。交叉连接并不常用,除非需要穷举两个表的所有可能的记录组合。
4.答
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
五、上机练习题
(一)表的定义及约束
2.答: (1)
CREATE TABLE 职工基本信息 (职工编号 CHAR(5) PRIMARY KEY, 姓名 CHAR(10) NOT NULL, 性别 CHAR(2), 出生日期 DATETIME, 部门编号 CHAR(3))
(2)
CREATE TABLE 工资
(职工编号 CHAR(5) PRIMARY KEY, 基本工资 MONEY, 奖金 MONEY, 实发工资 MONEY)
(3)
CREATE TABLE 部门信息
(部门编号 CHAR(3) PRIMARY KEY,
11
部门名称 CHAR(20) NOT NULL, 部门简介 VARCHAR(50))
3.答:
ALTER TABLE 职工基本信息ADD 职称 CHAR(10)
4.答:
ALTER TABLE 职工基本信息 DROP COLUMN 职称
5.答:
ALTER TABLE 部门信息 ADD CONSTRAINT uk_dptname UNIQUE(部门名称)
6.答:
ALTER TABLE 职工基本信息 ADD CONSTRAINT chk_sex CHECK (性别 in ('男','女'))
7.答:
ALTER TABLE 工资 ADD CONSTRAINT chk_salary CHECK (基本工资>0)
8.答:
ALTER TABLE 工资 ADD CONSTRAINT dftsalary1 DEFAULT 0 FOR 基本工资 ALTER TABLE 工资 ADD CONSTRAINT dftsalary2 DEFAULT 0 FOR 奖金
9.答:
ALTER TABLE 职工基本信息 ADD CONSTRAINT dftsex DEFAULT '男' FOR 性别
10.答:
ALTER TABLE 职工基本信息 ADD CONSTRAINT fk_1 FOREIGN KEY (部门编号) REFERENCES 部门信息(部门编号) ALTER TABLE 工资 ADD CONSTRAINT fk_2 FOREIGN KEY (职工编号) REFERENCES 职工基本信息(职工编号)
11.答:
ALTER TABLE 职工基本信息 DROP CONSTRAINT fk_1 ALTER TABLE 工资 DROP CONSTRAINT fk_2
(二)表的更新
1.答:
INSERT INTO 职工基本信息 VALUES ('10001','王佳','女','1979/02/01','001') INSERT INTO 职工基本信息 VALUES ('20001','张欣','男','1965/05/10','002') INSERT INTO 职工基本信息 VALUES ('20003','李勇','男','1976/08/01','002') INSERT INTO 职工基本信息 VALUES ('10002','刘军','男','1973/07/01','001')
2.答:
INSERT INTO 工资(职工编号,基本工资,奖金) VALUES ('10001',2000,2200) INSERT INTO 工资(职工编号,基本工资,奖金) VALUES ('10002',2500,3000)
3.答:
INSERT INTO 工资(职工编号,基本工资,奖金) SELECT 职工编号,基本工资,奖金 FROM 临时工资信息
4.答:
CREATE TABLE 部门平均年龄 (部门编号 CHAR(15), 平均年龄 SMALLINT)
5.答:
INSERT INTO 部门平均年龄
12
SELECT 部门名称,AVG(year(getdate())-YEAR(出生日期)) FROM 职工基本信息 GROUP BY 部门编号
6.答:
UPDATE 工资 SET 奖金=奖金*1.1 FROM 职工基本信息
WHERE 职工基本信息.职工编号=工资.职工编号 AND 职工基本信息.部门编号='001'
7.答:
UPDATE 工资 SET 实发工资=基本工资+奖金
8.答:
DELETE FROM 工资 WHERE 职工编号='10001'
9.答:
DELETE 工资 FROM 职工基本信息
WHERE 职工基本信息.职工编号=工资.职工编号 AND 职工基本信息.部门名称='001'
(三)表的查询
1.答:
SELECT * FROM Employees
2.答:
SELECT Emp_Name,Sex,Wage FROM Employees
3.答:
SELECT Emp_Name,Sex,Wage*1.2 as NewWage FROM Employees
4.答:
SELECT DISTINCT title FROM Employees
5.答:
SELECT Emp_Name, title FROM Employees WHERE Dep_id=1
6.答:
SELECT Emp_Name FROM Employees WHERE title='部门经理' AND Sex='女'
7.答:
SELECT * FROM Employees WHERE Wage BETWEEN 3000 AND 4000
8.答:
SELECT * FROM Employees WHERE Wage NOT BETWEEN 3000 AND 4000
9.答:
SELECT * FROM Employees WHERE Dep_id IN(1,2)
10.答:
SELECT * FROM Employees WHERE IdCard LIKE '110%'
11.答:
SELECT * FROM Employees WHERE IdCard LIKE '[0-3]%'
12.答:
SELECT MAX(Wage),MIN(Wage),SUM(Wage),AVG(Wage) FROM titles
13.答:
SELECT COUNT(DISTINCT(title)) FROM Employees
14.答:
SELECT COUNT(*) FROM Employees WHERE title='部门经理'
15.答:
13
SELECT Dep_id AS 部门编号,COUNT(emp_id) AS 人数 FROM Employees GROUP BY Dep_id
16.答:
SELECT Dep_id AS 部门编号, AVG(Wage) AS 平均工资 FROM Employees GROUP BY Dep_id
17. 答:
SELECT d.Dep_id AS 部门编号, d.Dep_name AS 部门名称, e.Emp_name AS 姓名, e.Wage AS 工资 FROM Employees e, Departments d WHERE e.Dep_id= d.Dep_id ORDER BY d.Dep_id COMPUTE AVG(Wage) BY d.Dep_id
18.答:
SELECT e.Emp_name, e.Sex, e.Title, d.Dep_name
FROM Employees e, Departments d WHERE e.Dep_id= d.Dep_id
19.答:
SELECT e.Emp_name, e.Sex, e.Title, d.Dep_name
FROM Employees e INNER JOIN Departments d ON e.Dep_id= d.Dep_id
20.答:
SELECT d.Dep_name, e.Emp_name, e.Sex, e.Title
FROM Departments d LEFT JOIN Employees e ON e.Dep_id= d.Dep_id
21.答:
SELECT * FROM Employees
WHERE Dep_id=(SELECT Dep_id FROM Departments WHERE Dep_name='办公室')
(四) (五)视图
1.答:
CREATE VIEW view1 AS
SELECT e.Emp_name AS 姓名, e.Sex AS 性别, e.Title AS 职务, d.Dep_name AS 部门 FROM Employees e INNER JOIN Departments d ON e.Dep_id = d.Dep_id
2.答:
SELECT * FROM view1
3.答:
SELECT * FROM view1 WHERE 姓名 LIKE '李%'
4.答:
ALTER VIEW view1 AS
SELECT e.Emp_name AS 姓名,e.Title AS 职务, d.Dep_name AS 部门 FROM Employees e INNER JOIN Departments d ON e.Dep_id = d.Dep_id
5.答:
DROP VIEW view1
14
第7章 规则和索引
一、填空题
1.CREATE RULE 2.绑定规则 3.sp_unbindrule 4.DROP RULE 5.聚集 6.B树
7.CREATE INDEX 8.INCLUDE
二、选择题
1.B 2.C 3.B 4.C 5.C
三、判断题
1.A 2.B 3.B 4.A 5.A
四、问答题
1.答
规则是用于执行一些与检查约束相同的功能。检查约束比规则更简明,一个列只能应用一个规则,但是却可以应用多个检查约束。
检查约束可以在CREATE TABLE语句中定义,而规则作为独立的对象创建,然后绑定在指定的列上。
2.答
用户对数据库最常用的操作就是查询数据。在数据量比较大时,搜索满足条件的数据可能会花费很长时间,从而占用较多的服务器资源。为了提高数据检索的能力,数据库中引入了索引的概念。
数据库的索引和书籍中的目录相似。有了索引,就可以快速地在书中找到需要的内容,而无需顺序浏览全书了。书中的目录是主要章节的列表,其中注明了包含各一章节的页码。而数据库中的索引是一个表中所包含的值的列表,其中注明了表中包含各个值的记录所在的存储位置。可以为表中的单个列建立索引,也可以为一组列建立索引。
索引提供指针以指向存储在表中指定列的数据值,然后根据指定的排序次序排列这些指针。数据库使用索引的方式与使用书的目录很相似:通过搜索索引找到特定的值,然后跟随指针到达包含该值的行。因为索引是有序排列的,所以会大大提高索引的效率。
3.答
参考7.2.7小节。
五、上机练习题
15