Продолжаем путь по тернистой дорожке SQL! Давайте немного углубимся в оператор SELECT. Итак данный оператор как вы уже надеюсь поняли, является ключевым при выполнении запросов к таблицам БД. Оператор SELECT обязательно должен содержать, "список возвращаемых столбцов", то есть:
SELECT FILED1, FIELD2, FIELD3 ... FROM ...
Слова FILED1, FIELD2, FIELD3 и есть не что иное как "список возвращаемых столбцов"! И набор данных, которые вернет ваш запрос SELECT, будет, следовать именно по порядку "списка возвращаемых столбцов"! Это необходимо, четко представлять! Так же "список возвращаемых столбцов", может содержать вычисляемые столбцы и константы.
SELECT FILED1, (FIELD2 - FIELD3) "CONST" ... FROM ...
В дальнейшем вы все это увидите!
Предложение FROM содержит "список спецификаторов таблиц", а именно имена таблиц, из которых производится запрос! Такие таблицы называются "исходными таблицами запроса". Так как результаты запроса берутся именно из них! Теперь давайте попробуем практически проверить все сказанное. Запускайте SQL Plus и введите запрос: Вывести список имен, офисов и дат приема на работу всех служащих.
SQL> SELECT NAME, REP_OFFICE, HIRE_DATE FROM SALESREPS 2 / NAME REP_OFFICE HIRE_DAT ------------------------------ ---------- -------- Вася Пупкин 13 12.02.88 Маша Распутина 11 12.10.89 Филип Киркоров 21 10.12.86 Света Разина 11 14.06.88 Наташа Королева 12 19.05.87 Игорь Николаев 12 20.10.86 Крис Кельми 13 13.05.90 Игорь Петров 21 12.10.89 Дима Маликов 12 01.03.87 Маша Сидорова 22 14.11.88 Максим Галкин 12 12.10.89 11 строк выбрано.
Запрос вернул три столбца и одиннадцать строк, замечательно! Я использовал таблицы из учебной БД, она несколько суховата, я только заменил в ней англоязычные слова на более "родные", названия, просто, чтобы было веселее и быстрее усваивалось! Ваша задача правильно понимать, постановку задачи запроса и его, результат! Что собственно и является конечной целью, нашего мероприятия! :-) Теперь давайте выполним еще один запрос, с такой формулировкой: Как зовут, а так же каковы плановый и фактический объем продаж, служащего с идентификатором 107?
SQL> SELECT NAME, QUOTA, SALES FROM SALESREPS 2 WHERE EMPL_NUM = 107 3 / NAME QUOTA SALES ------------------------------ --------- --------- Маша Сидорова 300 186,042
Получаем таблицу, из трех столбцов и одной строки, хотя здесь и одна строка это тем не менее таблица результата запроса! Некоторые запросы вообще возвращают единственное значение, например: Каково среднее значение фактических объемов продаж по всем служащим компании?
SQL> SELECT AVG(SALES) FROM SALESREPS 2 WHERE EMPL_NUM = 107 3 / AVG(SALES) ---------- 186,042
Получаем одно значение (!), но и это тоже таблица, состоящая из одной строки и одного столбца! И, наконец, любой запрос может вернуть ноль строк!
Например: Вывести список имен и дат приема на работу, всех служащих фактический объем продаж которых превышает 50 000?
SQL> SELECT NAME, HIRE_DATE FROM SALESREPS 2 WHERE SALES > 50000 3 / строки не выбраны NAME, HIRE_DATE ---- ---------
Даже в этом случае результат является таблицей, как это не кажется парадоксальным. Он содержит два (!) столбца и ноль (!!!) строк! Неожиданно не так ли? Но тем не менее утверждение считается верным!!! Идем дальше, в таблицах как вы помните есть значения NULL, это значит, что значение пока не определено, не ДА ни НЕТ, а так сяк! :) Давайте сделаем запрос такого типа: Вывести список служащих, с их плановыми объемами продаж и идентификаторами менеджеров.
SQL> SELECT NAME, MANAGER, QUOTA FROM SALESREPS 2 / NAME MANAGER QUOTA ------------------------------ --------- --------- Вася Пупкин 104 350 Маша Распутина 106 300 Филип Киркоров 108 350 Света Разина NULL 275 Наташа Королева 106 200 Игорь Николаев 104 300 Крис Кельми 101 NULL Игорь Петров 106 350 Дима Маликов 104 275 Маша Сидорова 108 300 Максим Галкин 108 400 11 строк выбрано.
Что же получилось у Светы Разиной, нет менеджера! (Да и зачем он ей собственно!!!) А у Криса Кельми нет планового обьема продаж (Все отпелся голубок!!!) Поля содержат значения NULL, но в запрос, тем не менее, они попадают! Что и требовалось доказать! Вот пока все, но с оператором SELECT, еще нужно разбираться! :)