Цель раздела - ознакомление с оператором SELECТ, который является одним из наиболее важных и востребованных операторов SQL, с его форматом и свойствами.
Наличие определителя NULL в строках таблицы проверяется с помощью такой конструкции:
<значение> IS [NOT] NULL
ПРИМЕР 6.17
Выбирите коды и названия книг, которые не имеют УДК (табл. 6.15).
SELECT Code, Name
FROM Books
WHERE UDK IS NULL;
Таблица 6.15
Code | Name |
---|---|
1 | Автоматизация производственных процессов на обогатительной фабрике |
2 | Решение задач по автоматизации процессов обогащения и металлургии |
3 | Асимптотические методы оптимального управления |
4 | Синтез оптимальных автоматических систем |
5 | Методы оптимизации стохастических систем |
6 | Автоматизированные системы управления технологическим процессом обогащения руды |
7 | C/C++ Программирование на языке высокого уровня |
8 | Компьютерные сети. Принципы, технологии, протоколы |
9 | Справочник по дифференциальным уравнениям с частными производными первого порядка |
10 | Теория вероятностей и математическая статистика |
11 | C#. Программирование на языке высокого уровня |
12 | Теория вероятностей и математическая статистика |
13 | Теория вероятностей и математическая статистика |
14 | Дискретно-групповые методы интегрирования обыкновенных дифференциальных уравнений |
Расчет итоговых значений в операторе SELECT осуществляется с помощью агрегатных или статистических функций: COUNT(), SUM(), AVG(), МАХ(), МIN().
Функция COUNT(<выражение>) подсчитывает число вхождений значений выражения во все записи результирующего набора данных. Она работает с данными любого типа: числовые, символьные или типа «дата/время».
ПРИМЕР 6.18
Определите, стоимость скольких книг превышает 25 грн. (табл. 6.16).
SELECT COUNT(*) AS cCount
FROM BookInventoryNumbers
WHERE Cost > 25;
Таблица 6.16
cCount |
---|
10 |
Если из группы одинаковых записей при подсчете необходимо учитывать только одну, то перед выражением в скобках вставляют предложение DISTINCT. Чаще всего как выражение выступают имена столбцов. Выражение может рассчитываться и по значениям нескольких таблиц:
COUNT (DISTINCT <виражение>)
ПРИМЕР 6.19
Определите, сколько различных библиотекарей выдавали книги (табл. 6.17).
SELECT COUNT(DISTINCT OutLibrarianCode) AS cCount
FROM BookInventoryNumbers
Таблица 6.17
cCount |
---|
6 |
Общее количество записей, которые соответствуют указанному условию, можно определить с помощью функции COUNT без фразы DISTINCT. Однако один и тот же библиотекарь может выдать несколько книг разным читателям. Предложение DISTINCT позволяет исключить из расчета значения, которые дублируются.
Функция SUM(<выражение>) рассчитывает сумму всех значений столбца или выражения. При этом столбец должен состоять из числовых данных (содержать целые числа, числа с плавающей запятой или денежные величины). Результат, возвращаемый этой функцией, имеет тот же тип данных, что и столбец или выражение, однако точность (разрядность) результата может быть выше. Например, если применить функцию SUM() к столбцу, содержащему 16-разрядные целые числа, то она может вернуть 32-разрядное целое число.
ПРИМЕР 6.20
Определите общую стоимость книг библиотечного фонда (табл. 6.18).
SELECT SUM(Cost) AS cSum
FROM BookInventoryNumbers
Таблица 6.18
cCount |
---|
6 |
Функции MIN(<выражение>), MAX(<выражение>) и AVG(<выражение>) позволяют рассчитать соответственно меньшее, большее и среднее значение в столбце или выражении. Функции MIN(), MAX() работают с числовыми, строковыми и данными типа «дата/время». AVG() работает только с числовыми данными. Результат, возвращаемый этими функциями, имеет такой же тип данных, как и выражение.
ПРИМЕР 6.21
Определите минимальную, максимальную и среднюю стоимость книг (табл. 6.19).
SELECT MIN(Cost) AS Mini, MAX(Cost) AS Maxi, AVG (Cost) AS Avgi
FROM BookInventoryNumbers
Таблица 6.19
Mini | Maxi | Avgi |
---|---|---|
10.10 | 74.2 | 38.27 |
Группировка записей используется тогда, когда необходимо получить агрегированные значения не для всего отношения, а отдельно по каждой группе кортежей, которые характеризуются общим признаком. Чаще всего это одинаковые значения в каком-либо атрибуте или группе атрибутов. Тогда в операторе SELECT используют предложение
GROUP BY столбец[, столбец ...]
При этом необходимо, чтобы один из столбцов результирующего набора данных обрабатывался агрегатной функцией.
ПРИМЕР 6.22
Определите количество книг, хранящихся в различных библиотечных фондах, а также их суммарную стоимость (табл. 6.20).
SELECT FundCode, COUNT(BookCode) AS cCount, SUM(Cost) AS cSum
FROM BookInventoryNumbers
GROUP BY FundCode
ORDER BY FundCode
Нет смысла включать имена столбцов BookCode и Cost в список фразы GROUPBY, поскольку в списке предложения SELECT они используются только в обобщающих функциях. Однако столбец FundCode в списке предложения SELECT не связан ни с одной обобщающей функцией, а потому обязательно должен быть указан во фразе GROUP BY .
Таблица 6.20
FundCode | cCount | cSum |
---|---|---|
1 | 9 | 307.95 |
2 | 6 | 266.05 |
При обработке этого запроса логика выполнения операций такая.
Таблица 6.21
FundCode | BookCode | Cost | СOUNT(BookCode) | SUM(Cost) | |
---|---|---|---|---|---|
1 | 1 | 15.56 | 9 | 307.95 | |
1 | 2 | 22.33 | |||
1 | 3 | 34.01 | |||
1 | 4 | 12.99 | |||
1 | 9 | 36.05 | |||
1 | 10 | 74.2 | |||
1 | 12 | 36.69 | |||
1 | 13 | 48.13 | |||
1 | 14 | 27.99 | |||
2 | 5 | 56.78 | 6 | 266.05 | |
2 | 6 | 10.10 | |||
2 | 7 | 73.50 | |||
2 | 7 | 45.10 | |||
2 | 8 | 59.25 | |||
2 | 11 | 21.32 |
Строки таблицы BookInventoryNumbers делятся на группы согласно значениям кода фонда (FundCode). В нашем примере будут созданы две группы, по количеству уникальных значений в столбце FundCode . Для каждой из групп рассчитывается общее число строк, равное количеству кодов книг, а также сумма их стоимости (столбец Cost), которая нас интересует. Затем генерируется единая сводная строка для всей группы исходных строк. Наконец, полученные строки результирующей таблицы перегруппировывается в порядке возрастания номера кода фонда, указанного в столбце FundCode.
Условие отбора сгруппированных записей приводится в предложении
HAVING <условия поиска>
Здесь условия поиска задают согласно тем же правилам, что и в предложении WHERE. HAVING и WHERE можно совместно использовать в запросе. Сначала предложение WHERE исключает из расчета строки, не соответствующие ее условиям поиска. Дальше работают условия поиска предложения HAVING. Они отфильтровывают из результирующего набора данных группы строк, где итоговые значения не соответствуют им.
Стандарт ISO требует, чтобы имена столбцов, используемых в предложении HAVING, обязательно были в списке GROUP BY или обрабатывались агрегатными функциями. На практике условия поиска в предложении HAVING всегда включают, по меньшей мере, одну агрегатную функцию. Условия поиска, не содержащие агрегатных функций, должны входить в предложения WHERE и применяться для отбора отдельных строк. В условиях поиска предложения WHERE применять агрегатные функции запрещено.
ПРИМЕР 6.23
Для каждого библиотечного фонда, где хранится более шести книг, определите их количество и суммарную стоимость (табл. 6.22).
SELECT FundCode, COUNT(BookCode) AS cCount, SUM(Cost) AS cSum
FROM BookInventoryNumbers
GROUP BY FundCode
HAVING COUNT(BookCode) > 6
ORDER BY FundCode
Этот пример аналогичен предыдущему, но здесь используются дополнительные ограничения, указывающие на то, что нас интересуют сведения только о тех фонды, в которых хранится более шести книг. Подобное требование накладывается на группы, поєтому в запросе следует использовать фразу HAVING.
Таблица 6.22
FundCode | cCount | cSum |
---|---|---|
1 | 9 | 307.95 |
Подзапрос - это инструмент создания временной таблицы, содержимое которой обрабатывается внешним оператором. Внутренние запросы могут быть использованы для вычисления значений после предложения SELECT и в условиях поиска после операторов сравнения (=, <>,> =, <=, <<) или IN в предложениях WHERE и HAVING внешнего оператора SELECT. Кроме того, подзапросы могут применяться в операторах INSERT, UPDATE и DELETE. Текст подзапроса берется в скобки.
Существует три вида подзапросов:
Для подзапросов устанавливаются такие правила и ограничения:
Когда невозможно обойтись одним подзапросом, тогда в нем используются вложенный подзапрос и т.д.
Скалярные подзапросы возвращают таблицу, состоящую из одного столбца и одной строки. Такую таблицу можно получить, если после предложения SELECT указать один столбец, а в предложении WHERE условие поиска создать с помощью потенциального ключа.
ПРИМЕР 6.24
Выведите на экран все даты возвратов книг читателем с номером читательского билета 28 (табл. 6.23).
SELECT ReturnDate, FactreturnDate
FROM BookGiveOutRecord
WHERE ReaderCode = (SELECT Code
FROM Readers
WHERE ReaderCardNumber = 28)
Внутренний оператор
SELECT Code
FROM Readers
WHERE ReaderCardNumber = 28)
предназначен для определения кода читателя с номером билета 28. После этого работает внешний запрос. Иначе говоря, внутренний оператор SELECT возвращает таблицу, которая имеет единственное значение - Code = 2. В результате внешний оператор SELECT приобретает следующий вид:
SELECT ReturnDate, FactreturnDate
FROM BookGiveOutRecord
WHERE ReaderCode = 2
Таблица 6.23
ReturnDate | FactreturnDate |
---|---|
25-SEP-04 | 24-SEP-04 |
Таблицу с одним столбцом и одной строкой можно получить, если после SELECT указать одну агрегатную функцию без использования группировки записей в предложении GROUP BY. В этом случае условия отбора приведенные в WHERE и HAVING, не играют несколь роли.
ПРИМЕР 6.25
Составьте список инвентарных номеров книг, стоимость которых выше средней. Укажите, насколько их стоимость выше средней стоимости всех книг библиотеки (табл. 6.24).
SELECT InventoryNumber,
Cost – (SELECT AVG(Cost)
FROM BookInventoryNumbers) AS Cost_diff
FROM BookInventoryNumbers
WHERE Cost > (SELECT AVG(Cost)
FROM BookInventoryNumbers)
Таблица 6.24
InventoryNumber | Cost_diff |
---|---|
4678532 | 18.51 |
7569832 | 35.23 |
5478956 | 6.83 |
2145876 | 20.98 |
5268933 | 35.93 |
7812639 | 9.86 |
Следует отметить, что нельзя употреблять «WHERE Cost > AVG(Cost)», поскольку использовать агрегатные функции в предложении WHERE запрещено. Для достижения желаемого результата необходимо создать подзапрос, в котором рассчитывают среднюю стоимость книг, а затем применить его во внешнем операторе SELECT, который предназначен для выборки сведений о тех книгах, стоимость которых превышает среднюю. Иначе говоря, подзапрос возвращает среднюю стоимость книг библиотеки: 38,27 грн. Результат выполнения этого скалярного подзапроса используется во внешнем операторе SELECT как для расчета отклонения стоимости средней, так и для отбора сведений о книгах. Поэтому внешний оператор SELECT имеет следующий вид:
SELECT InventoryNumber, Cost – 38.27 AS Cost_diff
FROM BookInventoryNumbers
WHERE Cost > 38.27
Подзапросы, возвращающие множество значений, используются в качестве операнда предиката IN. Например, табличный подзапрос можно использовать вместо внутреннего соединения таблиц. Для иллюстрации этого вернемся к ПРИМЕРУ 6.7: «Создайте список читателей, которые когда-либо принимали книги в библиотеке». С табличным подзапросом и псевдонимами таблиц оператор SELECT будет выглядеть так:
SELECT ReaderCode, FamilyName, Name, B.Code, InventoryCode
FROM Readers R
WHERE R.Code IN (SELECT ReaderCode
FROM BookGiveOutRecord B)
Все читатели, которые когда-либо принимали книги в библиотеке, зарегистрированные в таблице BookGiveOutRecord. Итак, нам необходимо вывести из таблицы Readers фамилии только тех читателей, коды которых находятся в множестве значений, возвращаемых подзапросом.
SELECT ReaderCode
FROM BookGiveOutRecord B)
Оператор EXISTS применяется тогда, когда в условиях поиска необходимо указать, что из таблицы нужно выбрать только те записи, для которых подзапрос возвращает одно или более значений:
[NOT] EXISTS(<подзапрос>)
Итак, оператор EXISTS применяется только с подзапросами. Он возвращает TRUE, если в результирующем наборе данных подзапроса есть одна или более записей. Иначе он возвращает FALSE. Для NOT EXISTS правила обратные.
ПРИМЕР 6.26
Выберите коды и названия тех книг студенческого фонда библиотеки, которые когда-либо выдавались читателям (табл. 6.25).
SELECT Code, Name
FROM Books
WHERE Code IN (SELECT BookCode
FROM BookInventoryNumbers
WHERE FundCode = (SELECT Code
FROM BookFunds
WHERE Name ='Студентський') AND
EXISTS (SELECT Code
FROM BookGiveOutRecord
WHERE InventoryCode = BookInventoryNumbers.Code))
Таблица 6.25
Code | Name |
---|---|
6 | Автоматизированные системы управления технологическим процессом обогащения руды |
7 | C/C++ Программирование на языке высокого уровня |
11 | C#. Программирование на языке высокого уровня |
Оператор SINGULAR применяется тогда, когда в условиях поиска необходимо указать, что из таблицы нужно выбрать только те записи, для которых подзапрос возвращает только одно значение.
[NOT] SINGULAR(<подзапрос>)
ПРИМЕР 6.27
Выберите коды и названия тех книг, которые выдавались читателям только один раз (табл. 6.26).
SELECT B.Code, B.Name
FROM Books B
WHERE B.Code IN (SELECT BIN.BookCode
FROM BookInventoryNumbers BIN
WHERE SINGULAR (SELECT BG.InventoryCode
FROM BookGiveOutRecord BG
WHERE BIN.Code = BG.InventoryCode))
Таблица 6.26
Code | Name |
---|---|
3 | Асимптотические методы оптимального управления |
4 | Синтез оптимальных автоматических систем |
7 | C/C++ Программирование на языке высокого уровня |
9 | Справочник по дифференциальным уравнениям с частными производными первого порядка |
14 | Дискретно-групповые методы интегрирования обыкновенных дифференциальных уравнений |
Операторы ALL, SOME, ANY используются тогда, когда в условиях поиска необходимо указать, что значение (значение столбца, результат вычисления выражения), которое сравнивается, должны находиться в определенных отношениях со всеми значениями множества, возвращаемого подзапросом.
<значение> [NOT] <оператор сравнения> {ALL | SOME | ANY} (<подзапрос>)
Здесь подзапрос может возвращать несколько значений. Оператор выполняет операцию сравнения (>, >=, < и т.д.). Отношение между сравниваемым значением и значениями, возвращаются подзапросом, определяются с помощью операторов ALL и SOME (ANY). Итак,
WHERE STOLBEZ > ALL (SELECT POLE FROM TABLIZA)
вернет TRUE, если текущее значение атрибута «STOLBEZ» будет больше всех значений в атрибуте «POLE» отношения «TABLIZA»;
WHERE STOLBEZ > SOME (SELECT POLE FROM TABLIZA)
вернет TRUE, если текущее значение атрибута «STOLBEZ» будет больше хотя бы одного значения в атрибуте «POLE» отношения «TABLIZA».
ПРИМЕР 6.28
Найдите инвентарные номера всех книг, стоимость которых выше, по крайней мере, стоимости одной книги фонда под номером «1» (табл. 6.27).
SELECT BookCode, InventoryNumber, Cost
FROM BookInventoryNumbers
WHERE Cost > SOME (SELECT Cost
FROM BookInventoryNumbers
WHERE FundCode = '1'
В этом случае внутренний подзапрос вернет следующие значения: {15.56, 22.33, 34.01, 12.99, 36.05, 74.20, 36.69, 48.13, 27.99}, а внешний - выберет сведения о тех книгах, стоимость которых превышает по крайней мере одно из значений в этом списке (фактически, больше минимального значения - 12.99).
Таблица 6.27
BookCode | InventoryNumber | Cost |
---|---|---|
1 | 4567890 | 15,56 |
2 | 4510000 | 22,33 |
3 | 4532477 | 34,01 |
5 | 4678532 | 56,78 |
7 | 7569832 | 73,50 |
7 | 5478956 | 45,10 |
8 | 2145876 | 59,25 |
9 | 5214786 | 36,05 |
10 | 5268933 | 74,20 |
11 | 7865890 | 21,32 |
12 | 6589321 | 36,69 |
13 | 7812639 | 48,13 |
14 | 7523690 | 27,99 |
ПРИМЕР 6.29
Найдите инвентарные номера книг, стоимость которых выше стоимости любой книги книжного фонда под номером «1» (табл. 6.28).
SELECT BookCode, InventoryNumber, Cost
FROM BookInventoryNumbers
WHERE Cost > ALL (SELECT Cost
FROM BookInventoryNumbers
WHERE FundCode = '1'
Здесь внешний запрос выбирает сведения о книгах, стоимость которых больше максимального значения множества {15.56, 22.33, 34.01, 12.99, 36.05, 74.20, 36.69, 48.13, 27.99}.
Таблица 6.28
BookCode | InventoryNumber | Cost |
---|---|---|
10 | 5268933 | 74,20 |
Предложение HAVING используется тогда, когда в условиях поиска для вложенного подзапроса необходимо указать агрегатную функцию.
ПРИМЕР 6.30
В библиотеку экземпляры одной книги могут поступать в разное время и иметь разную стоимость. Определите код и среднюю стоимость экземпляров книг, у которых средняя стоимость одного экземпляра выше средней стоимости экземпляров других книг (табл. 6.29).
SELECT BIN1.Bookcode, InventoryNumber, AVG(BIN1.Cost) AS AvgCost
FROM BookInventoryNumbers BIN1
GROUP BY BIN1.Bookcode
HAVING AVG(Cost) >= ALL (SELECT AVG(BIN2.Cost)
FROM BookInventoryNumbers BIN2
GROUP BY BIN2.Bookcode)
Сначала из таблицы BookInventoryNumbers выбираем значение средней стоимости экземпляров всех книг (вложенный подзапрос). Затем из этой же таблицы выбираем код и среднюю стоимость экземпляра той книги, которая будет наибольшей.
Таблица 6.29
BookCode | InventoryNumber | Cost |
---|---|---|
10 | 5268933 | 74,20 |
Обратите внимание на то, что в этом случае псевдонимы таблиц используются не столько для сокращения записей, сколько для определения атрибутов, которые необходимы для внешнего и внутреннего операторов SELECT.
Внешнее соединение определяется в предложении FROM оператора SELECT. Оно записывается в следующем формате:
SELECT {* | <значение> [, <значение> ...]}
FROM <таблица> <вид соединения> JOIN <таблица> ON <условие поиска>
В результирующий набор данных включаются все записи базовой таблицы. Какая из таблиц будет ведущей, определяет вид соединения:
LEFT – (левое внешнее соединение), когда базовой является таблица, расположенная слева от названия типа соединения;
RIGHT – (правое внешнее соединение), когда базовой является таблица, расположенная справа от типа соединения;
FULL – в результирующий набор данных входят все строки таблицы, которая расположена слева от типа соединения, и таблицы, расположенной справа от типа соединения, даже если условия поиска для них не выполняются.
ПРИМЕР 6.31
Выполните внешнее левое и правое соединение таблиц 6.30 и 6.31 по атрибутам Р2 и Р1 соответственно.
Таблица 6.30
Столбец Р1 | Столбец Р2 | Столбец Р3 |
---|---|---|
A | x | 400 |
B | x | 200 |
C | y | 500 |
D | NULL | NULL |
Таблица 6.31
Столбец Р1 | Столбец Р2 |
---|---|
X | 1 |
Y | 2 |
Z | 2 |
Запишем оператор SELECT для левого соединения, обозначив таблицы 6.30 и 6.31 как А и В соответственно.
SELECT A.P1, A.P2, B.P2
FROM A LEFT JOIN B ON A.P2 = B.P1
Серым цветом изображены столбцы базовой таблицы А. Как видим, для строки таблицы А, где столбец А.Р1 имеет значение «D», нет парных записей в таблице В, которые удовлетворяли бы условие поиска А.Р2 = В.Р1. Поэтому данная запись таблицы А соединена с пустой записью (табл. 6.32).
Таблица 6.32
Столбец A.Р1 | Столбец A.Р2 | Столбец B.Р2 |
---|---|---|
A | x | 1 |
B | x | 1 |
C | y | 2 |
D | NULL | NULL |
Запишем оператор SELECT для правого соединения:
SELECT A.P1, A.P2, B.P2
FROM A RIGHT JOIN B ON A.P2 = B.P1
Серым цветом показан столбец базовой таблицы В. Как видим, для строки таблицы В, где столбец В.Р1 имеет значение «z», а столбец В.Р2 имеет значение «2» , нет парных записей в таблице А, для которых выполнялась бы условие поиска А.Р2 = В.Р1. Поэтому данная строка таблицы В соединен с пустой записью (табл. 6.33).
Таблица 6.33
Столбец A.Р1 | Столбец A.Р2 | Столбец B.Р2 |
---|---|---|
A | x | 1 |
B | x | 1 |
C | y | 2 |
NULL | NULL | 2 |
Иногда возникает необходимость в объединении двух или более результирующих наборов данных, которые возвращают отдельные операторы SELECT. Для этого результирующие наборы данных должны иметь одинаковую структуру, то есть одинаковое количество и одинаковый тип возвращаемых столбцов. Такие наборы данных называют совместимыми по объединением. Дублирующиеся записи из объединенного набора данных исключаются.
ПРИМЕР 6.32
Объединить результаты выполнения трех запросов:
1) Паспорта с серией «АА» (табл. 6.34).
SELECT *
FROM PasportData
WHERE Series = 'АА'
Таблица 6.34
Code | Series | Number | Birthday | Birthplace | Sex | IssuePlace | IssueDate | Note |
---|---|---|---|---|---|---|---|---|
1 | АА | 45003 | 30.05.1930 | Россия, г. Опочка | Ж | Днепропетровск | 12.01.1995 | NULL |
2 | АА | 15700 | 23.02.1930 | Россия, г. Владимир | Ж | г. Житомир | 16.03.2000 | NULL |
2) Паспорта, выданные в 2000 году (табл. 6.35).
SELECT *
FROM PasportData
WHERE IssueDate BETWEEN ‘01/01/2000’ AND ‘12/31/2000’
Таблица 6.35
Code | Series | Number | Birthday | Birthplace | Sex | IssuePlace | IssueDate | Note |
---|---|---|---|---|---|---|---|---|
2 | АА | 15700 | 23.02.1930 | Россия. г. Владимир | Ж | г. Житомир | 16.03.2000 | NULL |
8 | АК | 23490 | 05.01.1961 | Россия, город Самара | Ж | Днепропетровск | 13.09.2000 | NULL |
20 | АК | 12578 | 11.11.1987 | Донецк, Краматорск | Ж | Киев | 26.01.2000 | NULL |
3) Паспорта, номера которых начинаются на 4 (табл. 6.36).
SELECT *
FROM PasportData
WHERE Number LIKE '4%'
Таблица 6.36
Code | Series | Number | Birthday | Birthplace | Sex | IssuePlace | IssueDate | Note |
---|---|---|---|---|---|---|---|---|
1 | АА | 45003 | 30.05.1930 | Россия, г. Опочка | Ж | Днепропетровск | 12.01.1995 | NULL |
7 | АЗ | 43188 | 13.11.1970 | Днепропетровская область, г. Днепродзержинск | Ж | Днепропетровская область, г. Днепродзержинск | 15.05.1998 | NULL |
12 | ИК | 45190 | 18.07.1983 | Днепропетровская область, село Петропавлока | Ж | Днепропетровская область, село Петропавлока | 20.09.1999 | NULL |
18 | АЖ | 45879 | 04.02.1961 | Днепропетровск | Ж | Днепродзержинск | 14.03.1980 | NULL |
22 | АЯ | 45789 | 07.08.1972 | Угорщина | Ж | Ивано-Франковск | 03.10.1988 | NULL |
Объединим три набора данных (табл. 6.37).
SELECT *
FROM PasportData
WHERE Series = 'AA'
UNION
SELECT *
FROM PasportData
WHERE IssueDate BETWEEN ‘01/01/2000’ AND ‘12/31/2000’
UNION
SELECT *
FROM PasportData
WHERE Number LIKE '4%'
Таблица 6.37
Code | Series | Number | Birthday | Birthplace | Sex | IssuePlace | IssueDate | Note |
---|---|---|---|---|---|---|---|---|
1 | АА | 45003 | 30.05.1930 | Россия, г. Опочка | Ж | Днепропетровск | 12.01.1995 | NULL |
2 | АА | 15700 | 23.02.1930 | Россия, г. Владимир | Ж | г. Житомир | 16.03.2000 | NULL |
7 | АЗ | 43188 | 13.11.1970 | Днепропетровская область, г. Днепродзержинск | Ж | Днепропетровская область, г. Днепродзержинск | 15.05.1998 | NULL |
8 | АК | 23490 | 05.01.1961 | Россия, город Самара | Ж | Днепропетровск | 13.09.2000 | NULL |
12 | ИК | 45190 | 18.07.1983 | Днепропетровская область, село Петропавлока | Ж | Днепропетровская область, село Петропавлока | 20.09.1999 | NULL |
18 | АЖ | 45879 | 04.02.1961 | Днепропетровск | Ж | Днепродзержинск | 14.03.1980 | NULL |
20 | АК | 12578 | 11.11.1987 | Донецк, Краматорск | Ж | Киев | 26.01.2000 | NULL |
22 | АЯ | 45789 | 07.08.1972 | Угорщина | Ж | Ивано-Франковск | 03.10.1988 | NULL |
Операция || соединяет два строчных значения, которые могут быть представлены выражениями: <строчное выражение1> || <строчное выражение2>.
Операцию || можно использовать как после предложения SELECT для указания возвращаемых значений, так и в предложении WHERE.
ПРИМЕР 6.33
Поместите фамилия, имя, отчество и место работы читателей в одну колонку, причем место работы взять в круглые скобки (табл. 6.38).
SELECT FamilyName ||’ ‘ Name || Patronymic || ‘(‘ || Job || ‘)’
FROM Readers
Таблица 6.38
COLUMN1 |
---|
Иванов Петр Иванович (НГУ, каф. ЭВТ) |
Федорец Ирина Олеговна (НГУ, АХЧ) |
Ильин Иван Петрович (НГУ, каф. физики) |
Суренко Дмитрий Павлович (НГУ, каф. геофизики) |
Коршунова Наталья Юрьевна (НГУ, каф. геоиформатики) |
Носенко Олег Владимирович (НГУ, ИКК) |
Брусов Владимир Михайлович (НГУ, каф. геодезии) |
Козырев Алексей Сергеевич (НГУ, каф. криминологии) |
Левченко Юлия Павловна (НГУ, каф. политической теории) |
Светлая Татьяна Ивановна (НГУ, каф. переводов) |
Щеглов Петр Евгеньевич (НГУ, каф. электроснабжения) |
Кириленко Виктор Александрович (НГУ, каф. электропривода) |
В одном запросе можно использовать таблицы из разных БД. В этом случае в СУБД Interbase имя таблицы представляется в формате
:Псевдоним БД :Имя таблицы
Под псевдонимом БД понимают псевдоним, который определен в утилите BDE Administrator. Ниже приведен пример обращения в одном запросе к таблицам БД InterВase (псевдоним «MONITOR») и Oracle (псевдоним «DWH»).
SELECT U.*
FROM ":MONITOR:NLS" N, ":DWH:OLAP_UPE" U
WHERE U.SC_CODE = N.COD_SCENARIO
ORDER BY U.SC_CODE;
Формат оператора SELECT необходимо уточнять в соответствующей документации, предоставляемой к выбранной Вами СУБД.
Благодаря возможности расчетов арифметических выражений, использованию агрегатных функций, простых и сложных условий поиска, вложенных подзапросов оператор SELECT обеспечивает почти все потребности представления информации в виде, который необходим пользователям. А если это невозможно выполнить с помощью одного оператора, то последовательно используют несколько операторов, с учетом того, что результатом работы любого оператора SELECT является двумерная таблица, которая может быть начальной для следующего оператора.
© Куваев Я.Г., 2005—2023.
Все права защищены.
Вся информация, размещенная на данном веб-сайте, предназначена только для персонального использования и не подлежит дальнейшему воспроизведению и/или распространению в какой-либо форме, иначе как с письменного разрешения Автора.