Выбрать главу

SELECT *

FROM Ships

WHERE class LIKE '%o';

Результатом выполнения запроса будет следующая таблица:

name

class

launched

Haruna

Kongo

1916

Hiei

Kongo

1914

Kirishima

Kongo

1915

Kongo

Kongo

1913

Musashi

Yamato

1942

Yamato

Yamato

1941

Пример. Найти все корабли, имена классов которых заканчиваются на букву 'о', но не на 'go':

SELECT *

FROM Ships

WHERE class NOT LIKE '%go' AND class LIKE '%o';

name

class

launched

Musashi

Yamato

1942

Yamato

Yamato

1941

Если искомая строка содержит трафаретный символ, то следует задать управляющий символ в предложении ESCAPE. Этот управляющий символ должен использоваться в шаблоне перед трафаретным символом, сообщая о том, что трафаретный символ следует трактовать как обычный символ. Например, если в некотором поле следует отыскать все значения, содержащие символ "_", то шаблон '%_%' приведет к тому, что будут возвращены все записи из таблицы. В данном случае шаблон следует записать следующим образом:

'%#_%' ESCAPE '#'

Для проверки значения на соответствие строке "25%" можно воспользоваться таким предикатом:

LIKE '25|%' ESCAPE '|'

Истинностное значение предиката LIKE присваивается в соответствии со следующими правилами:

* Если либо проверяемое значение, либо образец, либо управляющий символ равен NULL, истинностное значение равно UNKNOWN.

* В противном случае, если проверяемое значение и образец имеют нулевую длину, истинностное значение равно TRUE.

* В противном случае, если проверяемое значение соответствует шаблону, то предикат LIKE равен TRUE.

* Если не соблюдается ни одно из перечисленных выше условий, предикат LIKE равен FALSE.

Проверка отсутствия/наличия значения. Предикат IS NULL

Предикат

IS [NOT] NULL

позволяет проверить отсутствие (наличие) значения в полях таблицы. Использование в этих случаях обычных предикатов сравнения может привести к неверным результатам, т.к. сравнение со значением NULL дает результат UNKNOWN (неизвестно).

Так, если требуется найти записи в таблице Pc, для которых в поле price отсутствует значение (поиск ошибок ввода), можно воспользоваться следующим оператором:

SELECT *

FROM Pc

WHERE price IS NULL;

Получение итоговых значений

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

Функция

Описание

COUNT(*)

Возвращает количество строк источника записей.

COUNT()

Возвращает количество значений в указанном столбце.

SUM()

Возвращает сумму значений в указанном столбце.

AVG()

Возвращает среднее значение в указанном столбце.

MIN()

Возвращает минимальное значение в указанном столбце.

MAX()

Возвращает максимальное значение в указанном столбце.

Все эти функции возвращают единственное значение. При этом функции COUNT, MIN и MAX применимы к любым типам данных, в то время как SUM и AVG используются только для числовых полей. Разница между функцией COUNT(*) и COUNT() состоит в том, что вторая при подсчете не учитывает NULL-значения.

Пример. Найти минимальную и максимальную цену на персональные компьютеры:

SELECT MIN(price) AS Min_price, MAX(price) AS Max_price

FROM PC;

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

Min_price

Max_price

350.0

980.0

Пример. Найти имеющееся в наличии количество компьютеров, выпущенных производителем А:

SELECT COUNT(*) AS Qty

FROM PC

WHERE model IN

(SELECT model

FROM Product

WHERE maker = 'A');

В результате получим:

Qty

7

Пример. Если же нас интересует количество различных моделей, выпускаемых производителем А, то запрос можно сформулировать следующим образом (пользуясь тем фактом, что в таблице Product каждая модель записывается один раз):

SELECT COUNT(model) AS Qty_model

FROM Product

WHERE maker = 'A';

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

Qty_model

7

Пример. Найти количество имеющихся различных моделей, выпускаемых производителем А. Запрос похож на предыдущий, в котором требовалось определить общее число моделей, выпускаемых производителем А. Здесь же требуется найти число различных моделей в таблице PC (т.е. имеющихся в продаже).

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

SELECT COUNT(DISTINCT model) AS Qty

FROM PC

WHERE model IN

(SELECT model

FROM Product

WHERE maker = 'A');

даст следующий результат:

Qty

2

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