В самом простом случае список таблиц задаётся перечислением:
Select * /*все поля исходной таблицы*/ fromCustomer, Employee
Случай выборки из нескольких таблиц сводится к случаю выборки из одной таблицы. Таковым является именованное декартово произведение таблиц.
Поля таблицы 1
Поля таблицы 2
Запись 1
Запись 1
Запись 1
Запись 2
Запись 1
Запись 3
Именно в силу этого данный пример совершенно непотребный: m´n – это очень много.
select * fromOrders, Item, Product
where ID=Order_Ref, ID=Product_Ref;
Коллизия имён различных таблиц разрешается, как обычно, использованием полных, или квалифицированных, имён.
whereOrder.Id=Order_Ref
Product.Id=Product_Ref;
Правда такой приём не спасает при выборке из декартовых степеней.
Выделим однофамильцев:
select cust1.name, cust1.Id, cust2.Id
fromCustomer.cust1, Customer.cust2
where (cust1.name=cust2.name) and (cust1.Id<cust2.Id);
В таких случаях используют псевдонимы, локальные имена, или алиасы. В более сложном синтаксисе условие связи отделяется от условия фильтрации и записывается в списке выборки: (имя таблицы 1) join (имя таблицы 2) on (условие связи).
select cust1.name, cust1.Id, cust2.Id
fromCusromer. cust1 join
Customer.cust2 on
cust1.name=cust2.name
where cust1.Id<cust2.Id;
Опция joinимеет дополнительные опции, а именно: Inner, Left, Right, Full.
Inner – по умолчанию.
Что делать с официальными сиротами, то есть значениями ключей, равными null? Внутреннее соединение inner join игнорирует такие записи. Left join добавляет в результирующую выборку все записи из левой таблицы со значениями ключа null в комбинации с фиктивной нулевой записью второй таблицы.
select (что-то) from T1,T2where B(r1,r2) /*предикат*/ /*ri – поле таблицы Ti*/