如何解决sql:构建数据库并对其进行查询
| 我得到了以下任务: 第1部分: 您要设计一个架构(有些 表格) ID,名称;一门课程将具有ID,名称; 时间表将有roomId,从 时间;房间将具有ID,位置, 容量。 我建立了以下内容: 学生(varchar(10)PK ID,第一个,最后一个,courseId)--btw我认为最好添加一个枚举(身份)列,并在PK下调用此列+ id列-这样可以有多个每个学生一行(每个人选修另一门课程) 课程(varchar(10)PK ID,名称) 计划程序(FK到课程CourseId,FK到课程RoomId,日期,时间(7)小时)-哪些数据类型适合此处? 房间(PK ID,位置,容量) 您认为更好的设计吗? 第2部分:您要编写以下查询 一种。返回所有学生的名单,以及每个学生参加了多少门课程?从最高到最低的顺序。select s.id as STUDENT_ID,s.first as FIRST_NAME,s.last as LAST_NAME,count (s.CourseId) as COURSE_COUNT
from dbo.Students as s
Group by s.id
order by count(s.CourseId) desc
--STUDENT_ID,FIRST_NAME,LAST_NAME,COURSE_COUNT
b。哪个课程的学生人数最多?
Create view q2 as
select top 1
c.name as COURSE_NAME,count(s.id) as STUDENT_COUNT
from dbo.Students as s
JOIN dbo.Courses as c
ON (s.CourseId = c.id)
Group by c.name
order by count(s.id) desc
--COURSE_NAME,STUDENT_COUNT
C。哪个房间有2个或更多的课程重叠?
Create view q3 as
select sc.room as CLASSROOM_ID,r.location as LOC,COUNT(sc.courseId) as OVERLAP_COURSE_COUNT
from dbo.Schedule as sc
JOIN dbo.Rooms as r
ON (sc.room = r.room)
Group by sc.room,sc.day,sc.hour
HAVING COUNT(sc.courseId) > 1
--CLASSROOM_ID,LOC (Location),OVERLAP_COURSE_COUNT
d。附表中未安排哪些课程?
Create view q4 as
select c.id as COURSE_ID,c.name as NAME
from dbo.Courses as c
where c.id not in
(select sc.courseId
from dbo.Schedule as sc)
-- COURSE_ID,NAME
-- not in (course_id from dbo.Schedule)
您是否同意这些疑问?还有更好的实施方法吗?
我会尝试执行它们,但会感谢您的任何评论。
解决方法
第1部分:
You are to design a schema (some tables) in which a student will have
ID,名称;一门课程将具有ID,名称;
时间表将有roomId,从
时间;房间将具有ID,位置,
容量。
我建立了以下内容:学生
(varchar(10)PK ID,第一个,最后一个,
courseId)--btw我认为最好
添加一个枚举(身份)列
并在下面调用此列+ id列
PK-因此可能不止一个
每个学生一行(每个学生另一个
课程)
课程(varchar(10)PK ID,名称)
计划程序(FK到课程CourseId,FK
到课程RoomId,日期,时间(7)
小时)-合适的数据类型
这里?
房间(PK ID,位置,容量)
您认为更好的设计吗?
您的桌子设计一开始就有缺陷。有一个更好的方法来进行设置。
通常,除非必须,否则不要将ѭ5用作主键。 (请注意,在大多数情况下,您实际上并不需要。大多数情况下,我是指几乎所有。(几乎所有情况下,我是指所有。))
您说过要添加一个Identity列,这是一个好主意,但您说要添加它,以便可以多次添加一个学生(对于多个班级),这是一个坏主意。在这种情况下,我将使用单独的表来链接“学生”表和“课程”表-这样,您可以避免重复数据,否则可能导致数据异常。
紧随#2之后-您创建的解决方案可以让您将多名学生添加到一门课程中。但是,学生在学校不能参加多于一个课程吗?您应该重新考虑您的表关系;您可能意识到这将需要一个多对多表。
如果您要在“房间”和“课程”之间创建链接表,并且想知道应该使用哪种数据类型-您应该使用外键使用的数据类型,否则在输入时会出现错误尝试创建外键。 (这至少是MySQL的情况,尽管从您的查询语法来看,好像您正在为Microsoft实现编写代码。)对于其余部分,我会在使用时使用time
数据类型,以及当天的某种枚举值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。