Выбрать главу

Для получения этой информации необходимо сделать запрос к таблицам

customers, purchases, products и product_types. Соединения используют

отношения внешнего ключа между этими таблицами. В приведенном

ниже списке показаны необходимые соединения.

1. Для получения покупателя, сделавшего покупку, нужно соединить таблицы

customers и purchases, используя для этого столбцы customer_id соответствующих

таблиц (customers.customer_id = purchases.customer_id).

2. Для получения названий купленных товаров следует соединить таблицы

products и puchases, используя столбцы product_id соответствующих

таблиц (products.product_id = purchases.product_id).

Выборка информации из таблиц базы данных 53

3. Для получения названия типа товара можно соединить таблицы

products и product_types, используя для этого столбцы product_type_id

из соответствующих таблиц (products. p roduct_type_id = product_types.

product_type_id).

Ниже показан запрос, который использует эти соединения: обратите

внимание: использованы псевдонимы для таблиц и переименованы заголовки

для названия товара в PRODUCT и для названия типа товара в TYPE:

□ SELECT c.first_name, с.last_name, p.name AS PRODUCT, pt.name AS TYPE

FROM customers c, purchases pr, products p, product_types pt

WHERE c.customer_id = pr.customer_id

AND p.product_id = pr.product_id

AND p.product_type_id = pt.product_type_id

ORDER BY p.name;

FIRST_NAME LAST_NAME PRODUCT TYPE

John Brown Chemistry Book

Cynthia Green Chemistry Book

Steve White Chemistry Book

G a il Black Chemistry Book

John Brown Modern Science Book

Cynthia Green Modern Science Book

Steve White Modern Science Book

G a il Black Modern Science Book

Steve White Supernova Video

В двух примерах из предыдущего раздела в соединении использован

оператор равенства (=), поэтому такие соединения называются равносвязанными,

или соединениями по эквивалентности (equijoins). Как вы увидите

в следующем разделе, соединение по эквивалентности является не

единственным типом соединения, который вы можете использовать.

Условия и типы соединений

В этом разделе исследуются условия соединения и типы соединений, которые

позволяют создавать более сложные запросы.

Есть два типа условий соединения, которые базируются на операторе,

используемом в соединении.

■ Соединения по эквивалентности В соединении используется оператор

равенства (=) (выше приводились примеры соединений по эквивалентности)

.

■ Соединения по неэквивалентности В соединении используются

другие операторы, кроме оператора равенства, например меньше

(<) или больше (>), BETWEEN и т. п. (ниже приводятся примеры таких

соединений).

Кроме этого есть еще три различных типа соединения:

■ Внутренние соединения Возвращают строку только в том случае, если

столбцы соединения содержат значения, удовлетворяющие условию

54 Глава 2

соединения. Это означает, что если строка будет содержать пустое

значение в одном из столбцов условия соединения, она не будет возвращена.

Все рассмотренные до сих пор примеры относились к числу

внутренних соединений.

■ Внешние соединения Возвращают строку, даже если один из столбцов

в условии соединения содержит значение null.

■ Самосоединения Возвращают соединенные строки одной и той же

таблицы.

Соединения по неэквивалентности

В таких соединениях используется оператор, не являющийся оператором

равенства. Примерами таких операторов являются операторы неравенства

( о ) , меньше (<), больше (>), меньше или равно (<=), больше или равно

(>=), LIKE, IN и BETWEEN. Ситуации, в которых вам нужно будет использовать

соединение по неэквивалентности, довольно редки, но у меня было несколько

случаев, когда требовалось использовать такое соединение; в этих

случаях мне приходилось использовать оператор BETWEEN.

Например, вы хотите получить зарплатную сетку для сотрудников.

В первом запросе получим зарплатную сетку из таблицы salary_g rades:

□ SELECT *

FROM salary_grades;

SALARY_GRADE_ID LOW_SALARY HIGH_SALARY

1 1 250000

2 250001 500000

3 500001 750000

4 750001 999999

В следующем запросе соединение по неэквивалентности используется

для получения разрядной сетки зарплаты служащих, которая определяется

с помощью оператора BETWEEN:

□ SELECT е.first_name, e.last_name, е.title, е.salary, sg.salary_grade_id

FROM employees e, salary_grades sg

WHERE e.salary BETWEEN sg.low_salary AND sg.high_salary

ORDER BY salary_grade_id;

FIRST_NAME LAST_NAME TITLE SALARY SALARY_GRADE_ID

Fred Hobbs Salesperson 150000 1

Susan Jones Salesperson 500000 2

Ron Johnson Sales Manager 600000 3

James Smith CEO 800000 4

В этом запросе оператор BETWEEN возвращает true, если зарплата сотрудника

находится между нижней и верхней границами для данного разряда;

когда возвращается значение true, это означает, что найденный разряд