Рассматривайте объединения как способ создания новой таблицы (только для выполнения запроса) с данными из нескольких разных источников. В отсутствие конкретного примера для работы, давайте представим, что у нас есть база данных автомобилей, которая включает эти две таблицы:
CREATE TABLE car (plate_number CHAR(8),
state_code CHAR(2),
make VARCHAR(128),
model VARCHAR(128),);
CREATE TABLE state (state_code CHAR(2),
state_name VARCHAR(128));
Если вы хотите, скажем, получить список номерных знаков всех хонд в базе данных, эта информация уже содержится в таблице car
. Вы можете просто SELECT * FROM car WHERE make='Honda';
Точно так же, если вы хотите получить список всех состояний, начинающихся с «A», вы можете SELECT * FROM state WHERE state_name LIKE 'A%';
В любом случае, поскольку у вас уже есть таблица с необходимой информацией, объединение не требуется.
Возможно, вам даже понадобится список автомобилей с номерами Колорадо, но если вы уже знаете, что «CO» - это код штата Колорадо, вы можете SELECT * FROM car WHERE state_code='CO';
Еще раз, вся необходимая информация находится в одном месте, поэтому нет необходимости в соединении.
Но предположим, что вам нужен список хонд, в том числе название штата, в котором они зарегистрированы. Эта информация еще не содержится в таблице в вашей базе данных. Вам нужно будет "создать" один с помощью объединения:
car INNER JOIN state ON (car.state_code = state.state_code)
Обратите внимание, что я абсолютно ничего не сказал о том, что мы SELECT
думаем. Это отдельный вопрос целиком. Мы также не применили предложение WHERE
, ограничивающее, какие строки включаются в результаты. Это тоже отдельный вопрос. Единственное, к чему мы обращаемся при объединении, - это получение данных из двух таблиц вместе. Теперь у нас теперь есть новая таблица с именем car INNER JOIN state
, в которой каждая строка из car
соединена с каждой строкой в state
, которая имеет тот же state_code
.
Теперь из этой новой «таблицы» мы можем применить некоторые условия и выбрать некоторые конкретные поля:
SELECT plate_number, make, model, state_name
FROM car
INNER JOIN state ON (car.state_code = state.state_code)
WHERE make = 'Honda'
Итак, чтобы ответить на ваши вопросы более прямо, вам всегда нужно присоединяться к столам? Да, если вы собираетесь выбрать данные из них обоих. Вы не можете выбрать поля из car
, которых нет в таблице car
. Сначала вы должны присоединиться к другим нужным таблицам.
К каким столам нужно присоединиться? Какие бы таблицы ни содержали данные, которые вас интересуют в запросах.
Какие поля вы должны использовать? Какие бы поля не были актуальны. В этом случае связь между автомобилями и состояниями осуществляется через поле state_code
в обеих таблицах. Я мог бы так же легко написать
car INNER JOIN state ON (state.state_code = car.plate_number)
Для каждого автомобиля будут отображаться все штаты, сокращения которых соответствуют номеру автомобильного номера. Это, конечно, бессмысленно и, скорее всего, не даст никаких результатов, но с точки зрения вашей базы данных это совершенно правильно. Только вы знаете, что state_code
имеет значение.
И влияет ли объединение SELECT
ed полей или WHERE
условий? На самом деле, нет. Вы по-прежнему можете выбирать любые поля, которые вы хотите, и вы все равно можете ограничить результаты тем числом строк, которое вы хотите. Есть две оговорки.
Во-первых, если у вас одинаковое имя столбца в обеих таблицах (например, state_code
), вы не можете выбрать его, не уточнив, из какой таблицы вы его хотите. В этом случае я мог бы написать SELECT car.state_code ...
Во-вторых, когда вы используете INNER JOIN
(или на многих ядрах базы данных просто JOIN
), будут возвращены только строки, в которых выполняются ваши условия соединения . Таким образом, в моем бессмысленном примере поиска кода штата, который соответствует автомобильному номеру, вероятно, не будет никаких состояний, которые соответствуют. Строки не будут возвращены. Таким образом, хотя вы все еще можете использовать предложение WHERE
, как хотите, если у вас есть INNER JOIN
, ваши результаты могут быть уже ограничены этим условием.