⚙️ Функция
Когда в таблице встречаются NULL, логика запросов ломается.
Функция
🔹 Как работает
🔹 Пример:
Если в поле phone встретятся значения NULL, то вместо них выведется фраза: — нет телефона —.
🔹 Несколько значений:
Здесь функция проверяет значения полей, заданных в скобках по порядку:
🧠
и её можно использовать почти везде: в SELECT, ORDER BY, GROUP BY, даже в UPDATE.
Вообщем это очень крутая функция, знать о которой обязательно.
COALESCE — простая подстановка значений в SQLКогда в таблице встречаются NULL, логика запросов ломается.
Функция
COALESCE помогает “подставить” значение по умолчанию, если значения отсутствуют, то есть вместо них NULL.🔹 Как работает
SELECT COALESCE (NULL, 'default'); -- вернёт 'default'SELECT COALESCE ('данные', 'default'); -- вернёт 'данные'COALESCE просто берёт первое не-NULL значение из списка аргументов.🔹 Пример:
SELECT name,
COALESCE (phone, '— нет телефона —') AS phone_display
FROM clients;
Если в поле phone встретятся значения NULL, то вместо них выведется фраза: — нет телефона —.
🔹 Несколько значений:
SELECT COALESCE(email, backup_email, '— нет контактов —') AS contact
FROM users;
Здесь функция проверяет значения полей, заданных в скобках по порядку:
email → backup_email → '— нет контактов —'.🧠
COALESCE — это страховка от NULL,и её можно использовать почти везде: в SELECT, ORDER BY, GROUP BY, даже в UPDATE.
Вообщем это очень крутая функция, знать о которой обязательно.
👍4
Всем привет.
Разбор позавчерашнего вопроса про возврат строк из таблицы. Решил, что это нужно разобрать, так как работа с NULL не всегда выдает очевидное — чаще как раз наоборот.
1.
Это условие никогда не выполнится, потому что любые сравнения с
2.
Это условие всегда возвращает
3.
Этот запрос вернет только те строки, где order_id больше 5, а значит не гарантирует возврат всех строк таблицы, если есть строки с
4.
Аналогично первому варианту, сравнение с NULL (
5.✅
Это условие всегда истинно, независимо от содержимого строки: каждая строка будет возвращена, поэтому этот вариант гарантировано возвращает все строки из таблицы, если они в ней есть.
6.
Как и в предыдущих сравнениях с
Разбор позавчерашнего вопроса про возврат строк из таблицы. Решил, что это нужно разобрать, так как работа с NULL не всегда выдает очевидное — чаще как раз наоборот.
1.
SELECT * FROM orders WHERE 1 = NULL;Это условие никогда не выполнится, потому что любые сравнения с
NULL, включая 1 = NULL, всегда дают результат UNKNOWN, и такие строки не попадают в результат запроса. Другими словами нельзя сравнивать существующее значение с NULL, результат всегда будет FALSE.2.
SELECT * FROM orders WHERE 1 = 0;Это условие всегда возвращает
FALSE, ни одна строка не будет выбрана, запрос вернет пустой результат, даже если строки есть. Просто потому что, 1 не равно 0.3.
SELECT * FROM orders WHERE order_id > 5;Этот запрос вернет только те строки, где order_id больше 5, а значит не гарантирует возврат всех строк таблицы, если есть строки с
order_id ≤ 5.4.
SELECT * FROM orders WHERE 1 <> NULL;Аналогично первому варианту, сравнение с NULL (
1 <> NULL) всегда возвращает UNKNOWN. В результате ни одна строка не будет выбрана.5.
SELECT * FROM orders WHERE 1 = 1; Это условие всегда истинно, независимо от содержимого строки: каждая строка будет возвращена, поэтому этот вариант гарантировано возвращает все строки из таблицы, если они в ней есть.
6.
SELECT * FROM orders WHERE NULL = NULL;Как и в предыдущих сравнениях с
NULL, результат всегда UNKNOWN, ни одна строка не попадает в выборку — гарантировано пусто.Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🧨 Почему
Когда ты пишешь
Вот почему:
1️⃣ Хеш-таблица при алгоритме соединения
Если ты делаешь JOIN, Postgres может выбрать алгоритм соединения
Когда ты ставишь *, туда летит всё подряд.
Результат —
2️⃣ TOAST говорит: “Приятного аппетита!”
Postgres хранит длинные значения (TEXT, JSONB и т.д.) в TOAST-таблицах.
Если ты выбираешь *, он вытаскивает их в любом случае, даже если тебе нужно только id. То есть ты сам зовёшь на ужин все 10-гигабайтные тексты, которые никто не ел 🤦♂️
3️⃣ INDEX ONLY SCAN? Нет, не слышали.
Но
И твой быстрый запрос превращается в медленный.
4️⃣ Лишние данные = лишняя нагрузка
Сеть, CPU, память — всё страдает.
Даже если приложение потом использует 2 поля из 20, Postgres всё равно тащит весь мешок данных и заботливо складывает тебе в ответ.
5️⃣ Буферный кеш засоряется
Postgres кеширует страницы данных в специальных буферах, для эффективного обмена нужными данными.
Когда ты выбираешь *, кеш наполняется ненужными колонками.
А потом, когда реально нужный запрос приходит — места уже нет 🤷♂️
💡 Вывод:
Пиши явно, что тебе нужно. PostgreSQL скажет “спасибо” и даст красивый план с
Наверное многие слышали что * это плохо, но мало кто понимает почему. Это конечно не простая тема, если будут вопросы по пунктам пишите, буду пояснять.
SELECT * — это зло, и PostgreSQL тебе этого не простит ?Когда ты пишешь
SELECT *, где-то внутри PostgreSQL тихо плачет планировщик 😢 Потому что вместо одного красивого запроса ты запускаешь комбайн по растаскиванию кучи строк.Вот почему:
1️⃣ Хеш-таблица при алгоритме соединения
Hash Join пухнет до параметра work_mem (параметр, выделяющий память для обработки запросов).Если ты делаешь JOIN, Postgres может выбрать алгоритм соединения
Hash Join, как один из алгоритмов и хеш таблица будет построена по всем выбранным колонкам.Когда ты ставишь *, туда летит всё подряд.
Результат —
work_mem забит, планировщик начинает спиллинг на диск, и “быстрый” JOIN идёт пить кофе ☕️2️⃣ TOAST говорит: “Приятного аппетита!”
Postgres хранит длинные значения (TEXT, JSONB и т.д.) в TOAST-таблицах.
TOAST - это такая специальная технология для хранения больших значений в отдельных таблицах.Если ты выбираешь *, он вытаскивает их в любом случае, даже если тебе нужно только id. То есть ты сам зовёшь на ужин все 10-гигабайтные тексты, которые никто не ел 🤦♂️
3️⃣ INDEX ONLY SCAN? Нет, не слышали.
INDEX ONLY SCAN - оптимизация при которой нужные в результате столбцы есть в самом индексе. То есть возможно не нужно обращаться к самой таблице, а достать все данные из самого индекса, работает очень быстро и эффективно.Но
SELECT * ломает эту оптимизацию — Postgres вынужден идти в heap (кучу строк), чтобы достать остальные поля.И твой быстрый запрос превращается в медленный.
4️⃣ Лишние данные = лишняя нагрузка
Сеть, CPU, память — всё страдает.
Даже если приложение потом использует 2 поля из 20, Postgres всё равно тащит весь мешок данных и заботливо складывает тебе в ответ.
5️⃣ Буферный кеш засоряется
Postgres кеширует страницы данных в специальных буферах, для эффективного обмена нужными данными.
Когда ты выбираешь *, кеш наполняется ненужными колонками.
А потом, когда реально нужный запрос приходит — места уже нет 🤷♂️
💡 Вывод:
SELECT * — это как “всё включено” в отеле, где ты ешь один салат, но платишь за омаров, вино и шоу с фаерболами.Пиши явно, что тебе нужно. PostgreSQL скажет “спасибо” и даст красивый план с
INDEX ONLY SCAN.Наверное многие слышали что * это плохо, но мало кто понимает почему. Это конечно не простая тема, если будут вопросы по пунктам пишите, буду пояснять.
👍3👏2
📦 Что происходит, когда ты нажимаешь «Оформить заказ» (или меняешь данные в личном кабинете на сайте).
Ты жмёшь кнопку «Купить», и кажется — всё, магия! ✨
Но на самом деле под капотом запускается целая цепочка событий,
в которой участвуют браузер, сервер и база данных PostgreSQL.
Разберёмся пошагово 👇
🖱
Браузер (например, Chrome) отправляет запрос серверу сайта.
Что-то вроде:
POST /order
Внутри — всё нужное: товар, количество, адрес доставки, твой логин.
Браузер не идёт напрямую в базу, он просто говорит серверу:
«Эй, вот заказ от пользователя №123!»
⚙️
На сервере работает программа (например, на Python, Node.js, PHP или Java).
Она:
- проверяет, что ты залогинен,
- что товар есть в наличии,
- считает сумму заказа,
- и готовит SQL-запрос к базе данных.
Примерно так:
🧩
Теперь приложение подключается к PostgreSQL (по внутреннему протоколу) и говорит:
«Postgres, вот SQL-запрос — запиши новый заказ!»
PostgreSQL принимает запрос, проверяет права и создаёт новую запись в таблице orders.
🧠
Под капотом Postgres делает кучу работы:
находит таблицу orders,
выделяет место для новой строки,
записывает данные,
обновляет индексы,
и добавляет запись в журнал WAL (чтобы ничего не потерять при сбое).
Когда всё готово, он отвечает серверу:
«Всё, я сохранил заказ ✅»
📤
Сервер формирует ответ:
{"status": "ok", "message": "Заказ оформлен"}
и отправляет его обратно в браузер. А браузер показывает тебе красивую страницу:
«Спасибо за заказ!» 💙
💡
Каждый раз, когда ты что-то делаешь на сайте —
оформляешь заказ, редактируешь профиль или ставишь лайк —
данные проходят длинный путь:
браузер → сервер → PostgreSQL → обратно к тебе на экран.
Никакой магии. Просто хорошо отлаженная система 💪
Ты жмёшь кнопку «Купить», и кажется — всё, магия! ✨
Но на самом деле под капотом запускается целая цепочка событий,
в которой участвуют браузер, сервер и база данных PostgreSQL.
Разберёмся пошагово 👇
🖱
1. Ты нажал кнопку на сайтеБраузер (например, Chrome) отправляет запрос серверу сайта.
Что-то вроде:
POST /order
Внутри — всё нужное: товар, количество, адрес доставки, твой логин.
Браузер не идёт напрямую в базу, он просто говорит серверу:
«Эй, вот заказ от пользователя №123!»
⚙️
2. Сервер получает запрос и решает, что делатьНа сервере работает программа (например, на Python, Node.js, PHP или Java).
Она:
- проверяет, что ты залогинен,
- что товар есть в наличии,
- считает сумму заказа,
- и готовит SQL-запрос к базе данных.
Примерно так:
INSERT INTO orders (user_id, product_id, quantity, address)
VALUES (123, 42, 2, 'ул. Примерная, д.7');
🧩
3. Сервер общается с PostgreSQLТеперь приложение подключается к PostgreSQL (по внутреннему протоколу) и говорит:
«Postgres, вот SQL-запрос — запиши новый заказ!»
PostgreSQL принимает запрос, проверяет права и создаёт новую запись в таблице orders.
🧠
4. PostgreSQL обрабатывает запросПод капотом Postgres делает кучу работы:
находит таблицу orders,
выделяет место для новой строки,
записывает данные,
обновляет индексы,
и добавляет запись в журнал WAL (чтобы ничего не потерять при сбое).
Когда всё готово, он отвечает серверу:
«Всё, я сохранил заказ ✅»
📤
5. Сервер отправляет ответ браузеруСервер формирует ответ:
{"status": "ok", "message": "Заказ оформлен"}
и отправляет его обратно в браузер. А браузер показывает тебе красивую страницу:
«Спасибо за заказ!» 💙
💡
Итого:Каждый раз, когда ты что-то делаешь на сайте —
оформляешь заказ, редактируешь профиль или ставишь лайк —
данные проходят длинный путь:
браузер → сервер → PostgreSQL → обратно к тебе на экран.
Никакой магии. Просто хорошо отлаженная система 💪
❤3
🧩
CASE WHEN — это способ добавить в SQL немного “ума”.
Он позволяет выполнять условия прямо в запросах:
выбирать разные значения в зависимости от данных,
похож на конструкцию if...else в обычных языках программирования.
🧠 Когда используется CASE WHEN ?
- когда нужно преобразовать значения на лету;
- когда нужно разделить данные на категории;
- когда хотите добавить логику без подзапросов.
💡 Пример:
Допустим, у нас есть таблица пользователей users с количеством их публикаций —
Нам нужно вывести, насколько активен каждый пользователь.
🔍 Разбор:
CASE WHEN проверяет условия сверху вниз.
Сначала смотрим, есть ли у пользователя 20 и больше постов.
Если да — возвращаем '🔥 Активный автор'.
Если нет — проверяем следующее условие: от 5 до 19 постов.
Подходит? Тогда '🙂 Иногда пишет'.
Если не сработало ни одно условие — выполняется ELSE, и возвращаем '💤 Почти неактивен'.
Результат появляется в новом столбце activity_level, который мы сами назвали в конце запроса.
🧩 Итого
CASE WHEN — отличный инструмент, когда нужно добавить гибкую логику прямо в SQL.
Используйте его, чтобы:
- превращать цифры в осмысленные статусы,
- управлять порядком сортировки,
- или просто делать запросы “умнее”.
CASE WHEN — гибкая логика прямо в SQL.CASE WHEN — это способ добавить в SQL немного “ума”.
Он позволяет выполнять условия прямо в запросах:
выбирать разные значения в зависимости от данных,
похож на конструкцию if...else в обычных языках программирования.
🧠 Когда используется CASE WHEN ?
- когда нужно преобразовать значения на лету;
- когда нужно разделить данные на категории;
- когда хотите добавить логику без подзапросов.
💡 Пример:
Допустим, у нас есть таблица пользователей users с количеством их публикаций —
posts_count.Нам нужно вывести, насколько активен каждый пользователь.
SELECT
username,
posts_count,
CASE
WHEN posts_count >= 20 THEN '🔥 Активный автор'
WHEN posts_count BETWEEN 5 AND 19 THEN '🙂 Иногда пишет'
ELSE '💤 Почти неактивен'
END AS activity_level
FROM users;
🔍 Разбор:
CASE WHEN проверяет условия сверху вниз.
Сначала смотрим, есть ли у пользователя 20 и больше постов.
Если да — возвращаем '🔥 Активный автор'.
Если нет — проверяем следующее условие: от 5 до 19 постов.
Подходит? Тогда '🙂 Иногда пишет'.
Если не сработало ни одно условие — выполняется ELSE, и возвращаем '💤 Почти неактивен'.
Результат появляется в новом столбце activity_level, который мы сами назвали в конце запроса.
🧩 Итого
CASE WHEN — отличный инструмент, когда нужно добавить гибкую логику прямо в SQL.
Используйте его, чтобы:
- превращать цифры в осмысленные статусы,
- управлять порядком сортировки,
- или просто делать запросы “умнее”.
🔥2👍1
Не сравнивай свой прогресс с чужим.
Кто-то уже пишет сложные CTE и использует оконные функции, а ты всё ещё осваиваешь базовые JOIN — и это абсолютно нормально!
SQL — отличный инструмент для работы с данными, и его можно изучать шаг за шагом:
Сначала пройди основы: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY.
После того как простые запросы станут привычными, переходи к JOIN, учись объединять данные из разных таблиц.
Потом попробуй CTE (WITH) и оконные функции — они пригодятся для сложных задач.
Мотивационная инструкция:
Ставь реалистичные цели на неделю или месяц (например, освоить один тип JOIN или научиться писать простой SELECT с GROUP BY)
Практикуйся регулярно — даже 20 минут в день
Не стесняйся ошибаться, пробуй разные подходы
Старайся учиться на задачах, которые тебе интересны и полезны
Окружай себя поддержкой: общайся с единомышленниками, участвуй в сообществе и делись успехами
Кто-то уже пишет сложные CTE и использует оконные функции, а ты всё ещё осваиваешь базовые JOIN — и это абсолютно нормально!
Учёба — не гонка. У каждого свой темп, свой стиль мышления и свой путь. Главное не просто повторять за другими, а реально понимать, как работают запросы и почему они нужны.
SQL — отличный инструмент для работы с данными, и его можно изучать шаг за шагом:
Сначала пройди основы: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY.
После того как простые запросы станут привычными, переходи к JOIN, учись объединять данные из разных таблиц.
Потом попробуй CTE (WITH) и оконные функции — они пригодятся для сложных задач.
Мотивационная инструкция:
Ставь реалистичные цели на неделю или месяц (например, освоить один тип JOIN или научиться писать простой SELECT с GROUP BY)
Практикуйся регулярно — даже 20 минут в день
Не стесняйся ошибаться, пробуй разные подходы
Старайся учиться на задачах, которые тебе интересны и полезны
Окружай себя поддержкой: общайся с единомышленниками, участвуй в сообществе и делись успехами
Если кажется, что идёшь медленно — это иллюзия! Ты уже знаешь гораздо больше, чем вчера, и движешься к своей цели.
👍3❤1
Всем привет. Загадка.
В таблице products есть колонки id, name, category, price. Какой из запросов вернёт товары, стоимостью больше 1000, которые принадлежат к категории 'Books' или 'Electronics' ?
В таблице products есть колонки id, name, category, price. Какой из запросов вернёт товары, стоимостью больше 1000, которые принадлежат к категории 'Books' или 'Electronics' ?
Anonymous Quiz
43%
SELECT * FROM products WHERE category = 'Books' OR category = 'Electronics' AND price > 1000;
33%
SELECT * FROM products WHERE (category = 'Books' OR category = 'Electronics') AND price > 1000;
0%
SELECT * FROM products WHERE category = 'Books' AND category = 'Electronics' OR price > 1000;
19%
SELECT * FROM products WHERE category = 'Books' AND category = 'Electronics' AND price > 1000;
5%
Ни один из вариантов ответа;
💣 Атомарность транзакций — “всё или ничего” в действии.
Прежде чем разбираться, давай коротко — что такое транзакции.
Транзакция — это последовательность операций, сохраняющая согласованность данных, при условии , что операции внутри одной транзакции выполнены полностью, без помех со стороны других транзакций.
Например, перевод денег, оформление заказа или обновление профиля — всё это делается через транзакции.
Чтобы база оставалась надёжной, транзакции подчиняются четырём свойствам — ACID:
A — Atomicity (атомарность) — всё или ничего
C — Consistency (согласованность)
I — Isolation (изолированность)
D — Durability (надёжность, сохранность)
Сегодня разберём первую букву — атомарность 👇
⚙️ Что значит “атомарно”
Атомарность (Atomicity) — это гарантия, что транзакция выполнится полностью или не выполнится вовсе. Если где-то посередине произошёл сбой (например, свет моргнул, сеть отвалилась, диск не ответил) — PostgreSQL откатит всё, как будто ничего не происходило.
💰 Пример с переводом денег:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1; — списываем деньги с одного счета
UPDATE accounts SET balance = balance + 100 WHERE id = 2; — зачисляем на другой счет
COMMIT;
💡 Если всё прошло успешно — COMMIT зафиксирует изменения в базе.
💥 Если один из шагов упадёт (например, второй UPDATE не выполнится) — PostgreSQL автоматически откатит транзакцию:
сделает ROLLBACK;
И оба счёта останутся без изменений.
То есть либо оба действия проходят, либо ни одно.
🧠 Почему это важно
Без атомарности могли бы быть такие “чудеса”:
со счёта A деньги списались,
на счёт B — не пришли.
И всё, нормальное состояние базы данных нарушено.
Атомарность спасает от этого, гарантируя, что база данных никогда не окажется “наполовину обновлённой”.
⚡️
Итого
Атомарность — это “всё или ничего”.
PostgreSQL делает так, чтобы любая операция внутри транзакции была неделимой и безопасной.
❤4👍3
Разбор загадки: логические OR и AND.
На первый взгляд кажется, что правильный вариант —
но... это не так 😏
⚙️ Что происходит на самом деле
SQL, как и большинство языков, имеет приоритет операторов.
AND выполняется раньше, чем OR.
Поэтому запрос читается вот так:
✅ Правильный вариант
Чтобы выбрать товары только дороже 1000 и из двух категорий, нужно "изолировать" условия скобками:
Теперь порядок вычисления ясен:
1️⃣ выбираются категории Books или Electronics,
2️⃣ применяется фильтр по цене, но именно к одной из категорий в скобках.
🧠 Почему это важно
Такие мелочи часто ломают бизнес-логику:
в отчёте появляются лишние строки,
фильтры работают “почти правильно”,
разработчик уверен, что всё ок — пока аналитик не замечает странные данные.
На первый взгляд кажется, что правильный вариант —
SELECT * FROM products WHERE category = 'Books' OR category = 'Electronics' AND price > 1000;
но... это не так 😏
⚙️ Что происходит на самом деле
SQL, как и большинство языков, имеет приоритет операторов.
AND выполняется раньше, чем OR.
Поэтому запрос читается вот так:
WHERE category = 'Books' OR (category = 'Electronics' AND price > 1000)
А значит — в результат попадут:
все товары из категории Books (независимо от цены),
и только те товары из Electronics, где price > 1000.
💥 То есть дешёвые книги тоже окажутся в выборке, которые стоят меньше 1000.
✅ Правильный вариант
Чтобы выбрать товары только дороже 1000 и из двух категорий, нужно "изолировать" условия скобками:
SELECT * FROM products
WHERE (category = 'Books' OR category = 'Electronics') AND price > 1000;
Теперь порядок вычисления ясен:
1️⃣ выбираются категории Books или Electronics,
2️⃣ применяется фильтр по цене, но именно к одной из категорий в скобках.
🧠 Почему это важно
Такие мелочи часто ломают бизнес-логику:
в отчёте появляются лишние строки,
фильтры работают “почти правильно”,
разработчик уверен, что всё ок — пока аналитик не замечает странные данные.
SQL не “угадывает” твои намерения — он строго следует приоритетам операторов.
💡 Вывод
AND сильнее OR.
Если хочешь, чтобы условия работали как тебе нужно —
ставь скобки и не надейся на интуицию.
❤4👍4
Разберем полезный инструмент, а именно как CASE помогает решать подобные задания.
Имеется таблица отзывов пользователей маркетплейса о купленных товарах.
У каждого отзыва есть оценка в звёздах.
Нужно посчитать, какой процент отзывов имеет оценку «2» относительно общего количества — в одном SQL-запросе.
SELECT
count(review_id) AS общее_количество,
count(CASE WHEN stars = 2 THEN review_id END) AS количество_с_оценкой_2,
round(count(CASE WHEN stars = 2 THEN review_id END)::numeric / count(review_id) * 100, 2) AS процент
FROM market.reviews r;
Как это работает:
-
`CASE WHEN stars = 2 THEN review_id END` возвращает `review_id` только для тех строк, где оценка равна 2, для остальных возвращается —
`NULL`.- Функция
`count()` не считает `NULL`, поэтому получается только количество отзывов с оценкой 2.- Делим
count(CASE WHEN stars = 2 THEN review_id END) на общее количество строк count(review_id) и умножаем на 100 — получаем процент.-
`round(..., 2)` округляет результат до двух знаков после запятой.В итоге одним запросом получаем сразу три показателя: общее количество отзывов, количество с оценкой 2 и их долю в процентах.
👍6❤2
⚙️ Основные операторы в SQL-запросе.
SQL-запрос — это как предложение на человеческом языке:
у него есть структура, логика и свой порядок выполнения.
Разберём каждую часть на простых примерах 👇
🧩 Общий синтаксис SQL-запроса
💡 Важно: порядок написания != порядок выполнения.
SQL выполняет команды вот так, в отличии от синтаксического написания:
🔹 SELECT — что выбираем
🔹 FROM — откуда выбираем
🔹 WHERE — фильтр строк
🔹 GROUP BY — группировка
🔹 HAVING — фильтр после группировки
🔹 ORDER BY — сортировка
🔹 LIMIT / OFFSET — ограничение выборки
SQL-запрос — это как предложение на человеческом языке:
у него есть структура, логика и свой порядок выполнения.
Разберём каждую часть на простых примерах 👇
🧩 Общий синтаксис SQL-запроса
SELECT <столбцы или выражения>
FROM <таблица, подзапрос, функция>
WHERE <условие фильтрации>
GROUP BY <группировка>
HAVING <условие фильтрации для групп>
ORDER BY <сортировка>
LIMIT <ограничение количества строк>;
💡 Важно: порядок написания != порядок выполнения.
SQL выполняет команды вот так, в отличии от синтаксического написания:
👉 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
🔹 SELECT — что выбираем
Используется, чтобы выбрать нужные данные.
Можно:
выбрать все столбцы с помощью *,
выбрать только нужные:
SELECT name, price FROM products;
задавать псевдонимы полям для удобства:
SELECT price AS cost, name AS product_name FROM products;
💡 Псевдонимы (AS) можно использовать в ORDER BY, но не в WHERE, GROUP BY (PostgreSQL можно) или HAVING.
🔹 FROM — откуда выбираем
Указывает источник данных: таблицу, подзапрос, JOIN или даже функцию.
FROM users
JOIN orders ON users.id = orders.user_id;
Можно подставлять функции, например:
FROM generate_series(1,10);
🔹 WHERE — фильтр строк
Фильтрует строки до группировки.
WHERE price > 1000 AND category = 'Electronics';
💡 Работают логические операторы AND, OR, NOT, а также IN, LIKE, BETWEEN.
❗️ Псевдонимы из SELECT здесь использовать нельзя.
🔹 GROUP BY — группировка
Объединяет строки по признаку для агрегирования (например для подсчета суммы SUM, или количества COUNT для групп).
GROUP BY category;
💡 Здесь нельзя использовать псевдонимы из SELECT (в PostgreSQL можно),
но можно использовать выражения и номера столбцов:
GROUP BY 1; -- по первому столбцу из SELECT
🔹 HAVING — фильтр после группировки
Применяется уже к агрегированным данным:
HAVING COUNT(*) > 10;
💡 Псевдонимы из SELECT также недоступны — только реальные имена или агрегаты.
🔹 ORDER BY — сортировка
Сортирует строки по нужному полю.
ORDER BY price ASC;
ORDER BY price DESC;
ASC — по возрастанию (по умолчанию можно не писать)
DESC — по убыванию
💡 Здесь можно использовать псевдонимы из SELECT и номера столбцов:
ORDER BY 2 DESC;
🔹 LIMIT / OFFSET — ограничение выборки
Ограничивает количество возвращаемых строк:
LIMIT 10 - выводит 10 строк
OFFSET 20 - отступает первые 20 строк
💡 Псевдонимы здесь не применяются, так как это уже финальная стадия результата.
🔥10💯1
🔢 Разница между COUNT(*), COUNT(id) и COUNT(DISTINCT id)
В SQL эти три конструкции вроде бы похожи, но на деле ведут себя по-разному.
Разберём их на понятном примере с таблицей orders, которая изображена на картинке.
1️⃣ COUNT(*):
2️⃣ COUNT(user_id):
3️⃣ COUNT(DISTINCT user_id):
📘 Итого:
В SQL эти три конструкции вроде бы похожи, но на деле ведут себя по-разному.
Разберём их на понятном примере с таблицей orders, которая изображена на картинке.
1️⃣ COUNT(*):
SELECT COUNT(*) FROM orders;
Считает все строки, независимо от того, есть ли там NULL.
В нашем примере результат: 4.
2️⃣ COUNT(user_id):
SELECT COUNT(user_id) FROM orders;
Считает только те строки, где user_id не NULL.
У столбца user_id есть одно значения NULL, оно не попадает в подсчёт.
Результат: 3.
3️⃣ COUNT(DISTINCT user_id):
SELECT COUNT(DISTINCT user_id FROM orders;
Считает только уникальные значения user_id, и при этом игнорирует NULL.
В нашем примере уникальные user_id → 10, 11 результат: 2.
📘 Итого:
COUNT(*) → сколько всего строк в таблице.
COUNT(col) → сколько не-NULL значений в столбце.
COUNT(DISTINCT col) → сколько уникальных значений.
👍5🔥2
👨💻 Кто есть кто в мире данных (2025): короткий и понятный разбор
Мир данных развивается быстро — и роли внутри него тоже.
Вот актуальный гайд по ключевым направлениям в 2025 году: чем занимаются специалисты и где они востребованы.
📊 Data Analyst
🧱 Data Engineer
🛡 DBA (Database Administrator)
🤖 Data Scientist
📌 Итог: роли не конкурируют — они дополняют друг друга
Мир данных развивается быстро — и роли внутри него тоже.
Вот актуальный гайд по ключевым направлениям в 2025 году: чем занимаются специалисты и где они востребованы.
📊 Data Analyst
Специалист по анализу и визуализации данных, который помогает бизнесу принимать решения на основе отчётов и выявленных тенденций.
Работает с SQL, Excel, Power BI, Tableau.
В 2025 году — одна из самых востребованных ролей в РФ и Европе, особенно в BI, продуктовых компаниях и финансах. Часто совмещает функции бизнес-аналитика.
Что делает:
- строит дашборды и отчёты;
- анализирует данные и ищет закономерности;
- отвечает на вопрос «что произошло и почему».
🧱 Data Engineer
Создаёт и поддерживает инфраструктуру данных: хранилища, пайплайны, очереди, системы обработки.
Ориентирован на масштабируемость, качество и надёжность передачи данных.
Инструменты — Python, SQL, Spark, Airflow, облака. Востребован в IT, финтехе, медицине, e-commerce.
Что делает:
- проектирует хранилища и Data Lake;
- строит ETL/ELT-пайплайны;
- обеспечивает доступность и качество данных.
🛡 DBA (Database Administrator)
Администратор баз данных — специалист, отвечающий за работоспособность, безопасность и производительность систем хранения данных. Занимается резервированием, мониторингом, настройкой и эксплуатацией системами управления базами данных (СУБД).
Популярная и классическая роль, в 2025 всё чаще совмещается с инженерными функциями: DevOps-подход, автоматизация, инфраструктурный код.
Что делает:
- настраивает СУБД, репликацию, резервное копирование;
- следит за производительностью;
- обеспечивает отказоустойчивость и безопасность.
🤖 Data Scientist
Строит модели, применяет машинное обучение и статистику для прогнозов, оптимизаций и автоматизации решений. Работает с Python, R, ML/AI-фреймворками, большими и разнородными данными.
Востребован в рекомендательных системах, финтехе, медицине, производстве, AI-разработке.
Что делает:
- создаёт ML-модели;
- анализирует данные на глубоком уровне;
- отвечает на вопросы «что будет» и «что стоит сделать».
📌 Итог: роли не конкурируют — они дополняют друг друга
Data Analyst — поясняет бизнесу, что происходит в данных.
Data Engineer — делает данные доступными и надёжными.
DBA — следит, чтобы СУБД работала быстро и безопасно.
Data Scientist — строит алгоритмы и прогнозы.
Каждая роль закрывает свою часть работы — вместе они формируют полный цикл работы с данными.
🔥2
🔍 Где использовать условия в операциях JOIN в SQL?
Выполняя соединение таблиц, особенно это касается LEFT JOIN очень важно понимать куда вставить условие фильтрации.
✅ Пример 1: INNER JOIN + WHERE
⚠️ Пример 2: LEFT JOIN + WHERE
⭐️ Пример 3: LEFT JOIN + фильтр в ON
Выполняя соединение таблиц, особенно это касается LEFT JOIN очень важно понимать куда вставить условие фильтрации.
✅ Пример 1: INNER JOIN + WHERE
SELECT u.name, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.amount > 150;
Что происходит:
INNER JOIN оставляет только строки, где есть заказы, совершенные клиентами.
WHERE фильтрует только реальные строки заказов стоимостью более 150.
📊 Результат:
name amount
Anna 200
Bob 300
Kate исчезает уже на этапе JOIN.
⚠️ Пример 2: LEFT JOIN + WHERE
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.amount > 150;
Что происходит:
LEFT JOIN создаёт такие строки:
| name | amount |
|-----—-|-------——--|
| Anna | 100 |
| Anna | 200 |
| Bob | 300 |
| Kate | NULL |
WHERE применяет фильтр:
o.amount > 150
NULL > 150 = UNKNOWN → строка отбрасывается.
📊 Результат:
name amount
Anna 200
Bob 300
Kate исчезла, потому что WHERE удаляет строки с NULL.
LEFT JOIN превратился в INNER JOIN.
⭐️ Пример 3: LEFT JOIN + фильтр в ON
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id AND o.amount > 150;
Что происходит:
Фильтрация происходит во время JOIN, а не после него.
LEFT JOIN сохраняет всех пользователей из таблицы users (левая таблица) и присоединяет к ней строки из таблицы orders (правая таблица) предварительно отфильтрованные по условию amount > 150.
📊 Результат:
name amount
Anna 200
Bob 300
Kate NULL
В данном случае LEFT JOIN ничего не потерял.
❤2👍2
Всем привет. Сегодня без сложных примеров. А завтра нас будет ждать небольшая задача.
Кажется, что SQL — это так просто.
Да и постоянно слышишь: «Да чему там учиться, за две недели освоишь!»
И поначалу действительно так и кажется — пишешь себе спокойный и простой SELECT, чувствуешь себя уверенно, жизнь прекрасна.
Но потом приходит ОН.
Подзапрос.
А за ним — подзапрос в подзапросе.
А внутри — ещё один подзапрос, который смотрит на тебя так, будто проверяет, действительно ли ты хочешь заниматься аналитикой 😄
И вот ты уже сидишь, смотря на конструкцию длиной в километр, и думаешь:
«Может, это какой-то тест? Может, это вообще не SQL?»
SQL интуитивен и логичен…
Пока не наступит момент, когда интуиция сдаётся и отследить логику становится крайне сложно.
Кажется, что SQL — это так просто.
Да и постоянно слышишь: «Да чему там учиться, за две недели освоишь!»
И поначалу действительно так и кажется — пишешь себе спокойный и простой SELECT, чувствуешь себя уверенно, жизнь прекрасна.
Но потом приходит ОН.
Подзапрос.
А за ним — подзапрос в подзапросе.
А внутри — ещё один подзапрос, который смотрит на тебя так, будто проверяет, действительно ли ты хочешь заниматься аналитикой 😄
И вот ты уже сидишь, смотря на конструкцию длиной в километр, и думаешь:
«Может, это какой-то тест? Может, это вообще не SQL?»
SQL интуитивен и логичен…
Пока не наступит момент, когда интуиция сдаётся и отследить логику становится крайне сложно.
Но хорошая новость в том:
Что ты не один.
Мы все это проходили — и выживали 😉
👍6❤2😁2
На изображении находится SQL запрос. Но он не работает. Укажи все ошибки в этом SQL запросе и помоги его запустить.
Anonymous Poll
28%
В ORDER BY нельзя использовать псевдонимы
44%
В WHERE нельзя использовать агрегированные вычисления
11%
Таблицы должны соединяться по столбцам с одинаковым названием
33%
В HAVING нельзя использовать псевдонимы
33%
В GROUP BY отсутствует столбец, указанный в SELECT
67%
В ORDER BY используется неизвестный псевдоним
11%
HAVING должен располагаться после ORDER BY
👍3🔥2
Как SQL до сих пор держит позиции — и почему это хорошо.
SQL остаётся одним из самых востребованных и долгоживущих языков в сфере работы с данными. Несмотря на постоянное появление новых подходов, форматов и СУБД, он продолжает занимать устойчивое место практически во всех областях, связанных с хранением и анализом информации.
1. SQL — зрелый и стандартизированный инструмент
2. Широкое распространение реляционных баз данных
3. Повышенные требования к структуре и надёжности
4. SQL хорошо подходит для аналитических задач
5. SQL эволюционирует вместе с индустрией
Итог.
SQL остаётся одним из самых востребованных и долгоживущих языков в сфере работы с данными. Несмотря на постоянное появление новых подходов, форматов и СУБД, он продолжает занимать устойчивое место практически во всех областях, связанных с хранением и анализом информации.
1. SQL — зрелый и стандартизированный инструмент
SQL существует уже несколько десятков лет, и за это время стал промышленным стандартом. Его синтаксис, принципы и модели данных хорошо формализованы, что обеспечивает предсказуемость и совместимость между разными реляционными системами.
2. Широкое распространение реляционных баз данных
Большинство бизнес-приложений — от финансовых систем до аналитических платформ — работают на реляционных СУБД. PostgreSQL, MySQL, SQL Server, Oracle и другие остаются основой инфраструктуры компаний. Это делает SQL жизненно важным для разработки и анализа.
3. Повышенные требования к структуре и надёжности
Реляционные модели и ACID-гарантии обеспечивают высокую надёжность, согласованность и устойчивость данных. Многие проекты, особенно критичные для бизнеса, не могут позволить себе слабые гарантии или непредсказуемые схемы данных.
4. SQL хорошо подходит для аналитических задач
От простых выборок до сложных агрегаций, оконных функций и CTE — SQL прекрасно решает аналитические запросы. Многие современные инструменты, включая BigQuery, Snowflake и Spark SQL, расширяют SQL, а не заменяют его.
5. SQL эволюционирует вместе с индустрией
Современные СУБД добавляют новые возможности: работу с JSON, расширенные типы данных, функции машинного обучения и гибридные модели хранения. SQL не стоит на месте — он адаптируется.
Итог.
SQL остаётся ключевым языком для работы с данными благодаря своей зрелости, универсальности и устойчивости. Он доказал свою эффективность временем, а современная индустрия только укрепляет его позиции.
👍3🔥2
