Оператор SELECT. Выбор данных из таблицы. Псевдонимы столбцов. Удаление повторяющихся строк, страница 7

Перекрестные объединения редко применяются, поскольку, как правило, не имеют реальной интерпретации содержания.

Пример.

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