В предыдущей статье мы познакомились с оператором SELECT
языка SQL. Узнали основы - для чего он нужен, его синтаксис и как его применять. В данной статье мы рассмотрим Вычисляемые столбцы в SQL запросах с использованием оператора SELECT
.
Кроме столбцов, значения которых извлекаются непосредственно из базы данных, SQL-запрос на выборку может содержать вычисляемые столбцы, значения которых определяются на основании значений, хранящихся в базе данных. Чтобы получить вычисляемый столбец, в списке возвращаемых столбцов необходимо указать выражение. Как было сказано в статье "Основы SQL", выражения могут включать в себя операции сложения, вычитания, умножения и деления. Для построения более сложных выражений можно использовать скобки. Конечно, столбцы, участвующие в арифметическом выражении, должны содержать числовые данные. При попытке сложить, вычесть, умножить или разделить столбцы, содержащие текстовые данные, SQL выдаст сообщение об ошибке.
В следующем запросе будет получен простой вычисляемый столбец.
Выдать для каждого офиса список городов, регионов и сумм, на которые был перевыполнен/недовыполнен план по продажам.
SELECT CITY, REGION, (SALES - TARGET)
FROM OFFICES;
CITY REGION (SALES-TARGET)
------------ -------- ---------------
Denver Western -$113,958.00
New York Eastern $117,637.00
Chicago Eastern -$64,958.00
Atlanta Eastern $17,911.00
Los Angeles Western $110,915.00
При выполнении этого запроса для каждой строки таблицы OFFICES
генерируется одна строка результатов, как показано на рис. 3. Значения первых двух столбцов результатов запроса извлекаются непосредственно из таблицы OFFICES
. Третий столбец для каждой строки результатов запроса вычисляется на основании значений столбцов текущей строки таблицы OFFICES
.
Рис. 3. Выполнение запроса, содержащего вычисляемый столбец
Далее приведены другие примеры запросов, в которых используются вычисляемые столбцы.
Показать общую стоимость по каждому товару (показаны только 8 строк результирующего набора).
SELECT MFR_ID, PRODUCT_ID, DESCRIPTION, (QTY_ON_HAND * PRICE)
FROM PRODUCTS;
MFR_ID PRODUCT_ID DESCRIPTION (QTY_ON_HAND*PRICE)
------- ----------- --------------- --------------------
REI 2A45C Ratchet Link $16,590.00
ACI 4100Y Widget Remover $68,750.00
QSA XK47 Reducer $13,490.00
BIC 41672 Plate $0.00
IMM 779C 900-lb Brace $16,875.00
ACI 41003 Size 3 Widget $22,149.00
ACI 41004 Size 4 Widget $16,263.00
BIC 41003 Handle $1,956.00
Что получится, если увеличить плановый объем продаж для каждого служащего на 3% от его фактического объема продаж?
SELECT NAME, QUOTA, (QUOTA + (.03*SALES))
FROM SALESREPS;
NAME QUOTA (QUOTA+(.03*SALES))
-------------- ------------ --------------------
Bill Adams $350,000.00 $361,037.33
Mary Jones $300,000.00 $311,781.75
Sue Smith $350,000.00 $364,221.50
Sam Clark $275,000.00 $283,997.36
Bob Smith $200,000.00 $204,277.82
Dan Roberts $300,000.00 $309,170.19
Tom Snyder NULL NULL
Larry Fitch $350,000.00 $360,855.95
Paul Cruz $275,000.00 $283,603.25
Nancy Angelli $300,000.00 $305,581.26
Как было сказано в блоге "Основы SQL", во многих СУБД реализованы дополнительные арифметические операции, операции над строками символов и встроенные функции, которые можно применять в выражениях SQL. Их также можно использовать в выражениях в списке возвращаемых столбцов, как в следующем примере для DB2, в котором из даты извлекается значение месяца и года.
Вывести список имен, а также месяц и год приема на работу всех служащих. (В случае базы данных Oracle вместо функций month и YEAR следует применить функцию TO_CHAR
)
SELECT NAME, MONTH(HIRE_DATE), YEAR(HIRE_DATE)
FROM SALESREPS;
Кроме того, в списке возвращаемых столбцов можно использовать константы. Это может пригодиться для создания результатов запроса, которые более удобны для восприятия, как в следующем примере.
Список объемов продаж для каждого города.
SELECT CITY, 'has sales of', SALES
FROM OFFICES;
CITY HAS SALES OF SALES
------------ ------------- ------------
Denver has sales of $186,042.00
New York has sales of $692,637.00
Chicago has sales of $735,042.00
Atlanta has sales of $367,911.00
Los Angeles has sales of $835,915.00
Создается впечатление, что результаты запроса состоят из отдельных предложений, каждое из которых относится к одному из офисов, но на самом деле они представляют собой таблицу, содержащую три столбца. Первый и третий столбцы содержат значения из таблицы OFFICES
. Во втором столбце для всех строк содержится одна и та же текстовая строка из двенадцати символов.
Теперь давайте рассмотрим, как выбрать все данные из таблицы через запрос SELECT.