SQL Portal | Базы Данных
14.6K subscribers
713 photos
95 videos
41 files
579 links
Присоединяйтесь к нашему каналу и погрузитесь в мир баз данных

Связь: @devmangx

РКН: https://clck.ru/3H4Wo3
Download Telegram
20 SQL-вопросов среднего уровня (с подробными ответами)

1. Напиши SQL-запрос, чтобы найти вторую по величине зарплату.

SELECT MAX(salary) AS SecondHighestSalary
FROM employees
WHERE salary < (SELECT MAX(salary) FROM employees);


2. Как оптимизировать медленный SQL-запрос?

Используй подходящие индексы.
Избегай SELECT *, выбирай только нужные колонки.
Перепиши коррелированные подзапросы через JOIN.
Прогоняй EXPLAIN, чтобы понять план выполнения.
Разбей сложные запросы на CTE (WITH).

3. В чем разница между INNER JOIN и OUTER JOIN?

INNER JOIN: возвращает только совпадающие строки между таблицами.
OUTER JOIN: возвращает совпадающие строки и те, где нет совпадений (с NULL), бывает LEFT, RIGHT, FULL.

4. Напиши SQL-запрос, чтобы найти топ-3 отдела с самой высокой средней зарплатой.

SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
ORDER BY avg_salary DESC
LIMIT 3;


5. Как убрать дубликаты строк в SQL-запросе?

Можно использовать DISTINCT, либо ROW_NUMBER() внутри CTE и отфильтровать лишнее:

WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY name, department_id ORDER BY id) AS rn
FROM employees
)
DELETE FROM cte WHERE rn > 1;


6. Напиши SQL-запрос, чтобы найти сотрудников с одинаковыми именами в одном отделе.

SELECT name, department_id
FROM employees
GROUP BY name, department_id
HAVING COUNT(*) > 1;


7. В чем разница между UNION и UNION ALL?

UNION: убирает дубликаты.
UNION ALL: оставляет все строки, включая дубликаты.

8. Напиши SQL-запрос, чтобы найти отделы без сотрудников.

SELECT d.department_id, d.department_name
FROM departments d
LEFT JOIN employees e ON d.department_id = e.department_id
WHERE e.employee_id IS NULL;


9. Как индексирование помогает ускорить запросы?

Индексы уменьшают объем данных, которые сканируются при фильтрации или джойнах.
Создавай индексы на колонках, часто используемых в WHERE, JOIN и ORDER BY.

10. Напиши SQL-запрос, чтобы найти сотрудников, работающих больше 5 лет.

SELECT *
FROM employees
WHERE DATEDIFF(CURDATE(), hire_date) > 5 * 365;


11. В чем разница между SUBQUERY и JOIN?

Subquery: подзапрос внутри другого запроса, может быть вложенным.
JOIN: объединяет строки из нескольких таблиц по связанным колонкам.

12. Напиши SQL-запрос, чтобы найти топ-2 продукта с наибольшими продажами.

SELECT product_id, SUM(sales) AS total_sales
FROM sales_table
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 2;


13. Как использование хранимых процедур может улучшить производительность запросов?

Они заранее компилируются и кешируются.
Снижают сетевой трафик, объединяя несколько операций в один вызов.
Повышают модульность и переиспользуемость.

14. Напиши SQL-запрос, чтобы найти клиентов, оформивших заказ, но не сделавших оплату.

SELECT o.customer_id
FROM orders o
LEFT JOIN payments p ON o.order_id = p.order_id
WHERE p.payment_id IS NULL;


15. В чем разница между GROUP BY и HAVING?

GROUP BY: группирует строки по одной или нескольким колонкам.
HAVING: фильтрует группы, как WHERE, но для агрегированных данных.

16. Напиши SQL-запрос, чтобы найти сотрудников, работающих в одном отделе со своим менеджером.

SELECT e.employee_id, e.name
FROM employees e
JOIN employees m ON e.department_id = m.department_id AND e.manager_id = m.employee_id;


17. Как использовать оконные функции для решения сложных запросов?

Применяй ROW_NUMBER(), RANK(), SUM() OVER(), LAG() и т. д.
Они позволяют выполнять вычисления по нескольким строкам без группировки.

18. Напиши SQL-запрос, чтобы найти топ-3 продукта с самой высокой средней ценой.

SELECT product_id, AVG(price) AS avg_price
FROM products
GROUP BY product_id
ORDER BY avg_price DESC
LIMIT 3;


19. В чем разница между TRUNCATE и DELETE?

TRUNCATE: удаляет все строки, быстрее, и чаще всего нельзя откатить.
DELETE: удаляет выбранные строки, поддерживает WHERE и откаты через транзакции.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
При создании индексов или частичных индексов важно понимать, какие значения встречаются чаще всего и как распределены данные по процентилям.

В PostgreSQL это можно проверить с помощью запроса к таблице pg_statistic.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Нашёл мёд для тех, кто хочет освоить Git без нудных лекций.

Есть десктопное приложение под Mac, Windows и Linux, которое обучает работе с Git через практику.

Задания выполняются прямо в реальном Git и GitHub, репозитории создаются у вас в аккаунте и остаются навсегда.

Поддержка разных языков тоже в комплекте.

Ссылка: https://github.com/jlord/git-it-electron

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥31
Функция generate_series в Postgres принимает три аргумента:

- стартовое значение
- конечное значение
- шаг (инкремент)

Пример:

SELECT * FROM generate_series(1, 10, 2);


Результат:

1  
3
5
7
9


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
После установки октябрьского обновления 2025 года Oracle Database 23ai становится Oracle AI Database 26ai.

Теперь добавлена поддержка QUALIFY.

QUALIFY фильтрует результаты оконных функций после группировки —
так же, как HAVING фильтрует результаты агрегатных функций.

SELECT ... FROM ...
QUALIFY fn OVER ( ... ) > ...


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👀9
Сокращение в Postgres: USING можно использовать вместо JOIN ... ON a.id = b.id

SELECT DISTINCT
t.amount AS transaction_amount
FROM
accounts a
JOIN
transactions t USING (account_id)
WHERE
a.account_id = 1;


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Создавайте новые разделы списка при вставке новых значений ключа раздела в Oracle SQL, указав таблицу как

PARTITION BY LIST ( ... ) AUTOMATIC


или преобразуйте уже существующие таблицы с помощью

ALTER TABLE ... SET PARTITIONING AUTOMATIC

Майк Смитерс показывает, как это работает.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
Оператор CASE в Postgres

Преобразует данные в зависимости от условия.

SELECT
price,
CASE
WHEN price >= 500.00 THEN 'Luxury'
END AS price_tier
FROM
products
ORDER BY
price DESC;


Оператор CASE используется для изменения (трансформации) данных в зависимости от заданного условия.

Пример выше выбирает цену из таблицы products и добавляет вычисляемое поле price_tier.
Если price больше или равна 500, в это поле записывается 'Luxury'.

Результат сортируется по цене в порядке убывания.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
pg_flo — библиотека для потоковой обработки в PostgreSQL

Упрощает создание и выполнение потоковых операций прямо в PostgreSQL. Она предоставляет удобный интерфейс для работы с данными и отлично подходит для задач, где нужна последовательная обработка или сложные data pipeline-ы.

GitHub: github.com/pgflo/pg_flo

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
dx теперь показывает «версию по умолчанию» расширений рядом с установленной версией.

Можно сравнить версии, установленные бинарно, с записями в каталоге.

Быстрая команда

ALTER EXTENSION postgis UPDATE


исправит это.

Postgres COALESCE() и NULLIF():

Преобразовать NULL в другое значение можно с помощью COALESCE():

select name, coalesce(favorite_food, 'not provided') from users;


Сделать наоборот — превратить не-NULL значение в NULL:

select name, nullif(favorite_food, 'pizza') from users;


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Остерегайся фантомных чтений.

И в Postgres, и в MySQL возможно, что два одинаковых SELECT-запроса внутри одной и той же транзакции вернут разные результаты.

Представь, что у нас есть база и два клиента. Клиент A начинает транзакцию и делает SELECT всех заказов с суммой больше $100. Пока он выполняет другие запросы, клиент B вставляет новый заказ в таблицу и делает COMMIT. Потом клиент A снова выполняет тот же SELECT — и теперь видит новую строку, добавленную клиентом B!

Разрешено это или нет — зависит от уровня изоляции, который настроен.

В Postgres по умолчанию используется уровень READ COMMITTED, который допускает фантомные чтения. Каждый отдельный запрос видит консистентное состояние базы, но между запросами внутри одной транзакции могут появляться изменения, зафиксированные другими транзакциями.

Как и Postgres, MySQL поддерживает четыре уровня изоляции, которые можно настраивать. Более строгие уровни, вроде SERIALIZABLE, предотвращают фантомные чтения. Более «слабые», например READ COMMITTED, допускают их (по умолчанию в MySQL используется REPEATABLE READ).

Почему бы не использовать всегда SERIALIZABLE? Из-за производительности. Чем строже уровень изоляции, тем больше блокировок, и тем сильнее проседает перфоманс. Более «мягкие» уровни дают лучшую производительность, но ценой возможных неконсистентных данных.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
Совет по Postgres: если в запросах ты используешь NULLS FIRST или NULLS LAST, не забудь указать то же самое и при создании индекса.

CREATE INDEX ... ON table_name (column_name DESC NULLS LAST);


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Меня часто спрашивают, каким редактором я пользуюсь для работы с Postgres, чтобы писать SQL-запросы и получать результаты. На деле большинство имеют в виду графический редактор. Но я до сих пор сижу в стандартном консольном клиенте — psql, который идёт вместе с самим Postgres.

Главное, почему он для меня удобен, это немного понимания, как с ним работать, и пара лёгких настроек. Если ты только начинаешь, одно из самых простых и полезных действий — задать переменную окружения $EDITOR под свой любимый редактор. У меня локально стоит vim, но ты можешь указать sublime text, vscode или даже (брр) emacs.

После этого можно открыть последний выполненный запрос в выбранном редакторе командой \e.

Так ты остаёшься внутри psql, подключён к базе, но редактируешь запросы в удобном тебе редакторе.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍124🤔1
Зачем вообще нужны такие тулзы, как pgbouncer или pgcat, для Postgres? И что вообще значит transaction pooling?

Давай разберёмся на практике и посмотрим, как работает transaction pooling в pgcat.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
This media is not supported in your browser
VIEW IN TELEGRAM
Команда \watch {n} в Postgres повторно выполняет тот же запрос каждые n секунд.

Например, можно мониторить таблицу pg_stat_activity каждые 3 секунды так:

select * from pg_stat_activity; \watch 3


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
Когда-нибудь задумывался, как в SQL сделать выборку, где строки идут поочерёдно: мужчина, женщина, мужчина, женщина? Этот трюк отлично подойдёт для собесов в Deloitte, Accenture или любых задач, где нужно показать уверенное владение SQL.

Подход с ROW_NUMBER()

WITH Male AS (
SELECT id, EmpName, Gender, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM Employee
WHERE Gender = 'MALE'
),
Female AS (
SELECT id, EmpName, Gender, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM Employee
WHERE Gender = 'FEMALE'
),
pp AS (
SELECT id, EmpName, Gender, rn * 2 - 1 AS sort_order FROM Male
UNION ALL
SELECT id, EmpName, Gender, rn * 2 AS sort_order FROM Female
)
SELECT id, EmpName, Gender
FROM pp
ORDER BY sort_order;


Пояснение:

Шаг 1. Разделяем сотрудников по полу и каждому присваиваем порядковый номер.
ROW_NUMBER() OVER (ORDER BY id) даёт каждому сотруднику свой номер внутри группы (мужчины отдельно, женщины отдельно).

Шаг 2. Назначаем позиции так, чтобы чередование сохранялось:

Мужчины: rn * 2 - 1 → нечётные позиции (1, 3, 5 …)
Женщины: rn * 2 → чётные позиции (2, 4, 6 …)

После сортировки по sort_order получаем порядок: Мужчина → Женщина → Мужчина → Женщина.

Шаг 3. Выводим итоговую выборку.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
dbpill — это прокси для Postgres, который автоматизирует оптимизацию индексов, и теперь он в открытом доступе:

github.com/mayfer/dbpill

@SQLPortal
👍52🤔1
Кроссплатформенный клиент базы данных, созданный на основе Rust и Svelte

https://github.com/vrmiguel/pgpad/

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Минималистичный клиент для SQL-баз данных

Называется Outerbase Studio:

✓ Поддерживает MySQL, Postgres, SQLite и Mongo
✓ Работает с сервисами вроде Turso и Cloudflare D1
✓ Доступен для Web, macOS и Windows
✓ Бесплатный и с открытым исходным кодом

https://github.com/outerbase/studio

@SQLPortal
4👍3
Полезная находка: собрали в одном месте тестовые задания от разных компаний, включая и российский бигтех 😋

Там есть всё ( от Android и Python до SQL и фронтенда.) Отличный способ посмотреть, чего сейчас ждут от кандидатов и потренировать навыки на реальных задачах.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
Postgres и оператор :: для быстрой смены типов данных:

Вычитаем интервал:

SELECT '2025-10-15'::date - interval '3 days'


Сравнение значений:

SELECT * FROM sales WHERE amount::numeric > '1000'::numeric


Округление до нужной точности:

SELECT (10.0 / 3.0)::numeric(5, 2)


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4