Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие ТБД.doc
Скачиваний:
26
Добавлен:
04.09.2019
Размер:
1.92 Mб
Скачать

3.4.1.11.Оператор select: задание сложных условий поиска. Использование логических выражений

Сложные логические выражения строятся при помощи операторов AND, OR и NOT.

Замечание:

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

Пример:

SELECT R.*, T.ZENA

FROM RASHOD R, TOVARY T

WHERE R.TOVAR = T.TOVAR AND

(R.KOLVO <= 30 OR R.KOLVO >= 3000) AND

R.POKUP IS NOT NULL

ORDER BY R.KOLVO

Сравнение столбца с результатом вычисления выражения

<выражение> <оператор> <столбец>

или аналогичный способ

<столбец> <оператор> <выражение>

Результат вычисления выражения сравнивается содержимым указанного столбца.

Пример:

SELECT R.DAT_RASH, R.TOVAR, T.ZENA

FROM RASHOD R, TOVAR T

WHERE R.TOVAR = T.TOVAR AND T.ZENA > (120 / R.KOLVO)

ORDER BY R.DAT_RASH

Использование between

<значение> [ NOT ] BETWEEN <значение1> AND <значение2>

Указать значение, которое должно находиться в интервале между значением1 и значением2.

Пример:

SELECT *

FROM RASHOD

WHERE KOLVO BETWEEN 1000 AND 3000

Использование in

Если нужно, чтобы значение какого-либо столбца (или результат вычисления некоторого выражения) совпадало с одним из дискретных значений, в условии поиска указывается предложение:

<значение> [ NOT ] IN ( <значение1> [, <значение2> … ] )

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

Пример:

SELECT *

FROM RASHOD

WHERE KOLVO IN (100, 1000, 3000 )

Замечание:

Существует вторая форма использования IN, в которой список возможных значений возвращается вложенным запросом SELECT.

Использование функции upper

Функция преобразует все буквы аргумента в заглавные.

UPPER (<значение>)

Обычно эта функция используется в условиях поиска, когда необходимо игнорировать возможную разницу в высоте букв. Может использоваться как в списке столбцов результирующего НД, так и в условии поиска в предложении WHERE.

Пример:

SELECT *

FROM POKUPATELI

WHERE UPPER(GOROD) = ‘МОСКВА’

Использование like

Предложение LIKE определяет шаблоны сравнения строковых значений. Если необходимо чтобы сравниваемое значение удовлетворяло шаблону, в условии поиска необходимо указать

<значение> [NOT] LIKE <шаблон> [ESCAPE <подшаблон>]

В шаблоне используются специальные символы - «%» и «_».

Символ «%» означает, что на его месте может быть строка любой длины.

Символ «_» используется для указания любого одиночного символа.

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

Примеры:

LIKE “%USD”

LIKE “__94”

WHERE STOLBEZ LIKE “_!%” ESCAPE “!”

Использование функции cast

Для того, чтобы трактовать значение одного типа как значение другого типа применяется функция CAST:

CAST (<значение> AS <тип_данных>)

Множество типов данных, в которые может быть преобразовано значение:

Пример:

SELECT *

FROM RASHOD

WHERE CAST(KOLVO AS CHAR(4)) LIKE “%09”

3.4.1.12.Вложение подзапросов

Часто невозможно решить поставленную задачу путем использования единственного запроса. Например, в тех случаях, когда при использовании условия поиска в предложении WHERE параметр <значение, с которым сравнивать> заранее не определен и должен вычисляться в момент выполнения оператора SELECT.

В этом случае оператор SELECT с подзапросом имеет следующий вид:

SELECT …

FROM …

WHERE <сравниваемое_значение> <оператор> (SELECT …)

Пример:

SELECT KOLVO, DAT_RASH

FROM RASHOD

WHERE KOLVO = (SELECT MAX(KOLVO) FROM RASHOD)

Замечание.

Ошибкой для данного вида запроса является использование вложенного оператора SELECT, возвращающего вместо единичного список значений.

Пример1 (ошибочный):

SELECT R.DAT_RASH, R.TOVAR, R.KOLVO, R.POKUP

FROM RASHOD R

WHERE R.POKUP = (SELECT POK.POKUP

FROM POKUPATELI POK

WHERE UPPER(POK.GOROD) = ‘МОСКВА’)

Пример 2 (исправленный):

SELECT R.DAT_RASH, R.TOVAR, R.KOLVO, R.POKUP

FROM RASHOD R

WHERE R.POKUP IN (SELECT POK.POKUP

FROM POKUPATELI POK

WHERE UPPER(POK.GOROD) = ‘МОСКВА’)

Пример 3

SELECT RRR.*

FROM RASHOD RRR

WHERE R.POKUP IN

(SELECT R.POKUP

FROM RASHOD R

WHERE KOLVO =

(SELECT MAX(RSH.KOLVO)

FROM RASHOD RSH) )

Логический порядок выполнения запроса:

  • Определяется самая крупная покупка – отыскивается максимальное значение в столбце KOLVO («самый вложенный» запрос).

  • Определяется покупатель, осуществивший эту покупку (средний запрос)

  • Основной запрос выбирает записи с заданным покупателем.