我在使用数据库查询时遇到了一些问题。
我有两个表,学生(字段: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并且玩了几个小时,但事情变得复杂,我没有做任何事情,所以我几乎放弃了。
有人可以给我任何建议吗?我之前确实看过这个查询而且非常简单,但我在某处失败了。
答案 0 :(得分:4)
SELECT s.*
FROM STUDENTS s
WHERE s.stdssn NOT IN (SELECT t.tssn
FROM TEACHERS t)
SELECT s.*
FROM STUDENTS s
WHERE NOT EXISTS (SELECT NULL
FROM TEACHERS t
WHERE t.tssn = s.stdssn)
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)。