Я новичок в SQL и пытался решить вопрос о SQLzoo
Select the code that would show the countries with a greater GDP than any country in Africa (some countries may have NULL gdp values).
Мой ответ на вопрос был
SELECT name FROM bbc
WHERE gdp > ALL (SELECT gdp
FROM bbc
WHERE region = 'Africa'
AND gdp<>NULL)
Но правильный ответ на сайте
SELECT name FROM bbc
WHERE gdp > (SELECT MAX(gdp)
FROM bbc
WHERE region = 'Africa')
Я не понимаю, почему выбранный мной ответ неправильный
Я не думаю, что ваш ответ неправильный. Сравнение с агрегатом MAX() могло бы быть немного более эффективным.
@Shadow Я использую тот, который используется sqlzoo. Двигатели
@Corion Но когда я запускаю Query, они оба дают разные результаты. Я не понимаю причины этого
@sql_learner - ваша задача выбрать правильный. Но не выбирайте конфликтующие.
@Shadow Да, конечно, с этого момента мы будем заботиться о вас :)
Ах - оператор «ВСЕ» (w3schools.com/sql/sql_any_all.asp) возвращает истину, если ВСЕ строки соответствуют критериям, и не возвращает само значение. Это могло быть так. Спасибо, что научили меня этому оператору!


Проблема с выбранным вами решением > all (...) заключается в том, что некоторые значения gdp равны нулю.
Когда вы сравниваете ненулевое значение с нулевым, результат будет нулевым, если вы не используете нулевой безопасный оператор, такой как is null.
Я думал, что gdp<>NULL позаботится об этой части
Есть ли разница между gdp is not null и gdp<>NULL
@sql_learner Вместо <> можно использовать нулевой безопасный оператор <=>. например: gdp <=> null Ссылка: dev.mysql.com/doc/refman/8.0/en/…
@dnoeth Спасибо, что сообщили мне об альтернативном способе использования MIN / MAX.
@MadhurBhaiya Да, конечно, я тоже попробую
Мой первый комментарий был неправильным. Сравнение gdp<>NULL возвращает UNKNOWN для каждой строки, поэтому подзапрос не возвращает ни одной строки, а сравнение > ALL возвращает каждую строку в вашей таблице. Но подзапрос MAX не вернет никакой строки, если он вернет NULL.
Удалены конфликтующие теги товаров. Пожалуйста, добавьте обратно тот, который вы действительно используете.