Шаг 13 - Условие WHERE оператора SELECT

А вот теперь, самое интересное! Предложение WHERE, наверное, если сказать, честно, это самое "навороченное" предложение, языка SQL! Собственно, это некий фундаментальный кирпичик, для работы, с таблицами и выполнением, разнообразных запросов! Мы с вами рассмотрим основные из них, а что я не успею разъяснить, сможете разобраться и сами, с помощью, моих "записок сумасшедшего" :))))) Итак для начала выполним пару тройку запросов, к нашей учебной БД, используя выражение WHERE: Перечислить, офисы, в которых фактический объем продаж, превысил плановые.

SQL> SELECT CITY, SALES, TARGET FROM OFFICES
  2  WHERE SALES > TARGET
  3  /

CITY                   SALES    TARGET
------------------ --------- ---------
Красный Мотоцикл     692,637       575
Бубурино             367,911       350
Котрогайка           835,915       725

Здесь WHERE SALES > TARGET, значит, если SALES больше TARGET! Получили три столбца и три сроки.

Вывести, имя, объем фактических и плановых продаж для служащего с идентификатором 105

SQL> SELECT SALES, NAME, QUOTA FROM SALESREPS
     2 WHERE EMPL_NUM = 105
     3 /


    SALES NAME                               QUOTA
--------- ------------------------------ ---------
  367,911 Вася Пупкин                          350

Здесь WHERE EMPL_NUM = 105, означает, EMPL_NUM равно 105! Поучили три столбца и одну строку.

Вывести список всех служащих, менеджером которых является Наташа Королева. (вот тут то и станет ясно, ху из ху) :)

SQL> 1 SELECT NAME, SALES FROM SALESREPS
     2 WHERE MANAGER = 104
     3 /

NAME                               SALES
------------------------------ ---------
Вася Пупкин                      367,911
Игорь Николаев                   305,673
Дима Маликов                     286,775

Здесь WHERE MANAGER = 104 означает то, что и ранее, но получаем два столбца и три строки. Если говорить с точки зрения логики, то происходит следующее. Если условие поиска ИСТИНА(TRUE), то строка включается в результирующий набор, если условие поиска ЛОЖНО(FALSE), то строка отбрасывается из результирующего набора, если условие поиска NULL, то строка так же, отбрасывается из результирующего набора! Это важно, не забывайте, что NULL, срабатывает, в этом случае, так же как FALSE! По своей сути WHERE, работает как фильтр, отсеивая ненужные записи и выдавая нужные! Вот собственно такой смысл, этого оператора!

Основных условий поиска, иначе называемых "предикаты", пять. Рассмотрим их последовательно:

  1. Сравнение, то есть значение одного условия, сравнивается со значением, другого условия. Как, например, в первом запросе.
  2. Проверка на принадлежность к диапазону значений. Например, проверяется, попадает ли указанное значение, в определенный диапазон или нет.
  3. Проверка на членство во множестве. Например, проверяется, совпадает ли значение выражения, с одним из значений из заданного множества.
  4. Проверка на соответствие шаблону. Проверяется, соответствует ли строковое значение, содержащееся в столбце, определенному шаблону.
  5. Проверка на равенство значению NULL. Комментарии здесь я думаю излишни!

Начнем со сравнений. Применяемые выражения могут быть такими и в таком синтаксисе:

                      больше
------- ВЫРАЖЕНИЕ1 ----- > ----- ВЫРАЖЕНИЕ2 ------------------
                      меньше
                         <
                      равно
                         =
                      не равно
                         !=
                         <>
                      меньше либо равно
                         <=
                      больше либо равно
                         =>	

Операции сравнения могут содержать простые операции, например сравнение поля и константы: Найти имена всех служащих принятых на работу до 1988 г.

SQL> SELECT NAME FROM SALESREPS
  2  WHERE HIRE_DATE < TO_DATE('01.06.1988','DD/MM/YYYY')
  3  /

NAME
------------------------------
Вася Пупки
Филип Киркоров
Наташа Королева
Игорь Николаев
Игорь Петров
Дима Маликов

Функция TO_DATE('01.06.1988','DD/MM/YYYY') - встроенная функция PL/SQL Oracle для работы с датами. Вот например два одинаковых запроса, в которых видно, что операторы <>, != действуют одинаково и какой выбирать дело вкуса.

Вывести список офисов, менеджером которых не является служащий под номером 108.

SQL> SELECT CITY, MGR FROM OFFICES
     2 WHERE MGR <> 108
     3 /

CITY                                 MGR
------------------------------ ---------
Красный Мотоцикл                     106
Чугуевск                             104
Бубурино                             105

SQL> SELECT CITY, MGR FROM OFFICES
     2 WHERE MGR != 108
     3 /

CITY                                 MGR
------------------------------ ---------
Красный Мотоцикл                     106
Чугуевск                             104
Бубурино                             105

Как видим результат одинаковый! Либо содержать арифметические выражения: Вывести список офисов, фактические объемы продаж в которых, составили менее 80 процентов от плановых.

SQL> SELECT CITY, SALES, TARGET FROM OFFICES
     2 WHERE SALES < (0.8 * TARGET)
     3 /

CITY                               SALES    TARGET
------------------------------ --------- ---------
Запиндрищинск                    186,042       300

Следует заметить что, чаше всего используются запросы сравнения с константой, по первичному ключу поиска, такой например как телефон абонента городской АТС, ведь двух одинаковых номеров не бывает! По этому возвращается одно значение, и если таблица хорошо оптимизирована то, как правило, очень быстро. Вот собственно такие выводы!


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 10.08.03