Вопрос по подзапросам -- вычисляемые поля. Когда и как выполняется подзрапрос, порядок выполнения
Primary tabs
Forums:
В учебнике Бена Форта имеется вот такой пример к главе 11 "Использование подзапросов":
SELECT cust_name, cust_state, (SELECT COUNT(*) FROM Orders WHERE Orders.cust_id = Customers.cust_id) AS orders FROM Customers ORDER BY cust_name;
Для ясности поясню - подразумевается выборка количества заказов (которые хранятся в таблице Orders) каждого клиента (список которых хранится в таблице Customers,). Вот отрывок из пояснения к коду:
Поле orders является вычисляемым: оно формируется в результате выполнения подзапроса, который заключен в круглые скобки. Этот подзапрос выполняется один раз для каждого выбранного клиента.
Непонятно вот что: за счет чего осуществляется переключение поля cust_id таблицы Customers на следующее значение? Другими словами, если внутренний SELECT выполняется всегда перед внешним, как программа знает, что при новом проходе цикла нужно сравнивать идентификаторы таблицы Orders уже со следующим идентификатором таблицы Customers? Или скобки меняют порядок выполнение селектов?
- Log in to post comments
- 14057 reads
vedro-compota
Mon, 03/12/2018 - 13:10
Permalink
SELECT cust_name, cust_state,
этот запрос работает в mysql? Проверяли?
_____________
матфак вгу и остальная классика =)
Voronve
Mon, 03/12/2018 - 14:45
Permalink
Да, работает, и корректно.
Да, работает, и корректно.
vedro-compota
Wed, 03/21/2018 - 12:22
Permalink
Откуда можно подтянуть дамп
Откуда можно подтянуть дамп базы?
_____________
матфак вгу и остальная классика =)
Voronve
Wed, 03/28/2018 - 01:04
Permalink
Коды для копирования базы
Коды для копирования базы данных находятся по этому адресу http://www.forta.com/books/0672325675/
vedro-compota
Thu, 03/29/2018 - 09:38
Permalink
Откуда брать дамп
Удобнее сразу взять подготовленный нами скрипт: http://fkn.ktu10.com/?q=node/8945
потому что в оригинале там есть символы, которые не "развернёшь" -- т.е. приходится удалять комментарии, если хочешь это выполнить как запрос для mySQL, а у нас всё корректно)
_____________
матфак вгу и остальная классика =)
vedro-compota
Fri, 03/30/2018 - 08:58
Permalink
"для каждой строки" -- (не говориться, что "перед внешним")
Почему вы думаете что он выполняется перед внешним? Ведь в цитате из учебника сказано, что он выполняется для каждой выбранной строки из освного запроса (как вы уже цитировали):
-- т.е. чтобы понять механизм нам надо смотреть исходный код mysql (что непросто), по сразу можно сказать, что реализовать подобное можно, только можно выполняя подзапрос "после" после :
или дейсвительно после извлечения очередного кортежа в основном запросе
-- но тут повторюсь, что второй пункт это размышления о возможной внутренней реализации, про представлять, что:
подзапрос выполняется с использованием очередного выбранного в основоном запросе Customers.cust_id
(во как))
--------------------
-- как сказано выше: просто просматриваются аналогичные id из Orders,
т.е. енсли вы про связку:
то тут Customers.cust_id по сути просто берется из результата основного запроса (для каждого результата основоного запроса -- т.е. для каждой извлеченной строки/кортежа).
_____________
матфак вгу и остальная классика =)
Voronve
Sat, 03/31/2018 - 14:19
Permalink
Почему вы думаете что он
Видимо, я немного запутался. Просто у того же Бена Форта есть такой пример :
И соответствующее пояснение о том что
Но, видимо, если мы говорим о вычисляемых полях тут этот принцип не действует?
vedro-compota
Sat, 03/31/2018 - 16:12
Permalink
вычислимые поля и подзапросы -- порядок выполнения
Да, я хотел бы заметить:
-- подзапроса находится после WHERE осного запроса, а значит условия основонго запроса просто не будут известны, если предварительно не выполнить подзапрос.
А потому в этом случае вы правы -- подзапрос в любом случае полнится перед основным, если бы у этого подзапроса был свой подзапрос и он бы выполнился ещё раньше и т.д.
-- здесь для основного запроса все условия известны и без выполнения подзапроса, более того, как как подзапрос опирается на значение из основного, то выполнить его раньше итак не получится.
Таким образом ывше высказывание:
в данном случае верно.
_____________
матфак вгу и остальная классика =)
Voronve
Sat, 03/31/2018 - 16:55
Permalink
наложения в подзапросе
Вот именно эта внутренняя логика связывания результата подзапроса с одним из полей основного запроса в SQL мне и непонятна. Я так понял, мне на моем уровне это пока проще просто запомнить ). Спасибо за пояснение