【问题标题】:database query and index数据库查询和索引
【发布时间】:2015-06-14 18:04:31
【问题描述】:

给定两个关系:

      Students = (St-Id, Name, Address, CourseNo, Cgpa)
      Courses = (CourseN0, CourseName, Credits)

其中主键是St-IdCourseNo。学生关系中的CourseNo 是外键引用Courses 关系。

假设以下查询很频繁:

问题:每个学生学习的课程(CourseNo 和 CourseName)是什么?

SELECT Students.Name, Courses.CourseName, Course.CourseNO
FROM Students
INNER JOIN Courses
ON Students.CourseNo=Course.CourseNo;

使用连接操作的查询是否正确?

由于课程编号,它是一个主索引。我们可以将courseNo 视为主索引的规则吗?也是集群吗?集群和主索引有什么区别?

问题:每个学生的 Cgpa 是多少?

回答:Select Cgpa and name from students

【问题讨论】:

标签: mysql sql database indexing clustered-index


【解决方案1】:

我同意 rcl 的 simon 的观点,您的设计只允许每个学生一门课程。尝试在学生和课程之间放置一个交集表。

Students = (St-Id, Name, Address, Cgpa)
Courses = (CourseN0, CourseName, Credits)
StudentCourse = (St-Id, CourseN0)

【讨论】:

    【解决方案2】:
    SELECT 
         name
        ,cgpa
    FROM
       students
    WHERE 
       1=1
    

    试试这个

    【讨论】:

      【解决方案3】:

      另外,如果 St-id 是 Student 的主键,那么一个学生只能拥有一门课程。你的设计看起来有点欠缺。

      【讨论】:

        【解决方案4】:
        1. 如果表有主键,则聚集索引与主键相同。如果它没有主键,InnoDB 将自己创建一个聚集索引。它用于决定如何执行此操作的规则在here 中进行了描述。

        2. 您的语法不太正确。要从表中选择多个列,请用逗号分隔它们,而不是 and。所以应该是:

          SELECT name, cpga FROM student
          

        【讨论】:

        • 问题:每个学生的 Cgpa 是多少?是二级索引,因为cgpa不是一级索引,会频繁访问。对吧?
        • Cgpa 查询只是从每一行返回列。不需要索引,因为您没有尝试匹配任何内容。
        • 以防将来我将 Cgpa 与注册课程相匹配,例如,与地址或没有主键的关系。在这种情况下,我们可以为 Cgpa 使用二级索引吗?索引是什么?
        • 我不确定你在说什么类型的查询。为什么 Cgpa 会与任何其他表匹配? Cgpa 是综合平均绩点,对吧?这是一个不会出现在任何其他表格中的计算值。但是,如果您确实需要经常匹配它,那么您没有理由不能在其上添加索引。您可以在所需的任何列上添加索引。
        猜你喜欢
        • 1970-01-01
        • 2011-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多