MySQL «NOT IN» запрашивает 3 таблицы

У меня 3 курса, класс и оценка. Я хочу сравнить оценку и оценку двух таблиц. если данные в оценке таблицы не существуют в оценке таблицы, тогда данные будут отображаться (выводиться)

таблица и вывод

" select Grade.ID_Courses,Course.ID_Courses,Grade.NAME, Course.NAME, Grade.ID_Courses, Evaluation.NAME, Evaluation.Year, Grade.Year from Grade, Course, Evaluation WHERE Grade.ID_Courses=Course.ID_Courses AND Grade.NAME=JOHN and Grade.Year=1 and Evaluation.NAME=GRADE.NAME and Grade.ID_Courses NOT IN (SELECT ID_Courses FROM Evaluation where NAME=JOHN and Year=1 ) GROUP BY Grade.ID_Courses" 

проблема заключается в том, что имя john не находится в оценке таблицы, тогда нет выхода.

Solutions Collecting From Web of "MySQL «NOT IN» запрашивает 3 таблицы"

Избегайте NOT IN как чума, если

 SELECT ID_Courses FROM Evaluation where `NAME`='JOHN' and Year=1 

может когда-либо содержать NULL. Вместо этого используйте NOT EXISTS или Left Joins

использовать явные объединения, а не стиль стиля 1980-х годов, используя WHERE

Чтобы проиллюстрировать страдания НЕ В:

Ошибка SQL NOT IN ()

 create table mStatus ( id int auto_increment primary key, status varchar(10) not null ); insert mStatus (status) values ('single'),('married'),('divorced'),('widow'); create table people ( id int auto_increment primary key, fullName varchar(100) not null, status varchar(10) null ); 

блок 1:

 truncate table people; insert people (fullName,`status`) values ('John Henry','single'); select * from mstatus where `status` not in (select status from people); 

** 3 строки, как ожидалось **

Chunk2:

 truncate table people; insert people (fullName,`status`) values ('John Henry','single'),('Kim Billings',null); select * from mstatus where status not in (select status from people); 

нет строк, да?

Очевидно, что это «неверно». Это связано с использованием SQL-ключами трехзначной логики, обусловленной существованием NULL, без значения, указывающего отсутствие (UNKNOWN) информации. С NOT IN, Chunk2 он переводится следующим образом:

 status NOT IN ('married', 'divorced', 'widowed', NULL) 

Это эквивалентно:

 NOT(status='single' OR status='married' OR status='widowed' OR status=NULL) 

Выражение «status = NULL» оценивается UNKNOWN и, согласно правилам трехзначной логики, NOT UNKNOWN также оценивает UNKNOWN. В результате все строки отфильтровываются, и запрос возвращает пустой набор.

Возможные решения:

 select s.status from mstatus s left join people p on p.status=s.status where p.status is null 

или использовать not exists

Попробуйте использовать соединения для решения этой проблемы.

 select g.*, e.*,c.* from grade g inner join evaluation e on g.ID_COURSES <> e.ID_COURSES and g.year <> e.year inner join COURSE c on c.ID_COURSES = g.ID_COURSES ;