|
Программирование >> Создание клиентов mysql
Объединения Объединения Объединение создается путем указания нескольких таблиц в предложении FROM. Существуют два варианта записи объединений. В первом из них в предложении FROM указывается выражение объединения. Этим способом чаще всего создают внешние объединения. Второй вариант - применение условия отбора, заданного в предложении WHERE, к произведению таблиц, перечисленных в предложении FROM. Так получаются внутренние объединения. Для примера создадим вторую таблицу itemoption, которая будет участвовать в операциях объединения с таблицей item. В листинге 6.11 показаны инструкции, создающие обе таблицы и заносящие в них данные. В таблице item option хранятся описания возможных вариантов изготовления товаров, перечисленных в таблице item. CREATE TABLE item ( ID INT(6) NOT NULL AUTO INCREMENT, Name CHAR(32) NOT NULL, Price DECIMAL(4,2) NOT NULL, Description CHAR(255) DEFAULT No Description, PRIMARY KEY(ID), KEY (Name) INSERT INTO item VALUES (1, Toothbrush, 1.25, NULL); INSERT INTO item VALUES (2, Comb, 2.50, NULL); INSERT INTO item VALUES (3, Brush, 3.00, NULL); INSERT INTO item VALUES (4, Toothpaste, 0.75, NULL); CREATE TABLE item option ( ID INT(6) NOT NULL AUTO INCREMENT, Item INT(6) NOT NULL, Name CHAR(32) NOT NULL, PRIMARY KEY(ID), FOREIGN KEY(Item) REFERENCES Item (ID) INSERT INTO item pption VALUES (1, 2, Red Plastic); INSERT INTO item option VALUES (2, 2, Blue Plastic1); Чтобы создать внутреннее объединение таблиц, достаточно указать их имена в предложении FROM инструкции SELECT. При отсутствии предложения WHERE получится самый общий вариант такого объединения - декартово произведение, в котором каждая строка первой таблицы объединена с каждой строкой второй таблицы. Если же задано условие отбора, то в результаты запроса попадут лишь те строки таблицы произведения, в которых значения связанных столбцов удовлетворяют требуемому критерию {связанн1м называется столбец, присутствующий в условии отбора). В листинге 6.12 выполняется объединение двух таблиц по равенству столбцов item. ID и item option. Item, т.е. для каждой строки первой таблицы находится соответствующий элемент второй таблицы. Из объединенной таблицы отбираются три столбца: с названием и ценой товара, а также с названием варианта его изготовления. mysql> SELECT i.Name, i.Price, о.Name AS Option Name -> FROM item i, item option о -> WHERE i.ID = o.Item; +------+-------+--------------+ I Name I Price I Option Name I Comb I 2.50 I Red Plastic I 1 Comb I 2.50 I Blue Plastic I 2 rows in set (0.00 sec) В листинге 6.12 содержатся примеры псевдонимов таблиц и столбцов. Третий столбец результатов запроса называется так же, как и первый, поэтому во избежание путаницы он переименуется в Option Name. На псевдонимы столбцов можно ссылаться в предложениях GROUP BY и ORDER BY, рассматриваемых ниже. Псевдонимы таблиц необходимы для того, чтобы не возникала путаница с одноименными столбцами. Например, в обеих таблицах есть столбец Name, поэтому MySQL выдаст сообщениеоб ошибке, если не уточнить имя таблицы, к которой относится столбец. Псевдоним таблицы обычно выбирается максимально коротким, чтобы полные имена столбцов было удобно набирать. Длина псевдонима не может превышать 255 символов. В листинге 6.13 показано то же самое внутреннее объединение, что и в листинге 6.12, но на этот раз в предложении FROM присутствует операция INNER JOIN. В подобном случае условие отбора переносится из предложения WHERE в предложение ON. SELECT i.Name, i.Price, o.Name AS Option Name FROM item i INNER JOIN item option о ON i.ID = o.Item Иногда внутреннее объединение не дает нужных результатов. Оно формирует пары только тех строк, между которыми найдено соответствие. Все остальные строки исключаются. Чтобы включить в полученные выше результаты названия все товаров, нам потребуется выполнить внешнее объединение, в данном случае левое (листинг 6.14). Упорядочение результатов запроса mysql> SELECT i.Name, i.Price, o.Name AS Option Name -> FROM item i LEFT JOIN item option о -> ON i.ID = o.Item; I Name I Price Option Name +------------+-------+--------------+
5 rows in set (0.00 sec) Как видите, отображаются пять строк. В объединенную таблицу вошли все строки таблицы item, даже те, которым не найдено соответствие. Строка, не имеющая пары , дополняется значениями NULL. Упорядочение результатов запроса Предложение ORDER BY содержит имена столбцов, по которым осуществляется сортировка результатов запроса. На столбец можно сослаться по имени (краткому или полному), псевдониму или порядковому номеру в предложении SELECT (нумерация столбцов начинается с единицы). В листинге 6.15 таблица результатов сортируется по названию товара. SELECT i.Name, i.Price, o.Name AS Option Name FROM item i LEFT JOIN item option о ON i.ID = o.Item ORDER BY i.Name Предложение ORDER BY может содержать не одно имя, а целый список. Столбцы перечисляются в порядке убывания приоритетов. В первую очередь записи сортируются по столбцу, указанному первым. Если возникает конфликт (две или более строк имеют одинаковое значение в данном поле), проверяется второй столбец, затем третий и т.д. По умолчанию сортировка всех столбцов ведется по возрастанию. Если нужно задать обратный порядок, укажите рядом с именем столбца ключевое слово DESC. В листинге 6.16 показан пример сортировки товаров по цене, начиная от самгх дорогих.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |