2023年6月21日发(作者:)
S Q L 习 题
商品销售数据库
Article(商品号 char(4),商品名char(16),单价 Numeric(8,2),库存量 int) 商品
Customer(顾客号char (4),顾客名 char (8),性别 char(2),年龄 int) 顾客
OrderItem(顾客号 char(4),商品号 char(4),数量 int, 日期 date) 定购
1、 检索定购商品号为‘0001’的顾客号和顾客名。
select distinct 顾客号 from OrderItem where 商品号='0001' or 商品号='0002';
2、 检索定购商品号为‘0001’或‘0002’的顾客号。
select distinct 顾客号 from OrderItem
where 商品号='0001' or 商品号='0002';
3、检索至少定购商品号为‘0001’和‘0002’的顾客号。(用交的方法)
select 顾客号 from OrderItem where 商品号='0001' and 顾客号 in( select 顾客号
from OrderItem where 商品号='0002');
4、检索至少定购商品号为‘0001’和‘0002’的顾客号。(用自表连接方法)
select X. 顾客号 from OrderItem X,OrderItem Y where X.顾客号=Y.顾客号 and X.商品号='0001' and Y. 商品号='0002';
5、检索没定购商品的顾客号和顾客名。
select 顾客号,顾客名 from Custommer where 顾客号 not in (select 顾客号 from
OrderItem);
6、检索一次定购商品号‘0001’商品数量最多的顾客号和顾客名。
select 顾客号,顾客名 from Custommer where 顾客号 in(select 顾客号 from OrderItem
where 商品号='0001'and 数量=(select MAX(数量)from OrderItem where 商品号='0001'));
7、检索男顾客的人数和平均年龄。
select count(*) 人数,avg(年龄) 平均年龄 from Custommer where 性别='男';
8、检索至少订购了一种商品的顾客数。
select count(distinct 顾客号) from OrderItem;
9、检索订购了商品的人次数。
select count( 顾客号) from OrderItem;
select count(distinct 顾客号) from OrderItem;
10、检索顾客张三订购商品的总数量及每次购买最多数量和最少数量之差。
select sum( 数量),MAX(数量)-MIN(数量) from OrderItem,Custommer
where OrderItem.顾客号=Custommer.顾客号 and 顾客名='张三';
11、检索至少订购了3单商品的顾客号和顾客名及他们定购的商品次数和商品总数量,并按商品总数量降序排序。
select Custommer.顾客号,顾客名,count( *),Sum(数量) from OrderItem,Custommer
where OrderItem.顾客号=Custommer.顾客号 group by Custommer.顾客号,顾客名
having count( *)>3 order by 4 desc;
12、检索年龄在30至40岁的顾客所购买的商品名及商品单价。
select 商品名,单价 from Custommer,Article,OrderItem where Custommer.顾客号=OrderItem.顾客号 and Article.商品号=OrderItem.商品号 and 年龄 between 30 and 40;
13、创建一个视图GM,字段包括:顾客号,顾客名和定购的商品名,日期和金额(金额=数量*单价)。指定用内连接方式做。
create view GM as
select Custommer.顾客号,顾客名,商品名,日期,单价*数量 as 金额
from Custommer,Article,OrderItem
where Custommer.顾客号=OrderItem.顾客号 and Article.商品号=OrderItem.商品号
create view GM1 as
select Custommer.顾客号,顾客名,商品名,日期,单价*数量 as 金额
from (Custommer inner join OrderItem on Custommer.顾客号=OrderItem.顾客号)
inner join Article on Article.商品号=OrderItem.商品号
14、 检索购买的商品的单价至少有一次高于或等于1000元的顾客号和顾客名。
select Custommer.顾客号,顾客名from Custommer,OrderItem,Article
where Custommer.顾客号=OrderItem.顾客号 and Article.商品号=OrderItem.商品号 and 单价>1000
15、 检索购买的购买价都高于或等于1000元的顾客号和顾客名。
select Custommer.顾客号,顾客名 from Custommer where 顾客号 in
(select 顾客号 from OrderItem where 顾客号 not in
(select 顾客号 from OrderItem,Article
where OrderItem.商品号=Article.商品号 and 单价<=1000))
16、检索女顾客购买的商品号,商品名和数量合计。
select Article.商品号,商品名,sum(数量) from Custommer,Article,OrderItem
where OrderItem.顾客号=Custommer.顾客号 and OrderItem.商品号=Article.商品号
and 性别='女' group by Article.商品号,商品名
17、检索所有的顾客号和顾客名以及它们所购买的商品号。(包括没买商品的顾客)
select Custommer.顾客号,顾客名,商品号
from Custommer left join OrderItem on Custommer.顾客号=OrderItem.顾客号
18、检索这样的顾客号,顾客名,他们定购了所有的商品 (除法)
select Custommer.顾客号,顾客名 from Custommer where not exists
(select * from Article where not exists
(select * from OrderItem
where OrderItem.顾客号=Custommer.顾客号 and OrderItem.商品号=Article.商品号))
19、检索这样的顾客号,他们至少订购了顾客号为“0002”所订购的所有商品
(除法)
select distinct 顾客号 from OrderItem X where not exists
(select * from OrderItem Y where 顾客号='0002' and not exists
(select * from OrderItem Z where Z.顾客号=X.顾客号 and Z.商品号=Y.商品号))
20、向Article表插入一条纪录。删除无人购买的商品。(检验一下刚插入的记录是否已被删除)
delete from Article where 商品号 not in
(select 商品号 from OrderItem )
21、 降低已售出的数量总合超过10件的商品单价为原价的95%。 update Article set 单价=单价*0.95 where 商品号 in
(select 商品号 from OrderItem group by 商品号 having sum(数量)>10)
22、建立断言:顾客的年龄必须大于18岁。
Create ASSERTION A1 check
( not exists (select * from Custommer where 年龄<=18))
23、把修改商品单价的权限授给用户Wang, 用户Wang可以转授该权限。
Grant update (单价) on Article to Wang with grant option
24、把修改商品单价的权限用户Wang收回,转授出去的也级联收回。
revoke update (单价) on Article from Wang cascade
1. 教学数据库
学生表 S(S#,SNAME,AGE,SEX)
学习表 SC(S#,C#,GRADE)
课程表 C(C#,CNAME,TEACHER)
试用SQL的查询语句表达下列查询:
(1)检索LIU老师所授课程的课程号和课程名。
SELECT C#,CNAME
FROM C
WHERE TEACHER=‘LIU’
(2)检索年龄大于23岁的男学生的学号和姓名。
SELECT S#,SNAME
FROM S
WHERE (AGE>23) AND (SEX=‘M’)
(3)检索至少选修LIU老师所授课程中一门课程的女学生姓名。
SELECT SNAME
FROM S
WHERE SEX=‘F’ AND S# IN
(SELECT S#
FROM SC
WHERE C# IN
(SELECT C#
FROM C
WHERE TEACHER=‘LIU’)
NOTICE:有多种写法,比如联接查询写法:
SELECT SNAME
FROM S,SC,C
WHERE SEX=‘F’ AND SC.S#=S.S#
AND SC.C#=C.C#
AND TEACHER='LIU'
但上一种写法更好一些。
(4)检索WANG同学不学的课程的课程号。
SELECT C#
FROM C
WHERE C# NOT IN
(SELECT C#
FROM SC
WHERE S# IN
(SELECT S#
FROM S
WHERE SNAME='WANG'))
(5)检索至少选修两门课程的学生学号。
SELECT DISTINCT
FROM SC X,SC Y
WHERE = AND <>
Notice:对表SC进行自连接,X,Y是SC的两个别名。
(6)检索全部学生都选修的课程的课程号与课程名。
SELECT C#,CNAME
FROM C
WHERE NOT EXISTS
(SELECT *
FROM S
WHERE S# NOT IN
(SELECT *
FROM SC
WHERE SC.C#=C.C#))
要从语义上分解:(1)选择课程的课程号与课程名,不存在不选这门课的同学。
其中,“不选这门课的同学”可以表示为:
或者
SELECT *
SELECT *
FROM S
WHERE S# NOT IN
(SELECT *
FROM SC
WHERE SC.C#=C.C#)
FROM S
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE S.S#=C.S#
AND
SC.C#=C.C# )
(7)检索选修课程包含LIU老师所授课的学生学号。
SELECT DISTINCT S#
FROM SC
WHERE C# IN
(SELECT C#
FROM C
WHERE TEACHER='LIU'))
2.设有两个基本表R(A,B,C)和S(D,E,F),试用SQL查询语句表达下列关系代数表达式:
(1)πA(R) (2)σ(3)R×S (4))πA,F(σ(1)SELECT A FROM R
(2)SELECT * FROM R WHERE B='17'
(3)SELECT A,B,C,D,E,F FROM R,S
(4)SELECT A,F FROM R,S WHERE R.C=S.D
B='17'(R)
C=D(R×S))
3.设有两个基本表R(A,B,C)和S(A,B,C)试用SQL查询语句表达下列关系代数表达式:(包含)
(1)R∪S (2)R∩S (3)R-S (4)πA,B(R)πB,C(S)
(1)SELECT A,B,C FROM R
UNION
SELECT A,B,C
FROM S
(2)SELECT A,B,C
FROM R
INTERSECT
SELECT A,B,C
FROM S
(3)SELECT A,B,C
FROM R
WHERE NOT EXISTS
(SELECT A,B,C
FROM S
WHERE R.A=S.A AND R.B=S.B AND R.C=S.C)
(4)SELECT R.A,R.B,S.C
FROM R,S
WHERE R.B=S.B
4.试用SQL查询语句表达下列对教学数据库中三个基本表S、SC、C的查询:(集函数)
(1)统计有学生选修的课程门数。
SELECT COUNT(DISTINCT C#) FROM SC
(2)求选修C4课程的学生的平均年龄。
FROM S
WHERE S# IN
(SELECT S#
FROM SC
WHERE C#='C4')
或者,
SELECT AVG(AGE)
FROM S,SC
WHERE S.S#=SC.S# AND C#='004'
SELECT AVG(AGE)
(3)求LIU老师所授课程的每门课程的学生平均成绩。
SELECT CNAME,AVG(GRADE)
FROM SC ,C
WHERE SC.C#=C.C# AND TEACHER='LIU'
GROUP BY C#
(4)统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数, 查询结果按人数降序排列,若人数相同,按课程号升序排列。
SELECT DISTINCT C#,COUNT(S#)
FROM SC
GROUP BY C#
HAVING COUNT(S#)>10
ORDER BY 2 DESC, C# ASC
(5)检索学号比WANG同学大,而年龄比他小的学生姓名。
SELECT
FROM S AS X, S AS Y
WHERE ='WANG' AND X.S#>Y.S# AND <
(6)检索姓名以WANG打头的所有学生的姓名和年龄。
SELECT SNAME,AGE
FROM S
WHERE SNAME LIKE 'WANG%'
(7)在SC中检索成绩为空值的学生学号和课程号。
SELECT S#,C#
FROM SC
WHERE GRADE IS NULL
(8)求年龄大于女同学平均年龄的男学生姓名和年龄。
SELECT SNAME,AGE
FROM S AS X
WHERE ='男' AND >(SELECT AVG(AGE) FROM S AS Y WHERE ='女')
(9)求年龄大于所有女同学年龄的男学生姓名和年龄。
SELECT SNAME,AGE
FROM S AS X
WHERE ='男' AND >ALL (SELECT AGE FROM S AS Y WHERE ='女')
5.试用SQL更新语句表达对教学数据库中三个基本表S、SC、C的各个更新操作: (插入操作)
(1)往基本表S中插入一个学生元组(‘S9’,‘WU’,18)。
INSERT INTO S(S#,SNAME,AGE) VALUES('59','WU',18)
(2)在基本表S中检索每一门课程成绩都大于等于80分的学生学号、姓名和性别, 并把检索到的值送往另一个已存在的基本表STUDENT(S#,SANME,SEX)。
INSERT INTO STUDENT(S#,SNAME,SEX)
SELECT S#,SNAME,SEX
FROM S WHERE NOT EXISTS
(SELECT * FROM SC WHERE
GRADE<80 AND S.S#=SC.S#)
(3)在基本表SC中删除尚无成绩的选课元组。
DELETE FROM SC WHERE GRADE IS NULL
(4)把WANG同学的学习选课和成绩全部删去。
DELETE FROM SC
WHERE S# IN
(SELECT S#
FROM S
WHERE SNAME='WANG')
(5)把选修MATHS课不及格的成绩全改为空值。
UPDATE SC
SET GRADE=NULL
WHERE GRADE<60 AND C# IN
(SELECT C#
FROM C
WHERE CNAME='MATHS')
(6)把低于总平均成绩的女同学成绩提高5%。
UPDATE SC
SET GRADE=GRADE*1.05
WHERE GRADE<(SELECT AVG(GRADE) FROM SC) AND S# IN (SELECT S# FROM S WHERE
SEX='F')
(7)在基本表SC中修改C4课程的成绩,若成绩小于等于75分时提高5%, 若成绩大于75分时提高4%(用两个UPDATE语句实现)。
UPDATE SC
SET GRADE=GRADE*1.05
WHERE C#='C4' AND GRADE<=75
UPDATE SC
SET GRADE=GRADE*1.04
WHERE C#='C4' AND GRADE>75
6. “仓库管理”关系模型有五个关系模式:
零件 PART(P#,PNAME,COLOR,WEIGHT)
项目 PROJECT(J#,JNAME,DATE)
供应商 SUPPLIER(S#,SNAME,SADDR)
供应 P_P(J#,P#,TOTOAL)
采购 P_S(P#,S#,QUANTITY) (1)试用SQL DDL语句定义上述五个基本表,并说明主键和外键。
CREATE TABLE PART
(P# CHAR(4) NOT NULL,PNAME CHAR(12) NOT NULL,
COLOR CHAR(10),WEIGHT REAL,
PRIMARY KEY(P#))
CREATE TABLE PROJECT
(J# CHAR(4) NOT NULL,JNAME CHAR(12) NOT NULL,
DATE DATE,
PRIMARY KEY(J#))
CREATE TABLE SUPLIER
(S# CHAR(4) NOT NULL,SNAME CHAR(12),SADDR VARCHAR(20),
PRIMARY KEY(S#))
CREATE TABLE P_P
(J# CHAR(4),P# CHAR(4),TOTAL INTEGER,
PRIMARY KEY(J#,P#),
FOREIGN KEY(J#) REFERENCE PROJECT(J#),
FOREIGN KEY(P#) REFERENCE PART(P#))
CREATE TABLE P_S
(P# CHAR(4),S# CHAR(4),QUANTITY INTEGER,
PRIMARY KEY(P#,S#),
FOREIGN KEY(P#) REFERENCE PART(P#),
FOREIGN KEY(S#) REFERENCE SUPLIER(S#))
(2)试将PROGECT、P_P、PART三个基本表的自然联接定义为一个视图VIEW1,PART、P_S、SUPPLIER 三个基本表的自然联接定义为一个视图VIEW2。
CREATE VIEW VIEW1(J#,JNAME,DATE,P#,PNAME,COLOR,WEIGHT,TOTAL)
AS SELECT
PROJECT.J#,JNAME,DATE,PART.P#,PNAME,COLOR,WEIGHT,TOTAL
FROM PROJECT,PART,P_P
WHERE PART.P#=P_P.P# AND P_P.J#=PROJECT.J#
CREATE VIEW VIEW2(P#,PNAME,COLOR,WEIGHT,S#,SNAME,SADDR,QUANTITY) AS SELECT
PART.P#,PNAME,COLOR,WEIGHT,SUPPLIER.S#,SNAME,SADDR,QUANTITY
FROM PART,P_S,SUPPLIER
WHERE PART.P#=P_S.P# AND P_S.S#=SUPPLIER.S#
(3)试在上述两个视图的基础上进行数据查询:
1)检索上海的供应商所供应的零件的编号和名字。
SELECT P#,PNAME FROM VIEW2 WHERE SADDR='SHANGHAI'
2)检索项目J4所用零件的供应商编号和名字。
SELECT S#,SNAME FROM VIEW2 WHERE P# IN(SELECT P# FROM VIEW1 WHERE J#='J4')
3.9 对于教学数据库中基本表SC,已建立下列视图:
CREATE VIEW S_GRADE(S#,C_NUM,AVG_GRADE)
AS SELECT S#,COUNT(C#),AVG(GRADE)
FROM SC
GROUP BY S#
试判断下列查询和更新是否允许执行。若允许,写出转换到基本表SC上的相应操作。
(1) SELECT *
FROM S_GRADE
允许
SELECT S#,COUNT(C#),AVG(GRADE) FROM SC GROUP BY S#
(2) SELECT S#,C_NUM
FROM S_GRADE
WHERE AVG_GRADE>80
允许
SELECT S#,COUNT(C#) FROM SC WHERE AVG(GRADE)>80
(3) SELECT S#,AVG_GRADE
FROM S_GRADE
WHERE C_NUM>(SELECT C_NUM
FROM S_GRADE
WHERE S#=‘S4’)
允许
SELECT S#,AVG(GRADE) FROM SC AS X
WHERE COUNT(X.C#)>(SELECT COUNT(Y.C#) FROM SC AS Y WHERE Y.S#='S4')
GROUP BY S#
(4) UPDATE S_GRADE
SET C_NUM=C_NUM+1
WHERE S#=‘S4’
不允许
(5) DELETE FROM S_GRADE
WHERE C_NUM>4
不允许
2023年6月21日发(作者:)
S Q L 习 题
商品销售数据库
Article(商品号 char(4),商品名char(16),单价 Numeric(8,2),库存量 int) 商品
Customer(顾客号char (4),顾客名 char (8),性别 char(2),年龄 int) 顾客
OrderItem(顾客号 char(4),商品号 char(4),数量 int, 日期 date) 定购
1、 检索定购商品号为‘0001’的顾客号和顾客名。
select distinct 顾客号 from OrderItem where 商品号='0001' or 商品号='0002';
2、 检索定购商品号为‘0001’或‘0002’的顾客号。
select distinct 顾客号 from OrderItem
where 商品号='0001' or 商品号='0002';
3、检索至少定购商品号为‘0001’和‘0002’的顾客号。(用交的方法)
select 顾客号 from OrderItem where 商品号='0001' and 顾客号 in( select 顾客号
from OrderItem where 商品号='0002');
4、检索至少定购商品号为‘0001’和‘0002’的顾客号。(用自表连接方法)
select X. 顾客号 from OrderItem X,OrderItem Y where X.顾客号=Y.顾客号 and X.商品号='0001' and Y. 商品号='0002';
5、检索没定购商品的顾客号和顾客名。
select 顾客号,顾客名 from Custommer where 顾客号 not in (select 顾客号 from
OrderItem);
6、检索一次定购商品号‘0001’商品数量最多的顾客号和顾客名。
select 顾客号,顾客名 from Custommer where 顾客号 in(select 顾客号 from OrderItem
where 商品号='0001'and 数量=(select MAX(数量)from OrderItem where 商品号='0001'));
7、检索男顾客的人数和平均年龄。
select count(*) 人数,avg(年龄) 平均年龄 from Custommer where 性别='男';
8、检索至少订购了一种商品的顾客数。
select count(distinct 顾客号) from OrderItem;
9、检索订购了商品的人次数。
select count( 顾客号) from OrderItem;
select count(distinct 顾客号) from OrderItem;
10、检索顾客张三订购商品的总数量及每次购买最多数量和最少数量之差。
select sum( 数量),MAX(数量)-MIN(数量) from OrderItem,Custommer
where OrderItem.顾客号=Custommer.顾客号 and 顾客名='张三';
11、检索至少订购了3单商品的顾客号和顾客名及他们定购的商品次数和商品总数量,并按商品总数量降序排序。
select Custommer.顾客号,顾客名,count( *),Sum(数量) from OrderItem,Custommer
where OrderItem.顾客号=Custommer.顾客号 group by Custommer.顾客号,顾客名
having count( *)>3 order by 4 desc;
12、检索年龄在30至40岁的顾客所购买的商品名及商品单价。
select 商品名,单价 from Custommer,Article,OrderItem where Custommer.顾客号=OrderItem.顾客号 and Article.商品号=OrderItem.商品号 and 年龄 between 30 and 40;
13、创建一个视图GM,字段包括:顾客号,顾客名和定购的商品名,日期和金额(金额=数量*单价)。指定用内连接方式做。
create view GM as
select Custommer.顾客号,顾客名,商品名,日期,单价*数量 as 金额
from Custommer,Article,OrderItem
where Custommer.顾客号=OrderItem.顾客号 and Article.商品号=OrderItem.商品号
create view GM1 as
select Custommer.顾客号,顾客名,商品名,日期,单价*数量 as 金额
from (Custommer inner join OrderItem on Custommer.顾客号=OrderItem.顾客号)
inner join Article on Article.商品号=OrderItem.商品号
14、 检索购买的商品的单价至少有一次高于或等于1000元的顾客号和顾客名。
select Custommer.顾客号,顾客名from Custommer,OrderItem,Article
where Custommer.顾客号=OrderItem.顾客号 and Article.商品号=OrderItem.商品号 and 单价>1000
15、 检索购买的购买价都高于或等于1000元的顾客号和顾客名。
select Custommer.顾客号,顾客名 from Custommer where 顾客号 in
(select 顾客号 from OrderItem where 顾客号 not in
(select 顾客号 from OrderItem,Article
where OrderItem.商品号=Article.商品号 and 单价<=1000))
16、检索女顾客购买的商品号,商品名和数量合计。
select Article.商品号,商品名,sum(数量) from Custommer,Article,OrderItem
where OrderItem.顾客号=Custommer.顾客号 and OrderItem.商品号=Article.商品号
and 性别='女' group by Article.商品号,商品名
17、检索所有的顾客号和顾客名以及它们所购买的商品号。(包括没买商品的顾客)
select Custommer.顾客号,顾客名,商品号
from Custommer left join OrderItem on Custommer.顾客号=OrderItem.顾客号
18、检索这样的顾客号,顾客名,他们定购了所有的商品 (除法)
select Custommer.顾客号,顾客名 from Custommer where not exists
(select * from Article where not exists
(select * from OrderItem
where OrderItem.顾客号=Custommer.顾客号 and OrderItem.商品号=Article.商品号))
19、检索这样的顾客号,他们至少订购了顾客号为“0002”所订购的所有商品
(除法)
select distinct 顾客号 from OrderItem X where not exists
(select * from OrderItem Y where 顾客号='0002' and not exists
(select * from OrderItem Z where Z.顾客号=X.顾客号 and Z.商品号=Y.商品号))
20、向Article表插入一条纪录。删除无人购买的商品。(检验一下刚插入的记录是否已被删除)
delete from Article where 商品号 not in
(select 商品号 from OrderItem )
21、 降低已售出的数量总合超过10件的商品单价为原价的95%。 update Article set 单价=单价*0.95 where 商品号 in
(select 商品号 from OrderItem group by 商品号 having sum(数量)>10)
22、建立断言:顾客的年龄必须大于18岁。
Create ASSERTION A1 check
( not exists (select * from Custommer where 年龄<=18))
23、把修改商品单价的权限授给用户Wang, 用户Wang可以转授该权限。
Grant update (单价) on Article to Wang with grant option
24、把修改商品单价的权限用户Wang收回,转授出去的也级联收回。
revoke update (单价) on Article from Wang cascade
1. 教学数据库
学生表 S(S#,SNAME,AGE,SEX)
学习表 SC(S#,C#,GRADE)
课程表 C(C#,CNAME,TEACHER)
试用SQL的查询语句表达下列查询:
(1)检索LIU老师所授课程的课程号和课程名。
SELECT C#,CNAME
FROM C
WHERE TEACHER=‘LIU’
(2)检索年龄大于23岁的男学生的学号和姓名。
SELECT S#,SNAME
FROM S
WHERE (AGE>23) AND (SEX=‘M’)
(3)检索至少选修LIU老师所授课程中一门课程的女学生姓名。
SELECT SNAME
FROM S
WHERE SEX=‘F’ AND S# IN
(SELECT S#
FROM SC
WHERE C# IN
(SELECT C#
FROM C
WHERE TEACHER=‘LIU’)
NOTICE:有多种写法,比如联接查询写法:
SELECT SNAME
FROM S,SC,C
WHERE SEX=‘F’ AND SC.S#=S.S#
AND SC.C#=C.C#
AND TEACHER='LIU'
但上一种写法更好一些。
(4)检索WANG同学不学的课程的课程号。
SELECT C#
FROM C
WHERE C# NOT IN
(SELECT C#
FROM SC
WHERE S# IN
(SELECT S#
FROM S
WHERE SNAME='WANG'))
(5)检索至少选修两门课程的学生学号。
SELECT DISTINCT
FROM SC X,SC Y
WHERE = AND <>
Notice:对表SC进行自连接,X,Y是SC的两个别名。
(6)检索全部学生都选修的课程的课程号与课程名。
SELECT C#,CNAME
FROM C
WHERE NOT EXISTS
(SELECT *
FROM S
WHERE S# NOT IN
(SELECT *
FROM SC
WHERE SC.C#=C.C#))
要从语义上分解:(1)选择课程的课程号与课程名,不存在不选这门课的同学。
其中,“不选这门课的同学”可以表示为:
或者
SELECT *
SELECT *
FROM S
WHERE S# NOT IN
(SELECT *
FROM SC
WHERE SC.C#=C.C#)
FROM S
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE S.S#=C.S#
AND
SC.C#=C.C# )
(7)检索选修课程包含LIU老师所授课的学生学号。
SELECT DISTINCT S#
FROM SC
WHERE C# IN
(SELECT C#
FROM C
WHERE TEACHER='LIU'))
2.设有两个基本表R(A,B,C)和S(D,E,F),试用SQL查询语句表达下列关系代数表达式:
(1)πA(R) (2)σ(3)R×S (4))πA,F(σ(1)SELECT A FROM R
(2)SELECT * FROM R WHERE B='17'
(3)SELECT A,B,C,D,E,F FROM R,S
(4)SELECT A,F FROM R,S WHERE R.C=S.D
B='17'(R)
C=D(R×S))
3.设有两个基本表R(A,B,C)和S(A,B,C)试用SQL查询语句表达下列关系代数表达式:(包含)
(1)R∪S (2)R∩S (3)R-S (4)πA,B(R)πB,C(S)
(1)SELECT A,B,C FROM R
UNION
SELECT A,B,C
FROM S
(2)SELECT A,B,C
FROM R
INTERSECT
SELECT A,B,C
FROM S
(3)SELECT A,B,C
FROM R
WHERE NOT EXISTS
(SELECT A,B,C
FROM S
WHERE R.A=S.A AND R.B=S.B AND R.C=S.C)
(4)SELECT R.A,R.B,S.C
FROM R,S
WHERE R.B=S.B
4.试用SQL查询语句表达下列对教学数据库中三个基本表S、SC、C的查询:(集函数)
(1)统计有学生选修的课程门数。
SELECT COUNT(DISTINCT C#) FROM SC
(2)求选修C4课程的学生的平均年龄。
FROM S
WHERE S# IN
(SELECT S#
FROM SC
WHERE C#='C4')
或者,
SELECT AVG(AGE)
FROM S,SC
WHERE S.S#=SC.S# AND C#='004'
SELECT AVG(AGE)
(3)求LIU老师所授课程的每门课程的学生平均成绩。
SELECT CNAME,AVG(GRADE)
FROM SC ,C
WHERE SC.C#=C.C# AND TEACHER='LIU'
GROUP BY C#
(4)统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数, 查询结果按人数降序排列,若人数相同,按课程号升序排列。
SELECT DISTINCT C#,COUNT(S#)
FROM SC
GROUP BY C#
HAVING COUNT(S#)>10
ORDER BY 2 DESC, C# ASC
(5)检索学号比WANG同学大,而年龄比他小的学生姓名。
SELECT
FROM S AS X, S AS Y
WHERE ='WANG' AND X.S#>Y.S# AND <
(6)检索姓名以WANG打头的所有学生的姓名和年龄。
SELECT SNAME,AGE
FROM S
WHERE SNAME LIKE 'WANG%'
(7)在SC中检索成绩为空值的学生学号和课程号。
SELECT S#,C#
FROM SC
WHERE GRADE IS NULL
(8)求年龄大于女同学平均年龄的男学生姓名和年龄。
SELECT SNAME,AGE
FROM S AS X
WHERE ='男' AND >(SELECT AVG(AGE) FROM S AS Y WHERE ='女')
(9)求年龄大于所有女同学年龄的男学生姓名和年龄。
SELECT SNAME,AGE
FROM S AS X
WHERE ='男' AND >ALL (SELECT AGE FROM S AS Y WHERE ='女')
5.试用SQL更新语句表达对教学数据库中三个基本表S、SC、C的各个更新操作: (插入操作)
(1)往基本表S中插入一个学生元组(‘S9’,‘WU’,18)。
INSERT INTO S(S#,SNAME,AGE) VALUES('59','WU',18)
(2)在基本表S中检索每一门课程成绩都大于等于80分的学生学号、姓名和性别, 并把检索到的值送往另一个已存在的基本表STUDENT(S#,SANME,SEX)。
INSERT INTO STUDENT(S#,SNAME,SEX)
SELECT S#,SNAME,SEX
FROM S WHERE NOT EXISTS
(SELECT * FROM SC WHERE
GRADE<80 AND S.S#=SC.S#)
(3)在基本表SC中删除尚无成绩的选课元组。
DELETE FROM SC WHERE GRADE IS NULL
(4)把WANG同学的学习选课和成绩全部删去。
DELETE FROM SC
WHERE S# IN
(SELECT S#
FROM S
WHERE SNAME='WANG')
(5)把选修MATHS课不及格的成绩全改为空值。
UPDATE SC
SET GRADE=NULL
WHERE GRADE<60 AND C# IN
(SELECT C#
FROM C
WHERE CNAME='MATHS')
(6)把低于总平均成绩的女同学成绩提高5%。
UPDATE SC
SET GRADE=GRADE*1.05
WHERE GRADE<(SELECT AVG(GRADE) FROM SC) AND S# IN (SELECT S# FROM S WHERE
SEX='F')
(7)在基本表SC中修改C4课程的成绩,若成绩小于等于75分时提高5%, 若成绩大于75分时提高4%(用两个UPDATE语句实现)。
UPDATE SC
SET GRADE=GRADE*1.05
WHERE C#='C4' AND GRADE<=75
UPDATE SC
SET GRADE=GRADE*1.04
WHERE C#='C4' AND GRADE>75
6. “仓库管理”关系模型有五个关系模式:
零件 PART(P#,PNAME,COLOR,WEIGHT)
项目 PROJECT(J#,JNAME,DATE)
供应商 SUPPLIER(S#,SNAME,SADDR)
供应 P_P(J#,P#,TOTOAL)
采购 P_S(P#,S#,QUANTITY) (1)试用SQL DDL语句定义上述五个基本表,并说明主键和外键。
CREATE TABLE PART
(P# CHAR(4) NOT NULL,PNAME CHAR(12) NOT NULL,
COLOR CHAR(10),WEIGHT REAL,
PRIMARY KEY(P#))
CREATE TABLE PROJECT
(J# CHAR(4) NOT NULL,JNAME CHAR(12) NOT NULL,
DATE DATE,
PRIMARY KEY(J#))
CREATE TABLE SUPLIER
(S# CHAR(4) NOT NULL,SNAME CHAR(12),SADDR VARCHAR(20),
PRIMARY KEY(S#))
CREATE TABLE P_P
(J# CHAR(4),P# CHAR(4),TOTAL INTEGER,
PRIMARY KEY(J#,P#),
FOREIGN KEY(J#) REFERENCE PROJECT(J#),
FOREIGN KEY(P#) REFERENCE PART(P#))
CREATE TABLE P_S
(P# CHAR(4),S# CHAR(4),QUANTITY INTEGER,
PRIMARY KEY(P#,S#),
FOREIGN KEY(P#) REFERENCE PART(P#),
FOREIGN KEY(S#) REFERENCE SUPLIER(S#))
(2)试将PROGECT、P_P、PART三个基本表的自然联接定义为一个视图VIEW1,PART、P_S、SUPPLIER 三个基本表的自然联接定义为一个视图VIEW2。
CREATE VIEW VIEW1(J#,JNAME,DATE,P#,PNAME,COLOR,WEIGHT,TOTAL)
AS SELECT
PROJECT.J#,JNAME,DATE,PART.P#,PNAME,COLOR,WEIGHT,TOTAL
FROM PROJECT,PART,P_P
WHERE PART.P#=P_P.P# AND P_P.J#=PROJECT.J#
CREATE VIEW VIEW2(P#,PNAME,COLOR,WEIGHT,S#,SNAME,SADDR,QUANTITY) AS SELECT
PART.P#,PNAME,COLOR,WEIGHT,SUPPLIER.S#,SNAME,SADDR,QUANTITY
FROM PART,P_S,SUPPLIER
WHERE PART.P#=P_S.P# AND P_S.S#=SUPPLIER.S#
(3)试在上述两个视图的基础上进行数据查询:
1)检索上海的供应商所供应的零件的编号和名字。
SELECT P#,PNAME FROM VIEW2 WHERE SADDR='SHANGHAI'
2)检索项目J4所用零件的供应商编号和名字。
SELECT S#,SNAME FROM VIEW2 WHERE P# IN(SELECT P# FROM VIEW1 WHERE J#='J4')
3.9 对于教学数据库中基本表SC,已建立下列视图:
CREATE VIEW S_GRADE(S#,C_NUM,AVG_GRADE)
AS SELECT S#,COUNT(C#),AVG(GRADE)
FROM SC
GROUP BY S#
试判断下列查询和更新是否允许执行。若允许,写出转换到基本表SC上的相应操作。
(1) SELECT *
FROM S_GRADE
允许
SELECT S#,COUNT(C#),AVG(GRADE) FROM SC GROUP BY S#
(2) SELECT S#,C_NUM
FROM S_GRADE
WHERE AVG_GRADE>80
允许
SELECT S#,COUNT(C#) FROM SC WHERE AVG(GRADE)>80
(3) SELECT S#,AVG_GRADE
FROM S_GRADE
WHERE C_NUM>(SELECT C_NUM
FROM S_GRADE
WHERE S#=‘S4’)
允许
SELECT S#,AVG(GRADE) FROM SC AS X
WHERE COUNT(X.C#)>(SELECT COUNT(Y.C#) FROM SC AS Y WHERE Y.S#='S4')
GROUP BY S#
(4) UPDATE S_GRADE
SET C_NUM=C_NUM+1
WHERE S#=‘S4’
不允许
(5) DELETE FROM S_GRADE
WHERE C_NUM>4
不允许
发布评论