|
ГЛАВА 3
ЭЛЕМЕНТЫ ЯЗЫКА SQL
Эта глава содержит справочную информацию об основных элемен-
тах языка SQL. Понимание этих элементов имеет решающее зна-
чение для эффективного использования SQL. Перед использова-
нием любого оператора, представленного в Главе 5 -
"Справочник операторов SQL", необходимо хорошо понять кон-
цепции, излагаемые в этой главе. Данная глава описывает сле-
дующие разделы:
* объекты базы данных
* правила именования объектов базы данных
* зарезервированные слова
* литералы
* переменные
* типы данных
* значения null
* псевдостолбцы
Объекты базы данных
Объекты базы данных - это элементы, поддерживаемые ORACLE RDBMS.
Большинство объектов занимает память в базе данных; некоторые объекты
(например - табличные пространства) ис- пользуются для хранения других
объектов базы данных. Таблицы - это единственный объект, который хранит данные
пользовате- ля и к которому он может обращаться непосредственно.
Объекты базы данных при создании получают имена, которые подчиняются правилам
именования, описанным в следующем разделе. Все объекты базы данных имеют
создателя и владельца; обычно создатель и владелец объекта является одним и
тем же лицом. Ниже перечислены объекты, которые должны именоваться: *
кластеры * столбцы * ограничения * базы данных * связи базы данных *
индексы * сегменты отката * точки сохранения * последовательности *
синонимы * таблицы * табличные пространства * пользователи * обзоры
Правила именования объектов базы
Именование объектов базы данных подчиняется следующим правилам:
1. Имя объекта базы данных должно быть длиной от 1 до 30
символов (кроме имен объектов, ограниченных восемью символами).
2. Имя не должно содержать кавычек.
3. Имя не является регистрочувствительным
4. Имя должно начинаться с буквы.
5. Имя может содержать только символы A-Z, 0-9, _,$ и # (использование $ и #
специально оговаривается).
6. Имя не должно дублировать зарезервированные слова ORACLE (перечислены в
следующем разделе).
7. Имя не должно дублировать имя какого-либо иного объекта базы данных,
владельцем которого является тот же пользователь.
8. (индексы, последовательности, таблицы и обзоры). Некоторые объекты базы
-- 28 --
данных могут в дальнейшем определяться вместе с именем пользователя -
владельца данного объекта. Например, кроме имени EMP Вы можете
использовать имя SCOTT.EMP. Вы можете также включать пробеля справа и
слева от точки, но они не относятся к соглашениям.
9. Имя может содержать любую комбинацию символов и в случае заключения в
кавычки правила 3-6 не действуют. (в этом случае имя может также
содержать и пробел).
Алиасы таблиц и столбцов, хотя и не являются объектами базы, должны
следовать указанным правилам.
Примеры идентификаторов:
ENAME
HORSE
SCOTT.hiredate
"SELECT"
"EVEN THIS & THAT!"
A_VERY_VERY_VERY_LONG_NAME
Указания по именованию объектов базы данных
Существует несколько полезных указаний по именованию объектов базы данных:
* Используйте полные, смысловые имена объектов (как минимум -
хорошо известные аббревиатуры).
* Используйте имена в единственном числе.
* Используйте непротиворечивые имена.
* Используйте одно и то же имя для именования одной и той же сущности или
атрибута в разных таблицах.
Давая имена объектам базы данных Вы должны уравновесить два tребования:
сделать имя как можно короче (для простоты использования) и осмысленным (для
облегчения понимания). В случае сомнений на этот счет необходимо выбирать
простоту понимания, так как большинство систем используется многими людьми в
течение многих лет. Ваш двойник через десять лет может затратить много
времени, чтобы понять систему, если Вы поименовали объект PMDD вместо
PAYMENT_DUE_DATE.
Существует соглашение по именованию в единственном числе, например -
используйте название EMPLOYEE вместо EMPLOYEES. Или можно выбрать обратный
вариант и использовать везде множественную форму. Цель таких именований -
упростить понимание назначения таблицы без ее просмотра.
Использование согласованных правил именования поможет пользователям проще
понять назначение таблиц в Вашем приложении. Одним из таких правил может быть
назначение всем таблицам, относящимся к системе FINANCE, префикса FIN_.
Необходимо использовать в разных таблицах одинаковые имена для столбцов с
однотипными данными. Например, как в таблице EMP, так и DEPT столбец с именем
отдела называется DEPTNO.
Зарезервированные слова
Приведенные ниже слова резервируются в SQL. Их нельзя использовать в качестве
имен объектов базы данных (если не заключать их в кавычки).
-- 29 --
Слова, отмеченные звездочкой (*), также являются зарезервированными словами
ANSI. Слова, помеченные знаком плюс (+) впервые появились в ORACLE RDBMS
Version 6.
ACCESS DEFAULT* INDEX
ADD DELETE* INITIAL
ALL* DESC* INSERT*
ALTER* DISTINCT* INTEGER*
AND* DROP INTERSECT
ANY* INTO*
AS* ELSE+ IS*
ASC* EXCLUSIVE
AUDIT EXISTS* LEVEL
LIKE
BETWEEN* FILE LOCK
BT* FLOAT* LONG
FOR*
CHAR* FROM* MAXEXTEMNS
CHECK* MINUS
CLUSTER GRANT* MODE
COLUMN+ GRAPHIC MODIFY*
COMMENT GROUP*
COMPRESS NOAUDIT
CONNECT HAVING* NOCOMPRESS
CREATE* NOT
CURRENT* IDENTIFIED NOWAIT
IF+ NULL*
DATE IMMEDIATE* NUMBER
DBA IN*
DECIMAL* INCREMENT OF*+
OFFLINE+ ROWNUM UID
ON* ROWS UNION*
ONLINE+ UNIQUE*
OPTION* SELECT* UPDATE*
OR* SESSION* USER
ORDER* SET*+
SHARE VALIDATE
PCTFREE SIZE VALUES*
PRIOR SMALLINT* VARCHAR*
PRIVILEGES* START+ VARGRAPHIC
PUBLIC* SUCCSESSFUL VIEW*
SYNONYM
RAW SYSDATE WHENEVER*+
RENAME WHERE*
RESOURCE TABLE* WITH*
REVOKE* THEN+
ROW TO*
ROWID TRIGGER+
Ключевые слова
Следующие ключевые слова имеют специальное значение в языке SQL, поддержива-
емом ORACLE RDBMS, но не являются зарезервированными словами и, следовательно,
могут быть идентификаторами. Однако эти слова могут стать зарезервированными
в будущем. Зарезервированные слова ANSI отмечены звездочкой (*); ключевые
слова, впервые добавленные в версии 6, отмечены плюсом (+).
-- 30 --
ARCHIVELOG+ ESCAPE*+ MAXVALUE+
AUTHORIZATION*+ EVENTS+ MINEXTENTS+
EXEC*+ MINVALUE+
BACKUP+ MODULE*+
BEGIN*+ FETCH*+ MOUNT+
FOREIGN*+
CACHE+ FORTRAN*+ NEXT*+
CHARACTER*+ FOUND*+ NOARCHIVELOG+
CLOSE*+ NOCACHE+
COBOL*+ GO*+ NOCYCLE+
COMMIT*+ GOTO*+ NOMAXVALUE+
CONSTRAINT*+ NOMINVALUE+
CONTENTS+ INCLUDING+ NOORDER+
CONTINUE*+ INDICATOR*+ NORMAL+
CONTROLFILE+ INITRANS+ NOSORT+
CRASH INT*+ NUMERIC*+
CURSOR*+
CYCLE+ KEY*+ ONLY*+
OPEN*+
DATABASE LANGUAGE*+
DATAFILE+ LINK PASCAL*+
DEC*+ LOGFILE+ PCTINCREASE+
DECLARE*+ PCTUSED+
DISMOUNT+ MAXDATAFILES+ PL1*+
DOUBLE*+ MAXINSTANCES+ PRECISION*+
MAXLOGFILES+ PRIMARY*+
END*+ MAXTRANS+ PROCEDURE*+
READ*+ SEQUENCE+ TABLES+
REAL*+ SHARED+ TABLESPACE+
REFERENCES*+ SOME*+ TEMPORARY*+
RELEASE+ SORT+ TRANSACTION*+
RESETLOGS+ SPECIFIED+
REUSE+ SQL*+ USING*+
ROLLBACK*+ SQLCODE*+
SQLERROR*+ WRITE*+
SAVEPOINT+ STATEMENT+ WORK*+
SCHEMA*+ STORAGE+
SECTION*+ SWITCH+
SEGMENT+ SYSTEM*+
Термины системы ORACLE
Литералы
Термины: literal, constant, value (литерал, константа, значение) в ORACLE
имеют одинаковое значение; все представляют определенную часть информации.
Например - 'JACK', 'BLUE ISLAND', '101' - символьные литералы; '01-JAN-89'
- литерал типа дата; 5001 - цифровой литерал. Заметьте, что символьные и
датные литералы заключены в одиночные кавычки. Кавычки позволяют ORACLE
отличать имена объектов базы данных от символьных и датных литералов.
Переменные
-- 31 --
Переменные в системе ORACLE служат местом для помещения литералов. Переменные
ORACLE работают аналогично переменным в языках программирования. В любой
данный момент времени переменная может быть либо пустой, либо хранить
литерал. Переменные в основном используются во вложенном SQL.
Типы данных
Каждый литерал или переменная, с которыми работает система ORACL, имеет
определенный тип данных. Тип данных ассоциируется с фиксированным набором
свойств, присущих его значениям. Этот набор свойств позволяет ORACLE
различать типы данных. Например - сложение может выполняться с данными
типa NUMBER, но не с данными RAW.
Типы данных также ограничивают диапазон значений, которые может принимать
элемент данных. Например - тип данных DATE не может принимать значение 29
февраля, если год не високосный. Этот же тип данных не может принимать
значение 2 или 'SHOE'.
Значение в базе данных предполагается того же типа, что и тип столбца,
которому оно принадлежит. Типы данных специфицируются в операторах ALTER
TABLE, CREATE CLUSTER и CREATE TABLE. Каждому столбцу таблицы назначается
определенный тип данных, а следовательно - и каждому значению, принадлежащему
данному столбцу. ORACLE назначает тип данных небазовым значениям исходя из
контекста их использования. Например, если Вы вставляете '01-JAN-89' в
столбец с типом DATE, ORACLE после проверки на правильность будет трактовать
символьную строку '01-JAN-89' как значение типа DATE.
Смешанные типы: преобразование типов данных
В общем случае в выражении не должно быть смешения типов данных. Например
- выражение не может содержать произведения 5 на 10 и затем сложения с ним
'JAMES'.
Однако, ORACLE будет выполнять преобразование одного типа данных в другой
если это имеет смысл. Например, литеральная строка '10' имеет тип CHAR,
ORACLE преобразует ее в NUMBER, если она используется в числовом выражении.
Типы данных CHAR и VARCHAR
Тип данных CHAR используется при манипуляции со словами текста. Он имеет
меньше ограничений, чем другие типы данных и, следовательно, имеет меньше
свойств, нежели другие типы данных. Например, в типе данных CHAR могут
храниться любые формы текста, а в типе NUMBER - только числовые.
Данные хранятся в строках переменной длины в кодах ASCII или EBCDIC - в
зависимости от используемого компьютера. Использование нестандартных символов
может снизить переносимость приложений между машинами разных архитектур.
В настоящее время типы данных CHAR и VARCHAR эквивалентны. Эти типы данных
предназначены для хранения символьных (алфа витно цифровых) данных. Слова
CHAR и VARCHAR можно использовать равнозначно, с одинаковым эффектом.
-- 32 --
Абсолютный максимум числа символов, которые можно хранить в столбце,
определенном как CHAR и VARCHAR, равен 255. Максимальное число символов в
конкретном столбце указывается при создании таблицы, изменить его можно с
помощью оператора ALTER TABLE.
Столбцы CHAR и VARCHAR в словаре данных хранятся как VARCHAR.
В то время как CHAR и VARCHAR в Версии 6 трактуются эквивалентно, ожидается,
что в будущих версиях ORACLE RDBMS CHAR будет фиксированной длины, а VARCHAR
- переменной.
Text
Назначение Специфицировать литерал типа "строка символов"
Предпосылки нет
Синтаксис '[char]...'
Ключевые слова char один из элементов символьного
и параметры набора (т.е. ASCII, EBCDIC),
специфицируемого параметром файла
INIT.ORA - LANGUAGE.
Замечания по Текстовый литерал должен быть длиной до 255
использованию символов. Он заключается в одиночные кавычки; сама кавычка
представляется внутри литерала двумя идущими подряд кавычками.
Замечание: В данном руководстве термины сим-
вольный литерал и текстовый литерал использу-
ются взаимообразно.
Примеры 'Hello'
'ORACLE.dbs'
'Jackie''s raincoat'
'Happy Birthday, Tom!'
'09-MAR-88'.
Связанные Разделы "Integer" и "Number" ниже в этой гла-
разделы ве; синтаксическое описание condition и expr
в Главе 4 - "Операторы и функции" данного документа.
Тип данных NUMBER
Тип данных NUMBER используется для хранения чисел (с фиксированной или
плавающей точкой). Могут храниться числа практически любого размера -
точностью до 38 цифр. Храниться могут числа от 1.0*10 в (-129 степени)
до 9.99*10 в 124 степени.
Для числового столбца можно специфицировать:
* NUMBER
* NUMBER с точностью (общее количество цифр в диапазоне от 1 до 38)
* NUMBER с точностью и масштабом (количество цифр после десятичной
точки в диапазоне от -84 до 127)
-- 33 --
Синтаксис данных типа NUMBER следующий:
column_name NUMBER [ ( precision [,scale] ) ]
например:
CREATE TABLE MINI (WEENUMBERS NUMBER (2,1))
Использование масштаба и точности
Числовые поля хорошо специфицировать как общее число цифр и число десятичных
позиций (после запятой). Это позволяет выполнить на входе дополнительную
проверку на целостность. Спецификация максимального количества цифр, которые
необходимо хранить, не требует, чтобы все числа были фиксированной длины. Если
значение превышает максимальный масштаб, число будет округлено. В следующей
таблице даются примеры того, как данные будут запоминаться при различных
значениях масштаба.
Реальные данные Специфицировано Хранится
----------------------------------------------------------Д
7,456,123.89 NUMBER 7456123.89
7,456,123.89 NUMBER(9) 7456124
7,456,123.89 NUMBER(9,2) 7456123.89
7,456,123.89 NUMBER(9,1) 7456123.9
7,456,123.8 NUMBER(6) точность превышена
7,456,123.8 NUMBER(15,1) 7456123.8
7,456,123.89 NUMBER(7,-2) 7456100
7,456,123.89 NUMBER(7,2) точность превышена
Отрицательный масштаб
Если масштаб отрицательный, реальные данные округляются до указанного числа
позиций влево от десятичной точки. Например, спецификация (10,-2) означает
округление до сотен.
Масштаб больше точности
Хотя это используется и не часто, не будет ошибкой указание масштаба больше
точности. Если так, то точность специфицирует максимальное число значащих цифр
после десятичной точки. Как и везде с данными типа NUMBER, если значение
превышает максимальную точность, выдается сообщение об ошибке, а если
значение превышает максимальный масштаб, оно округляется. Например, если
столбец определен как NUMBER(4,5), он потребует в качестве первой цифры
после десятичной точки - ноль, и все цифры после точки, начиная с шестой,
будут округляться.
Следующая таблица показывает эффект, когда масштаб больше точности.
Реальные данные Специфицировано Хранится
----------------------------------------------------------Д
.01234 NUMBER(4,5) .01234
.00012 NUMBER(4,5) .00012
.000127 NUMBER(4,5) .00013
.0000012 NUMBER(2,7) .0000012
.00000123 NUMBER(2,7) .0000012
-- 34 --
Экспоненциальное представление
Данные могут быть представлены также и в экспоненциальном формате. Он
выражается числом, далее следует буква "Е" и далее число от 1 до 128.
Например, число 123456 представляется в виде 1.23456, а 0.0987 - как 9.87. За
точным определением в ORACLE чисел в экспоненциальном представлении обратитесь
к разделу "NUMBER" этой главы.
Подмножество FLOAT
ORACLE поддерживает концепцию числа с плавающей точкой с помощью типа данных
FLOAT. Этот тип данных согласовывается со стандартом ANSI для чисел с
плавающей точкой. В значении данных типа FLOAT позицию десятичной точки
можно указать в любом месте от первой до последней цифры (или нигде). Масштаб
здесь не применяется и Вы можете указать столько цифр после десятичной
точки, сколько захотите (не превышая максимального значения точности).
FLOAT можно специфицировать как FLOAT, FLOAT(*), FLOAT(binary_precision).
FLOAT и FLOAT(*) эквивалентны и представляют максимальную точность 126
двоичных цифр. 126 двоичных цифр примерно эквивалентны 37 десятичным цифрам.
Максимальную точность можно специфицировать с помощью синтаксиса
FLOAT(binary_precision). Чтобы преобразовать двоичную точность в десятичную,
необходимо умножить двоичное значение на 0.30103. Чтобы преобразовать из
десятичной точности в двоичную, умножьте десятичное значение на 3.32193.
Другие формы NUMBER
Для совместимости с другими системами управления базами данных ORACLE
поддерживает синтаксис широкого диапазона числовых типов данных включая
DECIMAL, INTEGER, DOUBLE_PRECISION и REAL. Все типы числовых данных реально
запоминаются в одном и том же внутреннем формате ORACLE. Дополнительные типы
числовых форматов варьируются по точности и масштабу. Например, DECIMAL(5)
подразумевает масштаб 0. Умалчиваемые значения для различных форм числовых
данных приводятся ниже в разделе "Сводка по числовым типам данных".
Integer
Назначение.....Специфицировать число (целое). Например,
integer может представлять размер базы данных.
Предпосылки Нет.
Синтаксис [ + | - ]digit[digit]...[K|M]
Ключевые слова digit одна из 0,1,2,3,4,5,6,7,8,9.
и параметры
Замечания по использованию
Если за integer следует "К", действительное значение получается умножением
специфицированного числа на 1024. Если следует "М", значение получается после
умножения числа на 1048576. В общем случае integer представляет байты; К -
означает килобайты и М - мегабайты. Однако нотацию "К" и "М" можно
использовать везде, где разрешено использование числовых выражений.
-- 35 --
Максимально integer может хранить 38 цифр.
Примеры 7
255
29К
6М
Связанные Разделы "Integer" и "Number" ниже в этой гла-
разделы ве; синтаксическое описание condition и expr
в Главе 4 - "Операторы и функции" данного документа.
Number
Назначение Представление числового литерала.
Предпосылки Нет.
Синтаксис digit[digit...].[digit...][{exponent|multiplier}]
Ключевые слова digit одна из 0,1,2,3,4,5,6,7,8,9.
и параметры
exponent {e|E}[+|-]digit[digit]...
multiplier К либо М. Обозначает число, на которое
умножается данное К - 1024, М - 1048576.
Замечания по Может использоваться для представления как
использованию целых, так и действительных чисел. Экспонен-
циальная нотация несовместима с указанием множителя.
Множитель может указываться только для представления целых чисел
Максимально number может хранить 38 цифр.
Примеры 25
6.34
0.5
7E2
25e-03
256K
1M
Связанные Разделы "Integer" и "Number" ниже в этой гла-
разделы ве; синтаксическое описание condition и expr
в Главе 4 - "Операторы и функции" данного документа.
Тип данных DATE
Тип данных DATE используется для хранения информации о дате и времени. Хотя
информация о дате и времени может быть представлена типами данных CHAR
или NUMBER, ORACLE ассоциирует с этим типом специальные свойства.
Для каждого значения даты запоминается:
* Век
* Год
* Месяц
* День
* Час
* Минута
* Секунда
-- 36 --
Время запоминается в 24 - часовом формате. По умолчанию время в DATE имеет
значение 12:00:00 a.m. (полночь) - если время не указывается. По умолчанию
дата в DATE принимает значение первого дня текущего месяца. Функция
SYSDATE возвращает текущую дату и текущее время.
Стандартный формат ORACLE для типа данных DATE DD-MON-YY, например -
13-NOV-88. Для ввода даты в нестандартном для ORACLE формате необходимо
использовать функцию TO_DATE с соответствующей маской формата.
Для ввода в дату времени необходимо также воспользоваться функцией TO_DATE,
чья маска должна содержать указание времени, например:
INSERT INTO BIRTHDAYS (BNAME, BDAY)
VALUES ('ANNIE',
TO_DATE('13-NOV-85 10:56 A.M.','DD-MON-YY HH:MI A.M.')
Для сравнения дат, имеющих в своем составе время, можно для игнорирования
времени использовать функцию TRUNC.
Арифметика дат
Хотя Вы и не можете умножать и делить одну дату на другую, к датам можно
прибавлять или вычитать числовые константы и другие даты. Например
SYSDATE + 1 означает "завтра", а SYSDATE - 7 - дату на неделю раньше
текущей. Вычитание SYSDATE из столбца HIREDATE даст число дней, которые
служащий работает в данной организации.
ORACLE предлагает функции для многих операций с датами. Например, функция
ADD_MONTHS позволяет добавлять или вычитать месяцы из даты. Функция
MONTHS_BETWEEN возвращает количество месяцев между двумя датами; дробная
часть результата представляет из себя часть 31 - дневного месяца. Более под-
робную информацию о функциях Вы сможете отыскать в Главе 4 "Операторы и
функции".
Так как каждая дата содержит компоненту времени, большинство результатов
операций с датами содержат дробную часть, означающую часть дня. Например 1.5
дней = 36 часов.
Использование Юлианской даты
Юлианская дата - это число дней, прошедших с 1 января 4712 года до нашей
эры. Юлианская дата означает последовательное датирование от общей точки.
Реализация юлианской даты в системе ORACLE не имеет компоненты времени. Для
использования юлианской даты в функциях TO_CHAR и TO_DATE применяется маска
формата "J". Например:
SELECT TO_CHAR(TO_DATE('01-JAN-89'),'J') FROM DUAL
вернет:
2447528
Тип данных LONG
-- 37 --
Столбцы, определенные как LONG, могут хранить символьные строки переменной
длины до 65535 символов. Тип данных LONG отличается от VARCHAR только
размером хранимых строк. Данные типа LONG могут использоваться для
хранения массивов символов и даже коротких документов.
В словаре данных определения обзоров хранятся в столбцах с типом данных LONG.
Столбцы типа LONG можно использовать:
* в списках операторов SELECT
* во фразах SET предложения UPDATE
* в операторах INSERT
Ограничение на использование данных LONG
На данные типа LONG накладываются некоторые ограничения. В таблице может
быть только один столбец типа LONG. Кроме того, такие столбцы нельзя
использовать:
* в индексах
* во фразах WHERE, GROUP BY, ORDER BY, CONNECT BY, DISTINCT
* в функциях (таких как SUBSTR или INSTR)
* в выражениях
* в списках SELECT блока запроса, связанного с другим блоком
запроса с помощью UNION, INTERSECT, MINUS
* в распределенных запросах (хотя их можно исполь зовать в команде
SQL*Plus - COPY)
Типы данных RAW и LONGRAW
Типы RAW и LONGRAW используются для байт - ориентированных данных (например
- двоичные данные или строки байтов) для хранения символьных строк и
последовательностей графических символов. ORACLE выдает данные типа RAW в
шестнадцатеричном виде. Данные типа RAW эквивалентны CHAR (а LONGRAW - LONG)
за исключением того, что при передаче с помощью SQL*Net данные типа CHAR
будут преобразовываться из ASCII в EBCDIC и обратно.
Данные типа RAW необходимо вводить в шестнадцатеричном виде.
Типы данных DB2 и SQL/DS
Дополнительно к типам данных ORACLE SQL - операторы могут создавать таблицы и
кластеры, воспринимающие типы данных продуктов фирмы IBM: SQL/DS и DB2 и
преобразовывать их в типы данных ORACLE следующим образом:
Тип данных SQL/DS или DB2 Тип данных ORACLE
------------------------------------------------------------
SMALLINT NUMBER(38)
INTEGER NUMBER(38)
DECIMAL(m,n) NUMBER(m,n)
FLOAT NUMBER
VARCHAR(n) CHAR(n)
LONG VARCHAR LONG
-- 38 --
Из-за отсутствия в ORACLE соответствующего типа данных не должны
использоваться типы:
* GRAPHIC
* VARGRAPHIC
* LONG VARGRAPHIC
Однако их нельзя использовать для именования объектов базы, так как он
являются зарезервированными словами SQL/DS.
Тип данных ROWID
Это связанный с каждой строкой псевдостолбец, который соответствует адресу
строки. Этот адрес может быть выбран SQL - оператором используя зарезервиро-
ванное слово ROWID. Как показано в следующем примере, запрос, выбирающий
ROWID, возвращает в шестнадцатеричном виде значение адреса выбираемой строки:
SELECT ROWID, ENAME FROM EMP WHERE DEPTNO = 20
ROWID ENAME
------------------- ----------
0000000F.000.0002 SMITH
0000000F.003.0002 JONES
0000000F.007.0002 SCOTT
0000000F.00A.0002 ADAMS
0000000F.00C.0002 FORD
ROWID возвращает три части информации, необходимой для нахождения строки:
* номер блока в файле базы данных
* номер строки в блоке (первая строка 0)
* номер файла базы данных (первый файл 1)
Для чего используется ROWID ?
ROWID имеют несколько важных применений:
* Это наискорейший метод доступа к определенной строке.
* Они могут использоваться, чтобы посмотреть, как реально хранятся
строки таблицы.
* Они являются уникальным идентификатором для строк в данной таблице
ROWID для строки остается постоянным на протяжении всего времени жизни
строки. Однако Вы не должны трактовать ROWID как основной ключ, так как он
может меняться при удалении и повторном добавлении строки, например - при
использовании утилит Export/Import. Более того, после удаления некоторой
строки ORACLE назначит этот ROWID вновь добавленной строке.
Хотя ROWID и могут использоваться во фразах SELECT или WHERE, они не
запоминаются в базе данных и, следовательно, не являются изменяемыми
данными. Другими словами - невозможно выполнить для ROWID операции UPDATE,
INSERT или DELETE.
Преобразование типов данных
Фразы WHERE и выражения (булевые, арифметические или строчные) могут исполь-
зовать при сравнении данные различных типов. В этих случаях для выполнения
оператора ORACLE обязательно использует преобразование данных. В следующих
-- 39 --
примерах ORACLE автоматически выполнит необходимые преобразования данных:
SELECT ENAME FROM EMP WHERE ENAME = 135
SELECT ENAME FROM EMP WHERE EMPNO = '7936'
SELECT ENAME FROM EMP WHERE HIREDATE = '12-MAR-86'
SELECT ENAME FROM EMP WHERE ROWID = '00002514.0001.0001'
Для выполнения преобразования ORACLE может:
* преобразовать константу в тип данных столбца
* преобразовать значение столбца к типу данных константы
* преобразовать тип данных столбца к типу данных
другого столбца
Рисунок 3-1 показывает пользовательские функции, которые могут выполнять
преобразование из одного типа данных в другой:
К какому
CHAR NUMBER DATE
Из какого Ъ------------ДВ--------------В------------Дї
і і і і
CHAR і не надо і TO_NUMBER і TO_DATE і
і і і і
Г------------ДЕ--------------Е------------Дґ
і і і і
NUMBER і TO_CHAR і не надо і TO_DATE і
і і і і
Г------------ДЕ--------------Е------------Дґ
і і і і
DATE і TO_CHAR і неверно і не надо і
і і і і
А------------ДБ--------------Б------------ДЩ
Рисунок 3-1 Функции преобразования типов данных
Преобразования данных являются контекстно - зависимыми, поэтому нельзя
ожидать, что во всех случаях будет выполняться тот же вид преобразования.
Вместо того, чтобы полагаться на неявные или автоматические преобразования,
необходимо указывать явные преобразования, обеспечиваемые функциями SQL. Это
диктуется следующими соображениями:
* если вы применяете функции явного преобразова-
ния, SQL - операторы становятся проще для понимания
* автоматическое преобразование данных может негативно влиять на
производительность, особенно если столбец преобразовывается к типу
данных константы
* алгоритмы неявного преобразования могут меняться от версии к
версии и от одного продукта ORACLE к другому и, следовательно,
поведение явных преобразований более предсказуемо.
Правила сравнения типов данных
Приведем список правил сравнения значений различных типов:
Числовые значения
Для положительных чисел сравнение обычное. Все отрицательные числа "меньше"
положительных. Таким образом: -1 меньше 100, а -100 меньше чем -1.
Значения даты
-- 40 --
Более поздняя дата рассматривается "больше", чем более ранняя. Например,
'29-MAR-88' "меньше" чем '05-JAN-89', а '1:35pm' больше чем '10:09am'.
Символьные значения
Значения сравниваются символ за символом, пока не обнаружится несовпадение.
Какая строка имеет больший символ в этой позиции, та и считается "больше".
Если две строки одинаковы по всем символам более короткой строки, то более
длинная считается больше.
Символы сравниваются в соответствии с "последовательностью слияния"
компьютера, на котором работает ORACLE. Один символ больше другого, если он
находится после него в последовательности слияния.
Большинство компьютеров используют две последовательности слияния,
называемые ASCII (American Standard Code for Information Interchange) и
EBCDIC (Extended Binary Coded Decimal Interchange Code). Они
представлены на следующих страницах.
Замечание: ORACLE использует последовательность слияния своего компьютера.
Буквы верхнего и нижнего регистров не эквивалентны. В ASCII все буквы нижнего
регистра больше всех букв нижнего, для EBCDIC верно обратное.
В ASCII символьные литералы от '0' до '9' сортируются ниже алфавита, для
EBCDIC также верно обратное.
В следующих двух таблицах приводятся последовательности сортировки для ASCII и
EBCDIC.
Последовательность сортировки ASCII
Десятичное Десятичное
значение Символ значение Символ
----------------------------------------------Д
32 пробел 59 ;
33 ! 60 <
34 " 61 =
35 # 62 >
36 $ 63 ?
37 % 64 @
38 & 65-90 A-Z
39 ' 91 [
40 ( 92
41 ) 93 ]
42 * 94 ^
43 + 95 _
44 , 96 `
45 - 97-122 a-z
46 . 123 {
47 / 124 |
48-57 0-9 125 }
58 : 126 ~
----------------------------------------------Д
Последовательность сортировки EBCDIC
-- 41 --
Десятичное Десятичное
значение Символ значение Символ
----------------------------------------------Д
64 пробел 108 %
74 (цент) 109 _
75 . 110 >
76 < 111 ?
77 ( 122 :
78 + 123 #
79 | 124 @
80 & 125 '
90 ! 126 =
91 $ 127 "
92 * 129-137 a-i
93 ) 145-153 j-r
94 ; 162-169 s-z
95 ї 193-201 A-I
96 - 209-217 J-R
97 / 226-233 S-Z
107 , 240-249 0-9
----------------------------------------------Д
Сводка по типам данных
При создании таблицы Вы должны указать для каждого столбца тип данных,
который может в нем храниться. SQL распознает типы данных, приведенные в
следующей таблице. Если Вы введете неправильное значение, SQL выдаст
сообщение об ошибке и выполнит для этого оператора ROLLBACK.
В следующем списке обобщаются типы данных ORACLE. Полное описание для
каждого типа данных можно найти в предыдущих разделах.
Тип данных Описание
--------------------------------------------------
CHAR(size) Символьные данные переменной длины;
максимальный размер определяется значением size.
Абсолютный максимум 255, умолча- ние 1 символ.
CHARACTER То же, что и CHAR.
VARCHAR То же, что и CHAR, но Вы должны специфицировать
size. В будущих версиях ORACLE можно будет
определять CHAR - фикси- рованная длина, а
VARCHAR - переменная длина.
DATE Правильные даты в диапазоне от 1 января 4712
года до нашей эры до 31 декабря 4712 года
нашей эры. Умалчиваемая форма DD-MON-YY
('01-JAN-89').
LONG Символьные данные переменной длины до 65535
символов. В таблице можно определить только
один столбец такого типа.
LONG VARCHAR То же, что и LONG.
RAW(size) Необработанные двоичные данные длиной size
байтов. Size специфицировать обязательно.
Абсолютный максимум 255 байтов. Данные должны
вводиться в шестнадцатеричном представлении.
LONG RAW Необработанные двоичные данные в остальном
похожие на LONG. Данные должны вводиться в
шестнадцатеричном представлении.
-- 42 --
ROWID Значение, которое уникально идентифицирует
строку в табли- це. Этот тип данных выбирается с
помощью псевдостолбца ROWID и может быть
преобразован в тип CHAR с помощью функции
ROWIDTOCHAR. Вы не можете сами создавать в
таблице столбцы такого типа.
Сводка по числовым типам данных
Если Вы специфицировали Это запишется как ...
------------------------------------------------------------
Тип Точность Масштаб
NUMBER NUMBER 38 null
NUMBER(*) NUMBER 38 null
NUMBER(*,s) NUMBER 38 s
NUMBER(p) NUMBER p 0
NUMBER(p,s) NUMBER p s
DECIMAL NUMBER 38 0
DECIMAL(*) NUMBER 38 0
DECIMAL(*,s) NUMBER 38 s
DECIMAL(p) NUMBER p 0
DECIMAL(p,s) NUMBER p s
INTEGER NUMBER 38 0
SMALLINT NUMBER 38 0
FLOAT NUMBER 38 null
FLOAT(*) NUMBER 38 null
FLOAT(b) NUMBER b null
REAL NUMBER 63 null
binary (18 decimal)
DOUBLE PRECISION NUMBER 38 null
Диапазон "p" (десятичная точность) от 1 до 38. Диапазон "s" (масштаб) от -84
до 127. Диапазон "b" (двоичная точность) от 1 до 126.
DEC и NUMERIC являются синонимами для DECIMAL, а INT - для INTEGER.
Масштаб null подразумевает плавающую точку, а не-null - фиксированную точку.
За полным описанием взаимодействия точности и масштаба обратитесь к разделу
данной главы "Тип данных NUMBER".
Значения Null
Если в определенном столбце строки данные отсутствуют, говорят что его
значение null. Столбец с данными любого типа может содержать значение null,
если только он специально не описан как NOT NULL в момент создания.
Значение null обладает следующими свойствами:
* присваивается, когда действительное значение неизвестно или бессмысленно
-- 43 --
* не эквивалентно значению нуль
* будет превращать в null любое выражение. Например NULL умноженное на 10
дает NULL.
Для временного преобразования null в действительное значение используется
функция NVL. Например NVL(COMM,0) возвращает 0, если значение в столбце COMM
- null и действительное значение, если оно не null.
Большинство групповых функций игнорирует значения null. Например запрос,
вычисляющий среднее из пяти значений: 1000, NULL, NULL, NULL, 2000 возвратит
1500, так как (1000+2000)/2 =1500.
Напрямую со значениями null должны работать только операции сравнения (IS
NULL или IS NOT NULL). Если со значением null используется любой другой
оператор, результат всегда неизвестный. Так как NULL представляет собой
отсутствие данных, он не может быть равен или не равен любому другому
значению, кроме null.
ORACLE трактует условия, приводящие к неизвестному результату как FALSE.
Например, если условие COMM = NULL всегда неизвестно, оператор SELECT с этим
условием во фразе WHERE не будет возвращать ни одной строки. Заметьте, что в
такой ситуации ORACLE не возвращает сообщение об ошибке.
Следующая таблица показывает результаты сравнений со значением null:
Если А равно: Сравнение Результат
--------------------------------------------------------
10 A IS NULL FALSE
10 A IS NOT NULL TRUE
NULL A IS NULL TRUE
NULL A IS NOT NULL FALSE
10 A =NULL неизвестный
10 A !=NULL неизвестный
NULL A =NULL неизвестный
NULL A !=NULL неизвестный
Псевдостолбцы
Псевдостолбцы ведут себя аналогично столбцам таблицы, но реально в таблице не
хранятся. В то время как запросы могут обращаться к псевдостолбцам,
последние не могут быть добавлены, удалены или изменены.
В следующей таблице приводится описание псевдостолбцов:
Псевдостолбец Возвращаемое значение
----------------------------------------------------Д
sequence_name. Возвращает текущее значение
CURRVAL указанной последовательности. Должно быть специфицировано
sequence_name.
sequence_name. Возвращает следующее значение
NEXTVAL указанной последовательности. Должно быть специфицировано
sequence_name.
За полным описанием последовательностей обратитесь к оператору
CREATE SEQUENCE в Главе 5 данного руководства ("Справоч- ник
по SQL - операторам").
ROWID Возвращает ROWID для строки. За информацией о ROWID
обратитесь выше к разделу "Тип данных ROWID".
-- 44 --
ROWNUM Возвращает последовательный номер выдаваемой строки из таблицы
или объединения строк. Первая выбранная строка имеет ROWNUM
=1, вторая 2 и т.д. ROWNUM полезен главным образом для
ограничения числа строк, возвращаемых запросом (например -
WHERE ROWNUM < 10). Он может быть также использован для
назначения уникального значения каждой строке таблицы (UPDATE
table SET column =ROWNUM) ROWNUM назначается, когда строка
возвращается и не влияет на порядок, назначаемый фразой ORDER
BY (т.е. он назначает до упорядочения).
Заметьте, что фраза WHERE ROWNUM > любого положительного числа
- никогда не вернет строк. Это получается, потому что ROWNUM
назначается для порядкового номера выдаваемой строки.
Например, первой выдаваемой строке назначается ROWNUM = 1,
условие WHERE ROWNUM > 1 дает FALSE и строка не высвечивается.
Тогда вторая выбранная строка получит также ROWNUM = 1 и тоже
не выдастся и, следовательно, не выдастся ни одной строки.
LEVEL Используется во фразе CONNECT BY оператора SELECT; возвращает 1
для корневого узла, 2 для его ребенка и т.д. Корневой узел
определяется как наивысший узел в инвертированном дереве. Child
(ребенок) - любой не корневой узел. Parent (родитель) - любая
строка, имеющая child. Leaf (лист) - любая строка, не имеющая
child. Пример инвертированного дерева приведен на Рис. 3-2, а
замечания по использованию фразы LEVEL даются в Главе 6 этого
руководства в разделе "Фразы CONNECT BY и START WITH".
Ъ----------Дї
і root/ і Level I
Ъ--------Дґ parent Г--------Дї
і А----------ДЩ і
Ъ------Б----ї Ъ--ДБ------Дї
і parent/ і і parent/ і
і child і і child і II
АДВ------ДВДЩ АДВ------ДВДЩ
Ъ--------ДБДї Ъ--ДБ------Дї Ъ--------Б--ї ЪДБ--------Дї
і child/ і і parent/ і і child/ і і parent/ і
і leaf і і child Г--Дї і leaf і і child і III
А----------ДЩ А--ДВ------ДЩ і А----------ДЩ А----ДВ----ДЩ
і і і
Ъ------Б----ї Ъ----Б------ї Ъ----ДБ----Дї
і child/ і і child/ і і child/ і
і leaf і і leaf і і leaf і IV
А----------ДЩ А----------ДЩ А----------ДЩ
Рисунок 3-2 Иерархическое дерево
|