#sql #mysql
#sql #mysql
Вопрос:
У меня возникли несколько проблем с запросом к БД.
У меня есть две таблицы, students (поля: FirstName, LastName, StdSSN) и teachers (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
Которая выдает мне список всех студентов со многими повторяющимися значениями, поэтому я немного застрял здесь. Как я могу изменить что-либо, чтобы возвращать список всех студентов, которые не являются преподавателями? Я думал о ВНУТРЕННЕМ / ВНЕШНЕМ / САМОСОЕДИНЕНИИ и играл с этим несколько часов, но все усложнилось, и я ничего не добился, так что я в значительной степени сдался.
Кто-нибудь может дать мне какой-нибудь совет? Я видел запрос раньше, и он был довольно простым, но у меня где-то произошел сбой.
Комментарии:
1. Это частично, это для класса базы данных колледжа, полный запрос намного сложнее, и я его решил, я просто не мог понять, как исключить студентов, которые также являются преподавателями.
Ответ №1:
Использование НЕ В
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)
Использование LEFT JOIN / РАВНО НУЛЮ
SELECT s.*
FROM STUDENTS s
LEFT JOIN TEACHERS t ON t.tssn = s.stdssn
WHERE t.column IS NULL
Я использовал «column» для любого столбца в TEACHERS, отличного от того, к которому присоединен.
Сравнение:
Если сравниваемые столбцы обнуляются (значение может быть нулевым), лучшим выбором является NOT EXISTS. В противном случае лучшим выбором (для MySQL) является LEFT JOIN/РАВНО NULL.
Комментарии:
1. @Eric Petroelje:
MINUS
зависит от Oracle по сравнению с ANSIEXCEPT
(иEXCEPT ALL
). Насколько мне известно, MySQL также не поддерживает.2. Большое вам спасибо за помощь, я потратил на это около 3 часов. Я собираюсь прочитать о соединениях позже этим вечером.
3. @user591162: Хороший учебник по объединению: codinghorror.com/blog/2007/10 /…