|
|
|
Волженные подзапросы. Работа EXISTS, NOT EXISTS.
|
|||
|---|---|---|---|
|
#18+
Люди, объясните пожалуйста работу запроса: Код: sql 1. Customers - клиенты Products - товары Orders - заказы Не могу понять логику выполнения этого запроса. Единственно, что я понял - это запросы такого вида: Код: sql 1. Вывод списка товаров, которые были заказаны хоть одним клиентом. Код: sql 1. Вывод списка товаров, которые не были заказаны ни одним клиентом. Если можно, объясните кто нибудь пожалуйста пошаговое выполнение запроса, буду очень признателен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2015, 13:46:25 |
|
||
|
Волженные подзапросы. Работа EXISTS, NOT EXISTS.
|
|||
|---|---|---|---|
|
#18+
unnomen, что именно не понятно-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2015, 13:55:17 |
|
||
|
Волженные подзапросы. Работа EXISTS, NOT EXISTS.
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, Логика выполнения этого запроса. В литературе написано, что это "Вывод списка клиентов, заказавших все виды товаров". Я не могу понять, как логически выполняется этот запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2015, 13:57:02 |
|
||
|
Волженные подзапросы. Работа EXISTS, NOT EXISTS.
|
|||
|---|---|---|---|
|
#18+
Допустим, обрабатывается некая запись таблицы Customers. Допустим, для неё обрабатывается некая запись таблицы Products. Внутренний подзапрос выберет все строки для этой пары из таблицы Orders. Средний подзапрос соответственно вернёт все строки, НЕ присутствующие во внутренней выборке. Т.е. список записей из Products, для которых данный Customers ничего не заказал. Внешний запрос соответственно вернёт только те строки, для которых этот список (незаказанных продуктов) пуст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2015, 14:30:16 |
|
||
|
Волженные подзапросы. Работа EXISTS, NOT EXISTS.
|
|||
|---|---|---|---|
|
#18+
Akina, Вроде бы понял, но не совсем. Получается так: Есть три клиента: Код: sql 1. 2. 3. Есть пять товаров: Код: sql 1. 2. 3. 4. 5. В заказах имеются записи: Код: sql 1. 2. 3. К примеру, Иванов два раза заказывал Ножницы, Сидиров вообще ничего не заказывал. При запросе: Код: sql 1. вернёт ответ: Код: sql 1. 2. 3. При запросе: Код: sql 1. происходит проверка, имеется ли список: Код: sql 1. 2. 3. для "Иванов", "Петров", "Сидоров" пустым? Если да, то выводится этот клиент, нет - получается возвращается false; В этом примере следует, что значение вернёт false (вернёт пустую таблицу), т.к. этот список существует для "Иванов", "Петров", "Сидоров". Правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2015, 14:53:16 |
|
||
|
Волженные подзапросы. Работа EXISTS, NOT EXISTS.
|
|||
|---|---|---|---|
|
#18+
Akina, Но! Соответственно, для "Иванов" список будет: Код: sql 1. 2. 3. 4. Для "Петров" список будет: Код: sql 1. 2. 3. 4. Для "Сидоров" список будет: Код: sql 1. 2. 3. 4. 5. Верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2015, 14:55:51 |
|
||
|
Волженные подзапросы. Работа EXISTS, NOT EXISTS.
|
|||
|---|---|---|---|
|
#18+
Похоже на правду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2015, 15:38:12 |
|
||
|
Волженные подзапросы. Работа EXISTS, NOT EXISTS.
|
|||
|---|---|---|---|
|
#18+
Akina, Спасибо большое. Теперь всё понятно!:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2015, 15:43:23 |
|
||
|
Волженные подзапросы. Работа EXISTS, NOT EXISTS.
|
|||
|---|---|---|---|
|
#18+
unnomen, Во втором примере - 2 вложенных "несуществования"... по русски оно читается примерно так: Отдай мне всех кастамеров, для которых НЕ существует продуктов с отсутствующими покупками этим же кастамером. То есть, второй вложенный подзапрос ограничивает не существование факта покупки для некоего товара из первого подзапроса. И верно, да. Для каждого покупателя первый подзапрос сформирует такие списки товаров "без" их покупок... .. только он сам, такой список является ограничением не существования, а стало быть весь запрос в итоге вернет только того покупателя, который сделал покупки всех товаров из списка. Ну и так, замечание: в подзапросах на (не)существование - вовсе не требуется делать "select * ". Вполне достаточно "SELECT 1 "... ибо выборка найденного подзапросом - никуда не уперлась. А вот, ежели вы её "запросили", то Мускуль таки будет её формировать... по сути зазря. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 07:48:30 |
|
||
|
Волженные подзапросы. Работа EXISTS, NOT EXISTS.
|
|||
|---|---|---|---|
|
#18+
Arhat109Ну и так, замечание: в подзапросах на (не)существование - вовсе не требуется делать "select * ". Вполне достаточно "SELECT 1 "... ибо выборка найденного подзапросом - никуда не уперлась. А вот, ежели вы её "запросили", то Мускуль таки будет её формировать... по сути зазря.ну, так-то неправда твоя... сервер при выполнении запроса банально игногрирует select-лист [not]exists-подзапроса. поэтому там можно написать любую конструкцию, которая пройдет синтаксический разбор. как пример, там можно написать хоть деление строки на ноль. :) В качестве доказательства своих слов: ссылка если бы сервер выполнял select-лист [not]exists-подзапроса, то сей запрос упал бы как минимум с ошибкой деления на ноль. я уж не говорю о невозможности преобразования строки 'bla-bla-bla' в число. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 08:24:29 |
|
||
|
Волженные подзапросы. Работа EXISTS, NOT EXISTS.
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, з.ы. если вдруг sqlfiddle.com не будет фурычить, то завсегда можно повторить эксперимент на любой доступной базе: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 08:26:50 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38894199&tid=1833504]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 339ms |

| 0 / 0 |
