Поэтому я пытаюсь понять состояние Exists в SQL.Я знаю, что он возвращает True, если существует один или несколько кортежей - PullRequest
0 голосов
/ 27 мая 2019

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

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

mysql-workbench

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 (согласно книге и онлайн-ресурсам)

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Да, я должен проверить себя, и то, что вы сказали, правильно.Однако из ссылки, на которую вы ссылаетесь здесь 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.com/doc/refman/8.0/en/exists-and-not-exists-subqueries.html

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

0 голосов
/ 27 мая 2019

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

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

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

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

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

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

...