Опубликован: 28.12.2011 | Доступ: свободный | Студентов: 7487 / 958 | Оценка: 3.81 / 3.53 | Длительность: 19:30:00
ISBN: 978-5-9963-0488-2

Лекция 5: Выборка данных. Общее построение предложения SELECT и фразы FROM и WHERE

Конечный отбор фразой SELECT

Из упорядоченного множества строк, полученных от ORDER BY, фраза SELECT формирует столбцы окончательного ответа:

ENAME            SAL
---------- ---------
ALLEN           1600
WARD            1250
TURNER          1500
MARTIN          1250

Заметьте, что в ответ не попали значения столбца HIREDATE, по которым упорядочены строки.

Пример 2 предложения SELECT

"Выдать всех работающих сотрудников с названиями их отделов".

SELECT ename, dname
FROM   emp, dept
WHERE  emp.deptno = dept.deptno

(Запрос не выдаст сотрудников, не причисленных ни к одному отделу, однако в наших данных таковых нет.)

Промежуточный результат после фразы FROM

При количестве источников данных более двух фраза FROM делает реальную работу и в нашем случае даст следующий результат:

   EMPNO ENAME      ...     DEPTNO     DEPTNO DNAME          LOC
-------- ---------- ... ---------- ---------- -------------- -------------
    7369 SMITH      ...         20         10 ACCOUNTING     NEW YORK
    7499 ALLEN      ...         30         10 ACCOUNTING     NEW YORK
    7521 WARD       ...         30         10 ACCOUNTING     NEW YORK
    7566 JONES      ...         20         10 ACCOUNTING     NEW YORK
    7654 MARTIN     ...         30         10 ACCOUNTING     NEW YORK
    7876 ADAMS      ...         20         10 ACCOUNTING     NEW YORK
    7900 JAMES      ...         30         10 ACCOUNTING     NEW YORK
    7902 FORD       ...         20         10 ACCOUNTING     NEW YORK
    7934 MILLER     ...         10         10 ACCOUNTING     NEW YORK
    7369 SMITH      ...         20         20 RESEARCH       DALLAS
    7499 ALLEN      ...         30         20 RESEARCH       DALLAS
    7521 WARD       ...         30         20 RESEARCH       DALLAS
            ... ... ... ... ...
    7876 ADAMS      ...         20         40 OPERATIONS     BOSTON
    7900 JAMES      ...         30         40 OPERATIONS     BOSTON
    7902 FORD       ...         20         40 OPERATIONS     BOSTON
    7934 MILLER     ...         10         40 OPERATIONS     BOSTON

Такой результат работы фразы FROM является декартовым произведением строк таблиц EMP и DEPT, то есть множеством всех возможных комбинаций строк этих таблиц друг с другом.

Строки с EMPNO равным 7934 и 7369 отбиратся далее из этого промежуточного результата на следующем шаге.

Промежуточный результат после фразы WHERE

Из полученного от FROM множества строк фраза WHERE отфильтрует для дальнейшей обработки следующие:

   EMPNO ENAME      ...     DEPTNO     DEPTNO DNAME          LOC
-------- ---------- ... ---------- ---------- -------------- -------------
    7369 SMITH      ...         20         20 RESEARCH       DALLAS
    7499 ALLEN      ...         30         30 SALES          CHICAGO
    7521 WARD       ...         30         30 SALES          CHICAGO
    7566 JONES      ...         20         20 RESEARCH       DALLAS
    7654 MARTIN     ...         30         30 SALES          CHICAGO
    7698 BLAKE      ...         30         30 SALES          CHICAGO
    7782 CLARK      ...         10         10 ACCOUNTING     NEW YORK
    7788 SCOTT      ...         20         20 RESEARCH       DALLAS
    7839 KING       ...         10         10 ACCOUNTING     NEW YORK
    7844 TURNER     ...         30         30 SALES          CHICAGO
    7876 ADAMS      ...         20         20 RESEARCH       DALLAS
    7900 JAMES      ...         30         30 SALES          CHICAGO
    7902 FORD       ...         20         20 RESEARCH       DALLAS
    7934 MILLER     ...         10         10 ACCOUNTING     NEW YORK

Столбцы ENAME и DNAME отбираются далее из этого промежуточного результата на следующем шаге.

Конечный отбор фразой SELECT

Из полученного от WHERE множества строк фраза SELECT сформирует столбцы окончательного ответа:

ENAME      DNAME
---------- --------------
SMITH      RESEARCH
ALLEN      SALES
WARD       SALES
JONES      RESEARCH
MARTIN     SALES
BLAKE      SALES
CLARK      ACCOUNTING
SCOTT      RESEARCH
KING       ACCOUNTING
TURNER     SALES
ADAMS      RESEARCH
JAMES      SALES
FORD       RESEARCH
MILLER     ACCOUNTING

Завершающие наблюдения:

  • строки окончательного ответа не считаются упорядоченными (в отличие от предшествовавшего запроса), так что повторение этого же запроса формально может вернуть их теми же, но в другой последовательности;
  • порядок перечисления таблиц во фразе FROM (в нашем случае <EMP, DEPT>, а не <DEPT, EMP>) никак не сказывается на конечном результате.

Логическая целостность обработки предложением SELECT

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

СУБД Oracle обеспечивает целостность выполнения каждого предложения SELECT, изолируя его от последствий подобных чужих изменений. Иными словами, в процессе вычисления результата СУБД исходит из предположения, что данные в таблицах-источниках соответствуют моменту старта выполнения SELECT, сколько бы это выполнение не длилось. (Хотя это явно никак не выражено, можно считать, что на время вычисления СУБД организует в пределах сеанса "автономную" транзакцию типа READ ONLY.)

Иллюзия неизменности данных таблиц-источников в процессе вычисления запроса требует от СУБД расходования внутренних ресурсов. Если запрос длится особенно долго, а данные в это время активно изменяются прочими сеансами, требование логической целостности может вступить в конфликт с ресурсными ограничениями СУБД, и тогда обработка оборвется, а программа вместо ответа получит сообщение об ошибке. Такие проблемы решаются настройкой приложения или СУБД программистом и администратором.

Фраза FROM предложения SELECT

Фраза FROM — одна из двух обязательных для каждого предложения SELECT. Она перечисляет источники данных для получения ответа на запрос. Логически она открывает цепочку вычислений, осуществляя (логически!) декартово произведение строк всех источников друг с другом.

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

Варианты указания таблицы-источника во фразе FROM и поля строки в остальных фразах

Безотносительно к форме ссылки на источник (краткое или расширенное имя таблицы), ссылаться на его столбцы можно как по кратким (если только не возникает двусмыслицы), так и по уточненным именам:

SELECT ename, emp.ename FROM emp;
-- Допустимо.
SELECT ename, emp.ename, scott.emp.ename FROM scott.emp;
-- Допустимо.
SELECT scott.emp.ename FROM emp;
-- Недопустимо, ошибка !

Полностью уточненные имена в запросе удлиняют формулировку, но (а) снимают неоднозначность понимания программистом или же смысла системой, и (б) дают некоторое ускорение обработки запроса, так как Oracle все равно будет пытаться определить расширенное имя.

Использование псевдонимов в запросе

"Псевдоним" — это такой синоним таблицы, действие которого ограничено рамками текста конкретного запроса. Он может служить для придания запросу лаконичности, читаемости или же гибкости формулировки.

Если во фразе FROM таблице приписан псевдоним, то во всех остальных фразах запроса SQL требует ссылаться на нее только по псевдониму.

Ярослав Прозоров
Ярослав Прозоров

В лекции № 7 "Введение в Oracle SQL" в подразделе "Несамостоятельность группировки с обобщениями ROLLUP, CUBE и GROUPING SETS"  представленная таблица сравнения содержит ошибки - окончания запросов пропущены. Видимо, ошибки вызваны некорректным переносом материала лекции.

Володимир Миколайчук
Володимир Миколайчук
Помогите разобраться поетапно с логикой запроса
-------TOOLS
NAME PRICE TYPE
drill 155 A
sawzall 192 N
mitre saw 292 M
router 86 I
RAD 145 M
jigsaw 128 I
screwdriver 77 P
------TOOL_TYPES
TYPE USAGE
A Always
I Often
M Sometimes
N Rarely
P Never

Запрос SQL:
SELECT t.type, SUM(t.price)
FROM tools t
GROUP BY t.type
HAVING SUM(t.price) >= (SELECT AVG(price)
FROM tools
WHERE type IN (SELECT type
FROM tool_types
WHERE usage = 'Often'));

И сколько строк он все таки вернет