MySQL 5.5数据库查询帮助

时间:2011-01-31 20:30:20

标签: sql mysql

我在使用数据库查询时遇到了一些问题。

我有两个表,学生(字段:FirstName,LastName,StdSSN)和教师(TFirstName,TLastName,TSSN),我已经为此示例剥离了这些表。我需要执行一个查询,该查询将返回除了教师本身的学生以外的所有学生。

我有查询

SELECT student.FirstName, student.LastName
FROM `student`,`teachers`
WHERE student.StdSSN=teachers.TSSN

这给了我一份所有老师的名单,这些老师也是学生,但没有向我提供非教师的学生名单,所以我尝试改为:

SELECT student.FirstName, student.LastName
FROM `student`,`teachers`
WHERE student.StdSSN!=teachers.TSSN

这给了我一份包含许多重复值的学生的列表,所以我有点卡在这里。如何更改内容以返回所有非教师学生的列表?我在想INNER / OUTER / SELF-JOIN并且玩了几个小时,但事情变得复杂,我没有做任何事情,所以我几乎放弃了。

有人可以给我任何建议吗?我之前确实看过这个查询而且非常简单,但我在某处失败了。

1 个答案:

答案 0 :(得分:4)

使用NOT IN

SELECT s.*
  FROM STUDENTS s
 WHERE s.stdssn NOT IN (SELECT t.tssn
                          FROM TEACHERS t)

使用NOT EXISTS

SELECT s.*
  FROM STUDENTS s
 WHERE NOT EXISTS (SELECT NULL
                     FROM TEACHERS t
                    WHERE t.tssn = s.stdssn)

使用LEFT JOIN / IS NULL

   SELECT s.*
     FROM STUDENTS s
LEFT JOIN TEACHERS t ON t.tssn = s.stdssn
    WHERE t.column IS NULL

我在“教师”中的任何专栏都使用了“专栏”,而不是加入的专栏。

比较

If the column(s) compared are nullable (value can be NULL), NOT EXISTS is the best choice。否则,LEFT JOIN / IS NULL是最佳选择(对于MySQL)。