Mysql 对两个表进行SQL查询;

Mysql 对两个表进行SQL查询;,mysql,sql,Mysql,Sql,数据库如下: 我想找到“大卫教授”班上的所有学生。但是,查找结果是: Select Student.name from Student, Teacher where Teacher.s_id =Student.id and Teacher.name="Prof. David"; +------+ | name | +------+ | Tom | | John | | Mary | | Tom | | John | | Mary | +------+ 我想结果应该是“汤姆”和“约翰”。有什

数据库如下:

我想找到“大卫教授”班上的所有学生。但是,查找结果是:

Select Student.name from Student, Teacher where Teacher.s_id =Student.id and Teacher.name="Prof. David";
+------+
| name |
+------+
| Tom  |
| John |
| Mary |
| Tom  |
| John |
| Mary |
+------+

我想结果应该是“汤姆”和“约翰”。有什么问题吗

问题是您有两个表,并且您正在使用查询对这些表执行笛卡尔连接。因此,您在结果中得到3x2=6行,其中每个教师显示所有3名学生的姓名。必须根据架构中的外键关系以逻辑方式联接表

例如:


从A.id=B.A_id上的联接B中选择A.field1、B.field2

问题是您有两个表,并且您正在使用查询对这些表执行笛卡尔联接。因此,您在结果中得到3x2=6行,其中每个教师显示所有3名学生的姓名。必须根据架构中的外键关系以逻辑方式联接表

例如:


从A.id=B.A_id上的联接B中选择A.field1、B.field2
学生
教师
之间没有联接条件,您将得到A(来自
学生
的所有记录与来自
教师
的所有记录相结合)

你可能是说:

SELECT
    Student.name
FROM Student s
JOIN Teacher t
  ON t.s_id = s.id
WHERE Teacher.name="Prof. David";

对于SQL新手,我强烈建议显式使用
JOIN
LEFT JOIN
等,而不是隐式地加入
WHERE
子句。这将有助于减少您执行的意外笛卡尔积的数量。

如果
学生
教师
之间没有联接条件,您将得到一个(来自
学生
的所有记录与来自
教师
的所有记录相结合)

你可能是说:

SELECT
    Student.name
FROM Student s
JOIN Teacher t
  ON t.s_id = s.id
WHERE Teacher.name="Prof. David";

对于SQL新手,我强烈建议显式使用
JOIN
LEFT JOIN
等,而不是隐式地加入
WHERE
子句。这将有助于减少您执行的意外笛卡尔积的数量。

要了解问题所在,请尝试以下操作:

Select Student.name, Teacher.name from Student, Teacher
你会得到一个结果,每个学生都和每个老师结合在一起,不管一个和另一个有没有关系。您需要添加一个条件来检查教师和学生是否相关:

Select Student.name, Teacher.name from Student, Teacher where Teacher.s_id = Student.id
一旦你有了这些,你就可以添加更多的条件,比如只列出某个老师的学生

Select Student.name from Student, Teacher where Teacher.s_id = Student.id and Teacher.name=...

要查看问题所在,请尝试以下操作:

Select Student.name, Teacher.name from Student, Teacher
你会得到一个结果,每个学生都和每个老师结合在一起,不管一个和另一个有没有关系。您需要添加一个条件来检查教师和学生是否相关:

Select Student.name, Teacher.name from Student, Teacher where Teacher.s_id = Student.id
一旦你有了这些,你就可以添加更多的条件,比如只列出某个老师的学生

Select Student.name from Student, Teacher where Teacher.s_id = Student.id and Teacher.name=...

您需要向where添加join子句。我想你是想挑选在某个班级里有某位老师的学生。例如,如果您有:

table Student with columns: student_id, name
table Teacher with columns: teacher_id, name
table Class with columns: class_id, class_name, teacher_id
table Class_Assignment with columns class_id, student_id
那么您的查询将是:

Select Student.name from Student, teacher, class_assignment
   where Student.student_id = class_assignment.student_id
   and Teacher.teacher_id = class_assignment.teacher_id
   and Teacher.name="Prof. David";

您需要向where添加join子句。我想你是想挑选在某个班级里有某位老师的学生。例如,如果您有:

table Student with columns: student_id, name
table Teacher with columns: teacher_id, name
table Class with columns: class_id, class_name, teacher_id
table Class_Assignment with columns class_id, student_id
那么您的查询将是:

Select Student.name from Student, teacher, class_assignment
   where Student.student_id = class_assignment.student_id
   and Teacher.teacher_id = class_assignment.teacher_id
   and Teacher.name="Prof. David";

这实际上适用于连接:“where Teacher.s_id=Student.id和Teacher.name=“Prof.David”。它正确返回“Tom”和“John”,而不使用“join”“。您可以隐式地加入WHERE子句,但我不建议这样做。如果需要进行左连接,会发生什么情况?如果您的WHERE标准有OR语句,该怎么办?有很多事情可能会出错,显式使用JOIN将有助于减少事故。@user697911-为了便于讨论,这里有一个来自不同StackExchange的线程:很高兴知道。谢谢。这实际上适用于联接:“where Teacher.s_id=Student.id和Teacher.name=“Prof.David”。它正确返回“Tom”和“John”,而不使用“联接”“。您可以隐式地加入WHERE子句,但我不建议这样做。如果需要进行左连接,会发生什么情况?如果您的WHERE标准有OR语句,该怎么办?有很多事情可能会出错,显式使用JOIN将有助于减少事故。@user697911-为了便于讨论,这里有一个来自不同StackExchange的线程:很高兴知道。非常感谢。