2015-01-07 5 views
2

Я уверен, что это работает повсеместно в различных реализациях SQL. Предположим, у меня есть много-ко-многим между 2 таблицы:SQL Multiple Joins - Как они работают точно?

Customer: id, name 

имеет много:

Order: id, description, total_price 

и это соотношение в соединительной таблице:

Customer_Order: order_date, customer_id, order_id 

Теперь я хочу напишите SQL-запрос, чтобы объединить все это вместе, указав имя клиента, описание и общую стоимость заказа и дату заказа:

SELECT name, description, total_price FROM Customer 
JOIN Customer_Order ON Customer_Order.customer_id = Customer.id 
JOIN Order = Order.id = Customer_Order.order_id 

Это все хорошо и хорошо. Этот запрос также будет работать, если мы изменим порядок, так что это FROM Customer_Order JOIN Customer или положим таблицу Order. Почему это так? Где-то я читал, что JOIN работает как оператор арифметики (+, * и т. Д.), Беря 2 операнда, и вы можете связать оператор вместе, чтобы вы могли: 2 + 3 + 5, например. Следуя этой логике, сначала нужно вычислить 2 + 3, а затем взять этот результат и добавить к нему 5. То же самое с JOINs?

Это за капюшоном, первый JOIN должен быть сначала завершен, чтобы второй JOIN состоялся? Таким образом, первый JOIN создаст таблицу из двух операндов слева и справа от нее. Затем второй JOIN берет эту итоговую таблицу в качестве ее левого операнда и выполняет обычное соединение. В принципе, я хочу понять, как несколько JOINs работают за капотом.

+3

В минорной ноте: Ваш запрос не будет работать в большинстве баз данных, потому что 'order' является зарезервированным словом. Но, исправляя это, он должен работать. –

+0

Если ваш вопрос заключается в том, что, как добавление, внутренние объединения (которые 'JOIN', unqualified, означает) являются ассоциативными, тогда ответ да. Они также являются коммутативными, если это не очевидно (т. Е. 'A JOIN b' совпадает с' b JOIN a'). Однако внешние объединения не являются коммутативными, и они также не гарантированно являются ассоциативными. –

+0

Извините, но не знал об этом, просто дал им примеры, вы можете взять что-нибудь еще, что хотите, чтобы иметь отношения «многие ко многим». – daremkd

ответ

0

Во многом я считаю, что ORM - это проклятие современного программирования. Развязывание заграждения подготовленных кодеров. О, хорошо, расскажи, что ты задаешь вопрос о теории множеств. Существуют потенциально другие варианты, которые сосредоточены на реляционной алгебре, но SQL основана на фундаментальной теории. вот несколько ссылок, чтобы вы начали

Using set theory to understand SQL

A visual explanation of SQL

Смежные вопросы