sql_manual
SQL MANUAL
SELECT
— выбрать все из таблицы ;
— оператор подсчитывает число записей;
Правило № 1. Выделение ключевых слов
Первое правило хорошего стиля — отделять ключевые слова
(SELECT, FROM, WHERE, AND, AS) от названий столбцов и таблиц.
Ключевые слова пишут в верхнем регистре, а названия — в нижнем.
Правило № 2. Перенос строк
Второе правило хорошего стиля — перечислять поля и функции,
перенося их на новую строку и выстраивая в один столбик.
Так проще понять, какие поля или значения будут выгружены.
Как ограничить выгрузку полей
Выгрузим только три поля:
SELECT last_name,
first_name,
gender
FROM buyer;
Переименование поля с помощью AS
Новое имя поля в итоговой таблице:
SELECT first_name,
age AS age_client,
connection_area AS area
FROM buyer;
Как ограничить выгрузку строк
Оператор LIMIT
Такой запрос отобразит десять записей из перечисленных полей:
SELECT поле_1,
поле_2,
поле_3 ...
FROM таблица
LIMIT 10;
Оператор OFFSET
Если нужно указать, с какой записи начинать выборку, к оператору LIMIT добавляют оператор OFFSET.
Он позволяет пропустить определённое число записей.
Такой запрос выведет записи с 6 по 15:
SELECT поле_1,
поле_2,
поле_3 ...
FROM таблица
LIMIT 10
OFFSET 5;
— самостоятельный оператор. Чтобы отобразить записи всей таблицы, начиная с определённой,
указывают только оператор без оператора .
Как задать условия выборки
Оператор WHERE
SELECT поле_1, -- поля для выгрузки
поле_2
...
FROM таблица -- таблица, из которой выгружают данные
WHERE поле > 4; -- условие для среза данных
Задать условия можно с помощью операторов сравнения. Они выглядят так:
— равно;=— не равно;!=— больше;>— меньше;<— больше или равно;>=— меньше или равно.<=
Поле, по которому формируется условие, необязательно
должно присутствовать в SELECT.
В PostgreSQL в операторе WHERE нельзя использовать псевдонимы. Потому что
«под капотом» во время компиляции **WHERE** выполняется раньше, чем SELECT,
когда псевдонимы ещё не назначены.
Операторы AND и OR
Операторы AND и OR позволяют объединять условия. AND применяют в том
случае, если выгружаемые данные должны соответствовать всем перечисленным
условиям.
WHERE connection_area = 'Роботический лабиринт'
AND age > 30;
Оператор NOT
Чтобы отобрать клиентов из всех зон, кроме зоны «Роботический лабиринт»,
можно «перевернуть» условие оператором . С его помощью выгружают
записи, которые не соответствуют условию:
Оператор IN
Если условий, которые нужно перечислить в операторе , очень много, то код
получится громоздким. Например, нужны все пользователи с именами Виктор,
Любовь, Борис, Станислав, Алина, Евгения и Ольга старше 25 лет. Если
использовать операторы и , то код выйдет таким:
WHERE age > 25
AND (first_name = 'Виктор',
OR first_name = 'Любовь',
OR first_name = 'Борис',
OR first_name = 'Станислав',
OR first_name = 'Алина',
OR first_name = 'Евгения',
OR first_name = 'Ольга');
Этот код выдаст верный результат, но чтобы много раз не перечислять один и тот
же оператор, можно просто использовать оператор :
WHERE age > 25
AND first_name IN ('Виктор', 'Любовь', 'Борис', 'Станислав',
'Алина', 'Евгения', 'Ольга');
Достаточно прописать его после нужного поля и в скобках перечислить
необходимые значения. В переводе на человеческий это значит: «Если возраст
больше 25 и имя содержит значение из списка, то…».
Оператор IN можно комбинировать с другими логическими операторами.
Его работу с AND вы видели в предыдущем примере. А вот как бы выглядел код, если
бы нужно было отобрать всех пользователей, имя которых не входит в список:
WHERE age > 25
AND first_name NOT IN ('Виктор', 'Любовь', 'Борис', 'Станислав',
'Алина', 'Евгения', 'Ольга');
Фильтрация по дате
SELECT *
FROM hotdog
WHERE date >= '2022-02-27' AND date <= '2022-03-14';
Функция DATE_TRUNC
Она пригодится, если нужно посчитать записи за конкретный период: например, неделю или месяц.
Синтаксис функции такой: .
Отрезок времени может быть разным, главное — не забыть одинарные кавычки:
— микросекунды;'microseconds'— миллисекунды;'milliseconds'— секунда;'second'— минута;'minute'— час;'hour'— день;'day'— неделя;'week'— месяц;'month'— квартал;'quarter'— год;'year'— десятилетие;'decade'— век.'century'
SELECT date,
DATE_TRUNC('month', date)
FROM hotdog
LIMIT 5;
Функция EXTRACT
Чтобы получить только конкретную часть даты — год, месяц или минуту, —
используют функцию . Её синтаксис: .
— век;CENTURY— год;YEAR— квартал;QUARTER— месяц;MONTH— неделя в году;WEEK— день;DAY— час;HOUR— минута;MINUTE— секунда;SECOND— миллисекунда.MILLISECOND
SELECT date,
EXTRACT(WEEK FROM date)
FROM hotdog
LIMIT 5;
ТИПЫ ДАННЫХ
Все числовые типы данных
| Название | Описание | Диапазон чисел | Размер |
|---|---|---|---|
| integer / int / int4 | целое число | от -2 147 483 648 до 2 147 483 647 | 4 байта |
| smallint / int2 | целое число в небольшом диапазоне | от -32 768 до 32 767 | 2 байта |
| bigint / int8 | целое число в большом диапазоне | от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 | 8 байтов |
| numeric / decimal | вещественное число с указанной точностью | не больше 131 072 цифр до запятой и 16 383 — после | переменный |
| real | вещественное число с переменной точностью | до 6 цифр по обе стороны запятой | 4 байта |
| double precision | вещественное число с переменной точностью | до 15 по обе стороны запятой | 8 байтов |
| float | вещественное число с переменной точностью | *PostgreSQL воспринимает тип float без указанной точности как double precision | 8 байтов |
Все текстовые типы данных
| Название | Описание | Диапазон |
|---|---|---|
| character(n) / char(n) | строка фиксированной длины | Точное значение длины для фиксированных строк задаётся в момент создания таблицы. Если по факту символов в строке меньше, чем указано в скобках, система автоматически заполняет разницу пробелами. Если ограничение по количеству символов не задано, система устанавливает ограничение автоматически — char(1), или 1 символ. |
| character varying(n) / varchar(n) | строка ограниченной переменной длины | До 10 485 760 символов. Если длина строки будет меньше, чем заявлено в скобках, система сохранит строку в исходном виде и не будет заполнять недостающие символы пробелами. Если ограничение по длине строки не задано, принимает строки любого размера. |
| text | строка неограниченной переменной длины | Принимает строки любой длины, если ограничение не задано. |
Основные типы данных, используемые в SQL для обозначения даты и времени
| Название | Описание | Размер |
|---|---|---|
| date | дата | 4 байта |
| time | время | 8 байтов |
| timestamp with time zone | дата и время с учётом часового пояса | 8 байтов |
| timestamp without time zone | дата и время без учёта часового пояса | 8 байтов |
Булевые, или логические, данные
Иногда в таблице достаточно зафиксировать простое «да или нет», «true
или false», «0 или 1». Например, чтобы в базе компаний отметить, какие из них ещё
работают, а какие — закрыты. Такую информацию можно хранить и в текстовом
формате, но куда проще использовать для решения этой задачи специальный тип
данных: , или .
Как узнать тип данных
Типы данных обычно задают при проектировании базы. И некоторые типы можно
узнать интуитивно. Например, поле с адресом, скорее всего, содержит текстовые
данные, а поле «цена» наверняка будет числовым значением. Но для более
точного определения типа стоит обращаться к описанию таблиц, или
ER-диаграмме (англ. entity relationship diagram, схема «сущность-связь»).
Группировка и агрегации
Расчёты с разными типами данных
Проводя вычисления, важно помнить про тип данных, которые содержит поле.
Вычисления можно проводить только с целочисленными или дробными типами данных.
Если попытаться провести математическую операцию, например,
с текстовой строкой, это приведёт к ошибке.
— После делителя или делимого добавляют сочетание слов
. Так мы говорим программе, что это дробное число,
и деление выполнится с остатком.
— сложение;+— вычитание;-— умножение;*— деление./
Aгрегирующие функции
Основные агрегирующие функции в SQL:
возвращает сумму значений в поле;SUM(поле)находит среднее арифметическое для значений в поле;AVG(поле)возвращает минимальное значение в поле;MIN(поле)возвращает максимальное значение в поле;МАХ(поле)выводит количество записей в поле.COUNT(поле)
Функция DISTINCT
— позволяет находить и рассчитывать показатели только по уникальным значениям.
Группировка данных по категориям
Оператор GROUP BY
Особенности запросов с GROUP BY
- До сих пор мы указывали в SELECT поле, по которому производилась группировка,
но это необязательно. Если его не указать, это поле просто не отобразится в итоговой таблице:
SELECT COUNT(name_hotdog) AS cnt_order,
AVG(quantity) AS average_quantity,
SUM(vegan_sausage) AS sum_vegan_sausage
FROM hotdog
GROUP BY name_hotdog;
- Но если поле указано в
, оно обязательно должно присутствовать и в группировке.SELECT - В группировках можно указывать псевдонимы. Давайте подсчитаем
среднюю цену товара для каждого месяца:
SELECT EXTRACT(MONTH FROM date) AS order_month,
AVG(price)
FROM hotdog
GROUP BY order_month;
Оператор HAVING
— фильтрует значения, полученные в результате группировки —
то есть работает не с новыми полями, а с результатом вычислений.
Его записывают после GROUP BY.
SELECT connection_area,
AVG(age)
FROM buyer
WHERE company_marker = 0
GROUP BY connection_area
HAVING AVG(age) > 30;
Особенности оператора HAVING
- Условие, по которому оператор HAVING фильтрует данные, необязательно указывать в SELECT.
Например, нужно отобразить зоны парка и максимальный возраст клиентов,
которые подключались в них, но исключить те, где средний возраст меньше 30 лет.
При этом сам средний возраст можно не выводить на экран.
SELECT connection_area,
MAX(age)
FROM buyer
WHERE company_marker = 0
GROUP BY connection_area
HAVING AVG(age) > 30;
- Все операторы, с которыми вы знакомы, можно комбинировать с HAVING —
но только при условии, что в запросе есть группировка GROUP BY.
Без неё HAVING работать не будет. Например, такой код приведёт к ошибке:
Оператор ORDER BY
Для сортировки данных в SQL используют оператор LIMITOFFSET```.
SELECT connection_area,
AVG(age)
FROM buyer
WHERE company_marker = 0
GROUP BY connection_area
ORDER BY AVG(age);
Изменить порядок сортировки
SELECT connection_area,
AVG(age) AS average_age
FROM buyer
WHERE company_marker = 0
GROUP BY connection_area
ORDER BY average_age DESC
LIMIT 5; VG(age) DESC
LIMIT 5;
Группировка по нескольким полям
Порядок, в котором указаны поля после , влияет только на вид итоговой таблицы.
Сортировка по нескольким полям
При сортировке важен порядок полей, которые указывают после оператора .