数据库系统概念第四章习题答案

  • 4.1
  • a.显示所有教师列表,列出他们的ID、姓名以及所讲授课程段的编号。对于没有讲授任何课程的教师,确保将课程段编号显示为0.在你的查询之中应该使用外连接,不能使用标量子查询。
  • b.使用标量子查询,不使用外连接写出上述查询。
  • c. 显示2010年春季开设的所有课程的列表,包括讲授课程段的教师姓名。如果一个课程段有不止一位教师讲授,那么有多少位教师,此课程段在结果中就出现多少次。如果一个课程段没有任何教师,它也要出现在结果中,相应教师名设置为“—”.
  • d. 显示所有系的列表,包括每个系中教师的总人数,不能使用标量子查询。确保正确处理没有教师的系。
  • 4.2 不使用外连接重写查询
  • a
  • b
  • 4.7 关系数据库如下
  • 4.12 查找那些没有经理的雇员。注意一个雇员可能只是没有列出其经理,或者有null经理。



python 假设有一个大学课程类Course 假设有一个课程名字段_标量


python 假设有一个大学课程类Course 假设有一个课程名字段_外连接_02

4.1

a.显示所有教师列表,列出他们的ID、姓名以及所讲授课程段的编号。对于没有讲授任何课程的教师,确保将课程段编号显示为0.在你的查询之中应该使用外连接,不能使用标量子查询。
select ID, name, sec_id
set sec_id = case
			when sec_id is null then 0
			end
from instructor natural left outer join teaches
group by ID,name;

上面的set语句不知道对不对!oracle没有跑成功

标答

select ID, name,
	count(course_id, sec_id, year,semester) as 'Number of sections'
from instructor natural left outer join teaches
group by ID, name

这题有点不太理解题目意思,哭~~~~标答在oracle上显示count()参数错误,我也觉得神奇!

函数nvl(p,q)可以实现null值赋值:如果p是null,则赋予q。如下

select ID,name,nvl(sec_id,0)
from instructor natural left outer join teaches;

oracle结果正确,但是不能使用group by.

b.使用标量子查询,不使用外连接写出上述查询。

直接上标答

select ID, name,
	(select count(*) as 'Number of sections'
	 from teaches T 
	 where T.id = I.id)
from instructor I
c. 显示2010年春季开设的所有课程的列表,包括讲授课程段的教师姓名。如果一个课程段有不止一位教师讲授,那么有多少位教师,此课程段在结果中就出现多少次。如果一个课程段没有任何教师,它也要出现在结果中,相应教师名设置为“—”.
select course_id, sec_id, ID,
	decode(name, NULL, '-', name)
from (section natural left outer join teaches)
			natural left outer join instructor
where semester='Spring' and year= 2010

decode()函数,检测控制并赋值。
decode函数详细介绍 section和teaches左外连接给出了对应课程上老师的ID,再与instructor左外连接得到老师的name.

d. 显示所有系的列表,包括每个系中教师的总人数,不能使用标量子查询。确保正确处理没有教师的系。
select distinct dept_name, count(ID)
from department natural left outer join instructor
group by dept_name;

4.2 不使用外连接重写查询

a
select* from student natural left outer join takes

解答:

select * from student natural join takes
union
select ID, name, dept_name, tot_cred, NULL, NULL, NULL, NULL, NULL
from student S1 where not exists
(select ID from takes T1 where T1.id = S1.id)
b
select* from student natural full outer join takes

解答

select* from student natural join takes
union
select ID, name,dept_name,tot_cred, NULL,NULL,NULL,NULL,NULL
from student S where not exists
	(select ID from takes T where S.ID = T.ID)
union
select ID, NULL,NULL,NULL,course_id, sec_id,semester,yesr,grade
from takes T where not exists 
	(select ID from student S where T.ID =S.ID)

4.7 关系数据库如下

python 假设有一个大学课程类Course 假设有一个课程名字段_外连接_03


Answer:

create table employee
(person name char(20),
street char(30),
city char(30),
primary key (person_name))

create table works
(person name char(20),
company name char(15),
salary integer,
primary key (person_name),
foreign key (person_name) references employee,
foreign key (company_name) references company)

create table company
(company_name char(15),
city char(30),
primary key (company_name))

create table manages
(person_name char(20),
manager_name char(20),
primary key (person_name),
foreign key (person_name) references employee,
foreign key (manager_name) references employee)

python 假设有一个大学课程类Course 假设有一个课程名字段_子查询_04

4.12 查找那些没有经理的雇员。注意一个雇员可能只是没有列出其经理,或者有null经理。

使用外连接

select employee_name
from employee natural left outer join manages
where manager_name is null

不使用外连接

(1)not exists版本

select employee_name as d
from employee as E
where not exists
	(select employee_name
	from manages as M
	where E.employee_name = M.employee_name 
		and manager_name is not null

(2)not in版本

select employee_name as d
from employee as E
where not in
	(select employee_name
	from manages as M
	where E.employee_name = M.employee_name 
		and manager_name is not null

(3)except版本

select employee_name
from employee
except
select employee_name
from employee natural join manages
where manager_name is not null