|
Помогите разобраться с темой ключевых слов 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 |
|
|
start [/forum/topic.php?fid=47&msg=40032208&tid=1828255]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 252ms |
total: | 396ms |
0 / 0 |