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

Выборка данных. Фраза SELECT предложения SELECT

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Аннотация: Приводятся правила построения и возможности фразы SELECT, используемой для формирования столбцов окончательного ответа в предложении SELECT. Рассматривается фраза PIVOT/UNPIVOT, логически объединяющая фразы SELECT и FROM.

Фраза 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 добавляет тексту запроса переносимости.

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Ярослав Прозоров
Ярослав Прозоров

В лекции № 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'));

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