|
Программирование >> Хронологические базы данных
<стол6ец> из этого предложения присваивается в качестве имени соответствующему столбцу таблицы Т2 (необязательное ключевое слово AS является лищним и может быть опущено без какого-либо ущерба). Если же параметр <выбираемый элемент не включает предложение AS, то, если он содержит просто (возможно, уточненное) имя <стол6е1>, это имя назначается соответствующему столбцу таблицы Т2. В противном случае соответствующий столбец таблицы Т2 фактически не будет иметь имени (на самом деле присваивается имя, зависящее от реализации ; см. [4.19], [4.22]). Рассмотрим некоторые дополнительные аспекты. Поскольку используется имя столбца именно таблицы Т2, а не Т1, представленное предложением AS имя не может употребляться в предложениях WHERE, GROUP BY и HAVING, включаемых непосредственно в конструкцию таблицы Т1. Однако на это имя можно ссылаться в предложении ORDER BY (в частности, при определении курсора в предложении DECLARE CURSOR), а также во внешнем выражении типа <та6личное выражение>, которое содержит рассматриваемое выражение типа <выражение выборки> как вложенное. Если некоторый параметр <выбираешй элемент> включает вызов оператора обобщения и параметр <выражение вы6оркИ> не включает предложение GROUP BY (см. ниже), то ни один параметр <выбираешй элементе в предложении SELECT не может включать никаких ссылок на столбец таблицы Т1, кроме случаев, когда такая ссылка является аргументом (или частью аргумента) в вызове оператора обобщения. Случай 2. Параметр <выбираемый элемент> принимает следующий вид. [ <переменная диапазона> . ] * Если уточнение опущено, т.е. элемент выборки <вы6ираемый элемен1> представляет собой просто неуточненный символ * , такой элемент выборки должен быть единственным элементом выборки в предложении SELECT. Этот вид элемента выборки является сокращением для списка всех имен столбцов таблицы Т1 в порядке их следования слева направо. Если используется уточнение и параметр <выбираемый элемент> представляет собой символ * , уточненный именем переменной кортежа R, т.е. J?.* , то такой параметр представляет список имен столбцов для всех столбцов таблицы, соответствующей переменной кортежа R, в порядке их следования слева направо. (Напомним, что, как указывалось в разделе 7.7, имя таблицы может использоваться и часто используется, как явная переменная кортежа. Поэтому параметр <вы6ираемый элемент> чаще представляется в виде Г.* , а не в виде i?.* .) Предложение FROM Предложение FROM имеет следующий вид. FROM <список ссылок на та6лицы> Параметр <список ссылок на таблицы> не должен быть пустым. Пусть указанный список ссылается на таблицы А, В, ... С. Тогда результат вычисления предложения FROM будет представлять таблицу, которая равна декартову произведению таблиц Л, В,... С. Замечание. Напомним, что декартово произведение одной таблицы Т совпадает с самой таблицей Т (см. упр. 6.12 в главе 6). Иначе говоря, в предложении FROM допускается наличие лишь одного параметра <ссылка на та6лицу>. Предложение WHERE Предложение WHERE имеет следующий вид. WHERE <условяое выражение> Пусть таблица Т представляет собой результат вычисления непосредственно предшествующего предложения FROM. Тогда результат вычисления предложения WHERE является таблицей, производной от таблицы Т. Результирующая таблица формируется путем исключения из таблицы Т всех строк, для которых вычисление выражения, заданного параметром <условное выражение>, дает ложь. Если предложение WHERE опущено, результатом будет просто таблица Т. Предложение GROUP BY Предложение GROUP BY имеет следующий вид. GROUP BY <список имен столбцов> Параметр <список имен столбцов> не должен быть пустым. Пусть таблица Т представляет собой результат вычисления непосредственно предшествующих предложений FROM и WHERE (если такие имеются). Каждый параметр <имя столбца>, указанный в предложении GROUP BY, должен являться именем столбца (необязательно уточненным) таблицы Т. Результат вычисления предложения GROUP BY представляет собой сгруппированную таблицу, т.е. множество групп строк, производных от строк таблицы Т, посредством ее концептуального переупорядочения в минимальное количество групп, в которых все строки имеют одно и то же значение для сочетания столбцов, определяемых предложением GROUP BY. Подчеркнем, что результат будет ненастоящей таблицей , поскольку он представляет таблицу групп, а не таблицу строк. Однако предложение GROUP BY никогда не используется без соответствующего предложения SELECT, назначение которого заключается в получении настоящей таблицы (т.е. таблицы строк) из таблицы групп, так что такое временное отклонение от реляционных правил является лишь небольшим изъяном. Если параметр <выражение выборки> включает предложение GROUP BY, то на вид соответствующего предложения SELECT накладываются определенные ограничения. А именно, каждый параметр <выбираемый элемент> в предложении SELECT, включая любой элемент, который подразумевается под сокращением * , должен принимать единственное значение в пределах каждой группы. Поэтому параметры <выбираемый элемент> не должны включать никаких ссылок на столбцы таблицы Г, которые не указаны в самом предложении GROUP BY, за исключение.м такой ссылки, которая представляет собой аргумент, или часть аргумента, в вызове оператора обобщения (поскольку в результате такого вызова некоторое множество скалярных значений в группе сводится к одному скалярному значению). Предложение HAVING Предложение HAVING имеет следующий вид. HAVING <условное выражение> Пусть G- сгруппированная таблица, полученная в результате вычисления непосредственно предшествующих предложений FROM, WHERE (если оно задано) и GROUP BY (если они заданы). Если предложение GROUP BY не указано, то таблица G будет результатом вычисления только предложений FROM и WHERE и будет рассматриваться как сгруппированная таблица, которая содержит ровно одну группу. Другими словами, в этом случае имеется неявное концептуальное предложение GROUP BY, в котором не указано никаких группируемых столбцов. Результат вычисления предложения HAVING является таблицей, производной от таблицы G путем исключения всех групп, для которых вычисление выражения, заданного параметром <условное выражение>, дает в результате значение лолсь. Приведем некоторые особенности использования предложения HAVING. Если предложение HAVING опущено, а предложение GROUP BY указано, результатом будет просто таблица G. Если оба предложения, HAVING и GROUP BY, опущены, результатом будет просто настояшая , т.е. не сгруппированная, таблица Т, которая будет получена в результате вычисления предложений FROM и WHERE. Любое выражение типа <скалярное выражениё> в предложении HAVING должно иметь одно значение в группе (как и скалярное выражение в предложении SELECT, если имеется предложение GROUP BY). Подробный пример в заключение нашего обсуждения выражений типа выражение выборки> рассмотрим достаточно сложный пример. С его помощью будут проиллюстрированы некоторые (но отнюдь не все) особенности, объяснявшиеся выше. Сформулируем запрос: Для каждой красной и синей детапи, которых в сумме поставлено более 350 штук (исключая из всех поставок детати, количество которых меньше или равно 200 штук), определить номер, вес в граммах, цвет и максимальное количество . Приведем возможную формулировку этого запроса на языке SQL. SELECT P.Pl, Вес в граммах = AS ТЕХТ1, Р.WEIGHT * 454 AS GMWT, P.COLOR, Максимальное количество = AS TEXT2, MAX ( SP.QTY ) AS MXQTY FROM P, SP WHERE P.Pl = SP.PI AND ( P.COLOR = Red OR P.COLOR = Blue ) Так говорится в стандарте, хотя логичнее следовало бы сказать самое большее одну группу , поскольку групп может не быть совсем, если в результате вычисления предложений FROM и WHERE получится пустая таблица.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |