Часто возникает ситуация, когда выборку данных необходимо производить из отношения, которое является результатом соединения двух других таблиц.
Например, нужно получить из базы данных publications информацию обо всех печатных изданиях в виде следующей таблицы:
Title
Yearpub
Publisher
Для этого СУБД предварительно должна выполнить слияние таблиц titles и publishers, а только затем произвести выборку из полученного отношения.
Для выполнения операции такого рода в операторе SELECT в предложении FROM указывается список таблиц, по которым производится поиск данных, а в предложении WHERE указывается условие, по которому производится соединение. Для того чтобы получить данный результат, запрос будет иметь вид:
SELECT a.title, a.yearpub, b.publisher FROM titles AS a, publishers AS b WHERE a.pub_id=b.pub_id;
Пример, где одновременно задаются условия и соединение, и выборки (запроса ограничивается изданиями после 1996 года):
SELECT a.title, a.yearpub, b.publisher FROM titles AS a, publishers AS b WHERE a.pub_id = b.pub_id AND a.yearpub > 1996;
Следует обратить внимание на то, что когда в разных таблицах присутствуют одноименные поля, то для устранения неоднозначности перед именем поля указывается имя таблицы и знак "." (точка). (Рекомендуется имя таблицы указывать всегда!). Имя таблицы может быть заменено альтернативным логическим именем – синонимом, для чего используется связка AS в разделе FROM (…FROM titles AS a, publishers AS b…).
Естественно, имеется возможность производить слияние и более чем двух таблиц.
Например, чтобы дополнить описанную выше выборку именами авторов книг необходимо составить оператор следующего вида:
SELECT d.author, a.title, a.yearpub, b.publisher FROM titles AS a, publishers AS b, titleauthors AS c, authors AS d WHERE c.au_id = d.au_id AND c.title_id = a.title_id AND a.pub_id = b.pub_id AND a.yearpub > 1996; Альтернативный вариант соединения нескольких таблиц может использовать оператор JOIN в оазжеде FROM. Существует три варианта оператора:- INNER JOIN – соединение, при котором записи включаются в результирующий набор только в том случае, если в связных атрибутах будут найдены одинаковые значения;- LEFT JOIN – левое соединение, при котором все записи из первой (левой) таблицы включаются в результирующий набор, даже если во второй (правой) таблице нет соответствующих им записей;- RIGHT JOIN –правое соединение, при котором все записи из второй (правой) таблицы включаются в результирующий набор, даже если в первой (левой) таблице нет соответствующих им записей. Например, предыдущий пример можно реализовать с использованием оператора INNER JOIN следующим образом: SELECT d.author, a.title, a.yearpub, b.publisher FROM ((titles AS a INNER JOIN publishers AS b ON a.pub_id = b.pub_id) INNER JOIN titleauthors AS c ON c.title_id = a.title_id) INNER JOIN authors AS d ON c.au_id = d.au_id WHERE a.yearpub > 1996;