Программирование >>  Sql: полное руководство 

1 ... 69 70 71 [ 72 ] 73 74 75 ... 264


(ACI, 41002, 54) < (ACI, 41003, 35)

- сортировка по второму столбцу (ACI, 41002, 10) < CACI, 41002, 54)

- сортировка по третьему столбцу

Табличные выражения

Стандарт SQL2 существенно расширил возможности SQL не только в отношении работы со скалярными значениями и записями, но также и в плане работы с таблицами. Им определен механизм динамического создания таблиц прямо в инструкциях SQL. Согласно стандарту SQL2 подчиненные запросы могут возвращать целые таблицы, а главный запрос может анализировать эти таблицы и сверять с ними собственные данные. Кроме того, подчиненные запросы могут использоваться в таких ситуациях, в которых стандартом SQL1 их использование не допускалось, - например в качестве таблицы-источника в предложении ьком инструкции select. Наконец, стандарт SQL2 предлагает расширенные возможности комбинирования таблиц, включая операции сложения (union), пересечения (intersect) и вычитания (except).

Табличный конструктор

Стандарт SQL2 позволяет задать значения ячеек таблицы прямо в инструкции, используя выражение специального типа - табличный конструктор (рис. 9.14). В своей простейшей форме этот конструктор представляет собой разделенный запятыми список конструкторов записей, каждый из которых, в свою очередь, состоит из разделенных запятыми литералов - значений столбцов. Например, инстзукция insert в SQL2 использует табличный конструктор в качестве источника вставляемых в таблицу данных. Если в SQL1 инструкция insert могла добавить в таблицу только одну запись, то следующая инструкция добавляет в таблицу 0FFIces сразу три записи:

Добавить в таблицу OFFICES данные о трех новых офисах.

INSERT INTO OFFICES (OFFICE, CITY, REGION, MGR, SALES) VALUES (23, San Diego, Western, 108, 0.00), (24, Seattle, Western, 104, 0.00), (14, Boston, Eastern, NULL, 0.00)

[~ VALUES конструктор записи - ф

Рис 9.14. Синтаксическая диагралща табличного конструктора (SQIS)

Обратим ваше внимание на то, что отдельные строки в табличном конструкторе вовсе не обязательно должны содержать только литеральные значения. Источником данных может быть и запрос, возвращающий скалярное значение либо запись. Хотя для нашей учебной базы данных следующий пример не имеет особого смысла, он вполне законен:

Добавить в таблицу OFFICES данные о трех новых офисах.

INSERT INTO OFFICES (OFFICE, CITY, REGION, MGR, SALES) VALUES (23, San Diego, Western, 108, 0.00),



(24, Seattle, Western, (SELECT MANAGER

FROM SALESREPS WHERE EMPL NUM = 105), 0.00), (SELECT 14, Boston, REGION, MGR, 0.00 FROM OFFICES WHERE OFFICE =12)

Как и в предыдущем примере, предложение values в инструкции insert генерирует таблицу из трех строк и пяти столбцов, которые должны быть добавлены в таблицу offices Первая строка задана как набор литеральных значений. Во второй строке значение четвертого столбца генерируется подчиненным запросом, который извлекает из таблицы salesreps идентификатор менеджера служащего с идентификатором 105. Третья строка целиком генерируется подчиненным запросом Три столбца, указанных в его предложении select, представляют собой константные значения, а значения третьего и четвертого столбца извлекаются из таблицы offices - это регион и руководитель Нью-йоркского офиса (идентификатор офиса 12).

Табличные подчиненные запросы

Стандарт SQL2 поддерживает подчиненные запросы, возвращающие не только скалярные значения, но также записи и даже таблицы Подчиненные запросы табличного типа ифают очень важную роль в предложениях where и having, где возвращаемые ими значения могут использоваться в выражениях со специальными операциями сравнения. Предположим, например, что нам нужны описания и цены всех товаров, для которых имеются заказы на сумму, большую $20000. Пожалуй, наиболее естественно сформулировать этот запрос так

Вывести описания и цены всех товаров, для которых имеются заказы на сумму, большую $20000

SELECT DESCRIPTION, PRICE FROM PRODUCTS WHERE (MFR ID, PRODUCT ID) IN (SELECT MFR, PRODUCT

FROM ORDERS WHERE AMOUNT > 20000.00)

Запрос звучит так: выбрать описания и цены товаров, чьи идентификационные данные (как и в предыдущем примере, это идентификаторы товара и его производителя) соответствуют одному товару из некоторого набора Этот набор - точнее, таблица из двух столбцов - генерируется подчиненным запросом, а вхождение в набор ицентификаторов очередного анализируемого товара проверяется в предложении where с помощью специального предиката in.

Конечно, запрос для нашего примера можно выразить иначе. Если вы прочли главу 7, то, вероятно, виците альтернативный вариант- объединение таблиц products и orders на основе составного условия.

Вывести описания и цены всех товаров, для которых имеются заказы на сумму, большую $20000.

SELECT DESCRIPTION, PRICE FROM PRODUCTS, ORDERS WHERE (MFR ID = MFR)

AND (PRODUCT ID = PRODUCT) AND (AMOUNT > 20000.00)

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



подчиненных запросов, возвращающих таблицы, очень важна - она позволяет выражать запросы проще и понятнее.

Понятие спецификации запроса в SQL2

То, что мы с вами в трех последних главах называли инструкцией select, запросом на выборку или просто запросом, стандарт SQL2 формально назьшает спецификацией запроса. Чтобы понять идею составных запросов, описанную в следующем параграфе, вам необходимо познакомиться с этим формальным определением Синтаксис спецификации запроса представлен на рис. 9.15 Ее компоненты должны быть вам уже хорошо знакомы из предыдущих глав.

В списке возвращаемых столбцов предложения select каждый столбец определяется выражением, которое сообщает СУБД, как вычислять его значения Столбцам могут (но не обязательно должны) быть присвоены псевдонимы, задаваемые с помощью ключевого слова as.

Предикаты all и distinct определяют, будут ли из результирующего набора записей удаляться повторяющиеся строки.

Предложение from определяет таблицы, на основе которых будут формироваться результаты запроса

Предложение where указывает СУБД, как определять, какие записи включать в запрос.

Предложения group by и having управляют процессом группировки отобранных записей и отбором групп для включения в окончательные результаты запроса Спецификация запроса является одним из базовых блоков формирования запросов

в SQL2. Концептуально она описьшает процесс составления строк и столбцов результирующего набора записей на основе данных из таблиц, указанных в предложении from Значением спецификации запроса является таблица данных Простейший запрос в SQL2 состоит из одной спецификации Более сложный запрос может щецрттятъ собой несколько спецификаций, вложенных одна в другую по принципу подчинения запросов Наконец, с помощью табличных операций спецификации могут объединяться в составные запросы, о которых рассказывается в следующем параграфе.

I-SELECT.

. ALL-

L-DISTINCT-

. имя таблицы

. скапярнов выражвнив

?имя столбца-

1- FROM

- спвцификация таблицы -

-WHERE усповив отбора I- GRUOP BY список столбцов группировки-

HAVING условив отбора

Р-( 9 15 Спецификации запроса в SQt2 -

ипр,:епение



1 ... 69 70 71 [ 72 ] 73 74 75 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика