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