es
Feedback
Пишем на SQL

Пишем на SQL

Ir al canal en Telegram

Уроки по SQL. Изучаем базы данных на примере СУБД ORACLE, MySQL, MS SQL Server, PostgreSql Мой курс по SQL и базам данных: https://prime-soft.biz/courses/sql Связь со мной @iliahohlov

Mostrar más
1 891
Suscriptores
-124 horas
-57 días
-730 días
Archivo de publicaciones
Спасибо всем за активное участие! Очень рад Вашим решениям! Для того, чтобы отобразить месяца 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

Всем отличного понедельника! Есть таблица клиентов 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 = дата заведения). В отчёте отобразить номер или название месяца и количество заведённых клиентов. Результат отсортироваить по убыванию. Вначале отобразить месяца, в которых заведено больше всего клиентов. Задачу можно решить любым способом. Один из вариантов решения задачи опубликую чуть позже, сначала буду ждать работу от Вас 🤗

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

Сколько строк вернёт запрос SELECT * FROM CLIENTS WHERE DESCRIPTION <> NULL AND DESCRIPTION <> ''
Anonymous voting

В таблице CLIENTS есть три строки: ID NAME DESCRIPTION ----------------------------------------------------- 1 АО Волга NULL 2 ИП Иванов 3 ИП Петров Договор

Какой из этих запросов отобразит список товаров и их последнюю по дате стоимость?
Anonymous voting

Всем привет! Предлагаю очередную задачу по базам данных. Есть таблицы 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 voting

Как можно в команде SELECT при генерации данных в столбцы использовать значения других столбцов, не используя запросы из запросов и CTE. Значения в некоторые столбцы могут формироваться сложным расчетами или подзапросами. Теперь представь, что при определённом получаемом значении в одном из таких столбцов, значение в соседнем столбце должно формировать по-другому, или даже своим подзапросом на основании полученного значения в предыдущем столбце. Как реализовать подобное, не прибегая к запросу из получаемой таблицы данных и не используя CTE? В СУБД MySql и MariaDB есть пользовательские переменные (те, что с собачкой @), которые можно использовать прямо пока выводятся данные командой SELECT, строчка за строчкой. Посмотри: SELECT t.*, @id_table := (select ...) ID_TABLE, (select count(*) from places where id_table = @id_table and is_busy = 0) COUNT_FREE_PLACES FROM ..... В ПРЕДПОСЛЕДНИЙ(!) столбец формируется значение идентификатора некоторого столика ресторана. В ПОСЛЕДНИЙ(!) столбец рассчитывается количество свободных мест того столика ресторана, идентификатор которого выведен в предыдущем столбце. В пользовательскую переменную @id_table будет положено некоторое значение, оно же и будет выведено в качестве данных этого столбца. В следующий столбец подзапрос получит данные, опираясь на значение этой переменной. Главное, чтобы эти столбцы формировать в указанном порядке. Сначала столбец, в результате расчёта которого получим значение в переменную, а затем столбец, который будет использовать значение этой переменной. Удобно и легко, да? И эта возможность - лишь верхушка айсберга возможностей использования пользовательских переменных! В примере выше для каждой строки такой расчёт выводит данные независимо от предыдущей строки, так как в каждой новой строке переменная @id_table получает новое значение и по-новой выполняется подзапрос на основании её значения. Ещё про пользовательские переменные я писал здесь: https://dzen.ru/a/Zcv6A63PZGDLYLHc

Требуется удалить дату DATE_EN для сессии с идентификатором 3. Для этого необходимо воспользоваться командой:
Anonymous voting

Всем доброе утро! Есть таблица сессий TBL_SESSIONS: ID DATE_ST DATE_EN 1 12.03.25 14.03.25 2 15.03.25 16.03.25 3 19.03.25 22.03.25

Какой из способов наиболее эффективно улучшит производительность этого запроса?
Anonymous voting

Всем привет! Предлагаю небольшую задачу по SQL на тему оптимизации запросов и индексов. В базе данных есть таблица ORDERS, определенная так: CREATE TABLE ORDERS ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, DATE_CREATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP, USER_ID INT NOT NULL, STATUS VARCHAR(20) NOT NULL ); В таблице миллионы записей. Часто используется следующий запрос: SELECT * FROM ORDERS WHERE USER_ID = 123 AND STATUS = 'completed'; При этом выполнение запроса занимает значительное время.

Какое значение будет получено в результате запроса: SELECT SUM(AMOUNT) AS PAY_SUM FROM PAYMENTS
Anonymous voting

Таблица PAYMENTS определена следующим образом: CREATE TABLE PAYMENTS ( ID NUMBER PRIMARY KEY, DATE_PAY DATE DEFAULT SYSDATE, AMOUNT NUMBER) и имеет данные: ID DATE_PAY AMOUNT 1 22.04.2025 300 2 22.04.2025 150 3 23.04.2025 null

При выполнении команды INSERT INTO GOODS (ARTICLE, NAME, DATE_CREATE) VALUES ('111', 'Некоторый товар') какое значение вставится в столбце DATE_CREATE?
Anonymous voting

Ещё одна небольшая задача с нашей табличкой GOODS (только попробуйте ответить неправильно 😉): CREATE TABLE GOODS ( ARTICLE VARCHAR(20) NOT NULL PRIMARY KEY, NAME VARCHAR(100) NOT NULL, DATE_CREATE DATE DEFAULT CURRENT_DATE)

Как можно оптимизировать выполнение этого запроса?
Anonymous voting

Всем привет! Предлагаю очередную задачу. В базе данных PostgreSQL, среди прочих, есть таблица выставленных счетов INVOICES: CREATE TABLE INVOICES ( ID INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, DATE_CREATE TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, ID_CLIENT INTEGER NOT NULL, DESCRIPTION VARCHAR(300), CONSTRAINT FK1 FOREIGN KEY (ID_CLIENT) REFERENCES CLIENTS(ID)); CREATE INDEX IND_INVOICES_DATE_CREATE ON INVOICES (DATE_CREATE); В некотором отчёте АБС количество счетов, выставленных за текущий день формируется SQL запросом: SELECT COUNT(*) COUNT_INV FROM INVOICES WHERE DATE(DATE_CREATE) = CURRENT_DATE.