Курс лекций "Базы данных и субд" Ульянов В. С. Лекция Язык sql. Однострочные функции
Вид материала | Курс лекций |
СодержаниеМодель формата |
- Курс лекций "Базы данных и субд" Ульянов В. С. Лекция Язык sql. Выборка данных, 168.86kb.
- Курс лекций "Базы данных и субд" Ульянов В. С. Лекция Язык sql. Создание таблиц и ограничений, 146.46kb.
- Курс лекций "Базы данных и субд" Ульянов В. С. Лекция. Манипулирование реляционными, 276.31kb.
- Курс лекций "Базы данных и субд" Логинова С. А. Лекция 13. Язык sql. Команды dml. Команды, 133.93kb.
- Лекция №1: Стандарты языка sql, 1420.56kb.
- Курс лекций "Базы данных и субд" Ульянов В. С. Лекция. Целостная часть реляционной, 213.79kb.
- Отчёт по курсовой работе на тему «Лабораторный практикум по изучению языка структурированных, 1960.59kb.
- Курс 2778. Создание запросов на языке Microsoft sql server 2005 Transact-sql. Курс, 16.57kb.
- Курс, 1 поток, 5-й семестр лекции (34 часа), экзамен, 52.85kb.
- Сервер баз данных, 379.17kb.
Курс лекций “Базы данных и СУБД” Ульянов В.С.
Лекция 4. Язык SQL. Однострочные функции.
Функции
Функция аналогична оператору в том, что она манипулирует элементами данных и возвращает результат. Функции отличаются от операторов форматом, в котором они задаются со своими аргументами. Этот формат позволяет функциям оперировать на нуле, одном, двух или большем количестве аргументов:
function(argument, argument, ...)
Функции могут использоваться для выполнения расчетов с данными, преобразования типов данных, изменения форматов вывода дат и т.д. Функции SQL бывают двух основных типов:
- однострочные (или скалярные) функции
- групповые (или агрегатные) функции
Эти функции различаются количеством строк, на которых они оперируют. Однострочная функция возвращает единственное значение для каждой строки таблицы, в то время как групповая функция возвращает единственное значение для целой группы строк. Групповые функции будут рассмотрены в следующих лекциях.
Однострочные функции
Однострочные функции могут появляться в предложениях SELECT, WHERE и ORDER BY команды SELECT. В качестве аргументов они могут принимать константы, заданные пользователем, значения переменных, имена столбцов таблицы БД или выражения, составленные с помощью операторов и функций. Все однострочные функции, как правило, разбивают на несколько групп по типам данных их аргументов и возвращаемых значений. Выделяют:
- числовые функции,
- символьные функции,
- функции для работы с датами,
- функции преобразования.
Числовые функции
Числовые функции принимают в качестве аргументов и возвращают в качестве результата числовые значения. В следующей таблице приведены некоторые из числовых функций:
Функция | Описание |
ABS(n) | Возвращает абсолютную величину n. |
MOD(m, n) | Возвращает остаток от деления m на n. Если n=0, возвращает m. |
POWER(m, n) | Возвращает m в степени n. Основание m и степень n могут быть любыми числами, но если m отрицательно, то n должно быть целым. |
ROUND(m[, n]) | Возвращает m, округленное до n позиций после десятичной точки; если n опущено, то до целого, если n отрицательно, округляется целая часть числа. n должно быть целым. |
SQRT (n) | Возвращает квадратный корень из n. n должно быть неотрицательным. |
TRUNC(m[, n]) | Возвращает m, усеченное до n цифр после десятичной точки. Если n опущено, усечение выполняется до целого. n может быть отрицательным, что приводит к усечению (обнулению) n цифр слева от десятичной точки. |
Примеры использования числовых функций
В примерах используется фиктивная таблица СУБД Oracle DUAL. Эта таблица принадлежит пользователю SYS и доступна всем пользователям. Она содержит один столбец с именем DUMMY и одну строку со значением X. Таблица DUAL полезна в случае, если требуется получить результат действия какой-либо однострочной функции, вызванной с аргументами, не связанными с данными БД.
Пример: Найти квадратный корень из 10.
SELECT SQRT(10)
FROM s_dept;
Результат:
SQRT(10)
---------
3,1622777
3,1622777
3,1622777
3,1622777
3,1622777
3,1622777
3,1622777
…
12 rows selected.
-- Мы получили 12 значений, так как в таблице s_dept 12 строк. Но так как -- вычисляемое значение никак не связано с данными таблицами, то все эти 12 -- значений одинаковы. Чтобы избежать подобных излишеств, и предназначена -- таблица DUAL:
SELECT SQRT(10)
FROM dual;
Результат:
SQRT(10)
---------
3,1622777
Пример использования ABS: Найти модуль чисел –13, 0 и 13.
SELECT ABS(-13), ABS(0), ABS(13)
FROM dual;
Результат:
ABS(-13) ABS(0) ABS(13)
-------- -------- --------
13 0 13
Пример использования MOD: Найти остаток от деления 18763298 на 813.
SELECT MOD(18763298, 813)
FROM dual;
Результат:
MOD(18763298,813)
-----------------
71
Пример использования ROUND: Округление числа 268,57 с различными значениями аргумента n.
SELECT ROUND(268.57, 5), ROUND(268.57, 1), ROUND(268.57),
ROUND(268.57, -2), ROUND(268.57, -3)
FROM dual;
Результат:
ROUND(268.57,5) ROUND(268.57,1) ROUND(268.57) ROUND(268.57,-2) ROUND(268.57,-3)
-------------- -------------- ------------ --------------- ---------------
268,57 268,6 269 300 0
Пример использования TRUNC: Усечение числа 268,57 с различными значениями аргумента n.
SELECT TRUNC(268.57, 5), TRUNC(268.57, 1), TRUNC(268.57),
TRUNC(268.57, -2), TRUNC(268.57, -3)
FROM dual;
Результат:
TRUNC(268.57,5) TRUNC(268.57,1) TRUNC(268.57) TRUNC(268.57,-2) TRUNC(268.57,-3)
--------------- --------------- ------------- ---------------- ----------------
268,57 268,5 268 200 0
Пример использования однострочной функции в предложении WHERE: Вывести фамилии и зарплаты служащих для всех служащих, у кого зарплата делится нацело на 100.
SELECT last_name, salary
FROM s_emp
WHERE MOD(salary,100)=0;
Результат:
LAST_NAME SALARY
---------------- ---------
Velasquez 2500
Nagayama 1400
Urguhart 1200
Biri 1100
Catchpole 1300
Magee 1400
Maduro 1400
Nozaki 1200
Chang 800
Schwartz 1100
10 rows selected.
Пример использования однострочной функции в предложении ORDER BY: Вывести фамилии и зарплаты служащих для всех служащих. Результат отсортировать по остатку от деления зарплаты на 100.
SELECT last_name, salary
FROM s_emp
ORDER BY MOD(salary,100);
Результат:
LAST_NAME SALARY
-------------- ---------
Velasquez 2500
Nagayama 1400
Biri 1100
Magee 1400
Maduro 1400
Chang 800
Schwartz 1100
Nozaki 1200
Catchpole 1300
Urguhart 1200
Havel 1307
Sedeghi 1515
Nguyen 1525
Smith 940
Ngao 1450
Menchu 1250
Quick-To-See 1450
Markarian 850
Newman 750
Dumas 1450
Ropeburn 1550
…
25 rows selected.
Символьные функции
Символьные функции оперируют на строковых значениях. В следующей таблице приведены некоторые из символьных функций:
Функция | Описание |
ASCII(char) | Возвращает ASCII-код первого символа строки char в наборе символов базы данных. |
CHR(n) | Возвращает символ, имеющий двоичный код n в наборе символов базы данных. |
CONCAT(char1, char2) | Возвращает строку char1, сцепленную со строкой char2. Эта функция эквивалентна оператору конкатенации (||). |
INITCAP(char) | Возвращает строку char, каждое слово которой начинается с прописной буквы, а остальные буквы строчные. |
INSTR(char1, char2[, n[,m]]) | Просматривает строку char1, начиная с ее n-го символа, отыскивает m-е вхождение подстроки char2, и возвращает позицию первого символа в этом вхождении относительно начала строки char1. Если n отрицательно, то Oracle отсчитывает и просматривает в обратном направлении, начиная с конца строки char1. Значение m должно быть положительным. По умолчанию оба значения m и n равны 1, т.е. Oracle отыскивает первое вхождение подстроки char2, начиная поиск с первого символа char1. Возвращаемое значение всегда вычислено относительно начала строки char1, независимо от значения n, и выражено в символах. Если поиск безуспешен (т.е. если подстрока char2 не встречается m раз после n-го символа строки char1), то возвращается 0. |
LENGTH(char) | Возвращает длину строки char в символах. Если char имеет тип данных CHAR, то эта длина включает все хвостовые пробелы. Если строка char пуста, то возвращается NULL. |
LOWER(char)/ UPPER(char) | Возвращает строку char, все буквы которой строчные/прописные. |
LPAD(char1, n[, char2])/ RPAD(char1, n[, char2]) | Возвращает строку char, дополненную слева/справа до n символов цепочками символов char2. Если char2 опущено, подразумевается пробел. Если char1 длиннее, чем n, то возвращаются первые n символов строки char1. |
SUBSTR(char, m[, n]) | Возвращает часть строки char, начиная с символа с номером m и длиной n символов. Если m положительно, Oracle отсчитывает символы от начала строки char, если m отрицательно - от конца строки char. Значение m не может быть нулевым. Если n опущено, возвращаемая часть строки продолжается до конца char. Значение n не может быть меньше 1. |
Примеры использования символьных функций
Пример использования LOWER, UPPER, INITCAP:
SELECT UPPER(last_name), LOWER(first_name), INITCAP(title)
FROM s_emp;
Результат:
UPPER(LAST_NAME) LOWER(FIRST_NAME) INITCAP(TITLE)
---------------- -------------- -------------------------
VELASQUEZ carmen President
NGAO ladoris Vp, Operations
NAGAYAMA midori Vp, Sales
QUICK-TO-SEE mark Vp, Finance
ROPEBURN audry Vp, Administration
URGUHART molly Warehouse Manager
…
25 rows selected.
Пример использования CONCAT: Для каждого служащего вывести его фамилию и имя через пробел в одном столбце с названием ‘employee’.
SELECT CONCAT(CONCAT(first_name,’ ‘), last_name) employee
FROM s_emp;
Результат:
EMPLOYEE
----------------------
Carmen Velasquez
LaDoris Ngao
Midori Nagayama
Mark Quick-To-See
Audry Ropeburn
Molly Urguhart
Roberta Menchu
Ben Biri
…
25 rows selected.
Пример использования LENGTH: Вывести названия отделов, в которых больше 10 символов:
SELECT name
FROM s_dept
WHERE LENGTH(name)>10;
Результат:
NAME
----------------
Administration
Пример использования LPAD, RPAD:
SELECT LPAD('table', 15, '!?'), RPAD('table', 15, '!?'),
LPAD('table', 3, '!?'), RPAD('table', 3, '!?')
FROM dual;
Результат:
LPAD('TABLE',15 RPAD('TABLE',15 LPA RPA
--------------- --------------- --- ---
!?!?!?!?!?table table!?!?!?!?!? tab tab
Пример использования INSTR:
SELECT INSTR('CORPORATE FLOOR', 'OR', 3, 2) "Instring",
INSTR('CORPORATE FLOOR', 'OR', -3, 2) "Reversed Instring"
FROM dual;
Результат:
Instring Reversed Instring
--------- -----------------
14 2
Функции для работы с датами
Даты в базе данных хранятся во внутреннем формате, где представлена следующая информация: столетие, год, месяц, день, часы, минуты, секунды.
С датами можно производить такие арифметические операции, как сложение и вычитание. При этом прибавлять и вычитать можно не только даты, но и числовые константы:
Операция | Результат | Описание |
дата + число | Дата | Прибавление количества дней к дате. |
дата - число | Дата | Вычитание количества дней из даты. |
дата - дата | Число | Вычитание одной даты из другой, результат – количество дней между датами. |
дата + число/24 | Дата | Прибавление часов к дате. |
Функции для работы с датами оперируют на значениях типа DATE. Все функции дат возвращают значения типа DATE, кроме функции MONTHS_BETWEEN, которая возвращает целое значение. В следующей таблице приведены некоторые из функций для работы с датами:
Функция | Описание |
ADD_MONTHS(дата, n) | Возвращает заданную дату, увеличенную на n месяцев. Аргумент n может быть любым целым числом. Если заданная дата попадает на последний день месяца, или если результирующий месяц имеет меньше дней, чем компонента дня заданной даты, то результирующий день будет последним днем результирующего месяца. В противном случае результирующий день остается таким же, как компонента дня заданной даты. |
LAST_DAY(дата) | Возвращает дату последнего дня месяца, содержащего указанную дату. |
MONTHS_BETWEEN (дата1, дата2) | Возвращает количество месяцев между датой1 и датой2. Если дата1 - более поздняя дата, чем дата2, то результат положителен; в противном случае – отрицателен. Если дата1 и дата2 попадают на одинаковые дни своих месяцев или на последние дни своих месяцев, то результат будет целым числом; в противном случае Oracle вычисляет дробную часть результата. |
NEXT_DAY(дата, символ) | Возвращает дату первого дня недели, имеющего имя символ и следующего за заданной датой. Аргумент символ может задавать порядковый номер или название дня недели. |
ROUND(дата[, fmt]) | Возвращает заданную дату, округленную к единицам, заданным моделью формата fmt. Если fmt опущена, то дата округляется до ближайшего дня на момент полуночи. |
SYSDATE | Возвращает текущие дату и время, не требует аргументов. |
TRUNC(дата[, fmt]) | Возвращает заданную дату, в которой порция времени усечена к единицам, заданным моделью формата fmt. Если fmt опущена, то дата округляется до ближайшего дня на момент полуночи. |
Описание моделей формата дат будет приведено далее в этой же лекции.
Примеры использования функций для работы с датами
Пример использования SYSDATE: Получить сегодняшнюю дату:
SELECT SYSDATE
FROM dual;
Результат:
SYSDATE
--------
06.10.03
В дальнейших примерах считать, что сегодняшняя дата: 06 октября 2003 года.
Пример использования арифметических операторов: Узнать, какое число было 10 дней назад и будет через 18 дней:
SELECT SYSDATE-10, SYSDATE+18
FROM dual;
Результат:
SYSDATE-10 SYSDATE+18
-------- --------
26.09.03 24.10.03
Пример использования ADD_MONTHS: Узнать, какое число будет через 9 месяцев:
SELECT ADD_MONTHS(SYSDATE, 9)
FROM dual;
Результат:
ADD_MONT
--------
06.07.04
Пример использования LAST_DAY: Какой день является последним днем текущего месяца и февраля 2005 года:
SELECT LAST_DAY(SYSDATE), LAST_DAY('01-02-2005')
FROM dual;
Результат:
LAST_DAY LAST_DAY
-------- --------
31.10.03 28.02.05
Пример использования MONTHS_BETWEEN: Сколько месяцев между текущим месяцем, 1 январем 2003 года, 6 январем 2004 года и 6 октябрем 2005 года:
SELECT MONTHS_BETWEEN(SYSDATE,'01-01-2003') one,
MONTHS_BETWEEN(SYSDATE,'06-01-2004') two,
MONTHS_BETWEEN(SYSDATE,'06-10-2005') three
FROM dual;
Результат:
ONE TWO THREE
--------- --------- ---------
9,1821658 -3 -24
Пример использования NEXT_DAY: На какой день приходится ближайший понедельник после сегодняшней даты:
SELECT NEXT_DAY(SYSDATE,1) one,
NEXT_DAY(SYSDATE,'mon') two,
NEXT_DAY(SYSDATE,'monday') three
FROM dual;
Результат:
ONE TWO THREE
-------- -------- --------
13.10.03 13.10.03 13.10.03
-- День недели можно задать с помощью любой из моделей формата даты,
-- возвращающей день недели (см. далее таблицу моделей форматов). В данном -- примере в первом столбце день недели задается с помощью модели d, во -- втором – DY, в третьем – DAY. Обратите внимание, если Вы задаете день -- недели с помощью модели d, Вы должны знать, с какого дня производится -- нумерация дней недели Вашим сервером. Нумерация может производиться с -- понедельника (русская версия) или с воскресенья (американская версия).
Пример использования ROUND:
SELECT ROUND(to_date('27-09-2003','dd-mm-yyyy'),'year'),
ROUND(to_date('27-09-2003','dd-mm-yyyy'),'month'),
ROUND(to_date('27-09-2003','dd-mm-yyyy'),'day')
FROM dual;
Результат:
ROUND(TO ROUND(TO ROUND(TO
-------- -------- --------
01.01.04 01.10.03 28.09.03
-- Об использовании функции to_date будет рассказано далее в этой же лекции.
Пример использования TRUNC:
SELECT TRUNC(to_date('27-09-2003','dd-mm-yyyy'),'year'),
TRUNC(to_date('27-09-2003','dd-mm-yyyy'),'month'),
TRUNC(to_date('27-09-2003','dd-mm-yyyy'),'day')
FROM dual;
Результат:
TRUNC(TO TRUNC(TO TRUNC(TO
-------- -------- --------
01.01.03 01.09.03 22.09.03
-- Об использовании функции to_date будет рассказано далее в этой же лекции.
Функции преобразования
Функции преобразования преобразуют значения из одного типа данных в другой. В следующей таблице приведены некоторые из функций преобразования:
Функция | Описание |
TO_CHAR(число|дата[, fmt]) | Преобразует число или дату в символьную строку VARCHAR2 с моделью формата fmt. |
TO_NUMBER(char) | Преобразует строку символов char содержащую цифры, в число. |
TO_DATE(char[, fmt]) | Преобразует строку символов char с датой в значение типа DATE в соответствии с заданной моделью fmt. |
Модели формата
Модель формата – это символьный литерал, который описывает формат значения типа DATE или NUMBER, представленного в символьном виде и хранящегося в строке символов. Модель формата в любом случае заключается в апострофы. Вы можете использовать модель формата, чтобы указать, в каком формате Oracle должен возвратить вам значение из базы данных или в каком формате Вы предоставляете значение для помещения его в базу данных. Например, Вы можете пожелать, чтобы дата при выборке выводилась в виде: “13 October of 2003” или “2003, October, 13”. Заметьте, что модель формата не изменяет внутреннего представления значения в базе данных.
Модели формата даты и времени
Модель формата | Описание |
SCC или CC | Столетие. “S” означает, что даты до н.э. получают префикс “-”. |
YYYY или SYYYY | Год четырьмя цифрами. ”S” означает, что даты до н.э. получают префикс “-”. |
YYY или YY или Y | Последние 3, 2 или 1 цифра года. |
Y,YYY | Год с запятой в указанной позиции. |
SYEAR или YEAR | Год словами. “S” означает, что годы до н.э. получают префикс “-”. |
BC или AD | Индикатор “до н.э./н.э.”. |
B.C. или A.D. | Индикатор “до н.э./н.э.” с точками. |
Q | Квартал. |
ММ | Месяц в виде двузначного числа. |
MONTH | Название месяца, дополненное конечными пробелами до 9 символов. |
MON | Трехбуквенное сокращение название месяца. |
RM | Номер месяца римскими цифрами. |
WW или W | Неделя года или месяца. |
DDD или DD или D | День года, месяца или недели. |
DAY | Название дня недели, дополненное конечными пробелами до 9 символов. |
DY | Трехбуквенное сокращение название дня недели. |
AM или PM | Индикатор “до полудня/после полудня”. |
A.M. или P.M. | Индикатор “до полудня/после полудня ” с точками. |
HH или HH12 или HH24 | Время суток, час в 12-часовом диапазоне или час в 24-часовом диапазоне. |
MI | Минуты (0-59). |
SS | Секунды (0-59). |
SSSSS | Количество секунд после полуночи (0-86399.) |
При выводе дат словами надо учитывать, что слова будут выводиться в том же регистре, что и модель формата. Например, если Вы укажете модель формата ‘Month’, то название месяца будет выводиться как ‘October’, если Вы укажете ‘month’, то – ‘october’, если Вы укажете ‘MONTH’, то – ‘OCTOBER’.
Модели формата числа
В примерах приведен результат запроса: SELECT TO_CHAR(-1234.567, ‘fmt’) FROM dual;
Модель формата | Описание | Пример | Результат |
9 | Числовая позиция (число девяток определяет ширину поля вывода) | 999999 999 | -1235 #### |
0 | Вывод ведущих нулей | 099999 | -001235 |
$ | Плавающий знак доллара | $999999 | -$1235 |
L | Плавающий знак местной валюты | L999999 | -F1234 |
. | Задает наличие в данной позиции десятичной точки | 999999.99 999999.9999 | -1234.57 -1234.5670 |
, | Ставит запятую в заданной позиции | 999,999 | -1,235 |
MI | Знак минус справа (для отрицательных значений) | 999999MI | 1235- |
PR | Заключение отрицательных значений в скобки | 999999PR | <1235> |
EEEE | Научный формат (должен быть задан четырьмя символами ‘E’) | 99.999EEEE | -1.235E+03 |
V | Умножить на 10 n раз (n = число символов “9” после V) | 9999V99 | -123457 |
Суффиксы, префиксы и другие элементы, влияющие на формат вывода
Задавая модель формата можно использовать знаки пунктуации (/ . ,), а также символьные константы (заключенные в двойные кавычки), которые будут включены в результат. Кроме того, можно использовать:
Префикс FM | Подавляет конечные пробелы в названиях месяцев и дней недели, оставляя результат переменной длины. Подавляются и ведущие нули в числах. Повтор FM отменяет подавление. |
Суффикс TH | Для вывода порядковых числительных (например, DDTH для вывода в формате “4th”). |
Суффикс SP | Для вывода чисел словами (например, DDSP для вывода слова “FOUR”) |
Сочетание суффиксов SP и TH: SPTH или THSP | Для вывода порядковых числительных словами (например, DDSPTH или DDTHSP для вывода слова “FOURTH”). |
Примеры использования функций преобразования и моделей форматов
Примеры использования TO_CHAR для преобразования дат: Чаще всего функция TO_CHAR используется для преобразования даты при выводе. Дело в том, что Oracle выводит даты при выборке в формате, установленном по умолчанию. Это может быть, например, формат ‘dd-mm-yy’, ‘dd-mon-yy’ или ‘dd.mm.yy’. Как правило, формат, используемый по умолчанию, не содержит информации о времени, квартале месяца, столетии и пр. На практике часто возникает необходимость вывести более полную информацию, задав необходимый формат.
SELECT TO_CHAR(SYSDATE,'dd - mm - yyyy - hh24 - mi - ss') data
FROM dual;
Результат:
DATA
-----------------------------
06 - 10 - 2003 - 17 - 05 - 49
SELECT TO_CHAR(SYSDATE,'dd "of" Month "year" yyyy') data
FROM dual;
Результат:
DATA
-------------------------
06 of October year 2003
-- В данном примере число состоит из одной цифры, поэтому перед ним
-- выводится ведущий 0, так как в модели формата указано, что число надо -- выводить двумя цифрами. Кроме того, модель ‘Month’ предполагает, что -- название месяца дополняется конечными пробелами до 9 символов. Чтобы -- убрать ведущие нули и конечные пробелы, используйте префикс FM.
SELECT TO_CHAR(SYSDATE,'fmdd "of" Month "year" yyyy') data
FROM dual;
Результат:
DATA
-------------------------
6 of October year 2003
SELECT TO_CHAR(SYSDATE,'fmDAY : MONTH : YEAR') data
FROM dual;
Результат:
DATA
---------------------------------------
MONDAY : OCTOBER : TWO THOUSAND THREE
Пример использования TO_CHAR для преобразования чисел:
SELECT salary, TO_CHAR(salary, '099999'), TO_CHAR(salary, '999'),
TO_CHAR(salary, '$99999'), TO_CHAR(salary, '99999V999')
FROM s_emp;
Результат:
SALARY TO_CHAR TO_C TO_CHAR TO_CHAR(S
--------- ------- ---- ------- ---------
2500 002500 #### $2500 2500000
1450 001450 #### $1450 1450000
1400 001400 #### $1400 1400000
1450 001450 #### $1450 1450000
…
25 rows selected
-- Символы # выводятся в случае, если количество цифр в числе превышает
-- количество цифр, предусмотренное моделью формата.
Пример использования TO_CHAR в предложении WHERE: Вывести фамилии служащих, которые были приняты на работу в понедельник.
SELECT last_name
FROM s_emp
WHERE TO_CHAR(start_date, 'dy')='mon';
Результат:
LAST_NAME
------------
Nagayama
Menchu
Magee
Sedeghi
Примеры использования TO_DATE: Если Вы хотите привести в запросе конкретную дату, необходимо заключить ее в апострофы. Но сервер Oracle расценит ее как дату только в случае, если заданная дата приводится в соответствующем контексте и если ее формат совпадает с одним из форматов, используемых сервером по умолчанию. В противном случае, заданная дата может быть расценена как символьное значение, что может привести к ошибкам. Чтобы их избежать, рекомендуется всегда при задании дат в запросах пользоваться функцией TO_DATE, чтобы явно указать серверу, что вводимое Вами значение является датой.
SELECT last_name
FROM s_emp
WHERE start_date='05/09/1991';
Результат:
no rows selected
-- Данным запросом пользователь хотел найти служащих, принятых на работу 9 -- мая 1991 года. Сервер воспринимает введенное значение, как 5 сентября -- 1991года, поэтому не вернул ни одной строки. Тот же пример, но с
-- указанием модели формата:
SELECT last_name
FROM s_emp
WHERE start_date=to_date('05/09/1991','mm/dd/yyyy');
Результат:
LAST_NAME
-------------------
Schwartz
SELECT ROUND('27-09-2003', 'year')
FROM dual;
Результат:
ERROR at line 1:
ORA-01722: invalid number
-- Функция ROUND может применяться как для округления чисел, так и для
-- округления дат. По умолчанию Oracle пытается произвести округление числа, -- но так как округляемое значение заключено в апострофы, его нельзя
-- расценить как число, что вызывает ошибку Oracle. Чтобы явно указать, что -- необходимо произвести округление даты, необходимо воспользоваться
-- функцией TO_DATE:
SELECT ROUND(TO_DATE('27-09-2003','dd-mm-yyyy'), 'year')
FROM dual;
Результат:
ROUND(TO
--------
01.01.04
Вложенные однострочные функции
Однострочные функции могут быть вложены на любую глубину, то есть значение, возвращаемое одной функцией, может быть использовано в качестве аргумента другой функции. Вложенные функции вычисляются от самого глубокого уровня к верхнему.
Пример: Для каждого служащего заглавными буквами вывести первую букву его имени с точкой и фамилию в одном столбце. Столбец назвать employees.
SELECT
UPPER(CONCAT(CONCAT(SUBSTR(first_name,1,1),’.’), last_name)) employees
FROM s_emp;
Результат:
EMPLOYEES
------------------
C.VELASQUEZ
L.NGAO
M.NAGAYAMA
M.QUICK-TO-SEE
A.ROPEBURN
M.URGUHART
R.MENCHU
B.BIRI
A.CATCHPOLE
M.HAVEL
C.MAGEE
H.GILJUM
…
25 rows selected.
Прочие однострочные функции
DECODE
Синтаксис:
DECODE (выражение, значение1, результат1[, значение2, результат2, …] [значение_по_умолчанию])
Чтобы вычислить значение этой функции, Oracle сравнивает выражение с каждым значением. Если выражение совпадает с некоторым значением, Oracle возвращает соответствующий результат. Если ни одного совпадения не найдено, Oracle возвращает значение_по_умолчанию, или NULL, если значение_по_умолчанию опущено. Максимальное количество аргументов DECODE, включая выражение, значение_по_умолчанию и все значения и результаты, равно 255.
Пример: Вывести текущий размер суммарной зарплаты всех служащих, а также размер суммарной зарплаты в случае, если всем торговым представителям (Sales Representative) повысить зарплату до 2000, а всем клеркам (Stock Clerk) – до 1500.
В решении используется групповая функция SUM, описанная в Лекции 8. В первом выходном столбце суммируются текущие зарплаты служащих, во втором столбце суммирование производится в зависимости от значения столбца title. Если значение title – ‘Sales Representative’ прибавляется 2000, если – ‘Stock Clerk’, прибавляется 1500, в противном случае – прибавляется текущее значение зарплаты salary.
SELECT SUM(salary) old,
SUM(DECODE(title, 'Sales Representative', 2000,
'Stock Clerk', 1500, salary)) new
FROM s_emp;
Результат:
OLD NEW
--------- ---------
31377 39507
GREATEST
Синтаксис:
GREATEST(выражение[, выражение] ...)
Возвращает наибольшее значение из списка выражений.
Пример:
SELECT GREATEST('Harry', 'Harriot', 'Harold')
FROM dual;
Результат:
GREAT
-----
Harry
LEAST
Синтаксис:
LEAST(выражение[, выражение] ...)
Возвращает наименьшее значение из списка выражений.
Пример:
SELECT LEAST('Harry', 'Harriot', 'Harold')
FROM dual;
Результат:
LEAST(
------
Harold
NVL
Синтаксис:
NVL (выражение1, выражение2)
Если выражение1 равно NULL, функция возвращает выражение2, в противном случае – выражение1.
Пример: Для каждой фирмы-клиента вывести ее номер и комментарии. В случае, если комментарии отсутствуют вывести фразу ‘no comments’.
SELECT id, NVL(comments, 'no comments') comments
FROM s_customer;
Результат:
ID COMMENTS
---- -------------------------------------------------------
201 Customer usually orders large amounts and has a high or
der total. This is okay as long as the credit rating r
emains excellent.
202 Customer should always pay by cash until his credit rat
ing improves.
203 Customer specializes in baseball equipment and is the l
argest retailer in India.
204 no comments
205 no comments
…
15 rows selected.
Л екция 4. Язык SQL. Однострочные функции.