Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯЗЫК SQL.doc
Скачиваний:
17
Добавлен:
16.11.2018
Размер:
903.17 Кб
Скачать

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

Строковые функции принимают в качестве параметра строку и возвращают после ее обработки строку или null.

  • SUBSTRING (строка FROM начало [FOR длина]) — возвращает подстроку, получающуюся из строки, которая указана в каче­стве параметра строка.

Подстрока начинается с символа, по­рядковый номер которого указан в параметре начало и имеет длину, указанную в параметре длина.

Нумерация символов строки ведется слева направо, начиная с 1. Квадратные скоб­ки здесь указывают лишь на то, что заключенное в них вы­ражение не является обязательным. Если выражение for длина не используется, то возвращается подстрока от начало и до конца исходной строки.

Значения параметров начало и длина должны выбираться так, чтобы искомая под­строка действительно находилась внутри исходной строки. В противном случае функция substring вернет null.

Например:

SUBSTRING ('Дорогая Маша!' FROM 9 TOR 4) — возвращает 'Маша';

SUBSTRING ('Дорогая Маша! ' FROM 9) — возвращает 'Маша! ';

SUBSTRING ('Дорогая Маша! ' FROM 15) возвращает NULL.

Использовать эту функцию в SQL-выражении можно, напри­мер, так:

SELECT * FROM Клиенты

WHERE SUBSTRING (Регион FROM 1 FOR 5) = 'Север';

  • upper (строка) — переводит все символы указанной в пара­метре строки в верхний регистр.

  • lower (строка) — переводит все символы указанной в пара­метре строки в нижний регистр.

  • TRIM(LEADING | TRAILING | BOTH ['символ'] FROM строка)

удаляет ведущие (leading), заключительные (trailing) или те и другие (both) символы из строки. По умолчанию удаляе­мым символом является пробел (' '), поэтому его можно не указывать. Чаще всего эта функция используется именно для удаления пробелов.

Например:

TRIM (LEADING ' ' FROM ' город Санкт-Петербург ')

возвращает 'город Санкт-Петербург ';

TRIM (TRALING ' ' FROM ' город Санкт-Петербург ')

возвращает ' город Санкт-Петербург';

TRIM(BOTH ' ' FROM город Санкт-Петербург ') —

возвращает 'город Санкт-Петербург';

TRIM (BOTH FROM ' город Санкт-Петербург ')

возвращает 'город Санкт-Петербург';

TRIM(BOTH 'г' FROM 'город Санкт-Петербург')

возвращает 'ород Санкт-Петербур'.

Среди этих функций наиболее часто используемые — это SUBSTRING() и TRIM() .

Числовые функции

Числовые функции в качестве параметра могут принимать дан­ные не только числового типа, но возвращают всегда число или null (неопределенное значение).

  • position (целеваяСтрока in строка) — ищет вхождение целевой строки в указанную строку. В случае успешного поиска возвращает номер положения ее первого символа, иначе — 0.

Если целевая строка имеет нулевую длину (например, пустая строка ''), то функция возвращает 1. Если хотя бы один из параметров имеет значение null, to возвращается null. Ну­мерация символов строки ведется слева направо, начиная с 1.

Например:

position (‘е' in 'Привет всем') — возвращает 5;

POSITION С всем' IN 'Привет всем') — возвращает 8;

position (‘ ' in 'привет всем') — возвращает 1;

POSITION ('Привет ! ' IN 'Привет всем') — возвращает 0.

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

Так, если требуется выбрать записи, относящиеся к клиентам, прожи­вающим в Санкт-Петербурге, то можно воспользоваться сле­дующим выражением SQL-запроса:

SELECT * FROM Клиенты

WHERE POSITION('Санкт-Петербург' IN Адрес) > 0;

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

SELECT * FROM Клиенты

WHERE Адрес LIKE '%Петербург%';

  • extract (параметр) — извлекает элемент из значения типа дата-время или из интервала.

Например:

EXTRACT(MONTH FROM DATE '2005-10-25') — возвращает 10.

  • character_length (строка) — возвращает количество симво­лов в строке.

Например:

character_length с привет всем') — возвращает 11.

  • octet_length (строка) — возвращает количество октетов (байтов) в строке. Каждый символ латиницы или кириллицы представляется одним байтом, а символ китайского алфави­та — двумя байтами.

  • cardinality (параметр) принимает в качестве параметра коллекцию элементов и возвращает количество элементов в коллекции (кардинальное число). Коллекция может быть, например, массивом или мультимножеством, содержащим элементы различных типов.

  • abs (число) — возвращает абсолютное значение числа.

Например:

abs(-123) — возвращает 123;

abs(2 - 5) — возвращает 3.

  • mod (число1, число2)возвращает остаток от целочислен­ ного деления первого числа на второе.

Например:

mod (5, 3) — возвращает 2;

mod(2, 3) — возвращает 0.

  • ln (число) — возвращает натуральный логарифм числа.

  • ехр( число) —возвращает ечисло (основание натурального ло­гарифма в степени число).

  • sqrt(число) — возвращает квадратный корень из числа.

  • floor (число) — возвращает наибольшее целое число, не пре­вышающее заданное параметром (округление в меньшую сто­рону).

Например:

floor(5. 123) — возвращает 5.0.'

  • ceil (число) или ceiling (число) — возвращает наименьшее целое число, которое не меньше заданного параметром (ок­ ругление в большую сторону).

Например:

ceil(5.123) — возвращает 6,0.

  • WIDTH_BUCKET(число1, число2, число3, число4) — возвращает целое число в диапазоне между 0 и число4 + 1.

Пара­метры число2 и число3 задают числовой отрезок, разделен­ный на равновеликие интервалы, количество которых задается параметром числом. Функция определяет номер ин­тервала, в который попадает значение число1. Если число2 находится за пределами заданного диапазона, то функция возвращает 0 или число4 +1.

Например:

width_bucket(3.14, о, 9, 5) — возвращает 2.

Функции даты-времени

В языке SQL имеются три функции, которые возвращают теку­щие дату и время.

  • current_date — возвращает текущую дату (тип date). На­пример, 2005-06-18.

  • currentjtime (число) — возвращает текущее время (тип time). Целочисленный параметр указывает точность пред­ставления секунд. Например, при значении 2 секунды будут представлены с точностью до сотых (две цифры в дробной части): 12:39:45.27.

  • current_timestamp (число) — возвращает дату и время (тип TIMESTAMP).

Например, 2005-06-18 12:39:45.27.

Целочисленный параметр указывает точность представления секунд.

Обратите внимание, что дата и время, возвращаемые этими функциями, имеют не символьный тип. Если требуется предста­вить их в виде символьных строк, то для этого следует использо­вать функцию преобразования типа cast ().

Функции даты-времени обычно применяются в запросах на вставку, обновление и удаление данных.

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

Вычисляемые выражения

Вычисляемые выражения строятся из констант (числовых, стро­ковых, логических), функций имен полей и данных других ти­пов путем соединения их арифметическими, строковыми, логи­ческими и другими операторами.

В свою очередь, выражения могут быть объединены посредством операторов в более слож­ные (составные) выражения. Для управления порядком вычис­ления выражений используются круглые скобки.

Арифметические операторы приведены далее:

+ — сложение;

-- — вычитание;

* — умножение;

/ — деление.

Строковый оператор только один — оператор конкатенации или склейки строк (и). В некоторых реализациях SQL (например, в Microsoft Access) вместо (и) используется символ (+). Оператор конкатенации приписывает вторую строку к концу первой. На­пример, выражение:

'Саша' | | 'любит' | | ' Машу'

вернет в качестве результата строку ' Саша любит Машу'.

При составлении выражений необходимо следить, чтобы операн­ды операторов имели допустимые типы.

Например, выражение:

123 + 'Саша'

недопустимо, поскольку арифметический оператор сложения применяется к строковому операнду.

Вычисляемые выражения могут находиться после оператора select, а также в выражениях условий операторов where и having.

Рассмотрим несколько примеров.

Пусть таблица Продажи содержит столбцы Тип_товара, Количе­ство и Цена, а нам требуется знать выручку для каждого типа товара. Для этого достаточно в список столбцов после оператора SELECT включить выражение Количество*Цена;

SELECT Тип_товара, Количество, Цена, Количество*Цена AS Итого FROM Продажи;

Здесь используется ключевое слово as (как) для задания псевдо­нима столбца с вычисляемыми данными.

Если требуется узнать общую выручку от продажи всех товаров, то достаточно применить следующий запрос:

SELECT SUМ(Количество*Цена) FROM Продажи;

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

SELECT Тип_товара, Количество*Цена AS Итого

FROM Продажи

WHERE Количество*Цена > 1000;

Предположим, что требуется получить таблицу, в которой два столбца:

Товар, содержащий тип товара и цену;

Итого, содержащий выручку.

Поскольку предполагается, что в исходной таблице Продажи столбец Тип_товара является символьным (тип char), а столбец цена — числовой, то при объединении (склейке) данных из этих столбцов необходимо выполнить приведение числового типа

к символьному с помощью функции cast ().

SELECT Тип_товара | | ' (Цепа: ' | | CAST(Цена AS CHAR(5)) | | ')' AS Товар, Количество*Цена AS Итого

FROM Продажи;

В Microsoft Access аналогичный запрос будет иметь следующий вид:

SELECT Тип_товара + ' (Цена: ' + СЭ1:г(Цена) + ')' AS Товар, Количество*Цена AS Итого FROM Продажи;

Условные выражения с оператором CASE

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

В языке SQL таким оператором является case (случай, обстоятельство, экземпляр). В SQL:2003 этот оператор возвращает значение и, следовательно, может использоваться в выражениях. Он имеет две основные формы, которые мы рас­смотрим в данном разделе.

Оператор CASE со значениями

Оператор case со значениями имеет следующий синтаксис:

CASE проверяемое_значение

WHEN значение1 THEN результат1

WHEN значение2 THEN результат2

WHEN значение N THEN результаты N

ELSE результатХ

END

В случае, когда проверяемое_значение равно значение1, опера­тор case возвращает значение результат1, указанное после ключевого слова then (to).

В противном случае проверяемое_ значение сравнивается с значение2, и если они равны, то воз­вращается значение результат2.

В противном случае проверяемое_ значение сравнивается со следующим значением, указанным после ключевого слова when (когда) и т. д.

Если проверяе-мое_значение не равно ни одному из таких значений, то воз­вращается значение результатХ, указанное после ключевого слова else (иначе).

Ключевое слово else не является обязательным. Если оно отсут­ствует и ни одно из значений, подлежащих сравнению, не равно проверяемому значению, то оператор case возвращает null.

Допустим, на основе таблицы Клиенты требуется получить таблицу, в которой названия регионов заменены их кодовыми номерами. Если в исходной таблице различных ре­гионов не слишком много, то для решения данной задачи удоб­но воспользоваться запросом с оператором case:

SELECT Имя, Адрес,

CASE Регион

WHEN 'Москва' THEN '77'

WHEN 'Тверская область' THEN '69'

ELSE Регион

END

AS Код региона

FROM Клиенты;

Оператор CASE с условиями поиска

Вторая форма оператора case предполагает его использование при поиске в таблице тех записей, которые удовлетворяют опре­деленному условию:

CASE

WHEN' условие1 THEN результат1

WHEN условие2 THEN результат2

WHEN условие N THEN результат N

ELSE результатХ

END

Оператор case проверяет, истинно ли условие1 для первой записи в наборе, определенном оператором where, или во всей таблице, если where отсутствует. Если да, то case возвращает значение результат1.

В противном случае для данной записи проверяется условие2. Если оно истинно, то возвращается зна­чение результат2 и т. д.

Если ни одно из условий не выполня­ется, то возвращается значение результатХ, указанное после ключевого слова else.

Ключевое слово else не является обязательным. Если оно отсут­ствует и ни одно из условий не выполняется, оператор case воз­вращает null. После того как оператор, содержащий case, вы­полнится для первой записи, происходит переход к следующей записи. Так продолжается до тех пор, пока не будет обработан весь набор записей.

Предположим, в таблице Книги (Название, Цена) столбец Цена

имеет значение null, если соответствующей книги нет в нали­чии.

Следующий запрос возвращает таблицу, в которой вместо null отображается текст "нет в наличии":

SELECT Название,

CASE

WHEN Цена IS NULL THEN 'Нет в наличии'

ELSE CAST(Цена AS CHAR(8))

END

AS Цена

FROM Книги;

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

Обратите внимание, что вместо первой формы оператора case всегда можно использовать вторую:

CASE

WHEN проверяемое_значение = значение1 THEN результат1 WHEN проверяемое_значение = значение2 THENрезультат2

WHEN проверяемое_значение = значениеN THEN результатN ELSE результатХ

END

Функции NULLIF и COALESCE

В ряде случаев, особенно в запросах на обновление данных (оператор update), удобно использовать вместо громоздкого оператора case более компактные функции nullif() (null, ес­ли) и coalesce() (объединять).

Функция NULLIF (значение1, значение.2) возвращает NULL, если значение первого параметра соответствует значению второго па­раметра, в случае несоответствия возвращается значение первого параметра без изменений.

То есть если равенство значение 1 = значение2 выполняется, то функция возвращает null, иначе — значение значение1.

Данная функция эквивалентна оператору case в следующих двух формах:

CASE значение1

WHEN значение2 THEN NULL

ELSE значение1

END

CASE

WHEN значение1 = значение2 THEN NULL

ELSE значение1

END

Функция COALESCE (значение1, значение2, ... , значениеN)

принимает список значений, которые могут быть как опреде­ленными, так и неопределенными (null). Функция возвращает первое определенное значение из списка или null, если все значения не определены.

Данная функция эквивалентна следующему оператору case:

CASE

WHEN значение1 IS NOT NULL THEN значение1

WHEN значение2 IS NOT NULL THEN значение2

WHEN значениеN IS NOT NULL THEN значениеN

ELSE NULL

END

Предположим, что в таблице Книги (название, цена) столбец Цена имеет значение null, если соответствующей книги нет в нали­чии. Следующий запрос возвращает таблицу, в которой вместо NULL отображается текст "Нет в' наличии":

SELECT Название, COALESCE(CAST(Цена AS CHAR(8)),

'Нет в наличии') AS Цена

FROM Книги;

Сложные запросы

В SQL сложные вопросы (запросы) являются комбинацией про­стых SQL-запросов. Каждый простой запрос в качестве ответа возвращает набор записей (таблицу), а комбинация простых за­просов возвращает результат тех или иных операций над ответа­ми на простые запросы. Чтобы понять запрос, лучше всего разо­браться в том, что является ответом на него, или понять, каким образом получается ответ.

В SQL сложные запросы получаются из других запросов сле­дующими способами:

  • вложением SQL-выражения запроса в SQL-выражение другого запроса. Первый из них называют подзапросом, а второй — внешним или основным запросом;

  • применением к SQL-запросам операторов объединения и соеди­нения наборов записей, возвращаемых запросами. Эти операто­ры называют теоретико-множественными или реляционными.