КаталогИндекс раздела
НазадОглавлениеВперед


2.3. Выборка c использованием фразы WHERE

2.3.1. Использование операторов сравнения

В синтаксисе фразы WHERE (п.2.1) показано, что для отбора нужных строк таблицы можно использовать операторы сравнения = (равно), <> (не равно), < (меньше), <= (меньше или равно), > (больше), >= (больше или равно), которые могут предваряться оператором NOT, создавая, например, отношения "не меньше" и "не больше".

Так, для получения перечня продуктов, практически не содержащих углеводов, можно сформировать запрос

SELECT  Продукт, Белки, Жиры, Углев, K, Ca, Na, B2, PP, C 
FROM    Продукты
WHERE   Углев = 0;

и получить:

ПродуктБелкиЖирыУглевKCaNaB2PPC
Говядина189.124.0.3150906001.528.0
Судак190.80.0.1870270 01.110.30

Возможность использования нескольких условий, соединенных логическими операторами AND, OR, AND NOT и OR NOT, позволяет осуществить более детальный отбор строк. Так, для получения перечня продуктов, практически не содержащих углеводов и натрия, можно сформировать запрос:

SELECT  Продукт, Белки, Жиры, Углев, K, Ca, Na, B2, PP, C 
FROM    Продукты
WHERE   Углев = 0 AND Na = 0;

Результат запроса имеет вид

ПродуктБелкиЖирыУглевKCaNaB2PPC
Судак190.80.0.187027001.110.30

Добавим к этому запросу еще одно условие

SELECT  Продукт, Белки, Жиры, Углев, K, Ca, Na, B2, PP, C 
FROM    Продукты
WHERE   Углев = 0 AND Na = 0 AND Продукт <> 'Судак';

и получим на экране сообщение "No rows exist or satisfy the specified clause" или аналогичное (в зависимости от вкусов разработчиков разных СУБД), информирующее об отсутствии строк, удовлетворяющих заданному(ым) условию(ям).

2.3.2. Использование BETWEEN

С помощью BETWEEN ... AND ... (находится в интервале от ... до ...) можно отобрать строки, в которых значение какого-либо столбца находятся в заданном диапазоне.

Например, выдать перечень продуктов, в которых значение содержания белка находится в диапазоне от 10 до 50:
Результат:
SELECT  Продукт, Белки
FROM    Продукты
WHERE   Белки BETWEEN 10 AND 50;
Продукт Белки
Майонез31.
Сметана26.
Молоко28.
Морковь13.
Лук17.

Можно задать и NOT BETWEEN (не принадлежит диапазону между), например:

Результат:
SELECT  Продукт, Белки, Жиры
FROM    Продукты        
WHERE   Белки NOT BETWEEN 10 AND 50     
AND     Жиры > 100;
Продукт Белки Жиры
Говядина189.124.
Масло 60.825.
Яйца127.115.

BETWEEN особенно удобен при работе с данными, задаваемыми интервалами, начало и конец которых расположен в разных столбцах.

Для примера воспользуемся таблицей "минимальных окладов" (табл. 2.1), величина которых непосредственно связана со студенческой стипендией. В этой таблице для текущего значения минимального оклада установлена запредельная дата окончания 9 сентября 9999 года.

Таблица 2.1
Минимальные оклады

МинокладНачалоКонец
225001-01-199331-03-1993
427501-04-199330-06-1993
774001-07-199330-11-1993
1462001-12-199330-06-1994
2050001-07-199409-09-9999

Если, например, потребовалось узнать, какие изменения минимальных окладов производились в 1993/94 учебном году, то можно выдать запрос

SELECT  Начало, Миноклад
FROM    Миноклады
WHERE   Начало BETWEEN '1-9-1993' AND '31-8-1994'
и получить результат:
НачалоМиноклад
01-12-199314620
01-07-199420500

Отметим, что при формировании запросов значения дат следует заключать в апострофы, чтобы СУБД не путала их с выражениями и не пыталась вычитать из 31 значение 8, а затем 1994.

Для выявления всех значений минимальных окладов, которые существовали в 1993/94 учебном году, можно сформировать запрос

SELECT  *
FROM    Миноклады
WHERE   Начало  BETWEEN '1-9-1993' AND '31-8-1994'
OR      Конец   BETWEEN '1-9-1993' AND '31-8-1994'
МинокладНачалоКонец
774001/07/199330/11/1993
1462001/12/199330/06/1994
2050001/07/199409/09/9999

Наконец, для получения минимального оклада на 15-5-1994:

Результат:
SELECT  Миноклад
FROM    Миноклады
WHERE   '15-05-1994' BETWEEN Начало AND Конец
Миноклад
14620

2.3.3. Использование IN

Выдать сведения о блюдах на основе яиц, крупы и овощей

SELECT  *
FROM    Блюда
WHERE   Основа IN (Яйца Крупа Овощи);

Результат:

БЛБлюдоВОснова Выход Труд
1Салат летнийЗОвощи200.3
3Салат витаминныйЗОвощи200.4
16ДраченаГЯйца180.4
17Морковь с рисомГОвощи260.3
19Омлет с лукомГЯйца200.5
20Каша рисоваяГКрупа210.4
21Пудинг рисовыйГКрупа160.6
23Помидоры с лукомГОвощи260.4

Рассмотренная форма IN является в действительности просто краткой записью последовательности отдельных сравнений, соединенных операторами OR. Предыдущее предложение эквивалентно такому:

SELECT  *
FROM    Блюда
WHERE   Основа=Яйца OR Основа=Крупа OR Основа=Овощи;

Можно задать и NOT IN (не принадлежит), а также возможность использования IN (NOT IN) с подзапросом (см. главу 3).

2.3.4. Использование LIKE

Выдать перечень салатов

Результат:
SELECT  Блюдо
FROM    Блюда
WHERE   Блюдо LIKE 'Салат%';
Блюдо
Салат летний
Салат мясной
Салат витаминный
Салат рыбный

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

Следовательно, в приведенном примере SELECT будет осуществлять выборку записей из таблицы Блюда, для которых значение в столбце Блюдо начинается сочетанием 'Салат' и содержит любую последовательность из нуля или более символов, следующих за сочетанием 'Салат'. Если бы среди блюд были "Луковый салат", "Фруктовый салат" и т.п., то они не были бы найдены. Для их отыскания надо изменить фразу WHERE:

WHERE Блюдо LIKE '%салат%'

или при отсутствии различий между малыми и большими буквами (такую настройку допускают некоторые СУБД):

WHERE Блюдо LIKE '%Салат%'  

Это позволит отыскать все салаты.

2.3.5. Вовлечение неопределенного значения (NULL-значения)

Как было рассказано в п.2.2.3, если при загрузке данных не введено значение в какое-либо поле таблицы, то СУБД поместит в него NULL-значение. Аналогичное значение можно ввести в поле таблицы, выполняя операцию изменения данных. Так, при отсутствии сведений о наличии у поставщиков судака и моркови в столбцы Цена и К_во соответствующих строк таблицы Поставки вводится NULL и там будет храниться код NULL-значения, а не 0, 0. или пробел. (Отметим, что в распечатке таблицы Поставки рис.1.1 в этих местах расположен пробел, установленный в СУБД для представления NULL-значения при выводе на печать).

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

Результат: ПР
SELECT   DISTINCT ПР
FROM    Наличие  
WHERE   К_во IS NULL;
2
9

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

SELECT  DISTINCT ПР
FROM    Наличие
WHERE   К_во IS NOT NULL;

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

столбец IS NULL  и  столбец IS NOT NULL

вместо, например,

столбец = NULL    и  столбец <> NULL

связано с тем, что ничто - и даже само NULL-значение - не считается равным другому NULL-значению. (Несмотря на это, два неопределенных значения рассматриваются, однако, как дубликаты друг друга при исключении дубликатов, и предложение SELECT DISTINCT даст в результате не более одного NULL-значения.)


КаталогИндекс раздела
НазадОглавлениеВперед