|
Программирование >> Хронологические базы данных
AND SP.QTY > 200 GROUP BY P.Pt, P.WEIGHT, P.COLOR HAVING SUM ( SP.QTY ) > 350 ; Пояснения. Прежде всего необходимо отметить, что (как объяснялось в предыдущем подразделе) предложения типа <выражение выборки> концептуально вычисляются в том порядке, в котором пишутся, за исключением самого предложения SELECT, которое вычисляется последним. Поэтому можно считать, что результат нашего примера будет формироваться следующим образом. 1. FROM. Вычислив предложение FROM, получим новую таблицу, которая является декартовым произведением таблиц Р и SP. 2. WHERE. Результат выполнения шага 1 преобразуется путем исключения всех строк, которые не удовлетворяют условию, указанному в предложении WHERE. В данном примере это строки, которые не удовлетворяют следующему условному выражению. P.PI = SP.PI AND ( Р.COLOR = Red OR P.COLOR = Blue ) AND SP.QTY > 200 3. GROUP BY. Результат выполнения шага 2 группируется по значениям столбцов, которые указаны в предложении GROUP BY. В данном примере это столбцы Р.Р#, P.WEIGHThP.COLOR. Замечание. Теоретически здесь для группирования было бы достаточно одного столбца P.Pt, поскольку столбцы Р.WEIGHT и Р.COLOR имеют лишь одно значение для каждого номера детали, т.е. они функционально зависимы от номера детали. Однако язык SQL не знает об этом факте, и возникнет ошибка, если в предложении GROUP BY столбцы Р.WEIGHT и Р.COLOR будут опущены, поскольку они упомянуты в предложении SELECT. (См. статью [10.6], где обсуждается этот вопрос.) 4. HAVING. Из результата выполнения шагаЗ исключаются группы, которые не удовлетворяют заданному условному выражению. SUM ( SP.QTY ) > 350 5. SELECT. Каждая образованная в результате выполнения шага 4 группа порождает одну итоговую строку, причем следующим образом. Во-первых, из группы извлекаются атрибуты номер детали , вес , цвет и максимальное количество . Во-вторых, значение веса преобразуется в граммы по заданной формуле. В-третьих, в соответствующие места в строке вставляются две символьные строки: Вес в граммах = и Максимальное количество =. В отношении фразы вставляются в соответствующие места в строке заметим, что мы полагаемся здесь на принятую в языке SQL упорядоченность столбцов таблицы слева направо. Эти текстовые строки потеряют всякий смысл, если не будут помещены в соответствующие места . Конечный результат будет подобен приведенному ниже.
Не забывайте, что описанный выше алгоритм был приведен исключительно как концептуальное объяснение того, как в языке SQL должно вычисляться выражение типа <выражение выборки>. Этот алгоритм, безусловно, корректен, в том смысле, что он гарантирует получение правильного результата. Однако буквальное следование данному алгоритму при его реализации было бы неэффективным. Например, необходимо считать очень неудачным решением реальное вычисление в системе декартова произведения таблиц на шаге \. Именно соображения, подобные приведенному, послужили причиной появления в реляционных системах оптимизаторов, обсуждавшихся в главе 17. Фактически основная задача оптимизатора в SQL-системе заключается в том, чтобы найти такую процедуру реализации, которая давала бы тот же результат, что и концептуальный алгоритм, кратко описанный выше, но была бы эффективнее его. А.З. Условные выражения Подобно выражениям типа <та6личное выражение>, выражения типа <условное выражениё> используются в различных контекстах языка SQL, в частности в предложении WHERE при определении требуемых или исключаемых строк для последующей обра-ботки. В этом разделе будут рассмотрены некоторые наиболее важные особенности данного типа выражений. Заметим, однако, что здесь, разумеется, не ставилась задача исчерпывающе осветить этот вопрос. В частности, не рассмотрены особенности обработки NULL-значений. Как указывалось в главе 18, если учитывать наличие NULL-значений, то для выражений типа <условное выражениё> потребуется существенно более расширенное толкование. Некоторые форматы условного выражения, которые не приводятся в этом приложении, относятся исключительно к аспектам, связанным с поддержкой NULL-значений. Однако данные аспекты обсуждались в главе 18. Как и в предыдущем разделе, начнем с BNF-грамматики. Затем перейдем к обсуждению некоторых специфических случаев, а именно- параметров <условие Икё>, <условие match>, <условие all или апу> и <условие unique>, которые будут рассмотрены более подробно (все другие случаи или обсуждались ранее в этой книге, или настолько просты и понятны, что не требуют разъяснений). <условное выражениё> ::= <тери условие I <условное выражениё> OR <repw условие <терм условиЯ> :: = <фактор условие I <герм условие AND <фактор условие <фактор условия> ::= [ NOT ] <первичное условие> <первичное условие> ::= <простое условие> \ {<условное выражение> ) Напомним, что, как указывалось в главе 8, условные выражения представляют в языке SQL аналог того, что в книге мы называли булевыми или логическими выражениями. <простое условие> <условие сравнениЯ> <условие in> <условие Ике> <условие match> <условие all или апу> <условие exists> <условие unique> <условие сравненное* ::= <конструктор строки> <оператор сравнения> <конструктор строкЯ> <оператор сравнения> = I < I <= I > I >= I о <у с ловие in> ::= <конструктор строки> [ NOT ] IN {<табличное выражение> ) I <скалярное выражение> [ NOT ] IN {<список скалярных выражений> ) <у с ловие Ике> :: = <выражение из символьных строк> [ NOT ] LIKE <шаблоЕГ> [ ESCAPE <исключениЯ> ] <условие match> ::= <конструктор строкИ> MATCH UNIQUE {<табличное выражение> ) <условие all или апу> ::= <конструктор строкИ> <оператор сравнения> ALL {<табличное выражение> ) I <конструктор строки> <оператор сравнениЯ> ANY (<табличное выражение> ) <условие exists> ::= EXISTS (<табличное выражение> ) <условие unique> ::= UNIQUE (<табличное выражение> ) Условие LIKE Условия LIKE предназначены для простой проверки соответствия символьных строк заданному шаблону. Еще раз приведем синтаксис этого условия. <выражение из символьных строк> [ NOT ] LIKE <шаблон> [ ESCAPE <исключение> ]
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |