powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите разобраться с темой ключевых слов ANY и ALL
27 сообщений из 27, показаны все 2 страниц
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032092
Dante80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Сейчас разбираю тему "Использование ключевых слов SOME (ANY) и ALL с предикатами сравнения"
В данной теме приведено 2 примера:

1. С использованием ANY

"Найти поставщиков компьютеров, моделей которых нет в продаже (то есть модели этих поставщиков отсутствуют в таблице PC)"
SELECT DISTINCT maker
FROM Product
WHERE type = 'pc' AND
NOT model = ANY (SELECT model
FROM PC
);

2. С использованием ALL

"Найти модели и цены портативных компьютеров, стоимость которых превышает стоимость любого ПК"
SELECT DISTINCT model, price
FROM Laptop
WHERE price > ALL (SELECT price
FROM PC
);

Дело в том, что я вроде как понимаю частично что происходит, но никак не могу отличить выполнение первого ключевого слова ANY, от использования ключевого слова ALL.
Помогите разобраться пожалуйста, примеров там очень мало, а в использовании первого примера приводится слишком сложная запись с отрицанием NOT. Из-за этого отрицания никак не могу сравнить первый пример со вторым. Возможно потому что уже 4 часа). Темы изучаю по мере прохождения заданий на сайте, по этому сильно заумных примеров пожалуйста не приводите)

Если вдруг нужен источник, то вот он: http://www.sql-tutorial.ru/ru/book_using_any_all_keywords_with_comparison_predicates.html
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032097
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80
Дело в том, что я вроде как понимаю частично что происходит, но никак не могу отличить выполнение первого ключевого слова ANY, от использования ключевого слова ALL.
Помогите разобраться пожалуйста, примеров там очень мало, а в использовании первого примера приводится слишком сложная запись с отрицанием NOT. Из-за этого отрицания никак не могу сравнить первый пример со вторым.

Я вообще не помню, чтобы где-то было это нужно. Если запросы сложные, то надо понимать, что потом их еще придётся поддерживать.
Первый пример делается обычно через not exists или left join, второй через
Код: sql
1.
where price > (select max(price) from pc)


Зачем городить что-то с any/all, кроме как запутать следующего программиста или завалить на экзамене/собеседовании, решительно не понятно.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032111
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ANY == хоть какой-нибудь

Соответственно WHERE x = ANY (y) эквивалентно WHERE x IN (y) .

ALL == все (любой)

Соответственно WHERE x > ALL (y) эквивалентно WHERE x > MAX(y) .

crutchmaster
Зачем городить что-то с any/all, ..., решительно не понятно.
+100500

Их бы вообще в deprecated - жаль, стандарт не позволяет.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032143
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
...

Соответственно WHERE x > ALL (y) эквивалентно WHERE x > MAX(y) .

...


Нет .
Только в рамках а) двузначной логики и б) при непустом множестве y

Интересно, что Дейт постулирует неправильную по определению работу MIN/MAX в SQL.
MAX по его мысли для пустого множества должен быть равен минимально допустимому значению в домене значений y.
Тогда, при запрете Null-значений для использования реляционных базах и при изменении определения MAX
x > ALL (y) окажется эквивалентным x > MAX(y)
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032152
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby , я ж даю применительно к показанным запросам.

Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT maker
FROM Product
WHERE type = 'pc' AND
NOT model = ANY (SELECT model
                 FROM PC);

эквивалентно
Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT maker
FROM Product
WHERE type = 'pc' AND
NOT model IN (SELECT model
              FROM PC);


и
Код: sql
1.
2.
3.
4.
SELECT DISTINCT model, price
FROM Laptop
WHERE price > ALL (SELECT price
                   FROM PC);

эквивалентно
Код: sql
1.
2.
3.
4.
SELECT DISTINCT model, price
FROM Laptop
WHERE price > (SELECT MAX(price)
               FROM PC);



А насчёт непустого множества и отсутствия NULL в PC - да, есть такое дело.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032164
Dante80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster, я понимаю что ты хотел упростить задачу, но я ввел твой запрос и он вывел на 3 строки больше, чем в ответе который был в примере. Там в каждом из примеров можно вводить свой вариант ответа, попробуй если не веришь.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032165
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
частный случай.

кстати, в техническом плане чаще рассуждают о
замене x op All(y)
на Not Exists( not op(x, y(i)))
в смысле потенциалной эквивалентности.

Это покрывает случай пустого y, но на Null-значениях все равно не даёт эквивалентного результата
из-за третьего логического значения.

Из-за чего Дейту очень сильно хочется поправить в этом месте Кодда.
Но поезд уже очень давно как ушел. Невероятно, что из этого желания что-то получится хоть когда-нибудь.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032184
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80
я понимаю что ты хотел упростить задачу, но я ввел твой запрос и он вывел на 3 строки больше, чем в ответе который был в примере

Это не упрощение задачи, запросы почти эквивалентные, разница только в работе с null, который и так не должен торчать из каждой дырки, чтобы не приходилось потом с ним героически бороться. За 10 лет работы с базами ANY/ALL нигде не видел и он не разу не понадобился, что там и зачем придумали умники в своём туториале - вопрос отдельный.

Dante80
попробуй если не веришь

Не могу, там надо регаться.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032185
Dante80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Я все равно не понимаю, почему я не могу тогда здесь поставить тоже ALL?

SELECT DISTINCT maker
FROM Product
WHERE type = 'pc' AND
NOT model IN (SELECT model
FROM PC);

Он же получается проверит все значения которые соответствуют NOT model?
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032186
Dante80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,

Понимаю, что ты имеешь ввиду о null, но я второй пример из сайта тестил, где был уже твой готовый пример который ты скинул.
Я пример с null и не трогал.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032188
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80
Он же получается проверит все значения которые соответствуют NOT model?

Что такое NOT model? Ты уверен, что такое условие вообще отработает? not x in (...) и x not in (...) не эквивалентны?
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032190
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80
Я пример с null и не трогал.

Какой пример с null? О чём речь?
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032191
Dante80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,

Ну на сайте работает. И под NOT model подразумевается null
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032192
Dante80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster
Dante80
Я пример с null и не трогал.

Какой пример с null? О чём речь?


Речь о первом примере, а ты ответ дал на второй

"второй через
where price > (select max(price) from pc)" - так ты писал в первом своем ответе на мою тему. Я сказал, что второй пример выдает совершенно иной результат. Ты ответил, что они почти эквивалентны и зачем то стал говорить про null из первого примера.

Я в этой теме задал вопрос лишь по теме ANY и ALL, я не знаю как там спустя 10 лет все происходит, но кто мешает мне использовать эти ключевые слова самому?
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032196
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80,

Кстати, в оракле:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT count(1) FROM dual WHERE NOT 1 = ANY (3,4, null) 
>> 0
SELECT count(1) FROM dual WHERE NOT 1 = ANY (3,4)
>> 1
SELECT count(1) FROM dual WHERE 5 > all (3,4, null)
>> 0
SELECT count(1) FROM dual WHERE 5 > all (3,4) 
>> 1

SELECT max(x) FROM (
SELECT 1 x FROM dual UNION ALL
SELECT 2 x FROM dual UNION ALL
SELECT NULL x FROM dual) a
>> 2


Делаем выводы о нужности.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032204
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80,


Dante80
И под NOT model подразумевается null

Под not model подразумевается not ( model = ANY (SELECT model FROM PC ) )

Dante80
Ну на сайте работает

На сайте - это не интересно. Интересно когда на живой бд что-то работает и воспроизводится.

Dante80
Речь о первом примере

Нужны доказательства: исходные данные и запрос.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032208
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80,

вы математику в школе проходили?
там где-то вводят кванторы существования и всеобщности.
SOME (ANY) - это квантор существования
записывают в SQL так:
x op SOME (Y)
где x - сравниваемое значение
op - какой-то из операторов сравнения - >, <, =, <>, >=, <=
Y - множество элементов, с которыми сравнивается значение x
---------------
Пусть x == 5, op == =, а Y - множество значений - (1,0,3,null,77)
предикат, записанный так: 5 = SOME (1,0,3,null,77)
читается так: в множестве значений (1,0,3,null,77) существует такое значение, которое равно 5.
Его истинностное значение - False
Если заменить операцию сравнения на <
5 < SOME (1,0,3,null,77) , то истинностное значение станет True, поскольку в множестве Y==(1,0,3,null,77)
существует элемент 77, который больше 5.
SOME (ANY) эквивалентен набору сравнений через или - OR
истинностное значение 5 < SOME (1,0,3,null,77) точно эквивалентно значению выражения
(5<1 OR 5<0 OR 5<3 OR 5<null OR 5 <77)
-------------------------
ALL - квантор всеобщности, обозначает "для всех" - для всех элементов из Y операция сравнения op
выполняется с истинностным значением true.
Если оставить x = 5, Y заменить на Y=(1,2,3,4), в качестве op выбрать >
то утверждение
5 > ALL (1,2,3,4) истинно, для всех элементов из Y, 5 > каждого из них
Но, если Y = (1,null,3,4), значение предиката становится False, поскольку сравнение со вторым элементов из Y не дает true.
Т.е. 5 > ALL (1,2,3,4) это

(5>1 AND 5>2 AND 5>3 AND 5>4) - ясно, что здесь оно true.

Чаще для выражения смысла ALL используют такую формулировку: в множестве Y не существует такого элемента y,
для которго сравнение 5 op y (5 > y) могло бы дать логическое значение, не равное true
(то есть, истинным оказалось отрицание op - not op).

Такая формулировака используется, чтобы объяснить поведение ALL для случая, когда множество Y пустое.
Для пустого множества утверждение ALL с любой операцией сравнения истинно, так как в таком множестве нет элементов,
на которых сравнение бы могло дать ложный результат, или его отрицание - истинный.

т.е. Y=()
и 5 > ALL () по определению истина, в Y нет элементов, которые при сравнении с 5 могли бы дать результат, не равный true.
Это приводит к эквивалентности
x op ALL (Y)
и not Exists( x not op SOME (Y)) при условии, что в Y нет пропущенных значений - null.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032209
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80
зачем то стал говорить про null из первого примера.

Там нет null. Я тебе говорю, что они разница в работе их с null, см. пример с ораклом.

Dante80
Я в этой теме задал вопрос лишь по теме ANY и ALL

См. пример с запросами из оракла выше. И проблема у тебя не с ANY/ALL, а с тем, что тебя смутил NOT перед условием.
Dante80
я не знаю как там спустя 10 лет все происходит, но кто мешает мне использовать эти ключевые слова самому?

Нууу, например на mysql in (select id from some_table) был неоптимизирован и чтобы получить вменяемую производительность надо было юзать через обычный join. Как на практике будут работать any/all - хз. Возможно, что никак. Однако РСУБД гарантированно хорошо делают join. Делай всё проще, не суй null куда попало, уважай нормализацию, не делай в таблицах структуры, где важен порядок записей. Тогда будешь здоровый, будет сон и аппетит хороший.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032221
Dante80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Я люблю математику, но у меня с ней большие проблемы. Не помню название "кванторы", но знаю что такое знаки сравнения и для чего они применяются. Спасибо что объяснили тему, да еще и поведали что такое кванторы. Теперь могу отличить ALL от ANY. Я до этого всего очень долго копался в СИ и С++, решил временно сменить род обучения так сказать. SQL по проще будет, да и благодаря этому языку столько много узнаешь и изучаешь, аж приятно становится от пополнения и восстановления знаний.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032223
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80
... по проще будет...

нет не будет
если с математикой проблемы - скорее бросайте SQL.

Бросайте всё и немедленно осваивайте объектно ориентированное программирование.
Оно сейчас не предполагает наличия формального образования.
Надо просто заучить набор волшебных паттернов и уметь расставлять кракозябры аннотации.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032228
Dante80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Спасибо за совет, но мне нравится то чем я сейчас занимаюсь.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032334
Dante80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Я сформулировал свой вопрос по данной теме.
Что если будут сравниваться 2 множества, как в данных примерах которые я указывал в теме? Вы привели пример сравнения переменной с множеством, а в какой последовательности будет происходить сравнение двух множеств?

Приведу первый пример из данной темы:

WHERE type = 'pc' AND
NOT model = ANY (SELECT model
FROM PC
);

Сравнивается множество Product.model с множеством из другой таблицы PC.model. Каким образом происходит взаимодействие между этими двумя множествами? Как я предполагаю, берется первый элемент из Product.model и сравнивается с каждым из элементов PC.model? И так по очереди? Меня сам процесс сравнения между множествами интересует в данном примере.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032352
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80,

извини, глубина твоего интереса к математике превышает мои возможности по обучению.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032361
Dante80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Понятно, ну не хочешь, не отвечай
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032489
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80
Меня сам процесс сравнения между множествами интересует в данном примере.

Поставь mysql, сделай таблицы, индексы, сделай explain, покажи, что напишет.
Dante80
И так по очереди?

Это - самый плохой вариант. Можно надеется что бд как-то оптимизирует запрос, но это - не точно.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032498
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80
booby,

Я сформулировал свой вопрос по данной теме.
Что если будут сравниваться 2 множества, как в данных примерах которые я указывал в теме? Вы привели пример сравнения переменной с множеством, а в какой последовательности будет происходить сравнение двух множеств?

Приведу первый пример из данной темы:

WHERE type = 'pc' AND
NOT model = ANY (SELECT model
FROM PC
);

Сравнивается множество Product.model с множеством из другой таблицы PC.model. Каким образом происходит взаимодействие между этими двумя множествами? Как я предполагаю, берется первый элемент из Product.model и сравнивается с каждым из элементов PC.model? И так по очереди? Меня сам процесс сравнения между множествами интересует в данном примере.


Если подселект SELECT model FROM PC так как он тут приведен (без проброса внешнего условия вовнутрь) то да, так или иначе, но на каждую выборку записи основного запроса Мускуль (да и любая иная СУБД) будет производить поиск в множестве значений подзапроса. Оптимизировать тут, как понимаю можно только предвыборку данных подзапроса, сложив например во временную табличку .. опять же зависит от размера.

Любые варианты с OR в списке условий (явно или завуалировано) кмк всегда работают хуже чем инвертированное условие и AND, но такое не всегда возможно. Если OR не велик, то кмк предпочтительнее UNION.
...
Рейтинг: 0 / 0
Помогите разобраться с темой ключевых слов ANY и ALL
    #40032712
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dante80Как я предполагаю, берется первый элемент из Product.model и сравнивается с каждым из элементов PC.model? И так по очереди?да, до первого TRUE в случае ANY

Dante80Что если будут сравниваться 2 множества, как в данных примерах которые я указывал в теме? Вы привели пример сравнения переменной с множеством, а в какой последовательности будет происходить сравнение двух множеств?без ORDER BY для таблицы (множества) порядок не гарантирован в БД, т.е как будет сравнивать БД - сказать определенно нельзя. Скажем так - как лежат данные на "диске" - так и будет сравнивать, а как они лежат - неизвестно.
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите разобраться с темой ключевых слов ANY и ALL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]