第03章练习题.doc
一、选择题
- SQL语言称为( )。
A.结构化定义语言 B. 结构化操纵语言
C. 结构化查询语言 D. 结构化控制语言 - 下列SQL语句中,修改表结构的是 ( )
A.CREATE B.UPDATE C.INSERT D.ALTER - 在SELECT语句中, 用于实现数据分组统计的子句是 ( )
A.FROM子句 B.WHERE子句
C.GROUP BY子句 D.ORDER BY 子句 - 下列哪种运算不能引出子查询。( )
A.IN B.LIKE C.EXISTS D.比较运算 - 基于学生选课数据库中的3个关系:S(学号, 姓名, 性别, 年龄)、C(课程号, 课程名, 任课教师)、 SC(学号, 课程号, 成绩),若要求查找选修“数据库技术”这门课程的学生姓名和成绩,将使用关系( )
A.S和SC B.SC和C C.S和C D.S、SC和C - 基于学生选课数据库中的3个关系:S(学号, 姓名, 性别, 年龄)、C(课程号, 课程名, 任课教师)、 SC(学号, 课程号, 成绩),若要求查找学生的平均成绩大于80分的学号和平均成绩,下面列出的SQL语句,正确的是( )。
A.SELECT 学号, AVG(成绩) FROM SC WHERE AVG(成绩)>80
B.SELECT 学号, AVG(成绩) FROM SC WHERE AVG(成绩)>80 GROUP BY 学号
C.SELECT 学号, AVG(成绩) FROM SC GROUP BY 学号 HAVING AVG(成绩)>80
D.SELECT 学号, 成绩 FROM SC GROUP BY 学号 HAVING AVG(成绩)>80 - 下列SQL语句中,正确的是( )。
A.SELECT S#, SNAME FROM SC GROUP BY S#
B.SELECT S# FROM SC GROUP BY S# HAVING COUNT()>3
C.SELECT S# FROM SC GROUP BY S# WHERE COUNT()>3
D.SELECT S# FROM SC WHERE COUNT(*)>3 GROUP BY S# - 在视图上不能完成的操作是( )。
A.更新视图 B.查询视图
C.在视图上定义新的基本表 D.在视图上定义新视图
二、填空 - 在SQL的查询语句中,使用( FROM )子句定义数据源,使用( WHERE )子句选择参与运算的数据行,使用( SELECT )子句指定目标列。可使用( GROUP BY )子句结合聚集函数进行分组统计。若对查询结果排序可使用( ORDER BY )子句。
- 在SQL中,( CREATE )语句创建表和声明完整性约束条件。如果要为一个基本表增加列和完整性约束条件,应该使用( ADD )语句。删除表的定义及表中的数据和索引,应该使用的语句是( DROP )。
- 视图是定义在( 基本表 )之上的虚表,对视图也可以进行插入、修改、删除和查询操作。但视图不存储数据,对视图的一切操作最终要转换为对( 基本表 )的操作。
三、简述题
1. SQL语言的特点?
1.综合统一
2.高度非过程化
3.面向集合的操作方式
4.以同一种语法结构提供两种使用方式
5.语言便捷,易学易用
2. SQL语言中常用的语句有哪些?
数据定义:
CREATE SCHEMA
DROP SCHEMA
CREATE TABLE
ALTER TABLE
DROP TABLE
CREATE INDEX
DROP INDEX
数据查询:
SELECT
FROM
WHERE
GROUP BY
ORDER BY
数据更新:
INSERT INTO
UPDATE SET
DELETE FROM
3. SQL中提供了哪些常用的聚集函数?它们如何使用?
COUNT()
SUM()
AVG()
MAX()
MIN()
在SELECT字句或者HAVING子句中使用
4. 什么是连接查询?连接查询如何指定连接条件?
一个连接同时涉及两个以上的表,则称之为连接查询。
WHERE子句中连接条件的一般格式为表名.列名 比较运算符 表名.列名
5. 什么是子查询?用在WHERE子句中的子查询有几种调用方式?
下层查询块是嵌套在上层查询块的WHERE条件中的。上层的查询块称为父查询,下层查询块成为子查询。
- 带有IN谓词的子查询
- 带有比较运算符的子查询
- 带有ANY或ALL谓词的子查询
- 带有EXISTS谓词的子查询
四、数据库操作
- 仓库管理系统
在某仓库管理系统中,有两个表:KC表和CKMX表,其结构和部分数据如下:
表1、KC表结构和数据
材料代码 材料名称 单位 单价 库存数量
01 计算机 台 5000.00 10
02 电视机 台 2000.00 20
… … … … …
表2、CKMX表结构和数据
编号 材料代码 出库日期 出库数量
1 01 2009-10-10 4
2 01 2009-11-20 3
3 02 2009-11-20 5
… … … …
其中,KC表保存当前仓库库存材料的信息,CKMX表存放库存材料的出库名细。
例如,KC表第一行表示该仓库中现有计算机10台。CKMX表第二行表示2009年11月20日从仓库中出库3台计算机。
(1) 试写出创建KC表和CKMX表的SQL语句,要求定义实体和参照完整性。
CREATE TABLE KC(
材料代码 CHAR(2) PRIMARY KEY,
材料名称 CHAR(9),
单位 CHAR(9),
单价 FLOAT(2),
库存数量 INT
)
CREATE TABLE CKMX(
编号 INT PRIMARY KEY,
材料代码 CHAR(2),
出库日期 DATE,
出库数量 INT
FOREIGN KEY(材料代码) REFERENCES KC(材料代码)
)
(2) 写出在KC表上按材料名称建立唯一索引的SQL语句。
CREAT UNIQUE INDEX Cname ON KC(材料名称)
(3) 创建一个视图,用于查询计算机的出库明细。
CREAT VIEW OUT_KC(编号,材料名称,出库日期,出库数量)
AS
SELECT 编号,材料名称,出库日期,出库数量
FROM KC,CKMX
WHERE KC.材料代码 = CKMX.材料代码
(4) 写出将表中数据插入到相应表中的语句。
(5) 从表CKMX中统计出各种材料的出库次数和出库总数量,试写出SQL语句。
(6) 写出由KC表和CKMX表产生如下结果集的查询语句:
编号 出库日期 材料名称 单价 出库数量 金额
1 2009-10-10 计算机 5000.00 4 20000.00
2 2009-11-20 计算机 5000.00 3 15000.00
… … … … … …
(1) 创建表
CREATE TABLE KC
(
材料代码 char(2) PRIMARY KEY,
材料名称 char(20),
单位 char(10),
单价 numeric(10,2),
库存数量 int
)
CREATE TABLE CKMX
(
编号 char(4) PRIMARY KEY,
材料代码 char(2) REFERENCES KC(材料代码),
出库日期 date,
出库数量 int
)
Or或者
CREATE TABLE CKMX
(
编号 char(4) PRIMARY KEY,
材料代码 char(2),
出库日期 date,
出库数量 int,
Foreign key (材料代码) REFERENCES KC(材料代码)
)
(2) 创建索引
CREATE UNIQUE INDEX index1 ON KC(材料名称)
Drop index index1 on KC
(3) 创建视图
CREATE VIEW viewComputer
AS
SELECT FROM CKMX,KC
WHERE CKMX.材料代码=KC.材料代码 and KC.材料名称= ‘计算机’
(4) 插入数据
INSERT INTO KC VALUES(‘01’,’计算机’,’台’,5000.00,10)
INSERT INTO KC VALUES(‘02’,’电视机’,’台’,2000.00,20)
INSERT INTO CKMX VALUES(‘1’,’01’,’2009-10-10’,4)
INSERT INTO CKMX VALUES(‘2’,’01’,’2009-10-20’,3)
INSERT INTO CKMX VALUES(‘3’,’02’,’2009-10-20’,5)
(5) 统计
SELECT 材料代码,COUNT() as 次数, SUM(出库数量) as 出库数量
from CKMX
group by 材料代码
(6) 查询
SELECT ckmx.编号,出库日期,材料名称,单价,出库数量,出库数量*单价 as 金额
FROM KC,CKMX
WHERE KC.材料代码 = CKMX.材料代码
- 财务管理系统
学校有多名学生,财务处每年要收一次学费。财务处现用两个表记录相关信息,其结构和部分数据如下表:
表1、XS表结构和数据
学号 姓名 性别 年龄 所在系
200901 张明 男 18 计算机
200902 王晓萌 21 信息
200903 李刚 男 20 计算机
… … … … …
表2、JFQK表结构和数据
序号 学号 交费日期 书费 学费
1 200901 2009-09-10 500.50 5000
2 200902 2009-09-10 400.00 5000
3 200901 2010-10-10 300.20 4000
… … … …
其中,XS表是在校学生名册和基本信息登记表,JFQK表是学生交学费情况记录。
(1) 试写出创建XS表和JFQK表的SQL语句,要求定义实体和参照完整性。
(2) 写出在XS表上按学生姓名建立唯一索引的SQL语句。
(3) 创建一个视图,用于查询计算机系同学的基本信息。
(4) 写出将表中数据插入到相应表中的语句。
(5) 将计算机系同学的年龄增加1岁,并将计算机系同学的学费减1000元。
(6) 从表JFQK中统计出每个同学的交费次数和交费总金额,试写出SQL语句。
(7) 写出由XS表和JFQK表能产生类似如下结果集的查询语句:
序号 姓名 交费日期 书费 学费 合计
1 张明 2009-09-10 500.50 5000 5500.50
2 王晓萌 2009-09-10 400.00 5000 5400.00
… … … … … …
(1) 创建表
CREATE TABLE XS
(
学号 char(6) PRIMARY KEY,
姓名 char(10) not null,
性别 char(2) null,
年龄 smallint,
所在系 char(20)
)
CREATE TABLE JFQK
(
序号 int PRIMARY KEY,
学号 char(6) REFERENCES XS(学号),
交费日期 date,
书费 numeric(6,2),
学费 int
)
(2) 创建索引
CREATE UNIQUE INDEX index1 ON XS(姓名)
(3) 创建视图
CREATE VIEW viewComputer1
AS
SELECT * FROM XS WHERE 所在系 = ‘计算机’
(4) 插入数据
INSERT INTO XS VALUES(‘200901’,’张明’, ‘男’,18,’计算机’)
INSERT INTO XS VALUES(‘200902’,’王晓萌’,null,21,’信息’)
INSERT INTO XS VALUES(‘200903’,’李刚 ‘, ‘男’,20,’计算机’)
INSERT INTO JFQK VALUES(1,’200901’,’2009-09-10’,500.50,5000)
INSERT INTO JFQK VALUES(2,’200902’,’2009-09-10’,400.00,5000)
INSERT INTO JFQK VALUES(3,’200901’,’2010-10-10’,300.20,4000)
(5) 更新数据
UPDATE XS SET 年龄 = 年龄 + 1
WHERE 所在系 = ‘计算机’
或 UPDATE viewComputer1 SET 年龄 = 年龄 + 1
UPDATE JFQK SET 学费 = 学费 -1000
WHERE ‘计算机’ = (SELECT 所在系 FROM XS WHERE XS.学号 = JFQK.学号)
(6) 统计
SELECT 学号,COUNT(*) as 交费次数, SUM(书费+学费) as 总金额
FROM JFQK
GROUP BY 学号
(7) 查询
SELECT 序号,姓名,交费日期,书费,学费,书费+学费 as 合计
FROM XS,JFQK
WHERE XS.学号 = JFQK.学号