В инете полно информации о порядках выполнения запроса, джойнах и всего прочего, что является вполне базовым уровнем понимания sql. Здесь будет выжимка из важных возможностей сиквела, чтобы всегда можно было быстро посмотреть, че и как.
Сводная таблица — аналог сводной таблицы в Экселе, или Pivot table. Как ни странно, уже зная хорошо вообще все, я узнал, что не знал, как делать сводники в sql. Хотя это мое любимое в экселе. Собственно, делается следующим образом:
SELECT region,
SUM(CASE WHEN product = 'Product 1' THEN sales_amount ELSE 0 END) AS product1_sales,
SUM(CASE WHEN product = 'Product 2' THEN sales_amount ELSE 0 END) AS product2_sales
FROM sales
GROUP BY region;
Итогом такого запроса, по горизонтали станут Регионы, тогда как в столбцах будет отобранный Продукт1 и Продукт2. Вау
Календарь дат — также как в Bi, мы создаем календарь, в sql также можно для отчетности создавать календарь, в котором точно будут все месяца и с помощью которого ты будешь уверен, что ничего не потерял. Синтаксис понятно везде разный. Ниже пример для Postgres
SELECT date_trunc('day', dd):: date
FROM generate_series
( '2007-02-01'::timestamp
, '2008-04-01'::timestamp
, '1 day'::interval) dd
;
Взято отсюда
Еще вариант, понятный:
WITH calendar AS (
SELECT DATE '2023-01-01' AS month_start
UNION ALL
SELECT month_start + INTERVAL '1 month'
FROM calendar
WHERE month_start < DATE '2024-01-01'
)
CASE — мощная штука, которую можно использовать где угодно SELECT, WHERE, ORDER BY (да, даже тут!) и других
SELECT column1, column2,
CASE
WHEN condition1 THEN value1
WHEN condition2 THEN value2
ELSE value3
END AS new_column
FROM table;
Несмотря на это, очень полезно использовать данную конструкция для Флагов.
Также, когда мы сделали эту функцию, как в примере выше, ее можно испльзовать для группировки, достаточно в ГруппБай положить ее алиас(если склайт3), если же нет, то номер столбца или само выражение.
IN и NOT IN — позволяет выбирать значения, по списку. Сам список может быть простым перечислением, либо же состоять из отобранного массива из таблицы (понимаешь да? т.е. на вход IN давать подзапрос, который сформирует нужную таблицу. Подзапрос можно делать с вложенным подзапросом и нужным фильтром и т.д.)
SELECT column1, column2
FROM table
WHERE column1 IN (SELECT column3 FROM another_table WHERE condition);
FILTER — позволяет забирать те строки, которые удовлетворяют условию. Может быть применена в различных частях SQL-запроса, включая SELECT, WHERE, HAVING и других. Прикольно выбирать прям в селекте (нужно помнить, что селект вообще исполняется практически в самом конце, и отбирает значения уже с сформированных таблиц)
SELECT column1, column2,
COUNT(*) FILTER (WHERE column3 = 'value') AS count_value,
SUM(column4) FILTER (WHERE column5 = 'condition') AS sum_condition
FROM table
GROUP BY column1, column2;
UNION ALL — объединяет таблицы «по вертикали», т.е. если у таблиц одинаковые столбцы, то можно их просто соединить этим оператором. Думаю очевидно, что при объединении, можно селектом забирать по одному или два (или сколько угодно) нужных столбца, которые тоже можно объединить. Есть еще UNION — но это пес, который удаляет дубликаты (ну или оставляет только уникальные значения, тут как посмотреть).
SELECT column1, column2
FROM table1
WHERE condition
UNION ALL
SELECT column1, column2
FROM table2
WHERE condition;
COALESCE — необходимо для заполнения отсутствующих ячеек (none). В примере ниже, вместо N/A можно подставить любое нужное. Как результат, в столбце вместо Nan или NULL будет подставленное значение.
SELECT COALESCE(column1, 'N/A') AS result
FROM table;
Мало этого, сама коалеске умеет перебирать строки до первого ненулевого значения. Зачем это надо — хз, но умеет (на вход подаешь несколько столбцов).
ХАРДКОД — ну тут чисто примерчики отдельные, полезные и важные:
- чтобы добавить столбец с одним каким-то значением, достаточно его просто указать в селекте
- NULL — не считается Count`ом
- Умножение делимого (первого числа при делении) на 1.0, чтобы получить десятичные дроби (вау!)
- ГруппБай по всем полям, позволит найти те строки, которые повторяются (ну например юзер дважды сделал заказ за день, или в неделю, смотря как смотрим и что изучаем)
- Джойн по двум столбцам происходит при указании сразу двух ключей через AND
Классный пример комбинации Filter и IN
SELECT
time::date as date,
count(distinct user_id) as all_users,
count(distinct user_id) filter (where order_id not in (select order_id from user_actions where action = 'cancel_order')) as paying_users
MOD — mod(столбец, 2) — функция для вычисления остатка. В первом аргументе столбец, во втором на что делим. Нужно для того, чтобы понять, четное у нас число или нет.
- MOD(1, 2) = 1 % 2 = 1 (остаток от деления 1 на 2)
- MOD(2, 2) = 2 % 2 = 0 (остаток от деления 2 на 2)
- MOD(3, 2) = 3 % 2 = 1 (остаток от деления 3 на 2)
- MOD(4, 2) = 4 % 2 = 0 (остаток от деления 4 на 2)
- MOD(5, 2) = 5 % 2 = 1 (остаток от деления 5 на 2)