Главное меню

EN | RU | UK

На главную

6. Оператор SELECT. Часть 2

Помощь & Консультация
Помощь & Консультация
Пишите мне в
Наверх страницы
Лекция
Цель

Цель раздела - ознакомление с оператором SELECТ, который является одним из наиболее важных и востребованных операторов SQL, с его форматом и свойствами.

6.13. Проверка наличия определителя NULL

Наличие определителя NULL в строках таблицы проверяется с помощью такой конструкции:

 <значение> IS [NOTNULL

ПРИМЕР 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 Дискретно-групповые методы интегрирования обыкновенных дифференциальных уравнений

6.14. Агрегатные функции

6.14.1. Рассчеты итоговых значений в операторе SELECT

Расчет итоговых значений в операторе SELECT осуществляется с помощью агрегатных или статистических функций: COUNT(), SUM(), AVG(), МАХ(), МIN().

Функция COUNT(<выражение>) подсчитывает число вхождений значений выражения во все записи результирующего набора данных. Она работает с данными любого типа: числовые, символьные или типа «дата/время».

ПРИМЕР 6.18

Определите, стоимость скольких книг превышает 25 грн. (табл. 6.16).

SELECT COUNT(*AS cCount

    FROM BookInventoryNumbers

    WHERE Cost > 25;

Таблица 6.16

Количество книг, стоимость которых превышает 25 гривен
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

6.14.2. Группировка

Группировка записей используется тогда, когда необходимо получить агрегированные значения не для всего отношения, а отдельно по каждой группе кортежей, которые характеризуются общим признаком. Чаще всего это одинаковые значения в каком-либо атрибуте или группе атрибутов. Тогда в операторе 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.

6.14.3. Условие отбора сгруппированных записей

Условие отбора сгруппированных записей приводится в предложении

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

6.15. Использование подзапросов в условиях поиска

6.15.1. Подзапрос

Подзапрос - это инструмент создания временной таблицы, содержимое которой обрабатывается внешним оператором. Внутренние запросы могут быть использованы для вычисления значений после предложения SELECT и в условиях поиска после операторов сравнения (=, <>,> =, <=, <<) или IN в предложениях WHERE и HAVING внешнего оператора SELECT. Кроме того, подзапросы могут применяться в операторах INSERT, UPDATE и DELETE. Текст подзапроса берется в скобки.

Существует три вида подзапросов:

  1. скалярный - возвращает таблицу, состоящую из одного столбца и одной строки, то есть одного значения, он может использоваться везде, где нужно привести одно значение;
  2. строчный - возвращает нескольких столбцов таблицы, но в виде единственной строки, он может использоваться везде, где применяется конструктор строчных значений;
  3. табличный - возвращает значение одного или более столбцов таблицы, расположенных в нескольких строках, он может использоваться везде, где допускается указывать множества значений, например, с оператором IN.

Для подзапросов устанавливаются такие правила и ограничения:

  1. В подзапросах не должна использоваться фраза ORDER BY, хотя она может быть во внешнем запросе.
  2. Список в предложении SELECT должен состоять из имен отдельных столбцов или составленных из них выражений, за исключением случая, когда подзапрос является операндом оператора EXISTS.
  3. По умолчанию имена столбцов в подзапросе относятся к таблице, имя которой есть в предложении FROM. Однако допускается ссылаться и на столбцы таблицы, указанной в FROM внешнего запроса, для чего используются квалифицированные имена столбцов. Такие подзапросы называются соотнесенными.
  4. Если подзапрос является одним из двух операндов, участвующих в операции сравнения, то он приводиться в правой части этой операции.

Когда невозможно обойтись одним подзапросом, тогда в нем используются вложенный подзапрос и т.д.

6.15.2. Скалярные подзапросы

Скалярные подзапросы возвращают таблицу, состоящую из одного столбца и одной строки. Такую таблицу можно получить, если после предложения 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

Даты возврата книг читателем, у которого номер читательского бидета 28
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

6.15.3. Подзапросы, возвращающие множество значений

Подзапросы, возвращающие множество значений, используются в качестве операнда предиката 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)

6.16. Операторы, которые используются только с подзапросами

6.16.1. Оператор EXISTS

Оператор EXISTS применяется тогда, когда в условиях поиска необходимо указать, что из таблицы нужно выбрать только те записи, для которых подзапрос возвращает одно или более значений:

[NOTEXISTS(<подзапрос>)

Итак, оператор 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#. Программирование на языке высокого уровня

6.16.2. Оператор SINGULAR

Оператор SINGULAR применяется тогда, когда в условиях поиска необходимо указать, что из таблицы нужно выбрать только те записи, для которых подзапрос возвращает только одно значение.

[NOTSINGULAR(<подзапрос>)

ПРИМЕР 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 Дискретно-групповые методы интегрирования обыкновенных дифференциальных уравнений

6.16.3. Операторы ALL, SOME, ANY

Операторы 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

Инвентарные номера книг, стоимость которых выше стоимости хотя бы одной книги фонда под номером «1»
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

Инвентарные номера всех книг, в которых стоимость превышает стоимость любой книги книжного фонда под номером «1»
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.

6.17. Внешние соединения

Внешнее соединение определяется в предложении 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

Иллюстрация левого внешнего соединения таблиц А и B
Столбец 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

Иллюстрация правого внешнего соединения таблиц А и B
Столбец A.Р1 Столбец A.Р2 Столбец B.Р2
A x 1
B x 1
C y 2
NULL NULL 2

6.18. UNION - объединения результатов выполнения нескольких операторов SELECT

Иногда возникает необходимость в объединении двух или более результирующих наборов данных, которые возвращают отдельные операторы 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

Дані паспортів, які видані у 2000 році
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

Данные паспортов, номера которых начинаются на 4
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

6.19. Операция сцепления строк

Операция || соединяет два строчных значения, которые могут быть представлены выражениями: <строчное выражение1> || <строчное выражение2>.

Операцию || можно использовать как после предложения SELECT для указания возвращаемых значений, так и в предложении WHERE.

ПРИМЕР 6.33

Поместите фамилия, имя, отчество и место работы читателей в одну колонку, причем место работы взять в круглые скобки (табл. 6.38).

SELECT FamilyName ||’ ‘ Name || Patronymic || ‘(‘ || Job || ‘)’

    FROM Readers

Таблица 6.38

Данные читателей, которые выведены в одну колонку
COLUMN1
Иванов Петр Иванович (НГУ, каф. ЭВТ)
Федорец Ирина Олеговна (НГУ, АХЧ)
Ильин Иван Петрович (НГУ, каф. физики)
Суренко Дмитрий Павлович (НГУ, каф. геофизики)
Коршунова Наталья Юрьевна (НГУ, каф. геоиформатики)
Носенко Олег Владимирович (НГУ, ИКК)
Брусов Владимир Михайлович (НГУ, каф. геодезии)
Козырев Алексей Сергеевич (НГУ, каф. криминологии)
Левченко Юлия Павловна (НГУ, каф. политической теории)
Светлая Татьяна Ивановна (НГУ, каф. переводов)
Щеглов Петр Евгеньевич (НГУ, каф. электроснабжения)
Кириленко Виктор Александрович (НГУ, каф. электропривода)

6.20. Работа с различными базами данных в одном запросе

В одном запросе можно использовать таблицы из разных БД. В этом случае в СУБД 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 необходимо уточнять в соответствующей документации, предоставляемой к выбранной Вами СУБД.

6.21. КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Какая конструкция в операторе SELECT отвечает за проверку наличия определителя NULL?
  2. Что общего и отличного между известными Вам функциями, которые рассчитывают итоговые значения в операторе SELECT?
  3. Для чего используется предложение GROUP BY в операторе SELECT?
  4. Какая существует разница между условиями поиска предложений HAVING и WHERE?
  5. С какой целью и где применяют подзапросы?
  6. Чем отличаются результирующие наборы данных, возвращаемые подзапросами известных Вам типов?
  7. Какие правила и ограничения формирования подзапросов Вам известны?
  8. Каким образом в условиях поиска предложения WHERE подзапрос позволяет использовать агрегатные функции?
  9. Какие значения и при каких условиях возвращают операторы EXISTS и SUNGULAR?
  10. Как в условиях поиска можно сравнить скалярное значение со всеми значениями множества, возвращаемого подзапросом?
  11. Какая существует разница между известными Вам типами внешних соединений отношений?
  12. Какая существует разница между внешними и внутренними соединениями отношений?
  13. Каким условиям должны отвечать результирующие наборы данных операторов SELECT, объединяемых с помощью оператора UNION?
  14. Как в результирующем наборе данных оператора SELECT объединить в одном столбце данные, расположенные в разных столбцах исходных таблиц?
  15. Можно ли в пределах одного оператора SELECT работать с таблицами, которые расположены в разных БД?
Вывод

Благодаря возможности расчетов арифметических выражений, использованию агрегатных функций, простых и сложных условий поиска, вложенных подзапросов оператор SELECT обеспечивает почти все потребности представления информации в виде, который необходим пользователям. А если это невозможно выполнить с помощью одного оператора, то последовательно используют несколько операторов, с учетом того, что результатом работы любого оператора SELECT является двумерная таблица, которая может быть начальной для следующего оператора.

© Куваев Я.Г., 2005—2023.

Все права защищены.

Вся информация, размещенная на данном веб-сайте, предназначена только для персонального использования и не подлежит дальнейшему воспроизведению и/или распространению в какой-либо форме, иначе как с письменного разрешения Автора.