Что ж, наконец, пришло время взяться за 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! Но так ли, это на самом деле, посмотрим дальше!