Пишем на SQL
1.92K subscribers
38 photos
6 videos
7 files
97 links
Уроки по SQL. Изучаем базы данных на примере СУБД ORACLE, MySQL, MS SQL Server, PostgreSql
Download Telegram
Друзья, всем привет!
Можете поделиться, пожалуйста, какие СУБД (базы данных) Вы преимущественно используете для своих проектов (не связанных с работой по найму)?
Anonymous Poll
7%
MySql
35%
Postgresql
6%
SQLite
28%
MS SQL Server или ORACLE
5%
Другое
20%
Я не использую базы данных или нет своих проектов
Анекдот на тему баз данных 😀

Почему программист расстался с девушкой-администратором баз данных?
— Она постоянно проверяла его связи.
😁17👍2👀1
Всем привет! Предлагаю очередную задачу по базам данных.

Есть таблицы PRODUCTS (товары) и PRICES_HIST (история цен товаров), с которыми мы уже работали ранее:

CREATE TABLE PRODUCTS (
ID INT PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
DESCRIPTION VARCHAR(300) NULL DEFAULT NULL);

CREATE TABLE PRICES_HIST (
  ID_PRODUCT   INT,
  DATE_PRICE    DATE /* дата, начиная с которой будет действовать цена товара */,
  VALUE_PRICE  DECIMAL(10, 2),
  PRIMARY KEY (ID_PRODUCT, DATE_PRICE),
  CONSTRAINT FK1 FOREIGN KEY (ID_PRODUCT) REFERENCES PRODUCTS (ID)
)

Есть два SQL-запроса:
1)
SELECT ID,
NAME,
(SELECT MAX(VALUE_PRICE)
FROM PRICES_HIST
WHERE ID_PRODUCT = PRODUCTS.ID) AS PRICE
FROM PRODUCTS

2)
SELECT PRODUCTS.ID,
PRODUCTS.NAME,
MAX(PRICES_HIST.VALUE_PRICE) AS PRICE
FROM PRODUCTS
LEFT JOIN PRICES_HIST
ON PRICES_HIST.ID_PRODUCT = PRODUCTS.ID
GROUP BY PRODUCTS.ID,
PRODUCTS.NAME
Какой из этих запросов отобразит список товаров и их последнюю по дате стоимость?
Anonymous Quiz
11%
Первый запрос
22%
Второй запрос
16%
Оба запроса
51%
Ни один из этих запросов
В таблице CLIENTS есть три строки:
ID NAME DESCRIPTION
-----------------------------------------------------
1 АО Волга NULL
2 ИП Иванов
3 ИП Петров Договор
Сколько строк вернёт запрос
SELECT * FROM CLIENTS WHERE DESCRIPTION <> NULL AND DESCRIPTION <> ''
Anonymous Quiz
36%
0
40%
1
19%
2
5%
3
1
🧠 Как не потерять интерес к SQL (если учишь сам)

Учить SQL — просто, но легко заскучать🙂. Вот как держать фокус:

1️⃣ Реальные данные — пиши запросы к таблицам с фильмами, заказами или играми. Учись на том, что интересно.
2️⃣ Своя база — попробуй сделать мини-ERP: товары, клиенты, заказы. И JOIN-ы сразу станут осмысленными.
3️⃣ Мини-задачи — решай 1 SQL-задачу в день: sqlbolt.com, LeetCode, Mode.
4️⃣ Связь с кодом — попробуй писать SQL-запросы в Go или Python. Реальный эффект = реальный интерес.
5️⃣ Маленькие шаги — 20 минут в день лучше попытки "проглотить всё за выходные".

🔥 SQL — это не только слово "SELECT", это умение говорить с базами данных. А базы — везде.
16👍2🫡1
Всем отличного понедельника!

Есть таблица клиентов CLIENTS:
ID DATE_CREATE NAME
1 15.01.2024 ИП Иванов
2 27.01.2024 АО Вагон
3 04.02.2024 ИП Крупицкая
...
99 19.06.2025 АО Фонтанка

Требуется написать SQL-запрос, выводящий месяца за 2024 год, в которые было заведено более 10 клиентов (DATE_CREATE = дата заведения). В отчёте отобразить номер или название месяца и количество заведённых клиентов. Результат отсортироваить по убыванию. Вначале отобразить месяца, в которых заведено больше всего клиентов.

Задачу можно решить любым способом. Один из вариантов решения задачи опубликую чуть позже, сначала буду ждать работу от Вас 🤗
👍4
Спасибо всем за активное участие!
Очень рад Вашим решениям!

Для того, чтобы отобразить месяца 2024 года, в которых заведено более 10ти клиентов, для начала просто отберём клиентов, заведённых именно в 2024 году:

SELECT *
FROM CLIENTS
WHERE DATE_CREATE >= DATE '2024-01-01'
AND DATE_CREATE < DATE '2025-01-01'

Было бы неплохо, если бы на столбце DATE_CREATE был индекс.

Мы получили всех клиентов, которых завели в 2024ом году. Выводя клиентов, выведем и ещё один столбец, в который будем извлекать номер месяца из даты заведения клиента (для того, чтобы позже клиентов группировать по одинаковому номеру месяца). Новому столбцу дадим алиас "MM". Наш запрос получит вид:

SELECT CLIENTS. *,
EXTRACT(MONTH FROM DATE_CREATE) MM
FROM CLIENTS
WHERE DATE_CREATE >= DATE '2024-01-01'
AND DATE_CREATE < DATE '2025-01-01'

В запросе выше мы вывели все имеющиеся столбцы из таблицы CLIENTS и добавили ещё один новый, в него мы получили месяц заведения клиента. У некоторых клиентов месяц заведения одинаковый, сгруппируем строки по одинаковом получаемому месяцу заведения клиента, подсчитав сколько в каждую группу сгруппировалось строк:

SELECT
EXTRACT(MONTH FROM DATE_CREATE) MM, COUNT(*) CLIENTS_COUNT
FROM CLIENTS
WHERE DATE_CREATE >= DATE '2024-01-01'
AND DATE_CREATE < DATE '2025-01-01'
GROUP BY EXTRACT(MONTH FROM DATE_CREATE)

В результате получим таблицу вида:
MM CLIENTS_COUNT
1 5
2 7
3 12
...
Сгруппировав клиентов 2024 года по месяцу заведения и подсчитав сколько клиентов заведено в каждом месяце, используя HAVING теперь оставим тех, где подсчитанное количество больше 10:

SELECT
EXTRACT(MONTH FROM DATE_CREATE) MM, COUNT(*) CLIENTS_COUNT
FROM CLIENTS
WHERE DATE_CREATE >= DATE '2024-01-01'
AND DATE_CREATE < DATE '2025-01-01'
GROUP BY EXTRACT(MONTH FROM DATE_CREATE)
HAVING COUNT(*) > 10

Обратите внимание, что в HAVING-е недопустимо для большинства СУБД (да и по ANSI стандарту тоже) использовать алиас (новое имя) столбца, ведь столбец с данными ещё не создан. Но в HAVING-е можно использовать такой же расчёт количества, что и в SELECT-е. В итоге и получилось не:
HAVING CLIENTS_COUNT > 10
а:
HAVING COUNT(*) > 10

Осталось добавить упорядочивание месяцов по количеству заведенных в них клиентов. Месяца с наибольшим количеством заведённых клиентов должны отображаться сверху. А вот в сортировке можно использовать алиасы столбцов. Конечный вариант нашего запроса:
SELECT
EXTRACT(MONTH FROM DATE_CREATE) MM, COUNT(*) CLIENTS_COUNT
FROM CLIENTS
WHERE DATE_CREATE >= DATE '2024-01-01'
AND DATE_CREATE < DATE '2025-01-01'
GROUP BY EXTRACT(MONTH FROM DATE_CREATE)
HAVING COUNT(*) > 10
ORDER BY CLIENTS_COUNT DESC
👍81
Здравствуйте, друзья!

На следующей неделе планирую новую группу по SQL и PostgreSql, и в этот раз обучение будет по будням! 👌

- Он-лайн обучение по вторникам и четвергам 19:30 - 21:00;

- Закрытая Телеграм группа куда я буду выкладывать записи наших он-лайн встреч (на случай, если пропустите или захотите повторить материал);

- Будут самостоятельные практические задачи на тренеровочной базе данных. Я буду проверять Ваши решения, помогать оптимизировать их и находить ошибки!

Посмотреть программу обучения и записаться можно тут: https://prime-soft.biz/courses/postgresql

Оплатить можно в два этапа. Вначале 50% (7.450 ₽) и столько же после пятого урока. Всего будет 10 онлайн встреч.

График обучения:
- вт, чт 19:30 - 21:00;
- 08.07.2025 - 07.08.2025!

Оставляйте вопросы прямо под постом или отправляйте на почту: info@prime-soft.biz
👍2
Всем привет!

Решая практические задачи и даже проходя небольшие тесты по SQL, мы становимся умнее: освежаем в памяти возможности языка SQL, узнаём и закрепляем новые знания! Поэтому, не ленимся и принимаем участие!😉

Предлагаю очередной интересный вопрос по базам данных.

В базе данных, среди прочих, есть таблица клиентов CLIENTS, определённая так:

CREATE TABLE CLIENTS (
ID INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
INN VARCHAR(20));

CREATE UNIQUE INDEX CLIENTS_INN ON CLIENTS (INN);

В таблице CLIENTS две строки:
ID NAME INN
1 АО Волга 12345
2 ИП Пятаков NULL

Что произойдёт при выполнении следующей команды?

INSERT INTO CLIENTS
(NAME, INN)
VALUES
('АО Зелёный дом', NULL)
Что произойдёт при выполнении SQL команды?
Anonymous Quiz
66%
В таблицу CLIENTS добавится строка
34%
Будет SQL-ошибка
👍1