Цель раздела - ознакомление с оператором SELECТ, который является одним из наиболее важных и востребованных операторов SQL, с его форматом и свойствами.
Оператор SELECT - один из важнейших операторов SQL, который используется чаще других [4, 6]. Он позволяет выбирать необходимую информацию из отношений БД и преобразовывать ее в тот вид, который удовлетворяет пользователей. С его помощью можно реализовать достаточно сложные и громоздкие условия выбора данных из различных взаимосвязанных таблиц.
Оператор SELECT полностью отвлеченный от вопросов представления данных [4, 6 - 8]. Все внимание при его применении сконцентрирована на проблемах доступа к данным. Он имеет такой формат:
SELECT [DISTINCT | ALL] {* | <значение>[, <выражение> ...]}
FROM <таблица>[,<таблица> ...]
[WHERE <условия поиска>]
[ORDER BY <список столбцов>]
[GROUP BY столбец [COLLATE collation]
[, столбец] [COLLATE collation], ...]
[HAVING <условия поиска>]
[UNION <оnepaтор SЕLECT>]
[PLAN <план выполнения запроса>]
Этот формат с первого взгляда покажется достаточно сложным, но при постепенном изучении возможностей оператора SELECT Вы увидите насколько он прост.
В простейшем случае оператор SELECT имеет следующий вид:
SELECT [DISTINCT | ALL] {* | <значенине>[, <значенине> ...]}
FROM <таблица>[,<таблица> ...]
С точки зрения реляционной алгебры данный оператор выполняет операцию проекции. После предложения FROM приводится список таблиц БД, из которых будем выбирать информацию, а после SELECT - список значений. В большинстве случаев это имена столбцов таблиц, перечисленных после предложения FROM. Звездочка указывает на то, что при выполнении запроса нужно включить все столбцы таблиц.
Выдать набор данных, содержащий все атрибуты и кортежи отношения Readers (табл. 6.1).
SELECT *
FROM Readers
Это еквивалентно
SELECT Code, FamilyName, Name, Patronymic, ReaderCardNumber, PasportCode, Job, Post, Note
FROM Readers
Таблица 6.1
ReaderCode | FamilyName | Name | Patronymic | ReaderCardNumber | PasportCode | Job | Post | Note |
---|---|---|---|---|---|---|---|---|
1 | Иванов | Петр | Иванович | 317 | 4 | НГУ, каф. ЭВТ | Ассистент | NULL |
2 | Федорец | Ирина | Олеговна | 28 | 1 | НГУ, АХЧ | Вахтер | NULL |
3 | Ильин | Иван | Петрович | 1345 | 11 | НГУ, каф. физики | Доцент | NULL |
4 | Суренко | Дмитрий | Павлович | 543 | 6 | НГУ, каф. геофизики | Ст. препод. | NULL |
5 | Коршунова | Наталья | Юрьевна | 128 | 8 | НГУ, каф. геоиформатики | Ассистент | NULL |
6 | Носенко | Олег | Владимирович | 5672 | 5 | НГУ, ИКК | Инженер | NULL |
7 | Брусов | Владимир | Михайлович | 485 | 24 | НГУ, каф. геодезии | Лаборант | NULL |
8 | Козырев | Алексей | Сергеевич | 759 | 15 | НГУ, каф. криминологии | Профессор | NULL |
9 | Левченко | Юлия | Павловна | 146 | 18 | НГУ, каф. политической теории | Заведующая кафедры | NULL |
10 | Светлая | Татьяна | Ивановна | 2021 | 22 | НГУ, каф. переводов | Ст. препод. | NULL |
11 | Щеглов | Петр | Евгеньевич | 997 | 14 | НГУ, каф. электроснабжения | Ассистент | NULL |
12 | Кириленко | Виктор | Александрович | 1010 | 17 | НГУ, каф. электропривода | Зам. декана | NULL |
Оператор SELECT позволяет формировать столбцы, содержащие результаты расчетов. Для этого используют арифметические выражения, построенные по правилам, принятым в алгоритмических языках.
SELECT [DISTINCT | ALL] {* | <значенине>[, <выражение> ...]}
FROM <таблица>[, <таблица> ...]
ПРИМЕР 6.2
Для каждой книги из таблицы BookInventoryNumbers определите величину произведения её цены на сумму значений кода и фонда книг.
SELECT Code, InventoryNumber, (BookCode + FundCode) * Cost
FROM BookInventoryNumbers
Необходимо понимать, что этот пример не имеет логического нагрузки. Он приведен только для демонстрации возможностей оператора SELECT. Результат, полученный с помощью вычисления выражения (BookCode + FundCode) × Cost для каждой записи таблицы BookInventoryNumbers, заносится в столбец, которому по умолчанию СУБД присвоила имя Column3 (табл. 6.2).
Таблица 6.2
Code | InventoryNumber | Column3 |
---|---|---|
1 | 4567890 | 31,12 |
2 | 4510000 | 66,99 |
3 | 4532477 | 136,04 |
4 | 4512890 | 64,95 |
5 | 4678532 | 397,46 |
6 | 4632112 | 80,80 |
7 | 7569832 | 661,5 |
8 | 5478956 | 405,9 |
9 | 2145876 | 592,5 |
10 | 5214786 | 360,5 |
11 | 5268933 | 816,2 |
12 | 7865890 | 277,16 |
13 | 6589321 | 476,97 |
14 | 7812639 | 673,82 |
15 | 7523690 | 419,85 |
Возможно переименовать любой столбец таблицы, который является результатом работы оператора SELECT. Для этого нужно после выражения или имени столбца исходной таблицы указать предложение AS и дальше новое имя:
SELECT [DISTINCT | ALL] {* | <значение>[, <выражение[AS <имя столбца>]> ...]}
FROM <таблица>[, <таблица> ...]
ПРИМЕР 6.3
Переименуйте в «Example» столбец, значения в котором вычисляются с помощью арифметического выражения, рассматриваемого в предыдущем примере.
SELECT Code, InventoryNumber, (BookCode + FundCode) * Cost AS Example
FROM BookInventoryNumbers
Повторяющимися записями (строками), считаются те, которые имеют идентичные значения во всех столбцах таблицы. Если результирующая таблица должна содержать только уникальные записи, то после SELECT указывают предложение DISTINCT. Если в результирующую таблицу необходимо включить все записи, то указывают ALL. Это предложение действует по умолчанию:
SELECT [DISTINCT | ALL] [DISTINCT | ALL] {* | <значение>[, <выражение> ...]}
FROM <таблица>[, <таблица> ...]
ПРИМЕР 6.4
Выведите коды библиотекарей, которые выдавали книги (табл. 6.3).
SELECT OutLibrarianCode
FROM BookGiveOutRecord
Таблица 6.3
OutLibrarianCode |
---|
4 |
4 |
4 |
3 |
10 |
7 |
8 |
9 |
8 |
9 |
10 |
Обратите внимание на то, что результат выполнения запроса содержит строки, которые дублируются, поскольку, в отличие от операции проекции реляционной алгебры, оператор SELECT по умолчанию их не исключает. Для извлечения дублирующихся строк с результирующей таблицы используется предложение DISTINCT (табл. 6.4):
SELECT DISTINCT OutLibrarianCode
FROM BookGiveOutRecord
Таблица 6.4
OutLibrarianCode |
---|
4 |
3 |
10 |
7 |
8 |
9 |
В отношении, которое формирует оператор SELECT, последовательность размещения кортежей неопределена. Это удобно далеко не всегда. Установить, по которым атрибутами необходимо отсортировать кортежи, можно в предложении ORDER BY. Она содержит список имён столбцов, разделенных запятыми, по которому будет осуществляться сортировка. Первый столбец в списке будет использован для глобального сортировки, второй - для сортировки внутри группы, которая определена единым значением первого столбца, и т.д.
SELECT [DISTINCT | ALL] [DISTINCT | ALL] {* | <значение>[, <выражение> ...]}
FROM <таблица>[, <таблица> ...]
ORDER BY <список столбцов>
ПРИМЕР 6.5
Создайте список читателей библиотеки по алфавиту (табл. 6.5).
SELECT *
FROM Readers
ORDER BY FamilyNamе, Name, Patronymic
Таблица 6.5
ReaderCode | FamilyName | Name | Patronymic | ReaderCardNumber | PasportCode | Job | Post | Note |
---|---|---|---|---|---|---|---|---|
7 | Брусов | Владимир | Михайлович | 485 | 24 | НГУ, каф. геодезии | Лаборант | NULL |
1 | Иванов | Петр | Иванович | 317 | 4 | НГУ, каф. ЭВТ | Ассистент | NULL |
3 | Ильин | Иван | Петрович | 1345 | 11 | НГУ, каф. физики | Доцент | NULL |
12 | Кириленко | Виктор | Александрович | 1010 | 17 | НГУ, каф. электропривода | Зам. декана | NULL |
8 | Козырев | Алексей | Сергеевич | 759 | 15 | НГУ, каф. криминологии | Профессор | NULL |
5 | Коршунова | Наталья | Юрьевна | 128 | 8 | НГУ, каф. геоиформатики | Ассистент | NULL |
9 | Левченко | Юлия | Павловна | 146 | 18 | НГУ, каф. политической теории | Заведующая кафедры | NULL |
6 | Носенко | Олег | Владимирович | 5672 | 5 | НГУ, ИКК | Инженер | NULL |
10 | Светлая | Татьяна | Ивановна | 2021 | 22 | НГУ, каф. переводов | Ст. препод. | NULL |
4 | Суренко | Дмитрий | Павлович | 543 | 6 | НГУ, каф. геофизики | Ст. препод. | NULL |
2 | Федорец | Ирина | Олеговна | 28 | 1 | НГУ, АХЧ | Вахтер | NULL |
11 | Щеглов | Петр | Евгеньевич | 997 | 14 | НГУ, каф. электроснабжения | Ассистент | NULL |
В набор данных, возвращает оператор SELECT, можно помещать только те записи, которые соответствуют некоторым заданным условиям отбора или условиям поиска, указывающие в предложении WHERE оператора SELECT:
SELECT [DISTINCT | ALL] [DISTINCT | ALL] {* | <значение>[, <виражение> ...]}
FROM <таблица>[, <таблица> ...]
ORDER BY <список столбцов>
WHERE <условия поиска>
Условия поиска по терминологии ISO разделяют на пять основных типов - пять предикатов: сравнение, попадание в диапазон, соответствие шаблону, принадлежность к множеству и наличие определителя NULL.
Сравнения позволяет сравнивать результаты вычисления одного выражения результатам вычисления другое. Как выражения применяются: константы, значения атрибутов, арифметические выражения, скалярные операторы SELECT. Между выражениями могут быть задействованы такие операторы сравнения: = (равно), < (меньше), > (больше), <=(меньше или равно),>= (больше или равно), !< (не менее, то есть больше или равно ), !> (не более, то есть меньше или равно), <> (не равно), != (не равно).
Результаты сравнения нескольких выражений могут быть объединены операторами OR и AND. Использование оператора NOT позволяет получить инверсию результата сравнения выражений. Принадлежность значений к заданному диапазону можно проверить объединив два результата сравнения с помощью оператора AND. Также в языке SQL есть специальная функция BETWEEN, которая позволяет проверить принадлежность результатов вычисления выражения заданному диапазону . Для проверки соответствия выражения некоторому шаблону в языке SQL предусмотрены следующие операторы : LIKE , CONTAINING, STARTING. Принадлежность результатов вычисления выражения множеству проверяется с помощью оператора IN. Проверка наличия неопределенного значения в атрибуте отношения осуществляется оператором IS NULL.
Сравнение констант со значениями в атрибуте отношения - одно из простых условий поиска, задействованное в предложении WHERE оператора SELECT.
ПРИМЕР 6.6
Составьте список библиотекарей с табельным номером, который больше числа 80.
σClockNumber > 80 (Librarians)
SELECT *
FROM Librarians
WHERE ClockNumber > 80
Здесь Librarians - является исходным отношением, а выражение ClockNumber > 80 - предикатом. Операция выборки определяет новое отношение, содержащее только те кортежи исходного отношения, в которых значение атрибута ClockNumber превышает число 80 (табл. 5.1).
Сравнение значений атрибутов отношений в большинстве случаев используется для реализации их внутреннего соединения.
ПРИМЕР 6.7
Создайте список читателей, которые когда-либо брали книги в библиотеке (табл. 5.4).
(ПCode, FamilyName, Name(Readers))►◄Readers.Code = ReaderCode(ПCode, ReaderCode, InventoryCode(BookGiveOutRecord))
В примере тета-соединение для составления этого списка использовалось соединение по эквивалентности. В нем присутствовали два атрибута Readers.Code и ReaderCode. Если бы они имели одинаковое имя, например ReaderCode, то для исключения из результирующего отношения одного из них можно было бы воспользоваться операцией натурального соединения:
(ПReaderCode, FamilyName, Name(Readers))►◄(ПCode, ReaderCode, InventoryCode(BookGiveOutRecord))
Оператор SELECT будет выглядеть так:
SELECT Readers.Code, FamilyName, Name, BookGiveOutRecord.Code, BookGiveOutRecord.ReaderCode, ReaderCode, InventoryCode
FROM BookGiveOutRecord, Readers
WHERE Readers.Code = BookGiveOutRecord.ReaderCode
При выполнении оператора SELECT для каждого кортежа отношения BookGiveOutRecord в таблице Readers выбирается строка, где значение атрибута ReaderCode совпадает со значением атрибута Code текущего кортежа отношения Readers. При этом не имеет значения, в какой последовательности расположить столбцы таблиц в условии поиска: Readers.Code = BookGiveOutRecord.ReaderCode идентично BookGiveOutRecord.ReaderCode = Readers.Code.
Для тета-соединение двух отношений R и S результирующее отношение формируется в такой логической последовательности:
ЗАМЕЧАНИЕ! Определение «логическая последовательность» употреблено не случайно. В проектировании СУБД всегда различают два уровня - логический и физический. Логический уровень - это чаще всего абстрактный уровень, поскольку нам так легче понимать процессы. Физический уровень определяет процессы, которые действительно происходят, но в большинстве случаев скрыты от взгляда. Физические процессы могут и не совпадать с логическим представлением о них.
SQL-сервер при выполнении запроса всегда стремится его оптимизировать, то есть выполнить максимально быстро при минимальных затратах ресурсов. В частности, оптимизация запросов в InterВase представляет собой «черный ящик», то есть нельзя сказать, как будет выполняться конкретный запрос, поскольку при оптимизации не последнюю роль играет текущее состояние БД. Процесс оптимизации запросов будет рассмотрен далее.
Сравнение значения столбца с результатом вычисления выражения чаще всего применяется при использовании механизма вложенных подзапросов (операторов SELECT, которые вложены друг в друга), речь о них пойдет позже. Сначала рассмотрим случай, когда результат вычисления выражения сравнивается с содержимым атрибута отношения.
ПРИМЕР 6.8
Для каждой книги определите величину произведения ее цены на сумму значений кода и фонда книги. Выберем только те строки, в которых результат, полученный при вычислении данного выражения превышает число 120 (табл.6.6).
SELECT Code, InventoryNumber, (BookCode + FundCode) * Cost AS Example
FROM BookInventoryNumbers
WHERE ((BookCode + FundCode) * Cost) > 120
Таблица 6.6
Code | InventoryNumber | Example |
---|---|---|
3 | 4532477 | 136,04 |
5 | 4678532 | 397,46 |
7 | 7569832 | 661,5 |
8 | 5478956 | 405,9 |
9 | 2145876 | 592,5 |
10 | 5214786 | 360,5 |
11 | 5268933 | 816,2 |
12 | 7865890 | 277,16 |
13 | 6589321 | 476,97 |
14 | 7812639 | 673,82 |
15 | 7523690 | 419,85 |
Использование операторов AND, OR и NOT позволяет строить более сложные условия поиска. Для устранения любой возможной неоднозначности рекомендуется использовать скобки. Выражения вычисляются по следующим правилам:
выражение вычисляется слева направо;
первыми вычисляются подвыражения в скобках;
операторы NOT выполняются раньше операторов AND и OR;
операторы AND выполняются перед оператороами OR;
ПРИМЕР 6.9
Приведите фамилии, имена и отчества тех читателей, которые занимают должности доцентов или ассистентов (табл. 6.7).
SELECT Code, FamilyName, Name, Patronymic, Job, Post
FROM Readers
WHERE Post = ‘Доцент’ OR Post = ’Асистент’;
В этом примере для выборки сведений о читателях, которые занимают должности доцентов или ассистентов, в предложении WHERE используется логический оператор OR: Post = 'Доцент' или Post = 'Ассистент'.
Таблица 6.7
Code | FamilyNamе | Name | Patronymic | Job | Post |
---|---|---|---|---|---|
1 | Иванов | Петр | Иванович | НГУ, каф. ЭВТ | Ассистент |
3 | Ильин | Иван | Петрович | НГУ, каф. физики | Доцент |
5 | Коршунова | Наталья | Юрьевна | НГУ, каф. геоиформатики | Ассистент |
11 | Щеглов | Петр | Евгеньевич | НГУ, каф. электроснабжения | Ассистент |
В примере 6.7 в перечне столбцов после предложения SELECT и в условиях поиска после WHERE перед именем столбца через точку указано название таблицы. В ряде случаев наличие названия таблицы перед именем столбца обязательно, поскольку в разных таблицах могут содержаться одноименные столбцы (как в нашем примере), а SQL-сервер должен знать, со столбцом какой таблицы он имеет дело.
Использовать имена таблиц для идентификации столбцов неудобно из-за их громоздкости. Псевдонимы, которые приводятся через пробел после имени таблицы в предложении FROM делают компактнее запись оператора SELECT :
SELECT [DISTINCT | ALL] {* | <значение>[, <виражение> ...]}
FROM <таблица псевдоним>[, <таблица псевдоним> ...]
[WHERE <условия поиска>]
[ORDER BY <список столбцов>]
Например, запрос, который рассмотрен в примере 6.7, после определения в нем псевдонимов таблиц, намного компактнее:
SELECT R.Code, FamilyName, Name, B.Code, ReaderCode, InventoryCode
FROM BookGiveOutRecord B, Readers R
WHERE R.Code = B.ReaderCode
Использование оператора сравнения BETWEEN позволяет в условии поиска указать, что некоторое значение должно находиться в интервале между двумя другими. Зарезервировано слово NOT инвертирует условие
<значение> [NOT] BETWEEN <значение> AND <значение>
ПРИМЕР 6.10
Перечислите инвентарные номера книг, цена которых находится в диапазоне от 20 до 60 гривен включительно (табл. 6.8).
SELECT InventoryNumber, Cost
FROM BookInventoryNumbers
WHERE BETWEEN 20 AND 60
Приведенный выше запрос можно переписать так:
SELECT InventoryNumber, Cost
FROM BookInventoryNumbers
WHERE Cost >= 20 AND Cost <=60;
Многие считают, что проверка принадлежности данных диапазону с помощью оператора BETWEEN является более простым способом записи, чем использование обычной проверки, которая рассмотрина в последнем операторе SELECT.
Таблица 6.8
InventoryNumber | Cost |
---|---|
4510000 | 22,33 |
4532477 | 34,01 |
4678532 | 56,78 |
5478956 | 45,10 |
2145876 | 59,25 |
5214786 | 36,05 |
7865890 | 21,32 |
6589321 | 36,69 |
7812639 | 48,13 |
7523690 | 27,99 |
Оператор LIKE задает шаблоны сравнения строковых значений. Он чувствителен к регистру. Если необходимо проверить удовлетворяет или нет значение столбца или результат вычисления строкового выражения шаблону (<значение> после предложения LIKE), то в условии поиска необходимо указать
<значение> [NOT] LIKE <значение> [ESCAPE <символ>]
В шаблоне используются специальные символы - «%» и «_». Символ «%» (процент) применяется для указания строки символов любой длины, а символ "_" (подчеркивание) - для указания любого единичного символа. Например:
IssuePlace LIKE 'М%' - этот шаблон означает, что первым символом строчного значения обязательно должна быть большая буква «М», а все другие символы являются произвольными и не проверяются;
IssuePlace LIKE ‘М_’ - этот шаблон означает, что строковое значение должно иметь длину, равную только двум символам, причем первым символом обязательно должен быть символ «М»;
IssuePlace LIKE '%е' - этот шаблон определяет любое строковое значение длиной не менее одного символа, причем последним символом обязательно должна быть символ «е»;
IssuePlace LIKE '%Днепропетровская область%' - этот шаблон означает, что нас интересует любая последовательность символов, которая содержит подстроку «Днепропетровская область»;
IssuePlace LIKE 'М%' - этот шаблон указывает на то, что нужны строки, которые не начинаются с символа «М».
Если необходимо, чтобы строка включала служебный символ, который используется как символ подстановки, то следует применить «escape»-символ, поместив его перед символом подстановки. Например, для проверки значений на соответствие ‘15%’ можно воспользоваться таким условием поиска:
LIKE '15#%' ESCAPE '#'
ПРИМЕР 6.11
Используя механизм поиска по шаблону, выведите код, серию и номер паспорта лиц, проживающих в Днепропетровской области (табл. 6.9).
SELECT Code, Series, Number, IssuePlace
FROM PasportData
WHERE IssuePlace LIKE '%Днепропетровская область%'
Таблица 6.9
Code | Series | Number | IssuePlace |
---|---|---|---|
3 | АБ | 87134 | Днепропетровская область, село Солёное |
7 | АЗ | 43188 | Днепропетровская область, г. Днепродзержинск |
12 | ІК | 45190 | Днепропетровская область, село Петропавловка |
ЗАМЕЧАНИЕ! Строго говоря последний SQL-запрос поместил в результирующее отношение информацию только о тех людях, у которых в атрибуте IssuePlace является последовательность символов, которая совпадает с шаблоном в условиях поиска (см. данные в отношении PasportData). Например, человек, для которого значение в атрибуте Code = 18, проживает в городе Днепропетровске, который расположен в пределах Днепропетровской области, но значение в атрибуте IssuePlace не соответствует заданному шаблону. Такое положение вещей говорит об отсутствии правил ввода информации в атрибут IssuePlace.
Оператор STARTING чувствителен к регистру. Он используется тогда, когда в условии поиска необходимо, чтобы значение какого-либо столбца или выражения начиналось с определенной последовательности символов:
<значение> [NOT] STARTING [WITH] <значение>
ПРИМЕР 6.12
Выберите коды, фамилии, имена и отчества читателей, в которых фамилии начинаются с буквы «И» (табл. 6.10).
SELECT Code, FamilyName, Name, Patronymic
FROM Readers
WHERE FamilyName STARTING WITH 'І'
Таблица 6.10
Code | FamilyName | Name | Patronymic |
---|---|---|---|
1 | Иванов | Петр | Иванович |
3 | Ильин | Иван | Петрович |
Оператор CONTAINING не чувствителен к регистру. Он используется тогда, когда необходимо, чтобы значение какого-либо столбца или выражения состояло (неважно с какой позиции) с заданной последовательности символов:
<значение> [NOT] CONTAINING <значение>
ПРИМЕР 6.13
Выберите коды, фамилии, имена и отчества читателей, к фамилиям которых входит последовательность букв «ко» (табл. 6.11).
SELECT Code, FamilyName, Name, Patronymic
FROM Readers
WHERE FamilyName CONTAINING 'ко'
Таблица 6.11
Code | FamilyName | Name | Patronymic |
---|---|---|---|
4 | Суренко | Дмитрий | Павлович |
5 | Коршунова | Наталья | Юрьевна |
6 | Носенко | Олег | Владимирович |
8 | Козырев | Алексей | Сергеевич |
9 | Левченко | Юлия | Павловна |
12 | Кириленко | Виктор | Александрович |
Функция UPPER(<значение>) используется для преобразования букв строчных значений (содержания столбца, результата вычисления выражения) в прописные буквы. Функция UPPER может применяться как в списке столбцов результирующего набора данных (после предложения SELECT), так и в условиях поиска в предложении WHERE, если необходимо игнорировать регистр букв.
ПРИМЕР 6.14
Выберите коды, фамилии, имена и отчества читателей в фамилии которых содержится последовательность букв «ко» независимо от того строчные они или прописные. Фамилию вывести строчными буквами (табл. 6.12).
SELECT Code, UPPER(FamilyName), Name, Patronymic
FROM Readers
WHERE FamilyName CONTAINING 'ко'
Таблица 6.11
Code | FamilyName | Name | Patronymic |
---|---|---|---|
4 | СУРЕНКО | Дмитрий | Павлович |
5 | КОРШУНОВА | Наталья | Юрьевна |
6 | НОСЕНКО | Олег | Владимирович |
8 | КОЗЫРЕВ | Алексей | Сергеевич |
9 | ЛЕВЧЕНКО | Юлия | Павловна |
12 | КИРИЛЕНКО | Виктор | Александрович |
Функция CAST используется тогда, когда возникает потребность трактовать значения одного типа как значение другого типа. Например, использовать числовое значение как символьную строку или наоборот. В этом случае применяют функцию
CAST( <значение> AS <тип данных>)
Функция CAST копирует значения, преобразую их до определенного типа данных. При этом не следует забывать про перечень типов данных, в который может быть преобразовано текущее значение:
Тип данных | Можно привести к типам |
---|---|
NUMERIC | CHARACTER, DATE |
CHARACTER | NUMERIC, DATE |
DATE | CHARACTER, NUMERIC |
ПРИМЕР 6.15
Выберите коды, серии и номера паспортов, в номерах которых встречается число «84» (табл. 6.13).
SELECT Code, Series, Number
FROM PasportData
WHERE CAST(Number AS CHAR(5)) LIKE '%84%'
Таблица 6.13
Code | Series | Number |
---|---|---|
9 | АС | 90843 |
11 | ИК | 10842 |
Такая проверка осуществляется с помощью оператора IN
<значение> [NOT] IN (<значение>[, <значение> ...])
Множество значений может быть сформировано с помощью оператора SELECT. Этот случай будет рассмотрен ниже при изучении вложенных подзапросов, которые возвращают множество значений.
ПРИМЕР 6.16
Используя таблицу PasportData, выведите код, серию и номер паспорта людей, которые проживают в Донецке или Киеве (табл. 6.14).
SELECT Code, Series, Number, IssuePlace
FROM PasportData
WHERE IssuePlace IN ('Донецк', 'Киев');
Как и при рассмотрении оператора BETWEEN, использование ключевого слова IN позволяет проще записать условия поиска, особенно, если список допустимых значений достаточно большой. Такой же результат может быть получен с помощью следующего запроса:
SELECT Code, Series, Number, IssuePlace
FROM PasportData
WHERE IssuePlace = 'Донецк' OR IssuePlace = 'Киев';
Таблица 6.14
Code | Series | Number | IssuePlace |
---|---|---|---|
4 | АЭ | 12300 | Донецк |
6 | АЖ | 01568 | Киев |
15 | АК | 89125 | Киев |
16 | АК | 55706 | Донецк |
20 | АК | 12578 | Киев |
Благодаря возможности расчетов арифметических выражений, использованию агрегатных функций, простых и сложных условий поиска, вложенных подзапросов оператор SELECT обеспечивает почти все потребности представления информации в виде, который необходим пользователям. А если это невозможно выполнить с помощью одного оператора, то последовательно используют несколько операторов, с учетом того, что результатом работы любого оператора SELECT является двумерная таблица, которая может быть начальной для следующего оператора.
© Куваев Я.Г., 2005—2023.
Все права защищены.
Вся информация, размещенная на данном веб-сайте, предназначена только для персонального использования и не подлежит дальнейшему воспроизведению и/или распространению в какой-либо форме, иначе как с письменного разрешения Автора.