Многотабличные запросы позволяет сформировать записи путем объединения взаимосвязанных записей таблиц из таблиц базы данных и выбора из них нужных записей. Например, при объединении двух нормализованных связанных одно-многозначными отношениями таблиц, для которых обеспечивается связная целостность, результирующая запись образуется на основе записи подчинённой таблицы, в которую добавляются поля из связанной записи в главной таблице. Подобное объединение формирует ненормализованную таблицу, в которой число записей равно числу записей в подчиненной таблице. При этом данные главной таблицы дублируются в различных записях результирующей таблицы.
При проектировании и конструировании запроса важнейшим условием является правильное представление о том, как идет объединение записей таблиц при формировании результата.
Запрос, который обращен к нескольким записям одной таблицы или к нескольким таблицам одновременно, называется объединением. В теории баз данных определено несколько типов запросов, чаще других применяется внутреннее объединение (inner join), которое и будет описано в этом разделе.
Рассмотрим запрос, при котором надо выбрать данные из двух таблиц так, чтобы выбирались только те строки, значения которых по соединяемым одноименным столбцам совпадают. Например, нам требуется узнать фамилию водителя, который позавчера водил синюю машину. Для того чтобы получить все необходимые данные, вам потребуется запросить все три таблицы базы, только тогда вы соберете все нужные сведения.
Вам придется оперировать именами столбцов из разных таблиц. Следует учесть, что полное имя столбца состоит из имени базы данных, таблицы и собственно имени столбца, например, taxi.cars.color.
При работе с одной базой данных из запросов можно исключить упоминание имени этой базы. Если запросы адресуются к одной таблице, то имя таблицы также опускается. Но при объединении необходимо указывать полностью имена таблиц и столбцов.
Часто имена таблиц заменяют короткими псевдонимами (alias), указывая их в запросе после ключевого слова FROM. Псевдонимы для таблиц являются стандартной частью языка SQL и обычно состоят из одной буквы. Задать псевдоним можно с помощью ключевого слова AS:
mysql> SELECT colorFROM cars AS c;
Псевдонимы удобно использовать в случае, когда имя результирующего столбца слишком длинное или выводятся данные из двух таблиц, в которых есть одноименные столбцы.
Между таблицами существуют связи по определенным столбцам. Столбец cars.id связывает таблицу cars с таблицей timetable через столбец timetable.car_number. Аналогично строится связь между таблицей drivers и timetable.
Объединение осуществляется по столбцам, образующим связь. При этом выбираются одинаковые значения полей, по которым осуществляется связь между таблицами:
timetable.car_number=cars.id
и
timetable.driver_number=drivers.id
Определим дату (данные из столбца timetable.use_on) и фамилию водителя (drivers. family_name), который водил машину определенного цвета (cars.color):
mysql> SELECT t.use_on, d. family_name, с.color
-> FROM timetable AS t, cars AS c, drivers AS d
-> WHERE t.car_number=c.id AMD t .driver_number=d. id;
Выборка данных происходит из таблиц timetable, cars и drivers, для которых определены псевдонимы, сокращающие запись запроса и облегчающие его редактирование. Выбираются только те строки из таблиц timetable и cars, в которых указан одинаковый учетный номер автомобиля. А из таблиц timetable и drivers выбираются строки, в которых поля в столбце, содержащем учетный номер водителя, одинаковы.