Запросы к базе данных с использованием языка SQL. Извлечение данных. Функции агрегирования
SQL (Structure Query Language, язык структурированных запросов) - это язык программирования и запросов к базам данных, который используется для осуществления доступа к данным, для запросов к реляционным СУБД, для управления БД и их обновления.
Все запросы на получение практически любого количества данных из одной или нескольких таблиц выполняются с помощью единственного предложения SELECT. При выполнении этой операции выполняется поиск указанной таблицы или таблиц, извлекаются заданные столбцы, выделяются строки, соответствующие условию отбора, сортируются или группируются результирующие строки в указанном порядке. Команда SELECT не изменяет данные в базе данных. Синтаксически оператор SELECT состоит из нескольких предложений, большинство из которых не являются обязательными:
SELECT [предикат] список_полей
FROM имена_таблиц
[WHERE критерий_поиска]
[GROUP BY критерий_группировки ]
[HAVING групповой_критерий]
[ORDER BY критерий_столбца]
Предложение SELECT позволяет выбрать данные из указанных столбцов и (если необходимо) выполнить перед выводом их преобразование в соответствии с указанными выражениями и (или) функциями и имеет следующий синтаксис:
SELECT [аргументы] список_полей
Список полей – это заданный в предложении SELECT список выражений или колонок, определяющий, какие данные должны быть извлечены. Список может быть задан одним из следующих способов:
- *- это означает выбрать все колонки, указанных в запросе;
- таблица.* | представление.* | псевдоним.* - это означает выбрать все колонки из указанной таблицы | представления | таблицы с указанным псевдонимом.
Аргументы:
- DISTINCT - аргумент, дающий возможность исключить дублирующиеся значения из результата выполнения предложения SELECT.
- TOP n [PERCENT] – аргумент, возвращающий в результате выполнения предложения SELECT только первые n строк из набора результата. Если задано ключевое слово PERCENT, то будут возвращаться первые строки, составляющие n процентов от общего количества строк.
Предложение FROM содержит имена таблиц и представлений (запросов), из которых извлекаются данные и имеет следующий синтаксис:
FROM таблица [AS псевдоним] | представление [AS псевдоним]
Псевдонимом является другое имя таблицы, которое может быть использовано в дальнейшем для ссылки на таблицу.
Предложение WHERE позволяет определить условие отбора строк из таблиц, перечисленных в предложении FROM для включения их в результат выполнения команды SELECT, и имеет следующий синтаксис:
WHERE критерий_поиска | таблица1.поле {*= | =*} таблица2.поле
Критерий поиска определяет логическое условие, при выполнении которого строка будет включена в результат.
При составлении логического условия можно использовать операторы, идентификаторы, функции, константы и подзапросы.
Операторы бывают реляционные, логические (булевы и специальные). Реляционные операторы – это математические символы (>, <, >=, <=, =, <>), которые задают определенный тип сравнения между двумя значениями. Булевы операторы (AND, OR, NOT) связывают одно или несколько выражений «истина / ложь» и в результате получают единственное значение «истина / ложь». К специальным операторам относятся операторы IN, LIKE, BETWEEN,.
Оператор LIKE применяется для поиска по соответствующему шаблону только к полям типа Char, VarChar (текстовых), и имеет следующий синтаксис:
выражение [NOT] LIKE шаблон.
Шаблоны – это специальные символы – заменители:
- символ % (процент) заменяет последовательность символов произвольной длины, например:
WHERE фамилия LIKE “С%” возвращает все строки с фамилиями, первой буквой которых будет С;
- _ ( подчеркивание) – заменяет один символ, например:
WHERE фамилия LIKE “С_к%” возвращает все строки с фамилиями, первой буквой которых будет С, а третья буква к;
- [ ] – вместо одного символа строки будет подставлен набор возможных символов, указанных в ограничителях, например:
WHERE фамилия LIKE “[А-С]%” возвращает все строки с фамилиями, начинающихся на буквы от А до С;
- [^] – вместо соответствующего символа строки будут подставлены все символы, кроме указанных в ограничителях, например:
WHERE фамилия LIKE “[^А-С]%” возвращает все строки с фамилиями, начинающихся на буквы вне диапазона от А до С.
Оператор IN используется как условие поиска, проверяющее, не соответствует ли проверяемое выражение кому –либо из значений в подзапросе или в списке значений, и имеет следующий синтаксис:
выражение [NOT] IN (значение_1, значение_2, . . .)| подзапрос
Например, WHERE фамилия IN (‘Иванов’, ‘Петров’, ‘Сидоров’).
Оператор BETWEEN используется всегда в сочетании с оператором AND и задает диапазон вхождения, применяемый как условие поиска, и имеет следующий синтаксис:
выражение [NOT] BETWEEN значение_1 AND значение_2.
Аргументы значение_1 и значение_2 определяют начало и конец диапазона значений. Они могут быть заданы числовыми, или символьными константами. Первое значение должно быть первым в соответствии с алфавитным и числовым порядком. Например, WHERE Фамилия BETWEEN ‘Орлов’ AND ‘Сидоров’.
Оператор IS NULL используется в условиях поиска, ищущих строк, содержащие NULL-значения в заданной колонке, и имеет следующий синтаксис:
выражение IS [NOT] NULL.
Предложение GROUP BY группирует по указанному перечню столбцов с тем, чтобы получить для каждой группы единственное агрегированное значение, используя в предложении SELECT агрегатные функции, и имеет следующий синтаксис:
GROUP BY [ALL] критерий_группировки [WITH {CUBE | ROLLUP}].
Аргумент критерий_группировки определяет условие группировки. Как правило, здесь указывается имя колонки таблицы, по которой будет выполнена группировка.
Аргумент ALL в разделе GROUP BY указывает серверу на необходимость выводить список всех групп, не выполняя для них функции агрегирования.
Аргумент WITH CUBE определяет необходимость суперагрегирования данных. В результате будут добавлены строки, являющиеся результатом агрегирования уже агрегированных данных (итого по группе, итого всего).
Аргумент WITH ROLLUP позволяет избежать излишнего агрегирования.
Агрегатные функции выполняют вычисления над набором значений и возвращают одно значение.
Функция AVG() – вычисляет среднее значение для набора данных, и имеет следующий синтаксис:
AVG ([ALL | DISTINCT] выражение)
ALL – агрегирование выполняется для всех строк набора данных (по умолчанию).
DISTINCT – агрегирование выполняется только для уникальных строк.
Функция Count() – подсчитывает количество строк, которое должно быть выведено при выполнении запроса, и имеет следующий синтаксис:
COUNT ({[ALL / DISTINCT] выражение / * })
«*» используется только в случае группировки данных с помощью раздела GROUP BY.
Функция Sum() – выполняет суммирование всех значений в указанной колонке, и имеет следующий синтаксис:
SUM ([ALL | DISTINCT] выражение).
Функция Max() – возвращает максимальное значение в указанной колонке, и имеет следующий синтаксис:
MAX ([ALL | DISTINCT] выражение).
Функция Min() – возвращает минимальное значение в указанной колонке, и имеет следующий синтаксис:
MIN([ALL | DISTINCT] выражение).
Предложение HAVING применяется, чтобы задать условия поиска для групп или для агрегатной функции.
Предложение ORDER BY применяется, чтобы задать порядок, в котором должны сортироваться строки набора результатов. С помощью ключевых слов ASC или DESC можно явно указать порядок сортировки:
- ASC – по возрастанию значений (действует по умолчанию);
- DESC – по убыванию.