Одним из самых мощных средств SQL является возможность выбирать данные из многих таблиц. Это достигается перечислением имен необходимых таблиц во фразе FROM. Если при этом во фразе WHERE не указывается условие их соединения, то производится декартово произведение всех таблиц из фразы FROM. Так, например, если заданы следующие две таблицы:
то есть каждая строка первой таблицы соединилась с каждой строкой второй таблицы. Как правило, таблицы соединяются по некоторому условию. Например, для получения списка имен факультетов и имен соответствующих им кафедр следует записать:
SELECT FACULTY.Name, DEPARTMENT.Name
FROM FACULTY, DEPARTMENT
WHERE FACULTY.#F = DEPARTMENT.#F
Уточнение имен столбцов. Обратим внимание, что во фразах SELECT и WHERE имена столбцов уточняются именами таблиц. Если есть столбец, который имеет одно и то же имя в объединяемых таблицах, то ссылаться на тот или иной столбец в запросе следует именно так – уточнять их именами таблиц.
Алиас имени таблицы. В связи с тем, что таблицы могут иметь длинные наименования, язык предоставляет возможность связывать с каждой таблицей некоторый краткий алиас, и в дальнейшем ссылаться на таблицу по нему. Сопоставление таблице алиаса делается о фразе FROM. Например, предыдущий запрос можно записать:
SELECT f.Name, d.Name
FROM FACULTY f, DEPARTMENT d
WHERE f.#F = d.#F
Очевидно, что фраза WHERE может использоваться одновременно как для указания способа соединения таблиц, так и для указания условия отбора строк в результирующую таблицу, например, запрос
SELECT DEPARTMENT.Name
FROM DEPARTMENT, TEACHER
WHERE DEPARTMENT.#D = TEACHER.#D AND TEACHER.Name = 'Иванов'
приводит к выводу названия кафедры, на которой работает преподаватель Иванов. (Заметим, что поиск преподавателей ведется по всему ВУЗу , поэтому по сути отыскиваются все кафедры ВУЗа, на которых работают преподаватели по фамилии 'Иванов'). Обратите внимание, что условие поиска задается на одной таблице, а результат выдается из другой.
Вычисляемые столбцы. Во фразе SELECT может быть сформирован новый столбец, значение которого вычисляется из других столбцов соединяемых таблиц. Приводимый далее запрос выдает сведения обо всех кафедрах факультета информатики с их фондами финансирования и процентом, который этот фонд составляет по отношению к фонду факультета.
SELECT d.Name, d.Fund, ( d.Fund / f.Fund ) * 100
FROM FACULTY f, DEPARTMENT d
WHERE f.#F = d.#F
Экви-соединение. Если таблицы соединяются по равенству значений одной или нескольких пар столбцов, причем из каждой таблицы выбираются ВСЕ столбцы, то такое соединение выражает операцию экви-соединения реляционной алгебры, например:
SELECT f.*, d.*
FROM FACULTY f, DEPARTMENT d
WHERE f.#F = d.#F
Естественное соединение. Операция реляционной алгебры естественного соединения выражается соединением двух или нескольких таблиц по предикату равенства с последующим удалением повторяющихся столбцов путем явного перечисления всех необходимых столбцов во фразе SELECT, например:
SELECT f.#F, f.Name, f.Dean, f.Building, f.Fund,
d.#D, d.Name, d.Head, d.Building, .Fund
FROM FACULTY f, DEPARTMENT d
WHERE f.#F = d.#F
Обратим внимание, что хотя столбцы Name, Building, Fund встречаются в обеих таблицах, однако они не рассматриваются как повторяющиеся, так как несут различную семантическую нагрузку, повторяющимся столбцом является тот единственный, по которому производится соединение – столбец #F, который выполняет роль внешнего ключа в таблице DEPARTMENT.
Тета-соединение. Это соединение по любому другому условию, отличающемуся от равенства. В этом случае соединение производится не по первичному-внешнему ключам, а по некоторым другим столбцам и имеет более глубокую семантику.
Соединение таблицы со своей копией. В некоторых случаях необходимо соединить таблицу с собой. В этом случае во фразе FROM указывается дважды имя таблицы с разными алиасами, чтобы можно было к каждой из таблиц ссылаться самостоятельно. Рассмотрим такой пример: пусть нам необходимо проверить, есть ли в таблице FACULTY такие пары строк, что имена факультетов совпадают, а их ключи #F разные. Для этого следует записать:
SELECT f1.Name, f1.#F, f2.#F
FROM FACULTY f1, FACULTY f2
WHERE f1.name = f2.Name AND f1.#F != f2.#F
Соединять можно и по трем, четырем и т.д. таблицам. Язык не ограничивает количество соединяемых таблиц. Но при этом следует помнить, что крайне важно производить именно соединение по некоторому условию,а не декартово произведение таблиц. Имейте в виду, что если произвести декартово произведение пяти таблиц, каждая из которых содержит всего по 20 строк, то результирующая таблица будет иметь довольно внушительный размер - 3,200,000 строк. Декартово произведение двух таблиц с десятками тысяч строк каждая может длиться часами!!! А объем результирующей таблицы может исчисляться десятками гигабайт!!!
Приведем несколько запросов, которые использовались при описании реляционной алгебры (подраздел 4.6.3), приводя тексты запросов в SQL и в реляционной алгебре (нумерация запросов сохраняется).
Запрос 6. Выдать список всех кафедр факультета информатики
SELECT DEPARTMENT.Name
FROM FACULTY, DEPARTMENT
WHERE FACULTY.#F = DEPARTMENT.#F AND FACULTY.Name = "IT"
Запрос 11. Привести список лекций, на которых количество студентов в группе превышает количество мест в аудитории. В списке указать номер аудитории, номер группы, читаемую дисциплину, неделю, день недели.
SELECT ROOM.Num, GROUP,Num, SUBJECT.Name, Week, Day