sql:构建数据库并查询它

时间:2011-06-18 00:19:17

标签: sql database-design

我接到了以下任务:

1部分:

  

你要设计一个架构(一些   表格)学生将拥有   id,name;一门课程会有id,name;   计划将有roomId,开始   时间;一个房间将有id,位置,   容量。

我构建了以下内容: 学生(varchar(10)PK id,first,last,courseId) - btw我认为最好添加一个enumertion(identity)列并在PK下调用这个列+ id列 - 所以每个可能有多行学生(每个人都参加另一门课程)

课程(varchar(10)PK id,name)

计划程序(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

湾哪个学生人数最多?

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

℃。哪个房间有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 个答案:

答案 0 :(得分:1)

  

1部分:

You are to design a schema (some tables) in which a student will have
     

id,name;一门课程会有id,name;   计划将有roomId,开始   时间;一个房间将有id,位置,   容量。

     

我建立了以下内容:学生   (varchar(10)PK id,first,last,   courseId) - 顺便说一句我认为最好   添加enumertion(标识)列   并调用此列+ id列   PK - 所以可能不止一个   每个学生的行(每个学生都有一行)   课程采取)

     

课程(varchar(10)PK id,name)

     

日程安排(FK到课程CourseId,FK   到课程RoomId,日期,时间(7)   小时) - 什么数据类型适合   这里吗?

     

房间(PK id,位置,容量)

     

你认为更好的设计吗?

你的桌面设计一开始就有缺陷;有一个更好的方法来设置它。

  1. 一般情况下,除非必须,否则请勿将varchar用于主键。 (请注意,在大多数情况下,你真的不需要。大多数情况下,我的意思是几乎所有。(几乎所有,我的意思是全部。)

  2. 您声明要添加一个标识列,这是一个好主意,但是您说要添加它以便您可以多次添加学生(对于多个类),这是一个馊主意。在这种情况下,我会使用一个单独的表来链接您的Students表和Courses表 - 这样,您可以避免重复数据,这可能会导致数据异常。

  3. 关于#2 - 您创建的解决方案可以让您在一门课程中添加多个学生。但是,学生不能在学校多参加一门课程吗?你应该重新考虑你的表关系;你可能会意识到这需要一个多对多的表。

  4. 如果您在Rooms和课程之间创建链接表,并且想知道应该使用哪种数据类型 - 您应该使用外键使用的数据类型,否则您将得到一个尝试创建外键时出错。 (这至少是MySQL的情况,尽管从你的查询语法看起来好像你正在编写一个Microsoft实现。)至于其余部分,我会使用time数据类型来实现它。时间,以及当天的某种类型的枚举值。