Справка по запросу базы данных MySQL 5.5

#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 по сравнению с ANSI EXCEPT EXCEPT ALL ). Насколько мне известно, MySQL также не поддерживает.

2. Большое вам спасибо за помощь, я потратил на это около 3 часов. Я собираюсь прочитать о соединениях позже этим вечером.

3. @user591162: Хороший учебник по объединению: codinghorror.com/blog/2007/10 /…