четверг, 23 февраля 2017 г.

Переименование столбцов и вычисления в результирующем наборе

Переименование столбцов и вычисления в результирующем наборе

Имена столбцов, указанные в предложении SELECT, можно переименовать. Это делает результаты более читабельными, поскольку имена полей в таблицах часто сокращают с целью упрощения набора. Ключевое слово AS, используемое для переименования, согласно стандарту можно и опустить, т.к. оно неявно подразумевается.
Например, запрос
SELECT ram AS Mb, hd Gb
FROM Pc
WHERE cd = '24x';

переименует столбец ram в Mb (мегабайты), а столбец hd в Gb (гигабайты). Этот запрос возвратит объемы оперативной памяти и жесткого диска для тех компьютеров, которые имеют 24-скоростной CD-ROM:

MbGb
648
3210
Переименование особенно желательно при использовании в предложении SELECT выражений для вычисления значения. Эти выражения позволяют получать данные, которые не находятся непосредственно в таблицах. Если выражение содержит имена столбцов таблицы, указанной в предложении FROM, то выражение подсчитывается для каждой строки выходных данных. Так, например, чтобы вывести объем оперативной памяти в килобайтах, можно написать:
SELECT ram * 1024 AS Kb, hd Gb
FROM Pc
WHERE cd = '24x';

Теперь будет получен следующий результат:

KbGb
655368
3276810
Иногда бывает необходимо выводить поясняющую информацию рядом с соответствующим значением. Это можно сделать, добавив строковое выражение как дополнительный столбец. Например, запрос
SELECT ram, 'Mb' AS ram_units, hd, 'Gb' AS hd_units
FROM Pc
WHERE cd = '24x';

даст следующий результат:

ramram_unitshdhd_units
64Mb8Gb
32Mb10Gb
Если же явно не указать имя для выражения, то будет использован способ именования по умолчанию, который зависит от используемой СУБД. Так в MS Access будут использованы имена типа выражение1 и т.д., а выходной столбец в MS SQL Server вообще не будет иметь заголовка.

Предикаты (часть 2)

Предикат LIKE

Синтаксис LIKE::=
<Выражение для вычисления значения строки>
[NOT] LIKE
<Выражение для вычисления значения строки>
[ESCAPE <символ>]
Предикат LIKE сравнивает строку, указанную в первом выражении для вычисления значения строки, называемого проверяемым значением, с шаблоном, который определен во втором выражении для вычисления значения строки. В образце разрешается использовать два трафаретных символа:
  • Символ подчеркивания (_), который можно использовать вместо любого единичного символа в проверяемом значении.
  • Символ процента (%), который заменяет набор любых символов (число символов в наборе может быть от 0 и более) в проверяемом значении.
Если проверяемое значение соответствует образцу с учетом трафаретных символов, то значение предиката равно TRUE. Ниже приводится несколько примеров написания шаблонов.

ШаблонОписание
'abc%'Любые строки, которые начинаются с букв "abc".
'abc_'Строки длиной строго 4 символа, причем первыми символами строки должны быть "abc".
'%z'Любая последовательность символов, которая обязательно заканчивается символом "z".
'%Rostov%'Любая последовательность символов, содержащая слово "Rostov" в любом месте строки.
Пример. Найти все корабли, имена классов которых заканчиваются на букву 'о':
SELECT *
FROM Ships
WHERE class LIKE '%o';

Результатом выполнения запроса будет следующая таблица:

nameclasslaunched
HarunaKongo1916
HieiKongo1914
KirishimaKongo1915
KongoKongo1913
MusashiYamato1942
YamatoYamato1941
Пример. Найти все корабли, имена классов которых заканчиваются на букву 'о', но не на 'go':
SELECT *
FROM Ships
WHERE class NOT LIKE '%go' AND class LIKE '%o';

nameclasslaunched
MusashiYamato1942
YamatoYamato1941
Если искомая строка содержит трафаретный символ, то следует задать управляющий символ в предложении ESCAPE. Этот управляющий символ должен использоваться в шаблоне перед трафаретным символом, сообщая о том, что трафаретный символ следует трактовать как обычный символ. Например, если в некотором поле следует отыскать все значения, содержащие символ "_", то шаблон '%_%' приведет к тому, что будут возвращены все записи из таблицы. В данном случае шаблон следует записать следующим образом:
'%#_%' ESCAPE '#'
Для проверки значения на соответствие строке "25%" можно воспользоваться таким предикатом:
LIKE '25|%' ESCAPE '|'
Истинностное значение предиката LIKE присваивается в соответствии со следующими правилами:
  • Если либо проверяемое значение, либо образец, либо управляющий символ равен NULL, истинностное значение равно UNKNOWN.
  • В противном случае, если проверяемое значение и образец имеют нулевую длину, истинностное значение равно TRUE.
  • В противном случае, если проверяемое значение соответствует шаблону, то предикат LIKE равен TRUE.
  • Если не соблюдается ни одно из перечисленных выше условий, предикат LIKE равен FALSE.

Использование значения NULL в условиях поиска

Предикат
IS [NOT] NULL

позволяет проверить отсутствие (наличие) значения в полях таблицы. Использование в этих случаях обычных предикатов сравнения может привести к неверным результатам, т.к. сравнение со значением NULL дает результат UNKNOWN (неизвестно).
Так, если требуется найти записи в таблице Pc, для которых в поле price отсутствует значение (поиск ошибок ввода), можно воспользоваться следующим оператором:
SELECT *
FROM Pc
WHERE price IS NULL;

Рекомендуемые упражнения: 44.