Для связи таблиц можно использовать то же ключевое слово WHERE, как и для условий отбора. При выборке из нескольких таблиц рекомендуется всегда использовать псевдонимы таблиц. Дело в том, что если в разных таблицах имеются одинаковые поля, то всегда нужно уточнять, к какой таблице они относятся, т.е., использовать синтаксис имя_таблицы.имя_поля. А так как имена таблиц обычно длинные, удобно заменять их псевдонимами.
Напечатать список договоров с указанием названия предприятия.
SELECT firm_name, contract_num, contract_date
FROM k_firm f, k_contract c
WHERE f.firm_num=c.k_firm_firm_num
То же самое можно получить, если использовать синтаксис JOIN...ON. Это так называемое внутреннее (INNER) соединение. Строки соединяются, если совпадают значения полей в условии ON.
SELECT firm_name, contract_num, contract_date
FROM k_firm f JOIN k_contract c ON f.firm_num=c.k_firm_firm_num
Для соединения трех и более таблиц синтаксис в этом формате следующий:
Напечатать список сотрудников, номера и даты договоров, которые они заключили, с указанием названия предприятия.
FROM k_firm f JOIN k_contract c ON f.firm_num=c.k_firm_firm_num
JOIN k_staff s ON s.staff_num=c.k_staff_staff_num
Кроме внутреннего, бывают еще левое (LEFT), правое (RIGHT) и полное (FULL) соединения.
Рассмотрим, например, левое соединение. В результат попадут строки, в которых совпадают значения полей в условии ON, и те строки из левой таблицы, для которых не нашлось соответствующих строк в правой таблице. Поля из правой таблицы будут заполнены значениями NULL.
Напечатать список договоров с указанием названия предприятия плюс список предприятий, у которых нет договоров:
SELECT firm_name, contract_num, contract_date
FROM k_firm f LEFT JOIN k_contract c ON
f.firm_num=c.k_firm_firm_num
А что будет в том случае, если условие связи вообще не указывать? Получится так называемое декартово произведение таблиц, в котором каждая строка первой таблицы будет сцеплена с каждой строкой второй таблицы. Результат получается обычно очень большим и не имеющим смысла.
SELECT firm_name, contract_num, contract_date
FROM k_firm f, k_contract c
# Предыдущий запрос вернул 35 строк,
#т.е. 5 предприятий умножить на 7 договоров.
Разумеется, в одном и том же запросе можно связывать не только две, а три и более таблицы, использовать в этих запросах подзапросы, группировки и т.п. Например, запрос к 4 таблицам:
Напечатать информацию о платежах с указанием названия предприятия:
SELECT firm_name, payment_date, payment_sum
FROM k_firm f, k_contract c, k_bill b, k_payment p