Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

УП СУБД ч1

.pdf
Скачиваний:
14
Добавлен:
11.06.2015
Размер:
1.05 Mб
Скачать

CUSTOMER_NAME

ROWID

ROWNUM

Mr.Pundleberry

AAADy8AAEAAAADUAAA

1

Mr.O’Raily

AAADy8AAEAAAADUAAB

2

Ms.Magpie

AAADy8AAEAAAADUAAC

3

Ms.Magpie

AAADy8AAEAAAADUAAD

4

Mr.Pundleberry

AAADy8AAEAAAADYAAA

5

Ms.Magpie

AAADy8AAEAAAADYAAB

6

Mr.O’Raily

AAADy8AAEAAAADYAAC

7

Рис. 6.11. Значение запроса 6.11

Поле ROWNUM содержит номер записи в результирующем множестве запроса (см. следующий раздел). Следует иметь в виду, что это значение формируется при вычислении запроса и никак не связано с хранением записи в базе данных. Это поле можно использовать, например, для того чтобы ограничить количество выдаваемых на экран строк, как в запросе 6.12:

SELECT customer_name,item FROM acceptedorders

WHERE rownum < 5

(6.12)

 

 

 

 

 

CUSTOMER_NAME

ITEM

 

 

Mr.Pundleberry

Book

 

 

Mr.O’Raily

DVD Disk

 

 

Ms.Magpie

Pizza

 

 

Ms.Magpie

PS3

 

Рис. 6.12. Значение запроса 6.12

6.4. Значение SQL-запроса

Теперь более точно объясним, что такое значение SQLзапроса. Значение запроса можно определить с двух точек зрения – с формальной и с неформальной. Формальным значением запроса всегда является таблица (возможно пустая), структура и содержание которой определяется в соответствии с семантикой языка SQL. Неформальное значение описывает смысл запроса с точки зрения предметной области. Сформулируем правило вычисления формального значения SQL-запросов при извлечении данных из одной таблицы.

61

1.Выполнение проверки каждой строки исходной таблицы на соответствие логическому условию конструкции WHERE, если оно указано.

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

3.Удаление дубликатов из результирующего множества, если используется DISTINCT.

4.Упорядочивание строк в результирующем множестве

всоответствии с выражениями конструкции ORDER BY. Рассмотрим два примера.

1.SELECT ‘Покупатель‘, customer_name, ‘ из ‘,

customer_address, ‘ заказал ‘, item

 

(6.13)

FROM acceptedorders;

 

 

 

 

 

 

 

 

‘ПОКУПАТЕЛЬ’

CUSTOMER_NAME

‘ИЗ’

CUSTOMER_ADDRESS

‘ЗАКАЗАЛ’

ITEM

Покупатель

Mr.Pundleberry

из

Green str. 2

заказал

Watch

Покупатель

Ms.Magpie

из

Pall Mall, 3

заказал

Book

Покупатель

Ms.Magpie

из

Pall Mall, 3

заказал

Pizza

Покупатель

Ms.Magpie

из

Pall Mall, 3

заказал

PS3

Покупатель

Mr.O’Raily

из

Docks

заказал

Pizza

Покупатель

Mr.Pundleberry

из

Green str. 2

заказал

Book

Покупатель

Mr.O’Raily

из

Docks

заказал

DVD Disk

Рис. 6.13. Значение запроса 6.13

2. SELECT ‘Покупатель‘ || customer_name || ‘ из ‘ ||

customer_address ||

‘ заказал ‘ || item

FROM acceptedorders;

(6.14)

‘ПОКУПАТЕЛЬ’||CUSTOMER_NAME||’ИЗ’||CUSTOMER_ADDRESS||’ЗАКАЗАЛ’||ITEM

Покупатель Mr.Pundleberry из Green str. 2 заказал Watch

Покупатель Ms.Magpie из Pall Mall, 3 заказал Book

Покупатель Ms.Magpie из Pall Mall, 3 заказал Pizza

Покупатель Ms.Magpie из Pall Mall, 3 заказал PS3

Покупатель Mr.O’Raily из Docks заказал Pizza

Покупатель Mr.Pundleberry из Green str. 2 заказал Book

Покупатель Mr.O’Raily из Docks заказал DVD Disk

Рис. 6.14. Значение запроса 6.14

62

Несмотря на внешнюю схожесть, результирующее множество запроса 6.13 состоит из шести колонок, тогда как запрос 6.14 – из одной.

Выводы

текст на языке SQL состоит из команд языка и комментариев;

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

SQLтаблица – множество записей или строк; все строки в таблице имеют одинаковую структуру, которая определяется при создании таблицы; для создания таблицы используется команда CREATE TABLE;

наиболее распространенные типы полей таблиц – числа, строки и даты;

для просмотра структуры таблицы используется команда DESCR;

структура простейшего запроса – SELECT <список выражений > FROM <имя таблицы>

значением SELECT-запроса является выборка (результирующее множество), имеющая структуру таблицы;

функция COUNT(*) используется для определения количества записей в таблице;

конструкция WHERE используется для селекции данных при помощи логического условия;

для изменения имени столбца в результирующем множестве используется конструкция AS;

для упорядочивания результирующего множества используется конструкция ORDER BY;

для удаления дубликатов из результирующего множества используется конструкция DISTINCT.

Вопросы для контроля

1. Каким образом записываются комментарии в языке SQL?

63

2.Перечислите имена известных типов данных в языке

SQL.

3.Как определить количество записей и имена полей в SQL-таблицы?

4.Сформулируйте правила вычисления значения SELECT-запроса.

5.Объясните, сколько колонок будет в результирующем множестве некоторого SELECT-выражения.

6.Что такое «формальные» и «неформальные» значения некоторого SELECT-запроса?

64

Раздел 7. Язык Oracle SQL. Встроенные функции

ипреобразования типов

Вданном разделе описаны наиболее распространенные встроенные функции языка SQL Oracle и способы их практического использования, рассмотрены вопросы, связанные

спреобразованием типов, а также с использованием оператора CASE.

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

К математическим функциям относятся алгебраические (SQRT, POWER), тригонометрические (SIN, COS и т.д.), логарифмические функции (LOG, LN), а также функции округления (FLOOR, CEIL, ROUND, TRUNC). Подробный список существующих в системе ORACLE функций приводится в документации. Запрос 3.1. иллюстрирует использование математических функций в SQL-запросе:

SELECT TRUNC( LN( 10 ), 12), FLOOR( 23.45 ),

CEIL( 23.45 ) FROM dual;

(7.1)

 

 

 

 

TRUNC(LN(10),12)

FLOOR(23.45)

CEIL(23.45)

 

2.302585092994

23

24

 

Рис. 7.1. Значение запроса 7.1

В запросе 7.1. имя DUAL – это специальное имя, которое используется в соответствии с синтаксисом языка SQL в системе ORACLE вместо имени реальной таблицы для вызова функций. Функция TRUNC используется для отбрасывания от десятичной дроби значения разрядов, в данном случае – начиная с двенадцатого, CEIL – округление до ближайшего большего целого.

Строковые функции предназначены главным образом для преобразования строковых значений. Изучение и ис-

65

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

 

Таблица 3

 

Строковые функции

 

 

LPAD

Добавление к строке нескольких символов слева

 

 

RPAD

Добавление к строке нескольких символов справа

 

 

LTRIM

Удаление у строки незначащих символов слева

 

 

RTRIM

Удаление у строки незначащих символов справа

 

 

UPPER

Преобразование символов строки в верхний регистр

 

 

LOWER

Преобразование символов строки в нижний регистр

 

 

INITCAP

Преобразование первых символов слов строки

 

в верхний регистр

 

 

REPLACE

Замена в строке одного набора символов (подстроки)

 

на другую строку

 

 

SUBSTR

Выделение из строки подстроки

 

 

INSTR

Поиск подстроки в строке

 

 

LENGTH

Вычисление длины строки (в количестве символов)

 

 

Строковые функции корректно работают со строковыми значениями национальных алфавитов.

Ниже приведены запросы, иллюстрирующие использование строковых функций. Запрос 7.2. иллюстрирует добавление символов «*» к строке слева или справа, чтобы общая длина получившейся строки стала 25 символов; эта функция удобна для выравнивания колонок текста в текс­ товых отчетах.

SELECT customer_name,

LPAD( customer_name, 25, ‘*‘ ) «LPAD», RPAD( customer_name, 25, ‘*‘ ) «RPAD»

FROM acceptedorders;

(7.2)

 

 

 

CUSTOMER_NAME

LPAD

RPAD

Mr.Pundleberry

*****Mr.Pundleberry

Mr.Pundleberry *****

Ms.Magpie

*****Ms.Magpie

Ms.Magpie *****

Рис. 7.2. Значение запроса 7.2

66

В запросе 7.3 используется обратное действие – отсечение незначащих символов от строки слева или справа (сначала к исходным значениям полей искусственно добавляется строка ‹!!!!!!› ).

SELECT customer_name,

LTRIM( ‘!!!!!!’ || customer_name, ‘!’ ) “LTRIM”,

RTRIM( customer_name || ‘!!!!’, ‘!’ ) “RTRIM”

FROM acceptedorders;

(7.3)

 

 

 

CUSTOMER_NAME

LTRIM

RTRIM

Mr.Pundleberry

Mr.Pundleberry

Mr.Pundleberry

Ms.Magpie

Ms.Magpie

Ms.Magpie

Ms.Magpie

Ms.Magpie

Ms.Magpie

Ms.Magpie

Ms.Magpie

Ms.Magpie

Mr.O’Raily

Mr.O’Raily

Mr.O’Raily

Mr.Pundleberry

Mr.Pundleberry

Mr.Pundleberry

Mr.O’Raily

Mr.O’Raily

Mr.O’Raily

Рис. 7.3. Значение запроса 7.3

В запросе 7.4. производится преобразование строковых значений в верхний и нижний регистры и замена первых букв слов на заглавные.

SELECT customer_name, UPPER( customer_name ) «UPPER», LOWER( customer_name ) «LOWER»,

INITCAP( LOWER( customer_name )) «INITCAP»

FROM acceptedorders;

 

(7.4)

 

 

 

 

CUSTOMER_NAME

UPPER

LOWER

INITCAP

Mr.Pundleberry

MR.PUNDLEBERRY

mr.pundleberry

Mr.Pundleberry

Mr.Pundleberry

MR.PUNDLEBERRY

mr.pundleberry

Mr.Pundleberry

Mr.O’Raily

MR.O’RAILY

mr.o’raily

Mr.O’Raily

Ms.Magpie

MS.MAGPIE

ms.magpie

Ms.Magpie

Ms.Magpie

MS.MAGPIE

ms.magpie

Ms.Magpie

Ms.Magpie

MS.MAGPIE

ms.magpie

Ms.Magpie

Mr.O’Raily

MR.O’RAILY

mr.o’raily

Mr.O’Raily

Рис. 7.4. Значение запроса 7.4

67

В запросе 7.5. выполняется замена подстроки ‘Ms’ на строку ‘Miss’, выделение подстроки из строки, начиная с четвертого символа от начала, а также вычисление длин строк.

SELECT customer_name,

REPLACE( customer_name, ‘Ms’, ‘Miss’) «REPLACE», SUBSTR( customer_name, 4 ) «SUBSTR»», LENGTH( RTRIM( customer_name )) «LENGTH»

FROM acceptedorders;

 

(7.5)

 

 

 

 

CUSTOMER_NAME

REPLACE

SUBSTR

LENGTH

Mr.PundleBerry

Mr.PundleBerry

PundleBerry

14

Mr.PundleBerry

Mr.PundleBerry

PundleBerry

14

Mr.O’Raily

Mr.O’Raily

O’Raily

10

Ms.Magpie

Miss.Magpie

Magpie

9

Ms.Magpie

Miss.Magpie

Magpie

9

Ms.Magpie

Miss.Magpie

Magpie

9

Mr.O’Raily

Mr.O’Raily

O’Raily

10

Рис. 7.5. Значение запроса 7.5

Функция INSTR используется для поиска подстроки в строке, значение функции – позиция, с которой начинается подстрока, или 0, если подстрока не найдена. Следующий запрос выводит значение самого поля customer_name и позицию, с которой начинается указанная подстрока. По результату видно, в каких строках в данном поле подстрока встречается, а где отсутствует.

SELECT customer_name, INSTR( customer_name, ‘Raily‘)

FROM acceptedorders

(7.6)

 

 

 

CUSTOMER_NAME

 

INSTR(CUSTOMER_NAME,’RAILY’)

Mr.Pundleberry

 

0

Mr.O’Raily

 

6

Ms.Magpie

 

0

Ms.Magpie

 

0

Mr.Pundleberry

 

0

Ms.Magpie

 

0

Mr.O’Raily

 

6

Рис. 7.6. Значение запроса 7.6

68

Запросы подобного вида, когда выводится одновременно и исходное значение, и значение вычисленной функции, в особенности удобны на начальном этапе освоения языка SQL и встроенных функций, когда может быть не вполне очевидно, что же в действительности вычисляет используемая функция.

Большое значение имеет работа со значениями-датами и с функциями работы с датами. Значения-даты записываются в литеральном представлении, как и строковые значения, при помощи ограничивающих одиночных кавычек. С этими значениями можно выполнять некоторые дополнительные действия, в частности добавлять и вычитать числа, что интерпретируется как переход к следующей или предыдущей дате. Поскольку значения-даты могут записываться в разных форматах, обычно функции, получающие такие значения, как параметр, используют специальные строки, определяющие использованный формат записи даты. Для полного описания всех функций работы с датами следует обратиться к документации. В данном издании приводятся примеры использования наиболее типичных способов использования значений-дат.

Системная функция SYSDATE, употребляемая без параметров и без скобок, возвращает текущую дату, т.е. дату вызова этой функции. Следущий запрос иллюстрирует инкрементирование значения-даты; значение инкремента интерпретируется как количество дней.

SELECT SYSDATE, SYSDATE + 1, SYSDATE + 0.1, SYSDATE - 1, SYSDATE + 30, SYSDATE + 300

FROM DUAL;

 

 

(7.7)

 

 

 

 

 

 

SYSDATE

SYSDATE+1

SYSDATE+0.1

SYSDATE-1

SYSDATE+30

SYSDATE+300

29-JUL-08

30-JUL-08

29-JUL-08

28-JUL-08

28-AUG-08

25-MAY-09

Рис. 7.7. Значение запроса 7.7

Функции TRUNC и ROUND выполняют округление арифметических значений; применительно к значениям-датам эти функции используются для получения даты первого или последнего дня месяца или года. В запросе 3.7 определяются первые дни текущего и будущего года, первые дни текущего

69

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

SELECT SYSDATE “TODAY”,

TRUNC( SYSDATE, ‘YEAR’ ) «YEAR»,

ROUND( SYSDATE, ‘YEAR’ ) «YEAR», TRUNC( SYSDATE, ‘MONTH’ ) «MONTH», ROUND( SYSDATE, ‘MONTH’ ) «MONTH»,

 

TRUNC( SYSDATE, ‘DDD’ ) «DDD»,

 

(7.8)

 

ROUND( SYSDATE, ‘DDD’ ) «DDD» FROM DUAL;

 

 

 

 

 

 

TODAY

YEAR

YEAR

MONTH MONTH

DDD

DDD

29-JUL-08 01-JAN-08 01-JAN-09 01-JUL-08 01-AUG-08 29-JUL-08 30-JUL-08

Рис. 7.8. Значение запроса 7.8

В таблице 4 приводятся наиболее распространенные форматы.

Таблица 4

 

Форматы дат

 

 

YYYY

Номер года из четырех знаков

YY

Номер года (последние две цифры)

Year

Запись номера года словами (по-английски)

MM

Номер месяца

Month

Название месяца (использует национальные настройки)

Mon

Первые три буквы названия месяца

Q

Номер квартала

DDD

Номер дня от начала года

DD

Номер дня от начала месяца

D

Номер дня недели

Day

Название дня недели (использует национальные настройки)

HH

Номер часа в 12-часовом формате

HH24

Номер часа в 24-часовом формате

MI

Минуты (от начала часа)

SS

Секунды (от начала минуты)

Функция LAST_DAY удобна для определения последнего дня месяца:

70