Запросы, представленные на рис. 7.76 и 7.77, применяют подзапросы, формирующие скалярные результирующие наборы. Для работы с результирующими наборами, представляющими собой множество однородных значений (значений одного типа), можно использовать операции IN, ANY и ALL.
В простейшем случае множество значений может быть указано явно. На рис. 7.78 приведен пример использования оператора SELECT, в секции WHERE которого, используется операция IN.
Рис. 7.78. Применение операции IN с явно указанным списком значений
Операция IN формирует логическое значение «истина» в том случае, если значение, указанное слева от ключевого слова IN (на рис. 7.78 – значение в столбце NOTE таблицы PROGRESS), равно хотя бы одному из значений списка, указанного справа от IN (на рис. 7.78 –одно из значений: 7, 9 или 10). Выражение IN на рис. 7.78 может быть заменено выражением, использующим операцию OR (рис. 7.79).
Рис. 7.79. Замена операции IN с явным списком значений (рис. 7.78),
несколькими сравнениями, соединенными операциями OR
На рис. 7.80 приведен пример SELECT-запроса, в котором список для операции IN формируется как результат выполнения некоррелированного подзапроса. Обратите внимание на то, что в этом случае заменить операцию IN несколькими сравнениями не получится.
Рис. 7.80. Формирование списка значений для операции IN с помощью
подзапроса, формирующего результирующий набор из одного столбца
Операция IN может применяться совместно с другими логическими операциями. Пример на рис. 7.81 демонстрирует операцию IN в сочетании с операциями NOT и AND. При этом следует помнить, что IN и LIKE будут иметь наивысший приоритет: операция NOT будет применяться к результату выполнения операции IN, и лишь затем операция AND соединит отрицание IN и предварительно полученный результат LIKE-сравнения.
Рис. 7.81. Применение операции IN совместно с другими
логическими операциями
Операция ALL используется совместно с операциями сравнения и тоже предназначена для сравнения со списком значений, который задается как результат выполнения подзапроса (рис. 7.82).
Рис. 7.82. Применение операции ALL совместно с операцией сравнения
В примере на рис. 7.82 операция ALL применяется совместно с операцией сравнения «больше». Обратите внимание: справа от символов > ALL (читается: больше каждого) в скобках записан подзапрос, возвращающий столбец значений. Операция >ALL сформирует истинное значение в том случае, если значение, стоящее слева (на рис. 7.82 – значение в столбце NOTE таблицы PROGRESS), больше каждого значения в списке, указанном справа (значения в столбце, сформированном подзапросом).
Операцию ALL можно применять со всеми операциями сравнения и в сочетании с другими логическими операциями (рис. 7.83).
Рис. 7.83. Применение операции ALL совместно с другими
логическими операциями
Операция ANY записывается и применяется аналогично операции ALL, но результат формируется иным образом (рис. 7.84).
Рис. 7.84. Применение операции ANY совместно с операцией сравнения
и другими логическими операциями
При выполнении ANY-сравнения (на рис. 7.84 – операция >= ANY) стоящее слева значение (столбец NOTE таблицы PROGRESS) сравнивается (операция >=) с каждым значением списка, записанным справа (содержимое столбца, сформированного подзапросом). Если хотя бы для одного значения из списка операция сравнения принимает значение «истина», то вся операция (>= ANY) принимает значение «истина».
Применение операции EXISTS
Часто в подзапросе, который применяется в секции WHERE, бывает достаточно выяснить только сам факт наличия строк в результирующем наборе. В таких случаях удобно использовать операцию EXISTS.
На рис. 7.85 представлен пример использования операции EXISTS.
Рис. 7.85. Пример использования операции EXISTS
В скобках, следующих за ключевым словом EXISTS, записывается подзапрос. Результатом операции является «истина», если результирующий набор подзапроса содержит хотя бы одну строку, в противоположном случае операция EXISTS формирует значение «ложь».
Рис. 7.86. Пример применения операции EXISTS в сочетании
с другими логическими операциями
Как и другие логические операции, EXISTS может использоваться в логических выражениях (рис. 7.86).
Секция GROUP BY
Если в SELECT-запросе есть секция GROUP BY, то она применяется после секции WHERE. Основное назначение GROUP BY – разбиение множества строк, сформированного секциями FROM и WHERE, на группы в соответствии со значениями в заданных операцией GROUP BY столбцах, а также выполнение вычислений над группами строк (подсчет количества строк; суммирование значений; вычисление средних, минимальных, максимальных значений и т. п.).
На рис. 7.87 изображена схема обработки строк секцией GROUP BY.
Рис. 7.87. Схема работы секции GROUP BY
Секция GROUP BY выполняет обработку строк в три этапа: 1) формирование строковых групп; 2) вычисление агрегатных функций над каждой группой строк; 3) формирование результирующего набора. В секции GROUP BY задается одно или несколько выражений (формирующих значения), задающих признак объединения строк в группы. На втором этапе для вычислений могут применяться агрегатные функции. Перечень наиболее часто используемых функций приведен в табл.7.2.
Таблица 7.2
Дата: 2019-02-25, просмотров: 239.