Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода ТОБД.doc
Скачиваний:
24
Добавлен:
13.04.2015
Размер:
8.25 Mб
Скачать

Задание 4. Поиск несоответствующих строк

Другой распространенный тип соединения в MySQL — объединение по остатку (левостороннее соединение – left join). В предыдущих примерах отбирались только те строки, в которых наблюдалось соответствие между таблицами. Однако могут потребоваться и строки, в которых нет соответствия — например, нужно найти клиентов, которые не сделали ни одного заказа, или книги, которые никто не заказывал.

Самый простой вариант ответа на такой вопрос в MySQL — использование левостороннего соединения, которое будет искать строки по указанному условию соединения двух таблиц. Если в указанной таблице нет подходящей строки, эта строка добавляется к результату, но с нулевым значением.

Пример:

select customers.customerid, customers.name, orders.orderid

from customers left join orders

on customers.customerid = orders.customerid;

Рис. 3.239. Запрос с левосторонним соединением.

Данный запрос SQL использует объединение по остатку для таблиц Customers и Orders. Его синтаксис в отношении условий объединения несколько иной; условие соединения указывается в специальной конструкции ON оператора SQL.

Результат запроса приведен на рис. 3.240.

Рис. 3.240. Результат запроса с левосторонним соединением.

Чтобы раскрыть суть левостороннего соединения добавим в таблицу Customers (Клиенты) еще одну строчку.

Рис. 3.241. Состав таблицы Customers (Клиенты) после добавления.

Если повторить запрос показанный на рис. 3.239, то получим результат приведенный на рис. 3.242.

Результат показывает, что для клиента Иван Иванов нет соответствующего orderid, поскольку его orderid имеют значения NULL.

Если необходимо найти исключительно тех клиентов, которые ничего не заказывали, этого можно достичь, проверив их на значение NULL в поле первичного ключа правой таблицы (в данном случае, orderid), поскольку строки с реальными значениями не могут иметь значение NULL (рис. 3.243)

Рис. 3.242. Результат левостороннего соединения таблиц Customers и Orders.

select customers.customerid, customers.name

from customers left join orders

using (customerid)

where orders.orderid is null;

Рис. 3.243. Запрос левостороннего соединения таблиц Customers и Orders с использованием using.

И вот результат:

Рис. 3.244. Результат левостороннего соединения таблиц Customers и Orders с использованием using.

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

Задание 5. Использование псевдонимов имен таблиц (as)

Часто бывает очень удобно, а порой и необходимо обращаться к таблицам под другими именами. Такие имена называются псевдонимами (aliase). Их можно создать в самом начале запроса, а потом пользоваться по мере необходимости. Псевдонимы очень удобны, все равно, что ярлык на рабочем столе. Если запрос, показанный на рис. 3.245 переписать с использованием псевдонимов (рис. 3.2460), то его объем становится меньше.

select customers . name

from customers, orders, order_items, books

where customers.customerid = orders.customerid

and orders.orderid = order_items.orderid

and order_items.isbn = books.isbn

and books.title like '%Java%';

Рис. 3.245. Запрос без использования псевдонимов.

Указывая таблицы, в фразе FROM, мы за именем таблицы вставляем конструкцию as, присваивая таблице псевдоним (короткое имя).

select с.name

from customers as с, orders as о, order_iterns as oi, books as b

where с.customerid = о.customerid

and о.orderid = oi.orderid

and oi.isbn = b.isbn

and b.title like '%Java%' ;

Рис. 3.246. Запрос с использованием псевдонимов.

Кроме того, псевдонимы можно давать столбцам, однако к этому мы вернемся после того, как рассмотрим обобщенные функции.

Табличные псевдонимы необходимы в случае соединения таблицы с самой собой. А такой подход очень удобен для поиска строк в той же таблице, в которой есть одинаковые значения. Если требуется найти клиентов, живущих в одном городе, скажем, с целью создания читательского клуба, можно присвоить одной и той же таблице Customers два разных псевдонима:

select sl.name, s2.name, sl.city

from customers as sl, customers as s2

where sl.city = s2.city

and sl.name != s2.name;

Рис. 3.247. Запрос с использованием 2-х псевдонимов на одной таблице.

Чтобы раскрыть суть соединения таблицы самой с собой, добавим в таблицу Customers (Клиенты) еще одну запись (рис. 3.248).

Рис. 3.248. Запрос на добавление нового клиента.

Далее исполним запрос на самосоединение таблиц:

Рис. 3.249. Список клиентов из одного города.

Мы делаем вид, что таблица Customers — это на самом деле две разные таблицы, sl и s2, и выполняем соединение по столбцу City. Второе условие, sl.name != s2.name, необходимо для того, чтобы в результате запроса не выдавалось соответствие клиента самому себе.

Резюме по типам соединениий

Мы рассмотрели только самые основные, хотя существуют еще несколько соединений, представленных в таблице на рис. 3.250.

Название

Описание

Декартово

произведение

Все комбинации всех строк во всех таблицах. В случае применения между именами таблиц ставят запятые и не употребляют конструкцию WHERE.

Полное

соединение

Аналогично предыдущему.

Перекрестное

соединение

Аналогично предыдущему. Также может использоваться с указанием ключевых слов CROSS JOIN между названиями объединяемых таблиц.

Внутреннее

соединение

Семантически эквивалентно запятой. Может использоваться с указанием ключевых слов INNER JOIN. Без условия WHERE эквивалентно полному объединению. Обычно при истинно внутреннемобъединении задается условие WHERE.

Соединение

по равенству

Использует условное выражение со знаком = для Соответствия в объединении строк из разных таблиц. В SQL в этом объединении применяется конструкция WHERE.

Соединение по

остатку

Старается уравнивать строки в таблицах и выискивает несовпадающие строки со значениями NULL. В SQL используется с ключевыми словами LEFT JOIN. Предназначено для поиска отсутствующих значений. Аналогично можно употреблять RIGHT JOIN.

Рис. 3.250. Типы соединеий в MySQL.