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

1 ... 66 67 68 [ 69 ] 70 71 72 ... 264


товара) соответствуют одному из элементов заданного набора пар значений, и было бы естественно написать запрос с проверкой на принадлежность множеству

SELECT MFR ID, PRODUCT ID, PRICE FROM PRODUCTS

WHERE (MFR ID, PRODUCT ID) IN ((ACI, 41003), (BIC, 41089), ...)

Однако стандарт SQLl не допускает выполнения такой проверки. Вместо этого вам придется составить длинную цепочку отдельных сравнений, соединенных операторами and и or.

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

SELECT *

FROM ORDERS WHERE AMOUNT > 1000

и затем использовать это представление как таблицу в предложении from запроса, определяющего, какие товары и в каких количествах входили в эти заказы:

SELECT MFR, PRODUCT, SUM(QTY) FROM BIGORDERS GROUP BY MFR, PRODUCT

Концептуально SQL должен позволить включить определение представления прямо в запрос:

SELECT MFR, PRODUCT, SUM(QTY)

FROM (SELECT * FROM ORDERS WHERE AMOUNT > 1000) GROUP BY MFR, PRODUCT

Ho не тут-то было! Стандарт SQLl не допускает непосредственного использования подчиненных запросов в предложении from. Хотя совершенно очевидно, что для выполнения запроса к представлению bigorders СУБД все равно придется раскрывать определение этого представления, так что какая ей разница?

Как показывают эти примеры, стандарт SQL1 и наиболее популярные СУБД существенно ограничивают использование в запросах выражений, включающих наборы элементов данных, записи и таблицы. Чтобы сделать язык SQL более гибким и освободить его от излишних ограничений, разработчики стандарта SQL2 включили в него ряд дополнительных возможностей. Их общую идею можно выразить так: Пользователь должен иметь возможность сформулировать свой запрос естественным для него способом, и если написанное им выражение правильно с логической точки зрения, то оно должно быть допустимой инструкцией SQL . Поскольку по сравнению со стандартом SQL1 новые возможности значительно расширили язык SQL, для их использования СУБД должна быть полностью совместима со стандартом SQL2 (уровень совместимости Full).

Выражения со скалярными значениями

Простейшие из расширенных возможностей стандарта SQL2 обеспечивают большую гибкость операций и вычислений, включающих в свой состав отдельные значения данных, называемые в SQL2 скалярами или скалярными значениями. У скалярных значений, используемых в инструкциях SQL, может быть три источника:

значение отдельного столбца отдельной строки таблицы;



щ литерал, например 125,7 или АБВ ;

значение, введенное пользователем в прикладной программе. В следующем запросе:

SELECT NAME, EMPL NUM, HIRE DATE, (QUOTA * .9) FROM SALESREPS WHERE (REP OFFICE = 13) OR TITLE = VP SALES

имена столбцов name, empl num, hire date и quota приводят к генерированию отдельных значений для каждой строки результатов запроса, как и имена столбцов rep office и title в предложении where. Кроме того, отдельные значения генерируются литералами 0,9 и 13 и строкой VP SALES . Если эта инструкция будет встроена в прикладную программу, значение номера офиса может храниться, например, в переменной of f ice num, и с ее участием тот же запрос может выглядеть так:

SELECT NAME, EMPL NUM, HIRE DATE, (QOOTA * .9) FROM SALESREPS WHERE (REP OFFICE = :office num) OR TITLE = VP SALES

Как показывает этот и многие другие примеры, отдельные значения могут объединяться в простые выражения, наподобие quota * . 9. К этим простейшим выражениям, поддерживаемым в SQL1, стандарт SQL2 добавил оператор cast, выполняющий явное преобразование типов данных, оператор case для организации ветвлений, оператор nullif для условного создания значений null и оператор coalesce для условного создания значений, отличных от null.

Оператор CAST

Стандарт SQL гфедусматривает очень строгие правила сочетания различных типов данных в вьфажениях. В нем определено, что СУБД должна автоматически выполнять преобразования простейших типов данных, таких как 2-байтовые и 4-байтовые целые. Однако если вы попытаетесь сравнить числовое и символьное значения, то СУБД, в соответствии со стандартом, должна сообщить об ошибке, причем даже в том случае, если строка на самом деле содержит число. Однако вы можете явно попросить СУБД вьшолнить преобразование типов - с помошз>ю оператора cast (рис. 9.8).

1-CAST(-

-скалярное выражение- AS -т- тип данных-)

NULL-

имя домена-

рагок

При интерактивном вводе инструкций SQL вы вряд ли будете часто пользоваться оператором cast. А вот если вы вьшолняете инструкции из программы, написанной на язьпсе, ти1ш1 данных которого не соответствуют типам данных SQL, тогда без этого оператора не обойтись. Например, в следующем запросе оператор CAST в предложении select преобразовывает значения полей rep OFFiCE (целое число) и hire date (дата) в символьные строки, которые будут возвращены в качестве результата запроса:

SELECT NAME, CAST REP OFFICE AS VARCHAR, HIRE DATE AS VARCHAR FROM SALESREPS



Оператор cast может стоять в инструкциях везде, где допускаются выражения, возвращающие скалярные значения. В следующем примере он используется в предложении where для преобразования номера клиента из символьной формы в целое число, чтобы его можно было сравнивать со значениями столбца из базы данных:

SELECT PRODUCT, QTY, AMOUNT FROM ORDERS WHERE COST = CAST 2107 AS INTEGER

Вместо типа данных в выражении с оператором cast в SQL2 разрешается указывать домен. Домен - это набор допустимых значений, который можно определить в базе данных с помощью специальной инструкции, описанной в стандарте SQL2. О доменах подробно рассказывается в главе И, поскольку они играют важную роль в обеспечении целостности данных. Обратите внимание на то, что с помощью оператора cast можно также сгенерировать значение null, приведенное к требуемому типу. Вот для чего чаще всего применяется оператор cast:

для преобразования значений, извлеченных из столбца таблицы с неподходящим типом данных. Например, столбец может быть определен как строковый, но вы знаете, что на самом деле он содержит числа (т.е. строки цифр) или даты (т.е. строки, которые могут быть интерпретированы как день/месяц/год );

для приведения возвращенных запросом данных к типу, поддерживаемому языком, на котором написано клиентское приложение. Например, большинство языков программирования не поддерживает специальных типов данных для даты и времени, и для обработки таких значений программой их нужно преобразовывать в символьные строки;

для приведения значений из одной таблицы к типу данных аналогичных значений в другой таблице. Например, если в таблице заказов дата заказа хранится в виде значений типа date, а в таблице наличия товара на складе дата хранится в виде символьной строки, для их сравнения нужно либо преобразовать дату заказа в строку, либо строку из складской таблицы привести к типу date. Подобйым же образом, если вы хотите объединить данные из двух таблиц с помощью операции union, объединяемые столбць! должны быть одинакового типа. Поэтому для вьшолнения такого объединения может понадобиться привести столбцы одной таблицы к типу данных столбцов другой.

Оператор CASE

Оператор case, включенный в стандарт SQL2, обеспечивает возможность организации ветвлений при вычислении SQL-выражений. Его базовая структура, представленная на рис. 9.9, подобна структуре конструкции if. . .then.. .else, имеющейся во многих языках программирования. Когда СУБД встречает оператор case, она вычисляет первое условие, и если оно истинно, выполняется первое результирующее выражение. Если же первое условие ложно, проверяется второе условие, и если оно истинно, вьшолняется второе результирующее выражение, и т.д.

I-CASE -у WHEN условие THEN

- рвзультирующев еыражение .

- NULL-

L Е15Етрвзультирующвв выражвнив-I-- NULL-

В, Ситапфчсская диаграмма оператора CAST ISQL21



1 ... 66 67 68 [ 69 ] 70 71 72 ... 264

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