Шаг 9 - Оператор SELECT

Что ж, наконец, пришло время взяться за SQL вплотную. Если говорить прямо, то практически весь SQL - базируется на единственном краеугольном камне, а именно операторе SELECT. Давайте попробуем разобраться, что же это такое? Сам оператор SELECT есть не что иное, как выражение для получения результирующего набора из таблиц БД. Мы формируем запрос при помощи оператора SELECT, а он, в свою очередь, выполнив свою работу, возвращает результирующий набор данных. Возвращаются эти данные в виде таблицы, которая в свою очередь, может быть обработана следующим оператором SELECT и т.д. Пока понятно?

Давайте поближе рассмотрим сам оператор и его синтаксис. Согласно стандарту SQL92, все это выглядит примерно так:

SELECT  -- ALL -------  схема , столбец ----
        -- DISTINCT --  ----  *  -----------

FROM    -- схема , таблица .. --------------

WHERE   -- условие поиска ------------------

GROUP BY  -- схема , столбец ---------------

HAVING  -- условие поиска ------------------

ORDER BY -- спецификатор сортировки --------

Первое правило, само выражение SELECT обязательно включает, выражение FROM. Остальные выражения используются по мере необходимости.

Выражение SELECT включает в себя список столбцов возвращаемых запросом.

Выражение FROM включает в себя список таблиц для выполнения запроса.

Выражение WHERE устанавливает условие поиска, если необходимо вернуть не все строки, а только ту часть, которая описана условием, поиска.

Выражение GROUP BY позволяет создать итоговой запрос, разбитый на группы.

Выражение HAVING определяет условие возврата групп и используется только совместно с GROUP BY.

Выражение ORDER BY определяет порядок сортировки результирующего набора данных.

Вот вкратце, как устроен оператор SELECT. Пока еще не все понятно, но в процессе разберемся!

Для начала давайте, выполним простой запрос, который возвращает, все записи (это обуславливает оператор * ) из таблицы OFFICES. Наш запрос будет выглядеть так:

Выбрать все записи из таблицы OFFICES.
SELECT *(все!) FROM OFFICES

-------------------------------------------------------------------------------------------
SQL> SELECT * FROM OFFICES
  2  /

   OFFICE CITY                           REGION                               MGR    TARGET         
--------- ------------------------------ ------------------------------ --------- ---------
    SALES
---------
       22 Запиндрищинск                  Запад                                108       300
  186,042

       11 Красный Мотоцикл               Восток                               106       575
  692,637

       12 Чугуевск                       Восток                               104       800
  735,044

       13 Бубурино                       Восток                               105       350
  367,911

       21 Котрогайка                     Запад                                108       725
  835,915

Результат несколько не нагляден вследствие того, что столбец CITY не попадает в формат вывода SQL Plus, это легко исправить, введя предикат COL CITY FORMAT A16. Таким образом, в начале каждого запроса можно отфарматировать каждый столбец. Немного громоздко, но полезно!!! :)

Итак снова выполним:

SELECT *(все!) FROM OFFICES

---------------------------------------------------------------------------------------
SQL> COL CITY FORMAT A16
SQL> SELECT * FROM OFFICES
  2  /

   OFFICE CITY             REGION                               MGR    TARGET     SALES
--------- ---------------- ------------------------------ --------- --------- ---------
       22 Запиндрищинск    Запад                                108       300   186,042
       11 Красный Мотоцикл Восток                               106       575   692,637
       12 Чугуевск         Восток                               104       800   735,044
       13 Бубурино         Восток                               105       350   367,911
       21 Котрогайка       Запад                                108       725   835,915

Ну вот, теперь все очень хорошо видно. Запрос вернул шесть столбцов и пять строк! Это важно!

Да, давайте еще раз посмотрим, сколько у нас таблиц в нашей схеме? Введите:

SELECT TABLE_NAME(выбираем одно поле!) FROM USER_TABLES(из таблицы USER_TABLES!)

---------------------------------------------------
SQL> SELECT TABLE_NAME FROM USER_TABLES
  2  /

TABLE_NAME                                                                           
------------------------------
BOYS
CUSTOMERS
GIRLS
OFFICES
ORDERS
PRODUCTS
SALESREPS

7 строк выбрано.

Семь таблиц, запрос вернул, один столбец и семь строк!

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

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

CITY                              TARGET     SALES                                   
------------------------------ --------- ---------                                   
Запиндрищинск                        300   186,042                                   
Красный Мотоцикл                     575   692,637                                   
Чугуевск                             800   735,044                                   
Бубурино                             350   367,911                                   
Котрогайка                           725   835,915                                   

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

--------------------------------------------------
SQL> SELECT CITY, TARGET, SALES
  2  FROM OFFICES
  3  WHERE REGION = 'Запад'
  4  /

CITY                              TARGET     SALES                                   
------------------------------ --------- ---------                                   
Запиндрищинск                        300   186,042                                   
Котрогайка                           725   835,915                                   

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

--------------------------------------------------
SQL> SELECT CITY, TARGET, SALES
  2  FROM OFFICES
  3  WHERE REGION = 'Запад'
  4  AND SALES > TARGET
  5   ORDER BY CITY
  6  /

CITY                              TARGET     SALES                                   
------------------------------ --------- ---------                                   
Котрогайка                           725   835,915                                   

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

--------------------------------------------------
SQL> SELECT AVG(TARGET), AVG(SALES)
  2   FROM OFFICES
  3  WHERE REGION = 'Запад'
  4  /

AVG(TARGET) AVG(SALES)                                                               
----------- ----------                                                               
      512,5   510,9785

Ну, на последок выберем из наших офисов, средние значения плановых и фактических объемов продаж по всем офисам расположенным в западном регионе. Вот примерно, так на первый взгляд просто строить, запросы при помощи операторов SELECT! Но так ли, это на самом деле, посмотрим дальше!


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