IBM Европейский Стандарт hh-mm-ss 21.04.37
IBM USA Стандарт (USA) hh.mm AM/PM 9.04 PM
Время может добавляться или сравниваться точно также как дата, с коррекцией числа секунд в минутах или часах автоматически. Кроме того, специально встроенные константы, указывающие текущую дату или время (CURDATEилиCURTIME) являются общими. Они похожи на константу USER (Пользователь), в которой их значение будет непрерывно меняться.
Можете ли вы включать время и дату в одно поле? Некоторые реализации определяют тип DATE достаточно точно, чтобы включать туда еще и TIME.
В качестве альтернативы, третий обобщающий тип, TIMESTAMP, может быть определен как комбинация этих двух.
ТИПЫ ТЕКСТОВОЙ СТРОКИ
ANSI поддерживает только один тип, чтобы представлять текст. Это — тип CHAR. Любое поле такого типа должно иметь определенную длину. Если строка, вставляемая в поле, меньше, чем длина поля, она дополняется пробелами; строка не может быть длиннее, чем длина поля.
Хотя и достаточно удобное, это определение все же имеет некоторые ограничения для пользователя. Например, символьные поля должны иметь одинаковую длину, чтобы можно было выполнить команду UNION. Большинство реализаций поддерживают строки переменной длины для типов данных VARCHAR и LONG VARCHAR (или просто LONG). В то время, как поле типа CHAR всегда может распределить память для максимального числа символов, которое может сохраняться в поле, поле VARCHAR при любом количестве символов может распределить только определенное количество памяти, чтобы сохранить фактическое содержание поля, хотя SQL может установить снаружи некоторое дополнительное пространство памяти, чтобы следить за текущей длиной поля.
Поле VARCHAR может быть любой длины, включая максимум, определяемый реализацией. Этот максимум может меняться от 254 до 2048 символов для VARCHAR, и до 16000 символов для LONG. LONG обычно используется для текста пояснительного характера или для данных, которые не могут легко сжиматься в простые значения полей; VARCHAR может использоваться для любой текстовой строки, чья длина может меняться.
Между прочим, не всегда хорошо использовать VARCHAR вместо CHAR. Извлечение и модифицирование полей VARCHAR — более сложный и, следовательно, более медленный процесс, чем извлечение и модифицирование полей CHAR. Кроме того, некоторое количество памяти VARCHAR остается всегда неиспользованной (в резерве) для гарантии вмещения всей длины строки.
Вы должны просчитывать, насколько значения полей могут меняться по длине, а также, способны ли они к объединению с другими полями, перед тем как решить, использовать CHAR или VARCHAR. Часто, тип LONG используется для сохранения двоичных данных. Естественно, что использование размера такого "неуклюжего" поля будет ограничивать оперативность SQL.
В любом случае полезно обратиться к технической документации по Вашей системе.
Команда FORMAT
Как мы подчеркивали в Главе 7, процесс вывода, выполняемого в стандарте SQL, ограничен. Хотя большинство реализаций включают SQL в пакеты, имеющие другие средства для управления этой функцией, некоторые реализации также используют команду типа FORMAT внутри SQL, чтобы навязывать выводу запроса определенные формы, структуры или ограничения. Среди возможных функций команды FORMAT существуют такие:
· определение ширины столбцов (при печати).
· определение представления NULL значений.
· обеспечение (новых) заголовков для столбцов.
· обеспечение заголовков внизу или вверху страниц выводимых на печать.
· навязывает присвоение или изменение форматам полей содержащих значения даты, времени или денежной суммы.
· вычисляет общие и промежуточные суммы, не исключая возможности обобщения поля, как это делает, например, SUM (альтернативным подходом к этой проблеме в некоторых программах является предложение COMPUTE).
Команда FORMAT может вводиться сразу перед запросом, или сразу после запроса, к которому она применяется, в зависимости от реализации. Одна команда FORMAT обычно может применяться только к одному запросу, хотя любое число команд FORMAT может применяться к одному и тому же запросу. Вот некоторые примеры команды FORMAT:
FORMAT NULL '_ _ _ _ _ _ _';
FORMAT BTITLE 'Orders Grouped by Salesperson';
FORMAT EXCLUDE (2, 3);
Первая из них представляет значения NULL в виде ’_ _ _ _ _ _ _’ при выводе на печать; вторая вставляет заголовок 'Orders Grouped by Salesperson' в нижнюю часть каждой страницы; третья исключает второй и третий столбцы из вывода предыдущего запроса. Вы могли бы использовать последнюю из них, если вы выбираете конкретные столбцы, чтобы использовать их в предложении ORDER BY, в вашем выводе. Так как указанные функции команды FORMAT могут выполняться по разному, весь набор их приложений не может быть здесь показан.
Имеются другие команды, которые могут использоваться для выполнения тех же функций. Команда SET подобна команде FORMAT; она является вариантом или дополнением к команде, которая применяется во всех запросах текущего сеанса пользователя, а не просто в одиночном запросе. В следующей реализации, команда FORMAT начинается ключевым словом COLUMN следующим образом:
COLUMN odate FORMAT dd-mon-yy;
что навязывает формат типа 10-Oct-90 в поле даты, использующемся в выводе запроса на печать.
Предложение COMPUTE, упомянутое ранее, вставляется в запрос следующим образом:
SELECT odate, amt
FROM Orders
WHERE snum = 1001
COMPUTE SUM (amt);
Оно выводит все Заказы продавца Peel, с датой и суммой приобретения по каждой дате, а в конце общую сумму приобретений.
Другая реализация выводит промежуточные суммы приобретений, используя COMPUTE в качестве команды. Сначала, она определяет разбивку
BREAK ON odate;
вывода вышеупомянутого запроса на страницы — сгруппировав их по датам, поэтому все значения odate в каждой группе — одинаковые. Затем вы можете ввести следующее предложение:
COMPUTE SUM OF amt ON odate;
Столбец в предложении ON предварительно должен быть использован в команде BREAK.
Функции
Для SQL в стандарте ANSI, вы можете применять агрегатные функции для столбцов или использовать их значения в скалярных выражениях, таких например как — comm * 100. Имеется много других полезных функций, которые вы, вероятно, встречали на практике.
Имеется список некоторых общих функций SQL, отличающихся от стандартных агрегатов. Они могут использоваться в предложениях SELECT запросов, точно так же как агрегатные функции, но эти функции выполняются для одиночных значений, а не для групповых. В следующем списке они классифицированы согласно типам данных, с которыми они выполняются. Если нет примечаний, то переменные в этом списке стандартизованы для любого выражения значений соответствующего типа, которые могут быть использованы в предложении SELECT:
МАТЕМАТИЧЕСКИЕ ФУНКЦИИ
Эти функции применяются для чисел.
ФУНКЦИЯ | ЗНАЧЕНИЕ |
ABX(X) | Абсолютное значение из X (преобразование отрицательного или положительного значений в положительное) |
CEIL(X) | X является десятичным значением, которое будет округляться сверху. |
FLOOR (X) | X является десятичным значением, которое будет округляться снизу. |
GREATEST(X,Y) | Возвращает большее из двух значений. |
LEAST(X,Y) | Возвращает меньшее из двух значений. |
MOD(X,Y) | Возвращает остаток от деления X на Y. |
POWER(X,Y) | Возвращает значение X в степени Y. |
ROUND(X,Y) | Цикл от X до десятичного Y. Если Y отсутствует, цикл до целого числа. |
SING(X) | Возвращает минус если X < 0, или плюс если X > 0. |
SQRT(X) | Возвращает квадратный корень из X. |
СИМВОЛЬНЫЕ ФУНКЦИИ
Эти функции могут быть применены для строк текста, либо из столбцов текстовых типов данных, либо из строк литерных текстов, или же комбинация из этих двух.
ФУНКЦИЯ | ЗНАЧЕНИЕ |
LEFT(<string>,X) | Возвращает крайние левые (старшие) символы X из строки. |
RICHT(<string>,X) | Возвращает символы X младшего разряда из строки |
ASCII(<string>) | Возвращает код ASCII которым представляется строка в памяти компьютера. |
CHR(<ASCIIcode>) | Возвращает принтерные символы кода ASCII. |
VALUE(<string>) | Возвращает математическое значение для строки. Считается что строка имеет тип CHAR или VARCHAR, но состоит из чисел. VALUE('3') произведет число 3 типа INTEGER. |
UPPER(<string>) | Преобразует все символы строки в символы верхнего регистра. |
LOWER(<string>) | Преобразует все символы строки в символы нижнего регистра. |
INlTCAP(<string>) | Преобразует символы строки в заглавные буквы. В некоторых реализациях может иметь название — PROPER. |
LENGTH(<string>) | Возвращает число символов в строке. |
<string>||<string> | Объединяет две строки в выводе, так чтобы после первой немедленно следовала вторая. (значек || называется оператором сцепления). |
LPAD(<string>,X,'*') | Дополняет строку слева звездочками '*', или любым другим указанным символом, с количестве, определяемом X. |
RPAD(<string>,X, ") | То же самое что и LPAD, за исключением того, что дополнение делается справа. |
SUBSTR(<string>,X,Y) | Извлекает Y символов из строки начиная с позиции X. |
ФУНКЦИИ ДАТЫ И ВРЕМЕНИ
Эти функции выполняются только для допустимых значений даты или времени.
ФУНКЦИЯ | ЗНАЧЕНИЕ |
DAY(<date>) | Извлекает день месяца из даты. Подобные же функции существуют для MONTH (МЕСЯЦ), YEAR (ГОД), HOUR (ЧАСЫ), SECOND (СЕКУНДЫ) и так далее. |
WEEKDAY(<date>) | Извлекает день недели из даты. |
ДРУГИЕ ФУНКЦИИ
Эта функция может быть применена к любому типу данных.
ФУНКЦИЯ | ЗНАЧЕНИЕ |
NVL(<column>,<value>) | NVL (NULL TO VALUE) будет меняет на значение <value> каждое NULL значение, найденное в столбце <column>. Если полученное значение <column> не =NULL, NVL ничего не делает. |
INTERSECT и MINUS
Команда UNION, как вы уже видели в Главе 14, может объединить два запроса, объединив их вывод в один. Два других обычно имеющихся способа объединения отдельных запросов — это INTERSECT (Плюс) иMINUS (Минус). INTERSECT выводит только строки, произведенные обоими перекрестными запросами, в то время какMINUS выводит строки, которые производятся одним запросом, но не другим. Следовательно, следующие два запроса
SELECT *
FROM Salespeople
WHERE city = 'London'
INTERSECT
SELECT *
FROM Salespeople
WHERE 'London' IN (SELECT city
FROM Customers
WHERE Customers.snum = Salespeople.snum);
выведут строки, произведенные обоими запросами, производящими всех продавцов в Лондоне, которые имели, по крайней мере, одного заказчика, размещенного там также. С другой стороны, запрос
SELECT *
FROM Salespeople
WHERE city = 'London'
MINUS
SELECT *
FROM Salespeople
WHERE 'London' IN (SELECT city
FROM Customers
WHERE Customers.snum = Salespeople.snum);
удалит строки, выбранные вторым запросом из вывода первого, и таким образом, будут выведены все продавцы в Лондоне, которые не имели там заказчиков. MINUS иногда еще называют DIFFERENCE (ОТЛИЧИЕ).