|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Всем привет! Сейчас разбираю тему "Использование ключевых слов 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 03:46 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Dante80 Дело в том, что я вроде как понимаю частично что происходит, но никак не могу отличить выполнение первого ключевого слова ANY, от использования ключевого слова ALL. Помогите разобраться пожалуйста, примеров там очень мало, а в использовании первого примера приводится слишком сложная запись с отрицанием NOT. Из-за этого отрицания никак не могу сравнить первый пример со вторым. Я вообще не помню, чтобы где-то было это нужно. Если запросы сложные, то надо понимать, что потом их еще придётся поддерживать. Первый пример делается обычно через not exists или left join, второй через Код: sql 1.
Зачем городить что-то с any/all, кроме как запутать следующего программиста или завалить на экзамене/собеседовании, решительно не понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 04:12 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
ANY == хоть какой-нибудь Соответственно WHERE x = ANY (y) эквивалентно WHERE x IN (y) . ALL == все (любой) Соответственно WHERE x > ALL (y) эквивалентно WHERE x > MAX(y) . crutchmaster Зачем городить что-то с any/all, ..., решительно не понятно. Их бы вообще в deprecated - жаль, стандарт не позволяет. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 07:51 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Akina ... Соответственно WHERE x > ALL (y) эквивалентно WHERE x > MAX(y) . ... Нет . Только в рамках а) двузначной логики и б) при непустом множестве y Интересно, что Дейт постулирует неправильную по определению работу MIN/MAX в SQL. MAX по его мысли для пустого множества должен быть равен минимально допустимому значению в домене значений y. Тогда, при запрете Null-значений для использования реляционных базах и при изменении определения MAX x > ALL (y) окажется эквивалентным x > MAX(y) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 11:03 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
booby , я ж даю применительно к показанным запросам. Код: sql 1. 2. 3. 4. 5.
эквивалентно Код: sql 1. 2. 3. 4. 5.
и Код: sql 1. 2. 3. 4.
эквивалентно Код: sql 1. 2. 3. 4.
А насчёт непустого множества и отсутствия NULL в PC - да, есть такое дело. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 11:29 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
crutchmaster, я понимаю что ты хотел упростить задачу, но я ввел твой запрос и он вывел на 3 строки больше, чем в ответе который был в примере. Там в каждом из примеров можно вводить свой вариант ответа, попробуй если не веришь. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 11:57 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Akina, частный случай. кстати, в техническом плане чаще рассуждают о замене x op All(y) на Not Exists( not op(x, y(i))) в смысле потенциалной эквивалентности. Это покрывает случай пустого y, но на Null-значениях все равно не даёт эквивалентного результата из-за третьего логического значения. Из-за чего Дейту очень сильно хочется поправить в этом месте Кодда. Но поезд уже очень давно как ушел. Невероятно, что из этого желания что-то получится хоть когда-нибудь. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 11:57 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Dante80 я понимаю что ты хотел упростить задачу, но я ввел твой запрос и он вывел на 3 строки больше, чем в ответе который был в примере Это не упрощение задачи, запросы почти эквивалентные, разница только в работе с null, который и так не должен торчать из каждой дырки, чтобы не приходилось потом с ним героически бороться. За 10 лет работы с базами ANY/ALL нигде не видел и он не разу не понадобился, что там и зачем придумали умники в своём туториале - вопрос отдельный. Dante80 попробуй если не веришь Не могу, там надо регаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:27 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Akina, Я все равно не понимаю, почему я не могу тогда здесь поставить тоже ALL? SELECT DISTINCT maker FROM Product WHERE type = 'pc' AND NOT model IN (SELECT model FROM PC); Он же получается проверит все значения которые соответствуют NOT model? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:28 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
crutchmaster, Понимаю, что ты имеешь ввиду о null, но я второй пример из сайта тестил, где был уже твой готовый пример который ты скинул. Я пример с null и не трогал. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:31 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Dante80 Он же получается проверит все значения которые соответствуют NOT model? Что такое NOT model? Ты уверен, что такое условие вообще отработает? not x in (...) и x not in (...) не эквивалентны? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:34 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Dante80 Я пример с null и не трогал. Какой пример с null? О чём речь? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:35 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
crutchmaster, Ну на сайте работает. И под NOT model подразумевается null ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:36 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
crutchmaster Dante80 Я пример с null и не трогал. Какой пример с null? О чём речь? Речь о первом примере, а ты ответ дал на второй "второй через where price > (select max(price) from pc)" - так ты писал в первом своем ответе на мою тему. Я сказал, что второй пример выдает совершенно иной результат. Ты ответил, что они почти эквивалентны и зачем то стал говорить про null из первого примера. Я в этой теме задал вопрос лишь по теме ANY и ALL, я не знаю как там спустя 10 лет все происходит, но кто мешает мне использовать эти ключевые слова самому? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:38 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Dante80, Кстати, в оракле: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Делаем выводы о нужности. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:43 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Dante80, Dante80 И под NOT model подразумевается null Под not model подразумевается not ( model = ANY (SELECT model FROM PC ) ) Dante80 Ну на сайте работает На сайте - это не интересно. Интересно когда на живой бд что-то работает и воспроизводится. Dante80 Речь о первом примере Нужны доказательства: исходные данные и запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:48 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:58 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Dante80 зачем то стал говорить про null из первого примера. Там нет null. Я тебе говорю, что они разница в работе их с null, см. пример с ораклом. Dante80 Я в этой теме задал вопрос лишь по теме ANY и ALL См. пример с запросами из оракла выше. И проблема у тебя не с ANY/ALL, а с тем, что тебя смутил NOT перед условием. Dante80 я не знаю как там спустя 10 лет все происходит, но кто мешает мне использовать эти ключевые слова самому? Нууу, например на mysql in (select id from some_table) был неоптимизирован и чтобы получить вменяемую производительность надо было юзать через обычный join. Как на практике будут работать any/all - хз. Возможно, что никак. Однако РСУБД гарантированно хорошо делают join. Делай всё проще, не суй null куда попало, уважай нормализацию, не делай в таблицах структуры, где важен порядок записей. Тогда будешь здоровый, будет сон и аппетит хороший. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:59 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
booby, Я люблю математику, но у меня с ней большие проблемы. Не помню название "кванторы", но знаю что такое знаки сравнения и для чего они применяются. Спасибо что объяснили тему, да еще и поведали что такое кванторы. Теперь могу отличить ALL от ANY. Я до этого всего очень долго копался в СИ и С++, решил временно сменить род обучения так сказать. SQL по проще будет, да и благодаря этому языку столько много узнаешь и изучаешь, аж приятно становится от пополнения и восстановления знаний. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 13:21 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Dante80 ... по проще будет... нет не будет если с математикой проблемы - скорее бросайте SQL. Бросайте всё и немедленно осваивайте объектно ориентированное программирование. Оно сейчас не предполагает наличия формального образования. Надо просто заучить набор волшебных паттернов и уметь расставлять кракозябры аннотации. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 13:28 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
booby, Спасибо за совет, но мне нравится то чем я сейчас занимаюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 13:36 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
booby, Я сформулировал свой вопрос по данной теме. Что если будут сравниваться 2 множества, как в данных примерах которые я указывал в теме? Вы привели пример сравнения переменной с множеством, а в какой последовательности будет происходить сравнение двух множеств? Приведу первый пример из данной темы: WHERE type = 'pc' AND NOT model = ANY (SELECT model FROM PC ); Сравнивается множество Product.model с множеством из другой таблицы PC.model. Каким образом происходит взаимодействие между этими двумя множествами? Как я предполагаю, берется первый элемент из Product.model и сравнивается с каждым из элементов PC.model? И так по очереди? Меня сам процесс сравнения между множествами интересует в данном примере. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 15:59 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Dante80, извини, глубина твоего интереса к математике превышает мои возможности по обучению. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 16:27 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
booby, Понятно, ну не хочешь, не отвечай ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 16:42 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Dante80 Меня сам процесс сравнения между множествами интересует в данном примере. Поставь mysql, сделай таблицы, индексы, сделай explain, покажи, что напишет. Dante80 И так по очереди? Это - самый плохой вариант. Можно надеется что бд как-то оптимизирует запрос, но это - не точно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 04:46 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 09:03 |
|
Помогите разобраться с темой ключевых слов ANY и ALL
|
|||
---|---|---|---|
#18+
Dante80Как я предполагаю, берется первый элемент из Product.model и сравнивается с каждым из элементов PC.model? И так по очереди?да, до первого TRUE в случае ANY Dante80Что если будут сравниваться 2 множества, как в данных примерах которые я указывал в теме? Вы привели пример сравнения переменной с множеством, а в какой последовательности будет происходить сравнение двух множеств?без ORDER BY для таблицы (множества) порядок не гарантирован в БД, т.е как будет сравнивать БД - сказать определенно нельзя. Скажем так - как лежат данные на "диске" - так и будет сравнивать, а как они лежат - неизвестно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2020, 20:09 |
|
|
start [/forum/topic.php?all=1&fid=47&tid=1828255]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
66ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 261ms |
total: | 428ms |
0 / 0 |