Использование предложения WHERE

Для выполнения внутреннего объединения с помощью предложения WHERE, как минимум, нужно выполнить два действия:
  • поместить имя одной или нескольких таблиц в список предложения FROM;
  • добавить условия в предложение WHERE, на основе которых будет выполняться объединение

В общих чертах, синтаксис подобной операции объединения имеет следующий вид:

SELECT [DISTINCT] [<table1>.]<column_name>, [<table2>.]<column_name> [,...]
FROM <table1>, <table2>, [<table3>,...]
WHERE [table1.]<column> <join_condition> [table2.]<column>

В списке таблиц предложения FROM по меньшей мере должно содержаться две таблицы, а столбцы в предложении WHERE должны быть совместимыми для объединения. Если столбцы, по которым выполняется объединение, имеют одинаковые имена, то в списке выбора и в предложении WHERE нужно указать соответствующие им таблицы.

Обычно объединение основывается на равенстве или совпадении значений в объединяемых столбцах. Однако кроме оператора равенства (=) для задания условия объединения (<join_condition>) могут использоваться следующие логические операторы: больше чем(>), больше или равно(>=), меньше чем(<), меньше или равно(<=), (!=) не равно.

IDevice IconПримеры
Получить список клиентов из Сиэтла, с указанием номеров действующих договоров:

SQL:
SELECT contract_id, lastname, name
FROM tbl_clients, tbl_contract
WHERE tbl_clients.client_id = tbl_contract.client_id AND retire_date IS NULL AND region='Seattle'

В представленном примере условием объединение является равенство clients.client_id = tbl_contract.client_id. Кроме этого, для записей должны выполнятся еще два условия: retire_date IS NULL (определяет действующий договор) и region='Seattle' (определяет место проживания клиента). В случае, если у клиента нет действующего договора, его данные не будут отображаться в результирующей таблице.


Подсчитать количество договоров, заключенных на пользование каждой из предлагаемых услуг. Полученный список отсортировать по названию услуги.

SQL:
SELECT service, Count(contract_id)
FROM `tbl_service`, `tbl_contract`
WHERE tbl_service.service_id = tbl_contract.service_id AND retire_date IS NULL
GROUP BY service
ORDER BY service


Во многих случаях, для получения полной информации создания объединения на основе двух таблиц бывает недостаточно.

Таблица tbl_contracts в базе данных db_telco хорошо иллюстрирует ситуацию, когда может потребоваться объединение более двух таблиц. Для получения полной информации о клиентах и услугах, которыми он и пользуются, необходимо объединить три таблицы.

IDevice IconПримеры

Получить список клиентов и услуг, с указанием номеров договоров. Список отсортировать по фамилиям клиентов.

SQL:
SELECT lastname, name, contract_id, service
FROM tbl_service, tbl_contract, tbl_clients
WHERE tbl_service.service_id = tbl_contract.service_id
AND tbl_contract`.client_id=`tbl_clients`.client_id
AND retire_date IS NULL
ORDER BY lastname


Вычислить сумму, которую должен платить каждый клиент за пользование услугами:

SQL:
SELECT lastname, name, SUM(price)
FROM tbl_service, tbl_contract, tbl_clients
WHERE tbl_service.service_id = tbl_contract.service_id
AND tbl_contract.client_id=tbl_clients.client_id
AND retire_date IS NULL
GROUP BY lastname
ORDER BY lastname