gpt4 book ai didi

sql - 不明白为什么在sql中过滤需要内部连接

转载 作者:行者123 更新时间:2023-12-05 01:02:53 24 4
gpt4 key购买 nike

我有以下表格:

基本上我使用连接表students_courses在学生和类(class)之间建立了many2many关系

enter image description here

以下是填充到表中的一些数据:
学生们:

enter image description here

培训类

enter image description here

学生类(class):

enter image description here

所以基本上我想为给定的学生选择 full_name 和 c_id。因此,例如对于 id=3 的学生,我将拥有 Aurica 5 和 Aurica 6。

我的第一种方法是写:

select s.full_name,sc.c_id from students s, students_courses sc
where sc.s_id=3

但我得到这个:
Aurica 5
Aurica 6
Aurica 5
Aurica 6
Aurica 5
Aurica 6

所以它被students_courses表的行数复制了。现在我不确定为什么会发生这种情况。

如果我是一个 SQL 解析器,我会像这样解析它:
“从students_courses 中获取c_id,从students 中获取full_name,如果students_course 行尊重where 过滤器,则显示它们”

使用 join 不起作用,但我真的不明白为什么需要内部连接。
select s.full_name, sc.c_id from students s
inner join students_courses sc
on sc.s_id=s.id and s.id=3;

解释一下 SQL 解析器如何解释第一个 sql 以及为什么 with join 起作用。

谢谢,

最佳答案

当您从两个表中选择信息时,它所做的是所有记录的叉积,然后查找满足 where 子句的所有记录。您在学生表中有 3 条记录

id | full_name
---+----------
3 | Aurica
4 | Aurica
5 | Aurica

以及 student_courses 表中的 6 条记录。
s_is | c_id
-----+-----
3 | 5
3 | 6
4 | 7
4 | 8
5 | 9
5 | 10

因此,在您的 where 语句之前,它会创建 18 条不同的记录。所以很容易看出我将包括所有列。
s.id | s.full_name | sc.s_id | sc.c_id
-----+-------------+---------+--------
3 | Aurica | 3 | 5
3 | Aurica | 3 | 6
3 | Aurica | 4 | 7
3 | Aurica | 4 | 8
3 | Aurica | 5 | 9
3 | Aurica | 5 | 10
4 | Aurica | 3 | 5
4 | Aurica | 3 | 6
4 | Aurica | 4 | 7
4 | Aurica | 4 | 8
4 | Aurica | 5 | 9
4 | Aurica | 5 | 10
5 | Aurica | 3 | 5
5 | Aurica | 3 | 6
5 | Aurica | 4 | 7
5 | Aurica | 4 | 8
5 | Aurica | 5 | 9
5 | Aurica | 5 | 10

从那里它只显示 cs.id=3 的那些
s.full_name | sc.c_id
------------+--------
Aurica | 5
Aurica | 6
Aurica | 5
Aurica | 6
Aurica | 5
Aurica | 6

您比较了 sc.s_id=s.id 的值的第二个查询,只显示那些值相同的,以及 c_id=3

关于sql - 不明白为什么在sql中过滤需要内部连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25596418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com