繁体   English   中英

使用联接的SQL查询

[英]Sql Query Using Joins

我有2张桌子-学生,考试

学生表架构:

id  Name  Course
1   Kavi   Dr.
2   Priya  Engg.

考试表架构:

Examid Student_id  Exam Date
1        1          22-03-2014
2        2          23-04-2014
3        1          24-04-2014

我的要求是,我需要加入这2个表,以便可以访问该表中的所有列。 到目前为止,我已经尝试使用Innerjoin查询,但我得到的结果是

id  Name  Course
1   Kavi   Dr.
2   Priya  Engg.
1   1      22-03-2014
2   2      23-04-2014

但我需要它,

id Name Course Exam Date
1  Kavi  Dr.    22-03-2014
1  Kavi  Dr.    24-04-2014
2  Priya Engg.  23-04-2014

请帮助!

编辑:

SELECT *
FROM STUDENT S INNER JOIN
     EXAM E
     ON S.id=E.Student_id 

我将给您查询,但首先您需要花一点时间来了解select语句的工作方式。

运行select语句时,您可以想象它是定义一个完全临时的表,该表仅在查找内容时存在。 这就是众所周知的查询结果。

您选择的列列表实际上成为新表的列。 “ FROM”决定使用哪些表来映射那些列。 “ WHERE”和“ HAVING”子句决定了在确定要包括的行时引擎应使用什么规则。

那么,您想要结果中的哪些列?

  • 学生卡
  • 学生姓名
  • 学生课程
  • 考试日期

您正在从“学生”和“考试”表中进行选择,但是您希望根据学生ID将行“合并”(这是JOIN的用处-您应该查看此内容以更好地了解JOIN的工作方式)

最后,听起来像您想要一切,所以没有WHERE / HAVING子句。

因此,您的查询应如下所示:

SELECT student.id, student.Name, student.Course, exam.Date
  FROM student
  JOIN exam ON student.id = exam.Student_id

现在,请注意,您应该为列保持一致的命名结构。 我建议您始终以小写字母开头(因此应该是student.course),就我个人而言,我始终避免在数据库定义中使用大写字母。 至少,以大写字母开头的内容通常表示编程领域中的类或对象名称

听起来您有兴趣处理重复项。 您还想研究关键词“ DISTINCT”和“ GROUP BY”。

另外...问问题时,您需要提供更多信息。 解释一下您尝试过的内容。 有组织地解释所有要求和目标。 你明白了。

试试这个查询

SELECT s.*, e.exam_date FROM student_tbl s
JOIN exam_tbl e ON e.student_id = s.id

试试这个

SELECT st.id,st.name,st.course,ex.date FROM student AS st 
LEFT JOIN exam AS ex ON ex.student_id=st.id

试试这个查询:

SELECT Student.id ,Student.Name,Student.Course,`Exam.Exam Date`
FROM Student
INNER JOIN EXAM
ON Student.id=EXAM.Student_id;
SELECT
    S.id, S.Name, S.Course, `E.Exam Date`
FROM
    Student S, Exam E
WHERE
    S.id = E.Student_id

我仍然觉得您的表上存在严重的设计缺陷-没有表将课程定义为从中获取课程信息(例如名称)的实体。 如果您能够进行一些标准化,则对您有益。

我相信您的查询问题很细微。 查询本身是正确的,因此这是您想要的:

SELECT *
FROM STUDENT S INNER JOIN
     EXAM E
     ON S.id=E.Student_id 

但是,不知何故,您得到的是cross join而不是inner join 这可能是因为您确实在执行:

SELECT *
FROM STUDENT S INNER JOIN
     EXAM E

在MySQL中, on子句是可选的,因此不会出错。 如果是这样,只需添加on子句即可解决此问题。

注意:这可能是由查询中的分号引起的:

SELECT *
FROM STUDENT S INNER JOIN
     EXAM E;
     ON S.id=E.Student_id 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM