Выборка данных из нескольких таблиц


Содержание лекционного занятия:

  •  Соединение равенства
  • Соединение неравенства
  •  Внешние соединения 

Как правило, информация, хранящаяся в базе данных, содержится в нескольких связанных между собой таблицах. Язык SQL позволяет создавать запросы, извле­кающие данные из нескольких таблиц. При этом выполняется операция соедине­ния нескольких таблиц с целью поиска в них запрошенных данных.

Существует несколько способов соединения таблиц. Наиболее часто встречаются следующие:

  • соединение равенства;
  •   соединение неравенства;
  •  внешние соединения.

Для задания вида соединения используется предложение WHERE, в котором вид •соединения указывается с помощью операторов сравнения или логических опера­торов.

Соединение равенства

Соединение равенства, используемое чаще других, обычно производится по обще­му для нескольких таблиц полю (которое, как правило, является первичным клю­чом).

Синтаксис оператора выборки для этого способа соединения таблиц следующий:

SELECT Таблица1.поле1.  Таблица2.поле2 {,…          ТаблицаN. полеN}

FROM поле1, поле2 {     полеN}

WHERE Таблица1.о6щее_поле1 = Таблица2.общее_поле1

{AND Таблица1.общее_поле2 = Таблица2.общее поле2}

При формировании запроса на выборку из нескольких таблиц в списке полей пос­ле слова SELECT перед именем поля обычно указывается имя таблицы, к которой это поле относится. Такое действие называется квалификацией полей запроса. Ква­лификация обязательна только для полей, имеющих одинаковые имена в разных таблицах, из которых производится выборка.

Рассмотрим пример выборки из двух таблиц посредством соединения равенства. Выберем из таблицы Клиенты поля, содержащие сведения об именах клиентов, а из таблицы Продажи — поля, в которых содержатся сведения о покупках, сделанных клиентами. Для связывания таблиц воспользуемся общим для обеих таблиц по­лем Код клиента:

SELECT Клиенты.Фамилия. Клиенты.Имя,

Клиенты.Отчество. Продажи.Продано

FROM Клиенты, Продажи

WHERE Клиенты.[Код клиента]=Продажи.[Код клиента]

Результат выполнения данного запроса приведен на рис. 29.

Рис. 29. Использование соединения равенства для выборки из двух таблиц

Рис.30. Пример группировки результатов выборки из двух таблиц

При связывании таблиц можно использовать предложение группировки. Изме­ним рассмотренный запрос (см. рис. 11.29) таким образом, чтобы результаты были сгруппированы по полям Фамилия, Имя, Отчество, и для каждого клиента выводи­лось суммарное количество покупок:

SELECT Клиенты.Фамилия. Клиенты.Имя. Клиенты.Отчество,

SUM(Продажи.Продано) AS [Количество покупок],

FROM Клиенты, Продажи, Товары

WHERE Клиенты.[Код клиента]=Продажи.[Код клиента]

GROUP BY Клиенты.Фамилия. Клиенты.Имя. Клиенты.Отчество

Результаты, возвращаемые этим запросом, приведены на рис. 30.

Выборка из трех таблиц проводится аналогичным образом, только в предложении WHERE необходимо указать условие связи с третьей таблицей. Для примера допол­ним предыдущий запрос (см. рис. 30) таким образом, чтобы в выборку была включена информация о наименовании товара из таблицы Товары:

SELECT Клиенты.Фамилия. Клиенты.Имя. Клиенты.Отчество,

SUM(Продажи.Продано) AS [Количество покупок],

Товары.Наименование

FROM Клиенты, Продажи, Товары

WHERE Клиенты.[Код клиента]=Продажи.[Код клиента] AND

GROUP BY Клиенты.Фамилия. Клиенты.Имя. Клиенты.Отчество

Товары.Наименование

Результат выполнения данного запроса показан на рис.31.

Рис. 31. Пример выборки из трех таблиц

Соединение неравенства

В случае соединения неравенства информация из двух таблиц объединяется та­ким образом, чтобы значения в заданном поле одной таблицы не совпадали со зна­чениями соответствующего ему поля в другой таблице.

Синтаксис запроса при соединении неравенства аналогичен предыдущему случаю, только вместо оператора = в предложении WHERE используются операторы о, <, > и т. п.:

SELECT tablel.fieldl. table2.field2 {,….tableNfieldN}

FROM table1, table2 {,…..          tableN}

WHERE tablel.common_fieldl <> table2.common_fieldl

{AND tablel.common_field2 > table2.common_field2}

Соединения неравенства используются довольно редко. В частности, для базы дан­ных, применяемой нами в качестве практической модели, довольно трудно приве­сти осмысленный пример такого соединения.

Внешние соединения

При использовании внешнего соединения результат запроса будет содержать все за­писи одной из таблиц даже в том случае, если в связанной с ней таблице отсутствуют совпадающие значения. Этот тип соединения реализуется оператором OUTER JOIN.

Внешние соединения подразделяются на три группы:

·       LEFT OUTER JOIN - левое внешнее соединение (в выборку включаются все запи­си таблицы, имя которой указано слева от оператора OUTER JOIN);

·       RIGHT OUTER JOIN - правое внешнее соединение (в выборку включаются все за­писи таблицы, имя которой указано справа от оператора OUTER JOIN);

·       FULL OUTER JOIN - полное внешнее соединение (в выборку включаются все за­писи из правой и левой таблиц).

Для внешнего соединения условие соединения указывается не с помощью предло­жения WHERE, а входит в оператор OUTER JOIN после ключевого слова ON:

SELECT tablel.fieldl. table2.field2 {       tableN.fieldN}

FROM tablel LEFT [ RIGHT | FULL {OUTER} JOIN table2

ON условие

{LEFT |  RIGHT |  FULL {OUTER} JOIN table3

ON условие}

Рассмотрим следующий пример. Выберем из таблицы Товары список товаров, а из таблицы Продажи — суммарное количество проданных товаров:

SELECT Товары.[Наименование]. Бимшродажи.[Продано]) AS [Всего продано] FROM Товары LEFT OUTER JOIN Продажи ON Товары.[Код товара]=Продажи.[Код товара] GROUP BY Товары.[Наименование]

Так как таблица Товары указана слева от оператора LEFT JOIN, то результирующая выборка будет содержать полный список товаров, включая даже те, которые ни разу не были проданы (рис.32).

Рис.32. Результат внешнего соединения двух таблиц

Вопросы для самоконтроля:

  1. Каковы особенности использования динамических операторов SQL?
  2. Что такое динамические главные переменные? Для чего они используются?

Рекомендуемая литература:

  1. Миловзоров В.К. Элементы информационных систем. – М.: Высшая школа,1989.
  2. Морозов В.К. Основы теории информационных систем. – М.: Высшая школа, 1994.