Для получения этой информации необходимо сделать запрос к таблицам
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, это означает, что найденный разряд