sql_manual

0
год назад
README.md

SQL MANUAL

SELECT

SELECT * FROM buyer;
— выбрать все из таблицы
buyer
;
SELECT COUNT(*) FROM buyer;
— оператор
COUNT()
подсчитывает число записей;

Правило № 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;

OFFSET
— самостоятельный оператор. Чтобы отобразить записи всей таблицы, начиная с определённой,
указывают только оператор
OFFSET
без оператора
LIMIT
.

Как задать условия выборки

Оператор
WHERE

SELECT поле_1, -- поля для выгрузки поле_2 ... FROM таблица -- таблица, из которой выгружают данные WHERE поле > 4; -- условие для среза данных

Задать условия можно с помощью операторов сравнения. Они выглядят так:

  • =
    — равно;
  • !=
    — не равно;
  • >
    — больше;
  • <
    — меньше;
  • >=
    — больше или равно;
  • <=
    — меньше или равно.
Поле, по которому формируется условие, необязательно должно присутствовать в SELECT.
В PostgreSQL в операторе WHERE нельзя использовать псевдонимы. Потому что «под капотом» во время компиляции **WHERE** выполняется раньше, чем SELECT, когда псевдонимы ещё не назначены.

Операторы
AND
и
OR

Операторы AND и OR позволяют объединять условия. AND применяют в том
случае, если выгружаемые данные должны соответствовать всем перечисленным
условиям.

WHERE connection_area = 'Роботический лабиринт' AND age > 30;

Оператор
NOT

Чтобы отобрать клиентов из всех зон, кроме зоны «Роботический лабиринт»,
можно «перевернуть» условие оператором

NOT
. С его помощью выгружают
записи, которые не соответствуют условию:

Оператор
IN

Если условий, которые нужно перечислить в операторе

OR
, очень много, то код
получится громоздким. Например, нужны все пользователи с именами Виктор,
Любовь, Борис, Станислав, Алина, Евгения и Ольга старше 25 лет. Если
использовать операторы
OR
и
AND
, то код выйдет таким:

WHERE age > 25 AND (first_name = 'Виктор', OR first_name = 'Любовь', OR first_name = 'Борис', OR first_name = 'Станислав', OR first_name = 'Алина', OR first_name = 'Евгения', OR first_name = 'Ольга');

Этот код выдаст верный результат, но чтобы много раз не перечислять один и тот
же оператор, можно просто использовать оператор

IN
:

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

Она пригодится, если нужно посчитать записи за конкретный период: например, неделю или месяц.
Синтаксис функции такой:

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

Чтобы получить только конкретную часть даты — год, месяц или минуту, —
используют функцию

EXTRACT
. Её синтаксис:
EXTRACT(отрезок времени FROM поле)
.

  • 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 6474 байта
smallint / int2целое число в небольшом диапазонеот -32 768 до 32 7672 байта
bigint / int8целое число в большом диапазонеот -9 223 372 036 854 775 808 до 9 223 372 036 854 775 8078 байтов
numeric / decimalвещественное число с указанной точностьюне больше 131 072 цифр до запятой и 16 383 — послепеременный
realвещественное число с переменной точностьюдо 6 цифр по обе стороны запятой4 байта
double precisionвещественное число с переменной точностьюдо 15 по обе стороны запятой8 байтов
floatвещественное число с переменной точностью*PostgreSQL воспринимает тип float без указанной точности как double precision8 байтов

Все текстовые типы данных

НазваниеОписаниеДиапазон
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». Например, чтобы в базе компаний отметить, какие из них ещё
работают, а какие — закрыты. Такую информацию можно хранить и в текстовом
формате, но куда проще использовать для решения этой задачи специальный тип
данных:

boolean
, или
bool
.

Как узнать тип данных

Типы данных обычно задают при проектировании базы. И некоторые типы можно
узнать интуитивно. Например, поле с адресом, скорее всего, содержит текстовые
данные, а поле «цена» наверняка будет числовым значением. Но для более
точного определения типа стоит обращаться к описанию таблиц, или
ER-диаграмме (англ. entity relationship diagram, схема «сущность-связь»).

Группировка и агрегации

Расчёты с разными типами данных

Проводя вычисления, важно помнить про тип данных, которые содержит поле.
Вычисления можно проводить только с целочисленными или дробными типами данных.
Если попытаться провести математическую операцию, например,
с текстовой строкой, это приведёт к ошибке.

SELECT 7::numeric/2
— После делителя или делимого добавляют сочетание слов
::numeric
. Так мы говорим программе, что это дробное число,
и деление выполнится с остатком.

  • +
    — сложение;
  • -
    — вычитание;
  • *
    — умножение;
  • /
    — деление.

Aгрегирующие функции

Основные агрегирующие функции в SQL:

  • SUM(поле)
    возвращает сумму значений в поле;
  • AVG(поле)
    находит среднее арифметическое для значений в поле;
  • MIN(поле)
    возвращает минимальное значение в поле;
  • МАХ(поле)
    возвращает максимальное значение в поле;
  • COUNT(поле)
    выводит количество записей в поле.

Функция
DISTINCT

DISTINCT
— позволяет находить и рассчитывать показатели только по уникальным значениям.

Группировка данных по категориям

Оператор
GROUP BY

Особенности запросов с
GROUP BY

  1. До сих пор мы указывали в 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;
  1. Но если поле указано в
    SELECT
    , оно обязательно должно присутствовать и в группировке.
  2. В группировках можно указывать псевдонимы. Давайте подсчитаем
    среднюю цену товара для каждого месяца:
SELECT EXTRACT(MONTH FROM date) AS order_month, AVG(price) FROM hotdog GROUP BY order_month;

Оператор
HAVING

HAVING
— фильтрует значения, полученные в результате группировки —
то есть работает не с новыми полями, а с результатом вычислений.
Его записывают после GROUP BY.

SELECT connection_area, AVG(age) FROM buyer WHERE company_marker = 0 GROUP BY connection_area HAVING AVG(age) > 30;

Особенности оператора
HAVING

  1. Условие, по которому оператор HAVING фильтрует данные, необязательно указывать в SELECT.
    Например, нужно отобразить зоны парка и максимальный возраст клиентов,
    которые подключались в них, но исключить те, где средний возраст меньше 30 лет.
    При этом сам средний возраст можно не выводить на экран.
SELECT connection_area, MAX(age) FROM buyer WHERE company_marker = 0 GROUP BY connection_area HAVING AVG(age) > 30;
  1. Все операторы, с которыми вы знакомы, можно комбинировать с HAVING —
    но только при условии, что в запросе есть группировка GROUP BY.
    Без неё HAVING работать не будет. Например, такой код приведёт к ошибке:

Оператор
ORDER BY

Для сортировки данных в SQL используют оператор

ORDER BY``. <br> Его пишут в самом конце запроса, после него можно указать только операторы
LIMIT
и
OFFSET```.

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;

Группировка по нескольким полям

Порядок, в котором указаны поля после

GROUP BY
, влияет только на вид итоговой таблицы.

Сортировка по нескольким полям

При сортировке важен порядок полей, которые указывают после оператора

ORDER BY
.