Sql 使用多对多关系联接表

Sql 使用多对多关系联接表,sql,left-join,inner-join,right-join,Sql,Left Join,Inner Join,Right Join,我试图通过使用这些表来理解连接。我正试图加入他们,这样我就可以得到所有学生在分配给他们的各种测验/测试中的所有分数。有些学生对某些事件没有分数,因此不会出现在标准的内部联接查询中(如预期的那样)。然而,我希望所有学生都出现,不管是否为空,对于所有学生都可以参加的每一个活动。然而,我只能成功地为分数表中记录了分数的学生返回数据。我不确定我做错了什么,也不知道该怎么办 assuming these 3 tables: student - | student_id | name | sex

我试图通过使用这些表来理解连接。我正试图加入他们,这样我就可以得到所有学生在分配给他们的各种测验/测试中的所有分数。有些学生对某些事件没有分数,因此不会出现在标准的内部联接查询中(如预期的那样)。然而,我希望所有学生都出现,不管是否为空,对于所有学生都可以参加的每一个活动。然而,我只能成功地为分数表中记录了分数的学生返回数据。我不确定我做错了什么,也不知道该怎么办

assuming these 3 tables:
student - | student_id | name       | sex   | - 31 students
score   - | event_id   | student_id | grade | - 173 total grades
event   - | event_id   | type       | date  | - 6 events

this means there could be a total of 186 entries in the grade book,
6 for every student, some or none of which could be NULL.

现在我想我知道为什么它不起作用了,只是不知道它周围的解决方案。左联接和右联接的概念是,如果指定表中的记录不匹配,则将在需要时附加适当的空值。然而,由于所有学生至少有一个年级,技术上来说,正确的加入是令人满意的,因为每个学生至少有一个匹配记录。我可以看出,修改我的事件和分数之间的连接可以很容易地解决这个问题,但我只是不确定我在做什么

首先,您需要创建所有186个选项事件/学生

The query I was trying:
SELECT st.student_id, st.name, e.date, e.type, sc.score
FROM event e LEFT JOIN score sc
ON e.event_id = sc.event_id
RIGHT JOIN student st
ON sc.student_id = st.student_id
然后使用
LEFT JOIN
尝试为每个事件分配
分数

SELECT *
FROM student
CROSS JOIN event   

因为您已经在
左侧安装了186,如果在
score
表中找不到匹配项,则这些组合将具有空值。从student.student\u id=score.student\u id开始,从student.student\u id开始左连接。然后从score.event\u id=event.event\u id的分数开始左连接。右连接与左连接相同,表在查询中重新排序。啊,看,这就是我要找的,我不确定如何构建初始数据集,然后根据剩下的表进行连接,生成我想要的数据。我读过的任何一本书都没有提到交叉连接。
CROSS-JOIN
相当于student,event
的旧符号
,但至少根据我自己的经验,最好使用该语法来保持相同的
内部连接
格式
交叉连接
,是你不会经常碰到的东西。我有点惊讶,它不会以某种方式与SQL书接触。哦,我的上帝。我甚至没有意识到这种关联。我被这样一个事实深深地吸引住了,我认为我不理解左对右,以至于我完全没有意识到我可以像那样使用内部连接语法。在这种情况下,交叉连接被覆盖,我只是没有足够的注意。谢谢大家,这完全消除了所有的困惑每个人都得从某个地方开始。
SELECT *
FROM student
CROSS JOIN event 
LEFT JOIN score
  ON score.student_id = student.student_id 
 AND score.event_id = event.event_id