Перекрестные объединения редко применяются, поскольку, как правило, не имеют реальной интерпретации содержания.
Пример.
SELECT
au_id,
pub_id,
a.state AS “”
p.state AS “”
FROM authors a
CROSS JOIN publishers p;
В варианте синтаксиса WHERE:
SELECT
au_id, pub_id,
a.state AS “Штат автора”
p.state AS “Штат издателя”
FROM authors a, publishers p;
Access поддерживает для перекрестных объединений синтаксис WHERE.
Естественное объединение является частным случаем объединения по равенству. Связываются столбцы с одинаковыми именами. Условие объединения также не задается, т.к. оно очевидно.
Пример. Отобразить название издания, издателя и цену. (запрос Natural-Title#Publsh)
SELECT
t.title_name, p.pub_name, t.price
FROM publisher p
NATURAL JOIN title t;
Access и Microsoft SQL не поддерживают синтаксис NATURAL JOIN. Поэтому следует применять синтаксис WHERE.
SELECT
t.title_name, p.pub_name, t.price
FROM publisher p, title t
WHERE p.pub_id = t.pub_id;
Пример. Объединение трех таблиц. (запрос Natural-3-Table)
SELECT
t.title_name, p.pub_name, t.price, r.advance
FROM publisher p
NATURAL JOIN title t
NATURAL JOIN roaylties r
WHERE r. advance < 20000;
В синтаксисе WHERE
SELECT
t.title_name, p.pub_name, t.price, r.advance
FROM publisher AS p, title AS t, roaylties AS r
WHERE p.pub_id=t.pub_id And t.title_id=r.title_id And r.advance<20000;
NATURAL JOIN создает внутренне объединение, ключевое слово INNER опускается. Можно создать и внешнее естественное объединение NATURAL LEFT OUTER JOIN, NATURAL RIGTH OUTER JOIN, NATURAL FULL OUTER JOIN.
Примечание. Oracle не разрешает применять уточненные имена столбцов в естественном соединении.
Наиболее распространенный запрос на объединение. Внутренне объединение использует оператор сравнения для сопоставления данных разных таблиц. Помещает в результат только объединенные строки, удовлетворяющие условию объединения.
Пример. Отобразить название издания, автора (включая соавторов) и объем продаж. (запрос Title#Authors#Sale)
SELECT
t.title_name, ta.au_id,t.sales
FROM title t
INNER JOIN title_authors ta
ON t.title_id = ta.title_id
ORDER BY t.title_name;
В синтаксисе WHERE
SELECT
t.title_name, ta.au_id, t.sales
FROM title AS t, title_authors AS ta
WHERE t.title_id=ta.title_id
ORDER BY t.title_name;
Пример. Отобразить название издания, автора (включая соавторов) и объем продаж, используя объединение трех таблиц. (запрос Title#Authors#Sale-2)
SELECT
t.title_name, ta.au_id, a.au_fname, a.au_lname, t.sales
FROM title AS t
INNER JOIN (title_authors AS ta INNER JOIN authors AS a ON a.au_id=ta.au_id)
ON t.title_id=ta.title_id
ORDER BY t.title_name;
Если применяется синтаксис JOIN то в Access необходимо делать вложенные объединения.
В синтаксисе WHERE
SELECT
t.title_name, ta.au_id, a.au_fname, a.au_lname, t.sales
FROM title AS t, title_authors AS ta, authors AS a
WHERE a.au_id=ta.au_id AND t.title_id=ta.title_id
ORDER BY t.title_name;
Задание.
1. Построить список изданий с указанием издательств и цены.
2. Построить список авторов, которые живут в тех городах (и штатах), где расположены издательства
3. Построить список книг, изданных в Калифорнии (за пределами США)
4. Отобразить авансы, выплаченные за книги-биографии.
5. Отобразить список категорий книг с указанием количества книг и выплаченного аванса за книги, относящиеся к категории.
Пример. Сгруппировать книги по категориям и издательствам, отобразить их количество и выплаченный аванс. (запрос Category#Advance)
SELECT
t.type, t.pub_id, COUNT (r.advance) AS ["Кол-во книг"], SUM (r.advance) AS ["Авансы"]
FROM title AS t INNER JOIN roaylties AS r ON r.title_id=t.title_id
WHERE r.advance IS NOT NULL
GROUP BY t.type, t.pub_id
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.