Как с работой. Мой вложенный запрос возвращает только 3 кортежа. Но в сочетании с внешним запросом он (внешний запрос) возвращает 736 кортежей. И это то же самое количество кортежей, если я напишу запрос, скажем, выберите p.height from ... где True.

Я читаю книги, в которых говорится, что это только возвращает истину, что имеет смысл в моем случае. Также прочитайте несколько онлайн-статей, где существует возвращает True, но внешний запрос выбирает только из результатов вложенного запроса.

MySQL - верстак

select p.height
from world_cup.player as p
where Exists(select q.height from world_cup.player as q where q.height = 165)
order by p.height;

Фактическим результатом должны были стать эти три кортежа 165, 165, 165 (по данным книги и интернет-ресурсов)

0
Nameet Nameet 27 Май 2019 в 22:50

2 ответа

Лучший ответ

Да, я должен проверить себя, и то, что вы сказали, правильно. Однако по ссылке, на которую вы ссылаетесь здесь, https://www.w3schools.com/sql/ sql_exists.asp, вам не хватает одного условия, при котором вам нужно иметь p.height=q.height перед q.height=165 для правильного возврата значений. Следовательно, ваш запрос должен быть таким:

SELECT p.height
FROM world_cup.player AS p
WHERE EXISTS (
              SELECT q.height FROM world_cup.player AS q 
               WHERE p.height=q.height -- you're missing this condition
                 AND q.height = 165
              )
ORDER BY p.height;

Вот ссылка: https: //dev.mysql. ком / DOC / RefMan / 8.0 / о / существует - и - не - существует - subqueries.html

"Для предыдущего примера, если t2 содержит какие-либо строки, даже строки, содержащие только значения NULL, условие EXISTS имеет значение TRUE."

0
tcadidot0 28 Май 2019 в 03:53

EXISTS имеет значение true, если и только если подзапрос возвращает хотя бы один кортеж.

Таким образом, пока есть хотя бы один игрок ростом 165, ваш EXISTS возвращает true для всех кортежей внешнего запроса. Если такого игрока не было, то в результате вы получили пустой сет. Таким образом, вы видите, что ваше использование довольно статично и, возможно, не имеет смысла использовать его таким образом, если только это не то, что вы намеревались.

Обычно подзапрос к EXISTS коррелируется, то есть значение внешнего запроса появляется в предложении WHERE внутреннего запроса, так что результаты EXISTS могут различаться от кортежа к кортежу внешнего запроса.

Если вам нужен игрок с ростом 165, просто используйте выражение равенства в предложении WHERE.

SELECT p.height
       FROM world_cup.player as p
       WHERE p.height = 165;

ORDER BY p.height тоже бесполезен, так как они все одинаковые.

0
sticky bit 27 Май 2019 в 20:18