А вот теперь, самое интересное! Предложение 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 ------------------ меньше < равно = не равно != <> меньше либо равно <= больше либо равно =>
Операции сравнения могут содержать простые операции, например сравнение поля и константы: Найти имена всех служащих принятых на работу до 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
Следует заметить что, чаше всего используются запросы сравнения с константой, по первичному ключу поиска, такой например как телефон абонента городской АТС, ведь двух одинаковых номеров не бывает! По этому возвращается одно значение, и если таблица хорошо оптимизирована то, как правило, очень быстро. Вот собственно такие выводы!