|
ГЛАВА 3 ОПЕРАЦИИ И ФУНКЦИИ
В этой главе описываются методы обработки отдельных элементов данных.
Например, описываются такие стандартные арифметические операции как сложение
и вычитание, а также более редкие функции, как абсолютное значение или длина
символьной строки. Глава содержит следующие разделы:
* операции
* функции
* модели форматов
* выражения
* условия
Операции
Операции и функции выполняют сходные задачи; они используют ноль или более
аргументов и возвращают один или более результатов.
Операции отличаются от функций тем, что представляются специальными
символами, в то время как функции используют следующий формат:
function_name(argument1, argument2, ...)
Большинство операций используют максимально 2 аргумента, структура же
функций позволяет использовать три и более.
В каждой приводимой ниже таблице операторы приводятся в порядке убывания стар-
шинства. В нашем обсуждении старшинство - это порядок, в котором операции
выполняются. Например, в выражении 1+2*3 сперва 2 умножается на три
(результат 6), а затем результат прибавляется к 1 (получая 7), так как
умножение выполняется перед сложением. В зависимости от порядка выполнения
(т.е. старшинства) ответ может быть 8 или 9. Операторы с одинаковым
старшинством группируются вместе.
Арифметические операции
Арифметические операции используются в выражениях для отрицания, сложения,
вычитания, умножения и деления числовых величин. Результат арифметической
операции имеет также числовое значение. Некоторые из этих операций
используются и для работы с датами. В следующей таблице представлены
арифметические операции в порядке убывания старшинства:
Операция Выполняемая функция Пример
------------------------------------------------------------
() Меняет нормальный порядок SELECT (X+Y)/(X_Y)...
выполнения операций. Опе-
рации внутри скобок выпо-
лняются в первую очередь.
+ - Означает положительное или ...WHERE QTYSOLD=-1
отрицательное выражение. ...WHERE -SAL < 0
* / Умножить, разделить. SELECT 2*X+1
...WHERE X>Y/2
-- 46 --
+ - Сложить, вычесть SELECT 2*X+1
...WHERE X>Y-Z
Символьные операции
Символьные операции используются в выражениях, работающих с символьными
строками. В следующей таблице приводится единственная символьная операция:
Операция Выполняемая функция Пример
------------------------------------------------------------
|| Конкатенация (сцепление) SELECT 'NAME IS'||ENAME
символьных значений
В результате конкатенации также получается символьное значение. Символьные
строки могут быть длиной максимально 255 символов; это же ограничение
относится и к результату конкатенации символьных строк.
Операции сравнения
Операции сравнения применяются в условиях, сравнивающих одно выражение с
другим. Как и для всех условий, результат сравнения одного выражения с другим
может быть либо TRUE, либо FALSE (См. ниже раздел "Условия"). В следующей
таблице приводятся операции сравнения SQL:
Операция Выполняемая функция Пример
------------------------------------------------------------
() Меняет нормальные пра- ...NOT(A=1 OR B=1)
вила старшинства операций.
= Проверяет на равенство ...WHERE SAL=10000
!=,^=,<> Проверяет на неравенство ...WHERE SAL!=10000
> "Больше чем" и ...WHERE SAL>10000
< "меньше чем"
>= "Больше или равно" и ...WHERE SAL>=10000
<= "меньше или равно"
IN "Равен любому члену из ...WHERE JOB IN
списка" ('CLERK','ANALIST')
Эквивалентен "=ANY" ...WHERE SAL IN
(SELECT SAL FROM EMP
WHERE DEPTNO=30)
NOT IN Эквивалентен "!=ALL" ...WHERE SAL NOT IN
Результат FALSE любой (SELECT SAL FROM EMP
элемент из набора NULL WHERE DEPTNO=30)
ANY Сравнивает значение с каж- ...WHERE SAL=ANY
дым значением из списка (SELECT SAL FROM EMP
или запроса. Должен предва- WHERE DEPTNO=30)
ряться: =,!=,>,<,<=,>=.
ALL Сравнивает значение со ...WHERE (SAL,COMM)>=ALL
всеми значениями из списка ((1400,300),(3000,0))
или запроса. Должен предва-
ряться: =,!=,>,<,<=,>=.
[NOT] [Не] больше или равно WHERE A BETWEEN 1
BETWEEN x x и меньше или равно y. AND 9
AND y
-- 47 --
[NOT] TRUE, если запрос воз- WHERE EXISTS
EXISTS вращает [не возвращает] (SELECT SAL FROM EMP
как минимум одну строку WHERE DEPTNO=30)
[NOT] "не сопоставляется/сопо-
LIKE ставляется со следующим
шаблоном". Символ "%" ис-
пользуется для сопостав-
ления с любой строкой из
нуля или более символов,
кроме NULL - строки, а "_"
сопоставляется с любым
одиночным символом. При-
меры приводятся ниже в
разделе "Операция LIKE".
IS [NOT] "проверка на [не] null. WHERE JOB IS NULL
NULL IS должен использоваться
для проверки на NULL.
NULL обсуждается в Главе 3
"Элементы языка SQL".
Операция NOT IN
Все строки будут иметь значение false (и ни одной строки не выберется), если
какой-нибудь элемент в списке операции NOT IN имеет значение null. Например:
SELECT 'TRUE'
FROM EMP
WHERE DEPTNO NOT IN (5,15,null)
- не возвращает строк, в то время как:
SELECT 'TRUE'
FROM EMP
WHERE DEPTNO NOT IN (5,15)
- вернет значение эTRUE'. Первый пример не возвращает строк, потому что:
DEPTNO NOT IN (5,15,null)
вычисляется как:
DEPTNO !=5 AND DEPTNO !=15 AND DEPTNO != null
Так как все условия, которые сравнивают с null, дают в результате null,
результатом всего выражения будет null. Такое специфичное поведение операции
можно легко проглядеть, особенно если она ссылается на подзапрос.
Логические операции
Логические операции используются для объединения результатов нескольких
условий. Оператор AND используется, когда строка должна удовлетворять обоим
условиям, OR - одному из условий. Например, в следующей фразе WHERE оператора
SELECT операция AND гарантирует, что должны выдаваться только строки с датой
приема на работу ранее 1984 года и заработком больше 1000 долларов в месяц:
-- 48 --
SELECT * FROM EMP
WHERE (HIREDATE < '01-JAN-84) AND (SAL > 1000)
Следующая таблица представляет логические операции в порядке убывания
старшинства:
Операция Выполняемая функция Пример
------------------------------------------------------------
() Меняет нормальные пра- SELECT...WHERE x=y
вила старшинства опе- and (a-b or p=q)
раций.
NOT Инвертирует результат ...WHERE NOT(JOB IS NULL)
логического выражения ...WHERE NOT(CODE LIKE 'T%')
...WHERE NOT(SAL BETWEEN
500 AND 999)
...WHERE NOT(A=1)
AND Устанавливает в TRUE ...WHERE A=1 AND B=1
логическое выражение,
если оба условия TRUE.
OR Устанавливает в TRUE ...WHERE A=1 OR B=1
логическое выражение,
если одно из условий TRUE.
Рисунок 4-1 иллюстрирует результаты операции AND с двумя условиями.
Ъ----------ДТ------------ДВ------------ДВ------------Дї
і AND є true і false і null і
ЖНННННННННННОНННННННННННННШНННННННННННННШНННННННННННННµ
і true є true і false і null і
Г----------ДЧ------------ДЕ------------ДЕ------------Дґ
і false є false і false і false і
Г----------ДЧ------------ДЕ------------ДЕ------------Дґ
і null є null і false і null і
А----------ДР------------ДБ------------ДБ------------ДЩ
pисунок 4-1 Таблица истинности: AND
Рисунок 4-2 иллюстрирует результаты операции OR с двумя условиями.
Ъ----------ДТ------------ДВ------------ДВ------------Дї
і OR є true і false і null і
ЖНННННННННННОНННННННННННННШНННННННННННННШНННННННННННННµ
і true є true і true і true і
Г----------ДЧ------------ДЕ------------ДЕ------------Дґ
і false є true і false і null і
Г----------ДЧ------------ДЕ------------ДЕ------------Дґ
і null є true і null і null і
А----------ДР------------ДБ------------ДБ------------ДЩ
pисунок 4-2 Таблица истинности: OR
Операции с множествами
Операции с множествами объединяют в один результаты нескольких запросов. В
следующей таблице в порядке убывания старшинства приводятся SQL - операции над
множествами.
-- 49 --
Операция Выполняемая функция Пример
------------------------------------------------------------
UNION Объединяет запросы для ...SELECT...
выдачи всех различающих- UNION SELECT...;
ся строк каждого отдель-
ного запроса
INTERSECT Объединяет запросы для ...SELECT
выдачи всех различающих- INTERSECT SELECT...;
ся строк обоих запросов
MINUS Объединяет запросы для ...SELECT...
выдачи всех различающих- MINUS SELECT...;
ся строк, выданных пер-
вым запросом, но не вторым.
Замечание: Если в двух таблицах встречаются дублирующиеся записи, то при
использовании множественных операций UNION, MINUS, INTERSECT выдается
только одна.
Рисунок 4-3 графически иллюстрирует результаты операций с множествами.
Затемненные части показывают результат, возвращаемый ORACLE.
ОПЕРАЦИИ С МНОЖЕСТВАМИ
A B
SELECT * Ъ----------------Дї
FROM A і±±±±±±±±±±±±±±±±±і
UNION Ъ----------ДБ----Дї±±±±±±±±±±±і
SELECT * і±±±±±±±±±±±±±±±±±і±±±±±±±±±±±і
FROM B і±±±±±±±±±±±±±±±±±і±±±±±±±±±±±і
А----------ДВ----ДЩ±±±±±±±±±±±і
і±±±±±±±±±±±±±±±±±і
А----------------ДЩ
A B A B
Ъ----------------ї Ъ----------------Дї
і±±±±±±±±±±±±±±±±і і і
і±±±±±±±±±±Ъ----ДБ------ї Ъ----------ДЕ----Дї і
і±±±±±±±±±±і і і і±±±±±і і
і±±±±±±±±±±і і і і±±±±±і і
і±±±±±±±±±±А----ДВ------Щ А----------ДЕ----ДЩ і
і±±±±±±±±±±±±±±±±і і і
А----------------Щ А----------------ДЩ
SELECT * FROM A SELECT * FROM A
MINUS SELECT * FROM B INTERSECT SELECT * FROM B
Рисунок 4-3 Операции с множествами.
Другие операции
Ниже описываются другие операции языка SQL:
Операция Выполняемая функция Пример
------------------------------------------------------------
-- 50 --
(+) Указывает, что предыду- WHERE DEPT.DEPTNO=
щий столбец - столбец EMP.DEPTNO(+)
внешнего объединения
[table.]* Выбирает в запросе все SELECT * FROM EMP
столбцы из таблиц. Когда
предваряется именем таб-
лицы с точкой, запрос вы- SELECT EMP.* FROM EMP
бирает все столбцы этой
таблицы.
COUNT(expr) Возвращает число строк, SELECT COUNT(COMM)
в которых expr не null. FROM EMP
COUNT(*) Возвращает число строк SELECT COUNT(*)
в таблице, включая содер- FROM EMP
жащие null.
ALL Возвращает дублирующиеся SELECT ALL * ...
значения в запросах и аг- ...COUNT(ALL DEPTNO)
регатах. (ALL - умалчива-
емое в отличие от DISTINCT)
DISTINCT Удаляет дублирующиеся стро- DELECT DISTINCT *...
ки из запроса или удаляет
дублирующиеся значения из ...COUNT(DISTINCT
агрегатного выражения. DEPTNO)...
PRIOR Определяет отношение CONNECT BY
"отец-сын" в древовидном PRIOR EMPNO=MGR
запросе. Выражение в левой
части условия (EMPNO) пре-
дставляет родительскую
строку; выражение справа
(MGR) представляет строку
ребенка. Может использова-
ться в любой фразе древо-
видного запроса, а не толь-
ко в CONNECT BY.
-- 51 --
Операция LIKE
Назначение Используется при сравнении символьных строк с помощью шаблонов.
Предпосылки Нет.
Синтаксис SELECT ....
WHERE char LIKE pattern
Ключевые слова char выражение с типом данных CHAR.
и параметры Строчные литералы должны заключаться в одиночные
кавычки. Обратитесь к описанию expr ранее в этой
главе и text в Главе 3 данного руководства.
pattern выражение с типом данных CHAR, в котором
используются специальные символы сопоставления
с шаблоном (% и _).
Замечания по использованию
Когда Вы применяете операцию "=" для точного сравнения одной символьной строки
с другой, на самом деле Вы используете операцию LIKE для сравнения части
одной строки с другой.
В фразе LIKE вы должны сравнить столбец с шаблоном, а не с константой. Столбец
специфицируется перед ключевым словом LIKE.
Например, Вы должны ввести такой запрос:
SELECT SAL
FROM EMP
WHERE ENAME LIKE 'BL%'
вместо любого из следующих запросов:
SELECT SAL
FROM EMP
WHERE ENAME = 'BL%'
SELECT SAL
FROM EMP
WHERE 'BL%' LIKE ENAME
Символьный шаблон может включать в себя два специальных символа, с которыми
можно сопоставлять различные символы в значении данных. Символ подчеркивания
"_" используется для сравнения ровно одного символа, а знак процента "%"
- для сравнения нуля и более символов. Заметьте однако, что строка '%' не
может сопоставляться с NULL.
Во всех условиях, сравнивающих символьные выражения, включая операции LIKE
и =, регистр имеет значение. Для выполнения регистронезависимого сравнения
можно воспользоваться функцией UPPER(), например:
UPPER(ENAME) LIKE UPPER('sm%')
LIKE можно использовать в любом логическом выражении, работающем с данными
типа CHAR. Если LIKE используется для поиска индексированного столбца по
шаблону, преимущества индекса в скорости теряются, если первый символ в
шаблоне "%" или "_". Если же это не так, то преимущества индекса почти
полностью сохраняются, так как ORACLE может ограничить сравниваемые строки
теми, которые начинаются с известного символа.
-- 52 --
Сами символы "%" и "_" можно отыскивать с помощью функции TRANSLATE.
Например, для поиска всех служащих, содержащих в имени символ подчеркивания,
надо ввести:
SELECT ENAME
FROM EMP
WHERE TRANSLATE(ENAME,'_','#') LIKE '%#%'
Предыдущий пример использует функцию TRANSLATE для преобразования "_" в "#".
Он вернет всех служащих, содержащих в имени #.
Примеры
Условие ENAME LIKE 'BL%' означает "Вернуть TRUE, если значение ENAME
начинается с BL, а далее следует ноль или более символов". Все
перечисленные ниже значения приведут к выдаче TRUE:
BLAKE, BL, BLACK, BLUE
Регистр здесь играет важную роль, так что значения Bl и bl возвратят FALSE.
Для условия ENAME LIKE 'SMITH_' верны следующие значения: SMITHE, SMITHY,
SMITHS, но не верно значение SMITH, потому что шаблон "_" означает
сопоставление в точности с одним символом.
Связанные Раздел "Операторы сравнения", синтаксическое описание expr,
разделы оператор SELECT - в Главе 5 "Справочник по SQL - операторам";
Фраза WHERE в Главе 6 этого руководства (в разделе "Фразы
оператора SELECT").
-- 53 --
Функции
Функции ведут себя аналогично операциям. И те и другие работают с нулем или
более аргументами и возвращают один или более результатов. И те и другие
работают с отдельными элементами данных.
Операции отличаются от функций тем, что используют формат "argument1 операция
argument2", в то время как функции - function_name(argument1,argument2,...).
Argument - это задаваемая пользователем переменная или константа.
Большинство операций используют максимально два аргумента;
структура функции позволяет ей принимать три и более аргументов.
Однострочные функции имеют следующие признаки:
* однострочные функции возвращают один результат на строку
* однострочные функции ожидают одного или более аргументов
* однострочные функции могут быть вложенными
* однострочные функции могут использоваться везде, где можно использовать
пользовательские перемен- ные, столбцы или выражения соответствующего типа
* однострочные функции работают с каждой строкой, возвращаемой запросом, не
ожидая выборки следующих строк
В данном документе приняты следующие сокращения для аргументов:
Сокращение Объяснение аргумента
аргумента
----------------------------------------------------------Д
char Символьная константа в одиночных
кавычках или выражение типа CHAR.
d или e Константа или выражение типа DATE.
m или n Любая числовая константа или выра-
жение типа NUMBER.
raw Выражение типа RAW.
rowid Выражение типа ROWID.
* Тип данных зависит от контекста
функции.
expr Выражение любого типа.
Однострочные числовые функции
Числовые функции принимают на входе и возвращают на выходе
числовые значения. В следующей таблице описываются числовые
функции SQL:
ABS Синтаксис ABS(n)
Назначение Возвращает абсолютную величину n.
Пример SELECT ABS(-15) "Absilute" FROM DUAL
-- 54 --
Absolute
--------
15
CEIL Синтаксис CEIL(n)
Назначение Возвращает наименьшее целое, большее
или равное n.
Пример SELECT CEIL(15.7) "Celling" FROM DUAL
Celling
-------
16
FLOOR Синтаксис FLOOR(n)
Назначение Возвращает наибольшее целое, меньшее или
равное n.
Пример SELECT FLOOR(15.7) "Floor" FROM DUAL
Floor
-----
15
MOD Синтаксис MOD(m,n)
Назначение Возвращает остаток от деления m на n.
Пример SELECT MOD(7,5) "Modula" FROM DUAL
Modula
------
2
POWER Синтаксис POWER(m,n)
Назначение Возвращает m в степени n. n должен быть
целым, иначе возникает ошибка.
Пример SELECT POWER(3,2) "Raised" FROM DUAL
Raised
------
9
ROUND Синтаксис ROUND(n[,m])
Назначение Возвращает n, округленное до m знаков
после десятичной точки; если m опущено,
округляется до 0 знаков. Для округления
слева от десятичной точки m должно быть
отрицательным. m должно быть целым.
Пример SELECT ROUND(15.193,1) "Round" FROM DUAL
Round
-----
15.2
SELECT ROUND(15.193,-1) "Round" FROM DUAL
Round
-----
20
-- 55 --
SIGN Синтаксис SIGN(n)
Назначение Если n<0, функция возвращает -1; если
n=0, функция возвращает 0 и при n>0
возвращает 1.
Пример SELECT SIGN(-15) "Sign" FROM DUAL
Sign
----
-1
SQRT Синтаксис SQRT(n)
Назначение Возвращает квадратный корень из n; если
n<0, возвращает NULL. Эта функция возв-
ращает действительный (real) результат.
Пример SELECT SQRT(25) "Square root" FROM DUAL
Square root
-----------
5
TRUNC Синтаксис TRUNC(n[,m])
Назначение Возвращает n с отсеченными m младшими
разрядами. Если m отсутствует, отсека-
ется до 0 разряда (до целых). Если m -
отрицательное, отсечение разрядов (об-
нуление) выполняется влево от десятич-
ной точки.
Пример SELECT TRUNC(15.79,1) "Truncate" FROM DUAL
Truncate
--------
15.7
SELECT TRUNC(15.79,-1) "Truncate" FROM DUAL
Truncate
--------
10
Однострочные символьные функции
Однострочные символьные функции требуют символьных исходных
данных, а возвращать могут как символьные, так и числовые
значения.
Однострочные символьные функции, возвращающие символьные
значения
CHR Синтаксис CHR(n)
Назначение Возвращает символ, имеющий соответству-
ющее значение n в коде ASCII или EBCDIC.
Пример SELECT CHR(75) "Character" FROM DUAL
-- 56 --
Character
---------
K
INITCAP Синтаксис INITCAP(char)
Назначение Возвращает char, каждое слово в котором
начинается с прописной буквы, а осталь-
ные - строчные.
Пример SELECT INITCAI('MR. SAMUEL HILLHOUSE')
"Capitalized"
FROM DUAL
Capitalized
--------------------
Mr. Samuel Hillhouse
LOWER Синтаксис LOWER(char)
Назначение Возвращает char, все символы которого
переведены в строчные
Пример SELECT INITCAI('MR. SAMUEL HILLHOUSE')
"Lowercase"
FROM DUAL
Lowercase
--------------------
mr. samuel hillhouse
LPAD Синтаксис LPAD(char1,n [,char2])
Назначение Возвращается char, дополненная слева до
n символов заполнителем char2. Подразу-
меваемое значение для char2 - пробел.
Пример SELECT LPAD('Page 1',14,'*.')
"LPAD example"
FROM DUAL
LPAD example
---------------
.*.*.*.*.Page 1
LTRIM Синтаксис LTRIM(char,[set])
Назначение Удаляет левые символы из char, пока
первый символ в char входит в set. Умол-
чание для set ''.
Пример SELECT LTRIM('xxxXxxLAST WORD','x')
"Left trim example"
FROM DUAL
Left trim example
-----------------
XxxLAST WORD
REPLACE Синтаксис REPLACE(char,search_string
[,replacement_string])
Назначение Заменяет в char все вхождения
-- 57 --
search_string на replacement_string.
Если replacement_string не указана, все
вхождения search_string удаляются. Если
не указаны ни replacement_string, ни
search_string, функция возвращает NULL.
Функция REPLACE расширяет возможности
функции TRANSLATE, которая обеспечивает
замену одиночных символов. REPLACE
обеспечивает замену строки на строку, а
также удаление символьных подстрок.
Пример SELECT REPLACE('JACR & JUE','J','BL')
"Changes"
FROM DUAL
Changes
------------
BLACK & BLUE
RPAD Синтаксис RPAD(char1,n [,char2])
Назначение Возвращает char1, дополненную справа до
n символов заполнителем char2, повторя-
емым столько раз, сколько необходимо.
Если char2 опущено, производится допол-
нение пробелами.
Пример SELECT RPAD('ENAME',10,'x')
"RPAD example"
FROM EMP
WHERE ENAME = 'TURNER'
RPAD example
------------
TURNERxxxx
RTRIM Синтаксис RTRIM(char [,set])
Назначение Возвращает char с завершающими символа-
ми, усеченными справа после последнего
символа, не входящего в set. Если set
опущен, предполагается по умолчанию ''.
Пример SELECT RTRIM('TURNERxxXxx','x')
"Right trim example"
FROM DUAL
Right trim example
------------------
TURNERxxX
SOUNDEX Синтаксис SOUNDEX(char)
Назначение Возвращает символьную строку, представ-
ляющую из себя символьное представление
слова (слов), заданных в char и имеющих
такое написание. Эта функция позволяет
сравнивать слова с различным написани-
ем, но звучащих одинаково.
-- 58 --
Пример SELECT ENAME
FROM EMP
WHERE SOUNDEX(ENAME) =
SOUNDEX('SMYTHE')
ENAME
-----------
SMITH
SUBSTR Синтаксис SUBSTR(char, m[,n])
Назначение Возвращает часть char, начиная с симво-
ла с номером m и длиной n символов. Ес-
ли n опущено - до конца char. Первая
позиция char 1.
Пример SELECT SUBSTR('ABCDEFG',2,3)
"Substring"
FROM DUAL
Substring
---------
BCD
TRANSLATE Синтаксис TRANSLATE(char,from,to)
Назначение Возвращает char со всеми замененными
символами from на to. Не сопоставленные
символы не меняются. TRANSLATE не уда-
ляет символы.
Пример SELECT TRANSLATE('HELLO! THREE!','!','-')
"Translate example"
FROM DUAL
Translate example
-----------------
HELLO- THREE-
UPPER Синтаксис UPPER(char)
Назначение Возвращает char со всеми символами, пе-
реведенными в верхний регистр.
Пример SELECT UPPER('Mr. Rogers')
FROM DUAL
UPPER('Mr. Rogers')
-------------------
MR. ROGERS
Однострочные символьные функции, возвращающие числовые значения
ASCII Синтаксис ASCII(char)
Назначение Выдает значение из последовательности
слияния для первого символа в char. Со-
ответствующей функции EBCDIC не сущест-
вует, но на машинах, работающих в коде
-- 59 --
EBCDIC эта функция выдает соответствую-
щее значение из последовательности сли-
яния EBCDIC.
Пример SELECT ASCII('Q') FROM DUAL
ASCII('Q')
----------
81
INSTR Синтаксис INSTR(char1,char2[,n[,m]])
Назначение Выдает позицию m - го вхождения char2 в
char1; поиск начинается с n - го симво-
ла в char1. Если "m" опущено, предпола-
гается 1, то же относится и к "n". По-
зиция выдается относительно первого
символа в char1, даже если n > 1.
Пример SELECT INSTR('MISSISSIPPI','S',5,2)
"In string example"
FROM DUAL
In string example
-----------------
7
LENGTH Синтаксис LENGTH(char)
Назначение Длина char.
Пример SELECT LENGTH('ELEPHANT')
"Length"
FROM DUAL
Length
------
8
NLSSORT Синтаксис NLSSORT(char)
Назначение Возвращает значение последовательности
слияния для char, основанной на местном
Национальном Языке. За информацией о
"Поддержке национальных языков" обрати-
тесь к Приложению F "ORACLE RDBMS Руко-
водства администратора базы данных".
Пример SELECT NLSSORT('Q') "Sequence #"
FROM DUAL
Sequence #
----------
5100
Групповые функции
-- 60 --
Групповые функции возвращают результаты, основанные на груп-
пе строк (в отличие от однострочных функций, возвращающих
результат для каждой строки). Для разделения результата на
меньшие группы используется фраза GROUP BY оператора SELECT.
Фраза DISTINCT заставляет групповые функции рассматривать
только отличающиеся значения выражений; ALL включает в расс-
мотрение все значения, включая дублирующиеся. Например,
среднее значение 1,1,1,3 для DISTINCT равно 1.5, а для ALL
оно будет равно 2. (Так в оригинале, но правильно должно
быть наоборот: ALL=1.5; DISTINCT=2. - Прим. перев.) Если в
операторе SELECT опущены обе этих фразы, предполагается ALL.
Все эти функции (кроме COUNT(*)) пропускают значения NULL.
Если в указывается "expr", тип данных аргумента может быть
CHAR, NUMBER или DATE.
AVG Синтаксис AVG([DISTINCT | ALL] n)
--Д
Назначение Возвращает среднее значение n, игнорируя
значения null.
Пример SELECT AVG(SAL) "Average" FROM EMP
Average
----------
2073.21429
COUNT(expr) Синтаксис COUNT([DISTINCT | ALL] expr)
--Д
Назначение Возвращает количество строк, где expr
не NULL.
Пример SELECT COUNT(JOBS) "Count"
FROM EMP
Count
-----
4
SELECT COUNT(DISTINCT JOB) "Jobs"
FROM EMP
Jobs
----
5
COUNT(*) Синтаксис COUNT(*)
Назначение Возвращает число строк в таблице, вклю-
чая дублирующиеся и содержащие NULL.
Пример SELECT COUNT(*) "Total" FROM EMP
-- 61 --
Total
-----
14
MAX Синтаксис MAX([DISTINCT | ALL] expr)
--Д
Назначение Возвращает максимальное значение expr.
Пример SELECT MAX(SAL) "Maximum" FROM EMP
Maximum
-------
5000
MIN Синтаксис MIN([DISTINCT | ALL] expr)
--Д
Назначение Возвращает минимальное значение expr.
Пример SELECT MIN(HIREDATE) "Minimum Date"
FROM EMP
Minimum Date
------------
17-DEC-80
STDDEV Синтаксис STDDEV([DISTINCT | ALL] n)
--Д
Назначение Возвращает среднеквадратичное отклонение
n, игнорируя значения null.
Пример SELECT STDDEV(SAL) "Deviation" FROM EMP
Deviation
----------
1182.50322
SUM Синтаксис SUM([DISTINCT | ALL] n)
--Д
Назначение Возвращает сумму значений n.
Пример SELECT SUM(SAL) "Total" FROM EMP
Total
-----
29025
VARIANCE Синтаксис VARIANCE([DISTINCT | ALL] n)
--Д
Назначение Возвращает дисперсию n, игнорируя значе-
ния null.
Пример SELECT VARIANCE(SAL) "Variance"
FROM EMP
-- 62 --
Variance
----------
1389313.87
-- 63 --
Функции преобразования
Функции преобразования переводят значение из одного типа
данных в другой. В общем случае такая функция преобразования
называется datatypeTOdatatype. Первый datatype - это входная
переменная, второй - выходная. Если в имени функции указан
только выходной тип, значит входным может быть любой дейс-
твительный тип данных системы ORACLE.
В этом разделе описываются функции преобразования ORACLE:
CHARTOROWID Синтаксис CHARTOROWID(char)
Назначение Преобразование значения из типа CHAR
в ROWID.
Пример SELECT ENAME
FROM EMP
WHERE ROWID =
CHARTOROWID('0000000F.0003.0002')
ENAME
-----
SMITH
CONVERT Синтаксис CONVERT(char [,dest_char_set
[,source_char_set] ] )
Назначение Преобразовывает между двумя различными
реализациями одного символьного набора.
Например, из символов DEC 8 bit в сим-
волы HP 8 bit.
dest_char_set - имя символьного набора,
в который будет выполняться преобразо-
вание. Это может быть имя столбца базы,
содержащего название символьного набора
или символьным литералом. Умалчиваемое
значение 'US7ASCII'.
source_char_set - имя символьного набо-
ра, в котором данные хранятся в базе.
Это может быть имя столбца, содержащего
имя набора или символьный литерал.
Умалчиваемое - текущее значение аргу-
мента (параметр LANGUAGE в
файле INIT.ORA).
Более подробную информацию о средстве
"Поддержки национальных языков" можно
подчерпнуть в Приложении F "ORACLE
RDBMS Руководства администратора базы
данных".
Существуют следующие стандартные символьные наборы:
US7ASCII (умалчиваемый) символьный набор US 7-bit
ASCII
WE8DEC западноевропейский 8-bit ASCII фирмы DEC
WE8HP западноевропейский 8-bit ASCII фирмы HP
F7DEC французский 7-bit ASCII фирмы DEC
WEIBMPC западноевропейский 8-bit ASCII, исполь-
зуемый в IBM PC.
-- 64 --
Пример SELECT ('NEW WORD','US7ASCII','WE8HP')
"Conversion"
FROM DUAL
Conversion
----------
NEW WORD
HEXTORAW Синтаксис HEXTORAW(char)
Назначение Преобразует символьное значение, состо-
ящее из шестнадцатеричных цифр в двоич-
ный вид (пригодный для занесения в
столбец типа RAW).
Пример INSERT INTO GRAPHICS (RAW_COLUMN)
SELECT HEXTORAW('7D')
FROM DUAL
RAWTOHEX Синтаксис RAWTOHEX(raw)
Назначение Преобразование raw в символьное значе-
ние, состоящее из шестнадцатеричных
цифр.
Пример SELECT RAWTOHEX(RAW_COLUMN) "Graphics"
FROM GRAPHICS
Graphics
--------
7D
ROWIDTOCHAR Синтаксис ROWIDTOCHAR(rowid)
Назначение Преобразование значений ROWID в тип
данных CHAR. В результате преобра-
зования всегда получается строка
длиной 18 символов.
Пример SELECT ROWID
FROM GRAPHICS
WHERE ROWIDTOCHAR(ROWID) LIKE '%F38%'
ROWID
------------------
00000F38.0001.0001
TO_CHAR, Синтаксис TO_CHAR(n [,fmt])
преобразо- Назначение Преобразование значения типа NUMBER
вание чисел в тип CHAR, используя необязатель-
ную строку формата. fmt должен быть
числовым форматом. Подробно форматы
описаны в разделе "Модели форма-
тов".Если fmt опущен, n преобразо-
вывается в символьное значение дли-
ной, достаточной для хранения всех
значащих цифр.
-- 65 --
Пример SELECT TO_CHAR(17145,'$099,999')
"Char"
FROM DUAL
Char
---------
$017,145
TO_CHAR, Синтаксис TO_CHAR(d [,fmt])
преобразова- Назначение Преобразование значения типа DATE в
ние дат тип CHAR, используя необязательную
строку формата. fmt должен быть
форматом даты. Форматы описаны ниже
в разделе "Модели форматов". Если
fmt опущен, d преобразуется в стан-
дартный формат системы ORACLE, "DD-
MON-YY".
Формат и число символов результата,
возвращаемого функцией TO_CHAR за-
висят от указанного значения fmt.
Пример SELECT TO_CHAR(HIREDATE,'Month DD,YYYY')
"New data format"
FROM EMP WHERE ENAME = 'SMITH'
New date format
---------------------------------
December 17, 1980
-- 66 --
TO_DATE Синтаксис TO_DATE(char [,fmt])
Назначение Преобразует char в значение типа
дата. Текущие значения месяца, года
и т.д. применяются в случае, если
они не точно определяются из аргу-
мента. fmt - это символьное значе-
ние в формате даты, которое специ-
фицирует формат char. Информация о
форматах предоставляется ниже, в
разделе "Модели форматов". Если fmt
опущен, значение даты в символьном
формате должно быть в виде "DD-MON-
YY". Если формат "J" - Юлианский,
то char должен быть числом.
Пример INSERT INTO BONUS (BONUS_DATE)
SELECT TO_DATE('January 15, 1989',
'Month dd, YYYY')
FROM DUAL
TO_NUMBER Синтаксис TO_NUMBER(char)
Назначение Преобразовывает char, являющийся
символьным представлением числа в
значение типа NUMBER.
Пример UPDATE EMP
SET SAL = SAL +
TO_NUMBER(SUBSTR('$100 raise',2,3))
WHERE ENAME = 'BLAKE'
Функции для работы с датами
Эти функции работают с датами системы ORACLE. Все функции
для работы с датами возвращают значение типа DATE (за исклю-
чением MONTHS_BETWEEN, которая возвращает числовое значение).
ADD_MONTHS Синтаксис ADD_MONTHS(d,n)
Назначение Возвращает дату d, увеличенную на n
месяцев. n должно быть целым и мо-
жет быть отрицательным.
Пример SELECT ADD_MONTHS(HIREDATE,12)
"Next year"
FROM EMP
WHERE ENAME = 'SMITH'
Next year
---------
17-DEC-81
LAST_DAY Синтаксис LAST_DAY(d)
Назначение Возвращает дату последнего дня ме-
сяца, содержащего d. Полезна для
определения количества дней в дан-
ном месяце.
-- 67 --
Пример SELECT LAST_DAY(SYSDATE) "Last"
FROM DUAL
Last
-----------------
31-AUG-89
MONTHS_BETWEEN Синтаксис MONTHS_BETWEEN(d,e)
Назначение Возвращает количество месяцев между
датами d и e. Если d более поздняя
дата, чем e, результат положитель-
ный, если более ранняя - отрица-
тельный. Дробная часть результата
означает часть 31 - дневного месяца.
Пример SELECT MONTHS_BETWEEN('02-feb-86',
'01-jan-86')
"Months"
FROM DUAL
Months
----------
1.03225806
NEW_TIME Синтаксис NEW_TIME(d,a,b)
Назначение Возвращает дату и время во времен-
ной зоне b, когда дата и время во
временной зоне a равны d. a и b -
это символьные выражения, принимаю-
щие следующие значения:
AST,ADT Атлантическое Стандартное
или Атлантическое Дневное Время
BST,BDT Берингово Стандартное или
Дневное Время
CST,CDT Центральное Стандартное или
Дневное Время
EST,EDT Восточное стандартное или
Дневное Время
GMT Среднее Гринвическое время
HST,HDT Стандартное или Дневное
время Аляски-Гаваев
MST,MDT Стандартное или Дневное
время Монтаны
NST Стандартное время Ньюфаунленда
PST,PDT Атлантическое Стандартное
или Дневное время
YST,YDT Стандартное или Дневное
Время Юкона
Пример SELECT
TO_CHAR(
NEW_TIME(TO_DATE(17:47','hh24:mi'),
'PST','GMT'),
'hh24:mi') "GREENWICH TIME"
FROM DUAL
-- 68 --
GREENWICH TIME
--------------
01:47
NEXT_DAY Синтаксис NEXT_DAY(d,char)
Назначение Возвращает дату дня, специфициро-
ванного char, первой недели, следу-
ющей за датой, определяемой d.
Пример В следующем примере возвращается да-
та следующего вторника после 17
марта 1989 г.
SELECT NEXT_DAY('17-MAR-89','TUESDAY')
"Next Day"
FROM DUAL
Next Day
---------
29-MAR-89
ROUND Синтаксис ROUND(d [,fmt])
Назначение Возвращает d, округленную на осно-
вании fmt. fmt подразумевает бли-
жайший день.
За деталями функций ROUND и TRUNC
обратитесь ниже к разделу "ROUND и
TRUNC".
Пример SELECT ROUND(TO_DATE('27-OCT-88'),'YEAR')
"FIRST OF THE YEAR"
FROM DUAL
FIRST OF THE YEAR
-----------------
01-JAN-89
-- 69 --
SYSDATE Синтаксис SYSDATE
Назначение Возвращает текущую дату и время. Аргу-
ментов не требует.
Пример SELECT SYSDATE FROM DUAL
SYSDATE
---------
19-MAR-89
TRUNC Синтаксис TRUNC(d [,fmt])
Назначение Возвращает дату и время, приведенные к
указанному в fmt значению (округляет в
меньшую сторону). По умолчанию удаляет
временную компоненту даты. См. также
следующий раздел "ROUND и TRUNC".
Пример SELECT TRUNC(TO_DATE('28-OCT-88','YEAR')
"First of the Year"
FROM DUAL
First of the Year
-----------------
01-JAN-88
ROUND и TRUNC
Следующая таблица показывает элементы формата и соответству-
ющий временной период для функций ROUND и TRUNC. По умолча-
нию предполагается "dd", что означает приведение временной
части даты к полуночи.
Модель формата Элемент (период)
----------------------------------------------------------Д
CC,SCC век
SYYY,YYYY,YEAR, год (округляется к 1 июля)
SYEAR,YYY,YY,Y
Q квартал (округляется на 16 число
старого месяца)
MONTH,MON,MM месяц (округляется на 16 число)
WW начальная неделя года
W начальная неделя месяца
DDD,DD,J день
DAY,DY,D ближайшее воскресенье
HH,HH12,HH24 часы
MI минуты
-- 70 --
Другие функции
DECODE Синтаксис DECODE(expr, search1, result1,
[search2, result2,] ...
[default] )
Назначение expr сравнивается с каждым значением
search и возвращает result, если expr
равно search. Если не сравнилось, функ-
ция DECODE возвращает значение default.
Если default отсутствует, предполагает-
ся null.
expr может быть любого типа, search
должна быть того же типа, что и expr.
Возвращаемое значение приводится к тому
же типу, что и первый result.
Пример SELECT ENAME,DECODE(MGR, 7934, 'SMITH',
7251, 'JONES', 7839, 'KING', 'NONE') Mgr
FROM EMP
ENAME MGR
----------- ----------
JONES KING
CLARK KING
OAKLEY NONE
FORD JONES
DUMP Синтаксис DUMP (expr [,display_format
[,start_position [, length]]])
Назначение Выдает значение выражения во внутреннем
формате. Действительными значениями для
display_format являются: 8 - для вось-
меричной системы, 10 - для десятичной,
16 - для шестнадцатеричной, 17 - для
символьного. start_position и length
определяют, какую часть результата надо
выдавать. По умолчанию выдается весь
результат.
Примеры SELECT DUMP(ENAME) "ASCII"
FROM EMP
WHERE ENAME = 'SCOTT'
ASCII
----------------------------
Type=1 Len=5: 83,67,79,84,84
SELECT DUMP(ENAME) "OCTAL"
FROM EMP
WHERE ENAME = 'SCOTT'
OCTAL
---------------------------------
Type=1 Len=5: 123,103,117,124,124
-- 71 --
SELECT DUMP(ENAME) "CHAR"
FROM EMP
WHERE ENAME = 'SCOTT'
CHAR
-----------------------
Type=1 Len=5: S,C,O,T,T
GREATEST Синтаксис GREATEST(expr [,expr] ...)
Назначение Возвращает наибольшее значение из спис-
ка. Перед выполнением сравнения все вы-
ражения (expr) преобразовываются к типу
данных первого.
Пример SELECT GREATEST('HARRY','HARRYOT','HAROLD')
"GREATEST"
FROM DUAL
GREATEST
--------
HARRIOT
LEAST Синтаксис LEAST(expr [,expr] ...)
Назначение Возвращает наименьшее значение из спис-
ка. Перед выполнением сравнения все вы-
ражения (expr) преобразовываются к типу
данных первого.
Пример SELECT LEAST('HARRY','HARRYOT','HAROLD')
"LEAST"
FROM DUAL
LEAST
--------
HAROLD
NVL Синтаксис NVL(expr1, expr2)
Назначение Если expr1 равно NULL, возвращает
expr2; если expr1 не равно NULL, возв-
ращает expr1. Тип данных возвращаемого
значения должен быть тем же, что и
expr1.
Пример SELECT ENAME,
NVL(TO_CHAR(COMM),'NOT APPLICATABLE')
"COMMISSION"
FROM EMP
WHERE DEPTNO = 30
ENAME COMMISSION
------------- -----------
ALLEN 300
WARD 500
MARTIN 1400
-- 72 --
BLAKE NOT APPLICATABLE
TURNER 0
JAMES NOT APPLICATABLE
UID Синтаксис UID
Назначение Возвращает уникальное число, назначен-
ное каждому имени пользователя (сущест-
вует единственное UID на пользователя).
Аргументов не требует.
Пример SELECT USER, UID FROM DUAL
USER UID
------------- -----
OPS$KING 9
USER Синтаксис USER
Назначение Возвращает имя текущего пользователя
ORACLE. В аргументах не нуждается.
Пример SELECT USER, UID FROM DUAL
USER UID
------------- -----
OPS$KING 9
USERENV Синтаксис USERENV(option)
Назначение Возвращает информацию типа CHAR о поль-
зователе/сеансе, используемую для спе-
цифичную для приложения таблицу журнала
регистрации доступа. Следующая таблица
показывает значение, возвращаемое для
каждой действительной опции option:
option Возвращаемое значение
--------------------------------Д
'ENTRYID' Доступный идентификатор
элемента регистрации
'SESSIONID' Идентификатор регистрации
сеанса пользователя
'TERMINAL' Идентификатор терминала
пользователя в операционной
системе
'LANGUAGE' Используемый язык (как оп-
ределено в параметре LANGUAGE
файла INIT.ORA
Пример SELECT USERENV('LANGUAGE') "Language"
FROM DUAL
Language
-------------------------
AMERICAN_AMERICA.US7ASCII
-- 73 --
VSIZE Синтаксис VSIZE(expr)
Назначение Возвращает количество байтов, использу-
емых ORACLE для хранения во внутреннем
виде expr.
Пример SELECT ENAME, VSIZE(ENAME) "BYTES"
FROM EMP
WHERE DEPTNO = 10
ENAME BYTES
------------ -------
CLARK 5
KING 4
MILLER 6
Модели форматов
Модели форматов используются с двумя целями:
* изменить формат выдачи столбца
* предоставить ORACLE значение формата, отличное от подразумеваемого.
Модели формата используются в функциях TO_CHAR и TO_DATE.
Внутри единственной функции TO_CHAR или TO_DATE могут быть применено
несколько моделей форматов.
Изменение формата выдачи
Модели формата могут применяться для изменения формы выдачи столбцов,
возвращаемых оператором SELECT. Модели формата никак не влияют на реальное
внутреннее представление данных столбца.
Например, чтобы выдать комиссионные всех служащих отдела 30 из таблицы EMP,
используя лидирующие символы доллара, запятые между каждыми тремя цифрами и
две десятичных позиции, введите:
SELECT ENAME EMPLOYEE, TO_CHAR(COMM,'$0,999.99') COMMISSION
FROM EMP
WHERE DEPTNO = 30
EMPLOYEE COMMISSION
----------- ----------
ALLEN $300.00
WARD $500.00
MARTIN $1,400.00
BLAKE
TURNER $0.00
JAMES
Обратите внимание, что функция TO_CHAR возвращает NULL для всех служащих, с
комиссионными NULL. Для подстановки 0 вместо NULL обратитесь к описанию
функции NVL выше по тексту. Заметьте также, что используются различные
модели формата ("$","9","0" и ".").
-- 74 --
Для выдачи даты приема на работу всех сотрудников отдела 20 с месяцами,
выводимыми словами, а также с включением века в год, необходимо ввести:
SELECT ENAME, TO_CHAR(HIREDATE,'fmMonth DD, YYYY') HIREDATE
FROM EMP
WHERE DEPTNO = 20
ENAME HIREDATE
------------ -----------------------
SMITH December 17, 1980
JONES April 2, 1981
SCOTT February 15, 1988
ADAMS March 20, 1988
FORD December 3, 1981
Назначение правильного формата
Модели формата могут быть также использованы для изменения значения в
формат, который ожидает ORACLE. При добавлении или изменении таблицы ORACLE
ожидает получить значения с типами данных, соответствующими типам данных
столбцов. Например, если Вы вставляете дату, ORACLE ожидает получить дату
или символьную строку в стандартном формате даты DD-MON-YY. Если Вы не
используете стандартный формат даты, необходимо воспользоваться функцией
TO_DATE с соответствующими моделями формата.
Для изменения даты найма служащего JONES на 20-May-88 не используя стандартный
формат, необходимо ввести:
UPDATE EMP
SET HIREDATE = TO_DATE('88 08 20','YY MM DD')
WHERE ENAME = 'JONES'
Функция TO_NUMBER
Функция TO_NUMBER не принимает модели формата. Все символьные выражения,
используемые в функции TO_NUMBER, должны приводить к правильному числу (См.
Главу 5 "Справочник по SQL - операторам").
Числовые форматы
Числовые форматы используются совокупно с функцией TO_CHAR для перевода
значений из типа данных NUMBER в CHARACTER. Их можно использовать только с
функцией TO_CHAR. Преобразование из NUMBER в CHARACTER может выполняться как
при выдаче данных, так и при передаче их системе ORACLE.
Все числовые форматы приводят к округлению числа до указанного количества
значащих цифр.
Если значение имеет больше значащих цифр в целой части, чем специфицировано
в формате, оно заменяется звездочками.
В следующей таблице показаны допустимые числовые форматы:
-- 75 --
Элемент Пример Описание
------------------------------------------------------------
9 9999 Число "9" определяет число выдаваемых позиций.
0 0999 Выдавать лидирующие нули.
$ $9999 Предварять значение знаком доллара.
B B9999 Выдавать нулевое значение как пробел, а не как "0".
MI 9999MI Выдавать "-" после отрицательного значения.
PR 9999PR Выдавать отрицательные значения в <угловых скобках>.
запятая 9,999 Выдать в данной позиции запятую.
точка 99.99 Выдать в данной позиции десятичную точку.
V 999V99 Умножить значение на 10*n, где n -
количество девяток после "V".
E 9.999EEEE Выдать результат в научной нотации
(формат должен содержать точно 4 "Е")
DATE DATE Для дат, хранящихся в числовом формате (ORACLE
Version 2). Выдается как дата в формате 'MM/DD/YY'.
Форматы даты
Форматы даты используются в функции TO_CHAR для выдачи даты в различных фор-
матах. Кроме того, они используются функцией TO_DATE для передачи ORACLE
значений, заданных в нестандартном формате. (Стандартный формат даты:DD-MON-YY
В следующей таблице приведены элементы форматов даты:
Элемент Значение
------------------------------------------------------------
SCC или CC Век; "S" означает предварение даты до
нашей эры символом "-".
YYYY или SYYYY Год; "S" означает предварение даты до нашей эры
символом "-".
YYY или YY или Y Последние 3, 2 или одна цифра года.
Y,YYY Год с запятой в указанной позиции
SYEAR или YEAR Год словами; "S" означает указание "-", если год до н.э.
BC или AD BC - до нашей эры, AD - наша эра.
B.C. или A.D. То же, но с точками в указанных позициях
Q Номер квартала (1,2,3,4; январь-март=1)
MM Месяц (01-12; январь=01)
MONTH Название месяца, дополненное пробелами до 9 символов.
MON Название месяца, трехбуквенное сокращение
WW Неделя года (1-52). Первая неделя начи-
нается первого числа года и продолжается до седьмого.
W Неделя месяца (1-5). Первая неделя начи-
нается с первого дня месяца и продолжается до седьмого.
DDD День года (1-366).
DD День месяца (1-31).
D День недели (1-7).
DAY Название дня недели, дополненное до 9символов пробелами.
DY Название дня, трехбуквенная аббревиатура
J Юлианская дата; число дней, прошедших с
1 января 4712 г. до н.э.
AM или PM До полудня или после полудня.
A.M или P.M То же, но с точками.
HH или HH12 Час дня (1-12).
HH24 Час дня (0-24).
MI Минуты (0-59).
SS Секунды (0-59).
-- 76 --
SSSSS Количество секунд, прошедших с полуночи.
/.,. Пунктуация, переносящаяся в результат.
"..." Многоточие, переносящееся в результат.
К элементам формата функции TO_CHAR может быть добавлен префикс FM (Fill Mode
- режим заполнения). Этот префикс подавляет пробелы, вставляемые во все
последующие элементы (например - в MONTH), а также подавляет для всех
последующих элементов лидирующие нули (например - в MI). Функция TO_CHAR
возвращает результат переменной длины.
FM - это параметр типа ключа. Если в модели формата он появляется дважды, то
после первого появления пробелы начинают подавляться, а после второго - вновь
вставляются в результат.
К первичным кодам формата функции TO_CHAR могут быть добавлены следующие
суффиксы:
TH Порядковый номер (т.е. "DDTH" для "4TH").
SP Номер выдается словом (т.е. "DDSP" для "FOUR").
SPTH или Порядковый номер выдается словом (т.е. "DDSPTH"
THSP для "FOURTH").
Выдача номеров (словами) прописными или строчными буквами зависит от
регистра, в котором набирается соответствующий элемент формата. Например,
"DAY" приведет к выдаче соответствующего слова прописными буквами - "MONDAY";
задав "Day", Вы получите "Monday", а задав "day" - "monday".
Кроме того, в модели формата можно вставлять различные знаки пунктуации,
например - дефисы, слеши, запятые, символьные константы, заключенные в
кавычки (не в апострофы !). Такие знаки пунктуации и символьные константы
переносятся в результат без изменений. Например, модель формата:
'DDTH "of" fmMonth, YYYY'
приводит к выдаче следующего результата:
15TH of March, 1989
Обратите внимание на наличие префикса "fm". В случае его отсутствия месяц
дополнялся бы пробелами до 9 символов:
15TH of March , 1989
Для включения в элемент формата апострофа, наберите его дважды. Например
следующий запрос:
SELECT TO_CHAR(sysdate, 'fmDay"''s Special"')
выдаст такой результат:
Tuesday's Special
-- 77 --
Выражения
Выражение - это комбинация одного или нескольких значений, операций и
функций, для которого вычисляется значение. В общем случае для компонентов
выражения предполагается определенный тип данных. Формальное определение
выражения ORACLE приводится в следующем разделе.
В следующем простом примере выражение имеет значение 4 и тип данных NUMBER
(один и тот же для обоих компонентов):
2*2
В следующем более комплексном примере используются как операции, так и функции.
В данном выражении к текущей дате добавляется семь дней, из суммы удаляется
временная компонента и результат преобразовывается к типу данных CHAR.
TO_CHAR(TRUNC(SYSDATE+7))
Выражения можно использовать практически везде, где можно использовать
постоянное значение. Например, можно вставить выражение вместо литерала
'smith' во фразе SET оператора UPDATE:
SET ENAME = 'smith'
В приведенном ниже примере вместо строки 'smith' вводится выражение
LOWER(ENAME):
SET ENAME = LOWER(ENAME)
-- 78 --
Expr
Назначение Текстовая строка, число, дата или выражение.
Предпосылки Нет.
Синтаксис Выражение может быть:
Форма I Столбцом, константой или специальным значением
[table.] {column | ROWID }
text
number
sequence.CURRVAL
sequence.NEXTVAL
NULL
ROWNUM
LEVEL
SYSDATE
UID
USER
Примеры EMP.ENAME
'this is a text string'
10
SYSDATE
Форма II Связанная переменная с необязательной индикаторной переменной
: { n | variable } [:ind_variable ]
Примеры :employee_name:employee_name_indicator_var
:department_location
Форма III Ссылка на функцию (доступные функции описываются в этой главе).
function_name ( [DISTINCT | ALL] expr [,expr]...)
Примеры LENGTH('BLAKE')
ROUND(1234.567*43)
Форма IV Комбинация других выражений (перечисленных выше).
(expr)
+expr, -expr, PRIOR expr
expr * expr, expr / expr
expr + expr, expr - expr, expr || expr
Примеры ('CLARK' || 'SMITH')
LENGTH('MOOSE') * 57
SQRT(114) + 72
Форма V Список выражений, заключенный в скобки:
(expr [,expr]...)
Примеры (10, 20, 40)
('SCOTT', 'BLAKE', 'TAYLOR')
(LENGTH('MOOSE') * 57, -SQRT(144) + 72, 69)
-- 79 --
Замечания по Выражения используются в:
использованию * списке выборки оператора SELECT
* условиях во фразах WHERE и HAVING
* фразах CONNECT BY, START WITH, ORDER BY
* фразе VALUE оператора INSERT
* фразе SET оператора UPDATE
Связанные Раздел "Функции" в этой главе, а также разде-
разделы лы "Text", "Integer" и "Number" в Главе 3 этого руководства.
Условия
Условие - это комбинация одного или более выражений и логических операций,
результатом которой являются значения FALSE либо TRUE. Условие можно было
бы назвать "Логическим" типом данных, хотя формально ORACLE такого типа не
поддерживает. Описание синтаксиса условия приводится в следующем разделе.
Покажем пример простого условия, результатом которого всегда будет TRUE:
1 = 1
В следующем примере приводится более сложное условие, которое выбирает ROWID
для каждой строки, преобразует в тип данных CHAR, сцепляет со строкой
'THE ROWID' и результат сравнивает на больше или равно с символьной константой
'smith':
ROWIDTOCHAR(ROWID) || 'THE ROWID' >= 'smith'
С помощью логических операций можно объединять несколько условий в одно.
Например, с этой целью можно использовать операцию AND:
(1 = 1) AND (5 < 7)
Для более подробной информации о вычислении условий с логическими операциями
обратитесь к разделу этой главы "Логические операции".
Условия наиболее часто используются во фразах WHERE операторов DELETE, SELECT
и UPDATE. Кроме того, они применяются во фразах START WITH, CONNECT BY и
HAVING оператора SELECT.
Condition
Назначение Элемент с результатом TRUE или FALSE.
Предпосылки Нет.
Синтаксис Условие может быть:
Форма I Сравнение с выражением или результатом запроса.
Форма II Сравнение с любым или всеми элементами списка запроса
-- 80 --
{ANY|ALL }([,]...)
{ANY|ALL }
{ANY | ALL}
( [,]...)
{ANY | ALL}
Форма III Тест на наличие в списке запроса
[NOT] IN ( [,]...)
[NOT] IN
[NOT] IN ( [,]...)
[NOT] IN
Форма IV Тест на вхождение в диапазон
[NOT] BETWEEN AND
Форма V Тест на значение NULL
IS [NOT] NULL
Форма VI Тест на существование в запросе строк
EXISTS
Форма VII Комбинация других условий (ранее перечисленных)
( )
NOT
AND
OR
Замечания по Используется во фразах WHERE, START WITH,
использованию CONNECT BY и HAVING.
Примеры ENAME = 'SMITH'
EMP.DEPTNO = DEPT.DEPTNO
HIREDATE > '01-JAN-88'
JOB IN ('PRESIDENT', 'CLERK', 'ANALYST')
SAL BETWEEN 500 AND 1000
COMM IS NULL AND SAL = 2000
Связанные Операторы SELECT, INSERT, UPDATE и DELETE в
разделы Главе 5 "Справочник по SQL - операторам";
фразы HAVING и WHERE в Главе 6 "Фразы опера-
тора SELECT".
-- 81 --
ГЛАВА 5
СПРАВОЧНИК ПО SQL - ОПЕРАТОРАМ
В этой главе содержится детальное описание всех SQL - операторов. За
небольшими исключениями эти операторы могут использоваться во всех
продуктах ORACLE. Операторы описываются в алфавитном порядке; описание
каждого включает следующие разделы:
Назначение описывает область использования оператора
Предпосылки перечисляются привилегии, необходимые
для выполнения этого оператора.
Синтаксис показывается, как надо вводить этот оператор. Используемая
нотация описана в предисловии к данному документу.
Ключевые слова описывается функция каждого ключевого
и параметры слова и параметра. Ключевое слово - это строка, которую
надо вводить именно так, как показано (она приводится в
символах верхнего регистра). Параметр - строка, вместо
которой пользователь помещает необходимое ему значение
(приводится в символах нижнего регистра).
Замечания по обсуждается, каким образом и где ис-
использованию пользуется этот оператор.
Примеры приводятся примеры каждого оператора.
Связанные разделы перечисляются разделы с дополнительной информацией.
Сводка по SQL - операторам
В Приложении В "Синтаксис SQL" дана полная сводка по синтаксису SQL - операто-
ров. В приводимой ниже таблице сведены все SQL - операторы с их функциональным
назначением. В таблице описываются следующие типы SQL - операторов:
DDL Data Defenition Language (Язык Определения Дан-
ных): эти операторы действуют на структуру объек-
тов базы данных и неявно используют словарь дан-
ных. До и после выполнения каждого DDL - оператора
ORACLE неявно выполняет операцию COMMIT.
DML Data Manipulation Language (Язык манипуляции дан-
ными): эти операторы выполняют различные манипуля-
ции с данными базы.
EMB Embedded SQL (Встроенный SQL): операторы, используемые для помещения
DDL и DML - операторов внутрь программы на процедурном языке.
Встроенный SQL поддерживается с помощью следующих прекомпиляторов
ORACLE: Pro*Ada, Pro*C, Pro*COBOL, Pro*FORTRAN, Pro*Pascal и
Pro*PL/I.
Оператор Тип Новый? Описание
------------------------------------------------------------
/* ... */ Помещает комментарий внутри
или между SQL - операторами.
ALTER CLUSTER DDL Y Переопределяет параметры
памяти кластера.
ALTER DATABASE DDL Y Открывает (закрывает, монтирует), pазмонтирует
-- 82 --
или переименовывает файлы базы данных;
переключает режимы архивации;
добавляют/отменяют файлы повторного выполнения
ALTER INDEX DDL Y Переопределяет будущее
распределение памяти индекса
ALTER ROLLBACK DDL Y Переопределяет будущее
SEGMENT распределение памяти сегмента отката
ALTER SEQUENCE DDL Y Переопределяет генерацию
последовательных номеров.
ALTER SESSION DDL Y Изменяет текущий сеанс пользователя.
ALTER TABLE DDL Добавляет столбцы к табли-
це, переопределяет их в су-
ществующих таблицах, а так-
же - будущее распределение памяти.
ALTER TABLESPACE DDL Y Переводит табличное прост-
ранство в off/online, уста-
навливает начало/окончание
backup, добавляет/переиме-
новывает файлы базы данных,
связанные с табличным прост-
ранством, меняет параметры
распределения памяти.
ALTER USER DDL Y Меняет пароль пользователя,
умалчиваемое табличное
пространство и умалчиваемое
временное табличное прост-
ранство.
AUDIT DDL Включает регистрацию досту-
па к указанным ресурсам ба-
зы данных.
CLOSE CURSOR EMB Освобождает ресурсы,
задержанные курсором.
COMMENT DDL Вносит в словарь данных
комментарии о таблице.
COMMIT DML Y Делает изменения, проведен-
ные с начала транзакции,
постоянными.
CONNECT EMB Присоединяет (подключает)
пользователя к базе данных.
CREATE CLUSTER DDL Создает кластер, который
может содержать одну или
более таблиц.
CREATE DATABASE DDL Y Создает базу данных и под-
готавливает ее к использо-
ванию.
CREATE DATABASE DDL Создает связь с определенным
LINK пользователем в удаленной ба-
зе данных.
CREATE INDEX DDL Создает индекс для таблицы.
CREATE ROLLBACK DDL Y Создает в табличном простра-
SEGMENT нстве сегмент отката.
CREATE SEQUENCE DDL Y Создает последовательность
пригодную для генерирования
основных ключей.
CREATE SYNONYM DDL Создает синоним для таблицы
или обзора.
CREATE TABLE DDL Создает таблицу и определя-
-- 83 --
ет ее столбцы и распределе-
ние памяти.
CREATE TABLESPACE DDL Y Создает в базе данных об-
ласть для хранения таблиц,
индексов, временных сегмен-
тов и сегментов отката и
именует входящие в него
файлы.
CREATE VIEW DDL Определяет обзор на одной
или нескольких таблицах или
других обзорах.
DECLARE CURSOR EMB Определяет курсор.
DECLARE DATABASE EMB Определяет имя удаленной
базы данных для ссылок в по-
следующих SQL - операторах.
DECLARE STATEMENT EMB Определяет имя SQL - пере-
менной для SQL - оператора.
DESCRIBE EMB Инициализирует дескриптор
для хранения описаний host
- переменной.
DELETE DML Удаляет все или выбранные
строки из таблицы.
DROP object DDL Удаляет кластер, межбазовую
связь, индекс, сегмент от-
ката, последовательность,
синоним, таблицу или обзор
из базы данных.
EXECUTE IMMEDIATE EMB Подготавливает и выполняет
SQL - оператор, не содержа-
щий host - переменных.
EXPLAIN PLAN Y Показывает план выполнения
SQL - оператора.
FETCH EMB Выбирает данные из базы.
GRANT DDL Создает новых пользователей
базы данных, назначает па-
роли и предоставляет поль-
зователям привилегии систе-
мы ORACLE. Предоставляет
пользователям привилегии на
таблицы, а также привилегию
использования ресурсов таб-
личного пространства.
INSERT DML Добавляет к таблице или об-
зору новые строки.
LOCK TABLE DML Блокирует таблицу, временно
ограничивая к ней доступ
другим пользователям.
NOAUDIT DDL Отменяет регистрацию досту-
па полностью или частично,
влияя на предыдущий опера-
тор AUDIT или на
опции регистрации.
OPEN cursor EMB Распределяет ранее описан-
ный курсор.
PREPARE EMB Выполняет разбор SQL -
оператора.
-- 84 --
RENAME DDL Изменяет имена таблиц, об-
зоров или синонимов.
REVOKE DDL Отменяет привилегии по базе
данных или пользовательские
привилегии по доступу к
таблицам.
ROLLBACK DML Y Откатывает все проведенные
изменения к точке сохране-
ния или к началу транзакции.
SAVEPOINT DML Y Устанавливает контрольную
точку, к которой впоследс-
твии можно будет выполнить
откат.
SELECT DML Выполняет запрос; выбирает
строки и столбцы из одной
или нескольких таблиц.
SET TRANSACTION DDL Y Начинает согласованную по
чтению транзакцию.
UPDATE DML Изменяет данные в таблице.
VALIDATE INDEX DDL Проверяет целостность индек-
са.
WHENEWER EMB Специфицирует, как будут
обрабатываться ошибки и
предупреждения.
/* ...*/ (SQL - комментарий)
Назначение Комментарии вставляются для лучшего понимания
SQL - оператора, не оказывая никакого влияния
на его работу.
Предпосылки Нет; комментарии можно помещать в любой SQL -
оператор.
Синтаксис /* text */
Ключевые слова text строка, содержащая печатаемые
и параметры символы из символьного набора
операционной системы, т.е.
ASCII или EBCDIC.
Замечания по Комментарии могут находиться внутри любого
использованию SQL - оператора ("внутри" означает - между
слов).
/* начинает комментарий, а */ его завершает.
Комментарий может распространяться на любое
число строк и может начинаться или заканчи-
ваться посредине строки. Между слешем и звез-
дочкой не должно быть никаких символов.
Пример Следующий SQL - оператор включает в себя нес-
колько комментариев:
SELECT ENAME, SAL+COMM COMP, JOB, LOC
/* Select all employees whose compensation is
greater then that Jones. - выбрать всех слу-
жащих, чья зарплата превышает зарплату
-- 85 --
служащего Jones */
FROM EMP, DEPT
/* DEPT is used to get depar-
tment name - DEPT использует-
ся для получения названия от-
дела */
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND SAL + COMM > /* Подзапрос: */
(SELECT SAL+COMM /* COMP=SAL+COMM */
FROM EMP /* зарплата */
WHERE ENAME='JONES') /* Джонса */
Связанные Оператор COMMENT.
разделы
-- 86 --
ALTER CLUSTER
Назначение Переопределение будущих характеристик памяти
для кластера.
Предпосылки Вы должны быть либо владельцем кластера, либо
иметь привилегию DBA для изменения характе-
ристик памяти чужого кластера.
Синтаксис ALTER CLUSTER [user.]cluster
[PCTUSED integer] [PCTFREE integer]
[SIZE integer]
[INITRANS integer] [MAXTRANS integer]
[STORAGE storage]
Ключевые слова user имя пользователя - владельца
и параметры кластера.
cluster имя кластера.
PCTUSED integer (Обратитесь к ниже к параметру
PCTUSED в описании оператора
CREATE TABLE).
PCTFREE integer (Обратитесь к ниже к параметру
PCTFREE в описании оператора
CREATE TABLE).
SIZE integer определяет, сколько ключей кла-
стера будет запоминаться в од-
ном блоке ORACLE, распределен-
ном кластеру. Полное описание
этого параметра дается ниже в
операторе CREATE CLUSTER.
INITRANS integer (Обратитесь к ниже к параметру
INITRANS в описании оператора
CREATE TABLE).
MAXTRANS integer (Обратитесь к ниже к параметру
MAXTRANS в описании оператора
CREATE TABLE).
STORAGE storage (См. ниже описание фразы
STORAGE).
Замечания по Используя команду ALTER CLASTER, Вы можете:
использованию
* изменить PCTUSED и PCTFREE для будущих бло-
ков кластера
* изменить SIZE для будущих блоков кластера
* изменить для будущих блоков значения
INITRANS и MAXTRANS
* изменить будущие распределения памяти, за-
даваемые с помощью параметров PCTINCREASE,
MAXEXTENTS, NEXT.
Используя команду ALTER CLUSTER, Вы не можете:
* изменять количество столбцов кластера и их
имена
* изменять параметр MINEXTENTS
* изменять любой параметр относительно бло-
ков, уже распределенных кластеру
-- 87 --
* удалять таблицы из кластера (См. команды
DROP CLUSTER и DROP TABLESPACE)
* менять табличное пространство, которому
принадлежит кластер
Пример Чтобы изменить кластер CUSTOMER пользователя
SCOTT так, чтобы в будущем он содержал по 4
ключа кластера на один блок ORACLE (предпола-
гается размер блока ORACLE 2 килобайта
2К/(SIZE 512)=4) и установить MAXEXTENTS в
25, введите:
ALTER CLUSTER SCOTT.CUSTOMER
SIZE 512
STORAGE (MAXEXTENTS 25)
Связанные Операторы CREATE CLUSTER и CREATE TABLE, фраза
разделы STORAGE.
-- 88 --
ALTER DATABASE
Назначение Изменение существующей базы данных в следую-
щих направлениях:
* монтировать базу данных (в разделяемом или
исключительном режимах)
* открыть или закрыть базу данных
* переименовать или отменить файл журнала
повторного выполнения
* специфицировать, что файл журнала будет ар-
хивироваться и, следовательно, будет полезен
при восстановлении носителя или не будет ар-
хивироваться и, значит, поможет только при
восстановлении экземпляра.
Предпосылки Требуется привилегия DBA.
Синтаксис ALTER DATABASE [ database ]
{ADD LOGFILE filespec [,filespec ...]
|DROP LOGFILE 'filename' [,'filename'] ...]
|RENAME FILE 'filename' [,'filename'] ...
TO filename [,filename] ... ]
|ARCHIVELOG
|NOARCHIVELOG
|MOUNT [SHARED | EXCLUSIVE]
--------Д
| DISMOUNT
|OPEN
| CLOSE [NORMAL | IMMEDIATE]}
------
Ключевые слова database идентификатор базы данных,
и параметры который не может содержать
более 8 символов. Если от-
сутствует, имя базы будет
браться из значения параметра
файла INIT.ORA - DB_NAME.
Этот идентификатор не связан
со спецификацией базы данных
в SQL*Net.
ADD LOGFILE спецификация базы данных в
форме:
'filename' [SIZE integer [K|M]] integer [REUSE]
указывает SIZE в байтах. Если
integer опущено, предполага-
ется размер файла журнала в
500К. Если далее идет "К",
integer умножается на 1024,
если "М" - на 1048576.
DROP LOGFILE имя текущего файла журнала,
filename который должен быть отменен.
RENAME FILE специфицирует старое и новое
filename TO имена для файлов базы данных.
filename Новые имена файлов должны со-
ответствовать соглашениям Ва-
шей операционной системы.
|