В лекции № 7 "Введение в Oracle SQL" в подразделе "Несамостоятельность группировки с обобщениями ROLLUP, CUBE и GROUPING SETS" представленная таблица сравнения содержит ошибки - окончания запросов пропущены. Видимо, ошибки вызваны некорректным переносом материала лекции. |
Выборка данных. Фраза SELECT предложения SELECT
Фраза SELECT и функции в предложении SELECT
Фраза SELECT — вторая, вместе с FROM, обязательная для каждого предложения SELECT. Ее назначение состоит в формировании столбцов таблицы — окончательного результата выполнения запроса. Типично она сохраняет количество строк, поступивших ей на входе от предшествующих фраз, и занимается только переформулированием столбцов, но в некоторых случаях она способна вдобавок и сократить количество строк.
Обычно состав фразы SELECT — список через запятую выражений для столбцов окончательного ответа. В отдельных случаях у такой структуры могут существовать свои особенности.
Сокращенная запись для "всех столбцов таблицы"
Если делается запрос по одной таблице-источнику данных и требуется выдать все поля строк этой таблицы без изменений, вместо списка выражений во фразе SELECT можно указать символ *:
SELECT * FROM dept;
Символ * может быть предварен именем таблицы:
SELECT dept.* FROM dept;
В данном случае в этом нужды нет, но если бы источников данных было несколько, такое уточнение было бы оправдано.
Два последних примера равносильны и выдадут то же, что и следующая формулировка:
SELECT dept.deptno, dept.dname, dept.loc FROM dept;
Еще пример. Следующие два предложения равносильны:
SELECT emp.ename, dept.deptno, dept.dname, dept.loc FROM dept, emp WHERE dept.deptno = emp.deptno; SELECT emp.ename, dept.* FROM dept, emp WHERE dept.deptno = emp.deptno;
Символ * не связан с единичностью источника и означает "все столбцы частичного результата обработки, пришедшие на вход фразе SELECT, без каких-либо преобразований". Пример употребления в запросе к двум таблицам:
SELECT * FROM dept, emp WHERE dept.deptno = emp.deptno;
Использование SELECT * может показаться привлекательным в силу экономности записи, однако стоит напомнить, что это нереляционная конструкция, так как она полагается на порядок столбцов в таблице, в то время как в реляционной модели атрибуты в отношении порядка не имеют и допускают обращение к ним только по названиям. В предположении порядка столбцов (тем более неявном) кроется определенный риск, так как таблицы в Oracle допускают добавление и удаление столбцов, из-за чего запросы в программе могут потерять синтаксическую корректность или, хуже того, изменить смысл.
В технических запросах (не в приложении) конструкцией SELECT * можно пользоваться свободнее.
Выражения во фразе SELECT
Пример, когда во фразе SELECT приводятся выражения, а не имена столбцов:
SELECT ename , ' earns' , ( sal + NVL ( comm, 0 ) ) / 1000000 , ' million dollars per month' FROM emp ;
Первый по порядку столбец будет содержать разные имена сотрудников, второй и четвертый — постоянные значения, а третий — разные результаты оценки числового выражения.
Именование столбцов в результате запроса
Если не предпринять специальных мер, столбцы в таблице-результате именуются автоматически (чаще всего на основе имен столбцов запрошенных таблиц). При желании программист может потребовать СУБД назвать столбец по-своему, указав имя через пробел после формулировки выражения. (Имеется в виду "обобщенный пробел", который может
состоять фактически из нескольких знаков пробела, табуляции или переходов на новую строку).
Примеры:
SELECT ename, sal salary FROM emp; SELECT ename "Сотрудники", sal "Зарплата" FROM emp; SELECT SUM ( comm ) / COUNT ( * ) "Усреднение по всем сотрудникам" FROM emp ;
Правила выбора и записи имен столбцов те же, что и для таблиц в БД.
Вместо обобщенного пробела можно с равным успехом использовать связку AS:
SELECT ename AS "Сотрудники", sal AS "Зарплата" FROM emp;
Использовать пробел или ключевое слово AS — дело вкуса и здравого смысла программиста. Ключевое слово AS добавляет тексту запроса переносимости.