Спасибо за активное участие!
Большое количество ответов. И немного дискуссии - всё как любят в айти)
Мне понравилось решерие Бориса, именно такой способ в качестве решения этой задачи я и хотел написать! Он самый простой и будет работать на всех современных СУБД (PostgreSql, MySql, ORACLE, MS SQL Server и т.д.).
Решение с помощью INSERT-а на основе SELECT-а. INSERT вставляет в целевую таблицу строки, которые начитывает (готовит) SELECT.
Борис отобрал значения из таблицы CODES_2024 для которых не нашлось ещё такого кода в таблице CODES_ALL. Эти значения и будут вставлены в CODES_ALL.
Решения подобных проблем я описал в своей статье в Дзене: https://dzen.ru/a/YrBUMUU2jxB4P8Ry
Большое количество ответов. И немного дискуссии - всё как любят в айти)
Мне понравилось решерие Бориса, именно такой способ в качестве решения этой задачи я и хотел написать! Он самый простой и будет работать на всех современных СУБД (PostgreSql, MySql, ORACLE, MS SQL Server и т.д.).
Решение с помощью INSERT-а на основе SELECT-а. INSERT вставляет в целевую таблицу строки, которые начитывает (готовит) SELECT.
Борис отобрал значения из таблицы CODES_2024 для которых не нашлось ещё такого кода в таблице CODES_ALL. Эти значения и будут вставлены в CODES_ALL.
Решения подобных проблем я описал в своей статье в Дзене: https://dzen.ru/a/YrBUMUU2jxB4P8Ry
Дзен | Статьи
КАК ВСТАВИТЬ ТОЛЬКО НЕДОСТАЮЩИЕ СТРОКИ ИЗ ОДНОЙ ТАБЛИЦЫ В ДРУГУЮ, НЕ ИСПОЛЬЗУЯ ПОДЗАПРОСЫ И MERGE
Статья автора «Илья Хохлов» в Дзене ✍: MERGE есть не во всех СУБД, да и подзапросы могут негативно сказаться на производительности.
👍4
Поле D_NUM таблицы DOCS имеет тип данных VARCHAR(4) и отмечено как NOT NULL. В таблице DOCS пока 2 строки. В первой строке D_NUM имеет значение "2888" и во второй строке "3477". Какое количество строк вернёт запрос: SELECT * FROM DOCS WHERE D_NUM != NULL
Anonymous Quiz
43%
0
4%
1
53%
2
1%
3
0%
4
👍5🤬5😁2
Всем привет и хорошего окончания рабочей недели!
Айтишник в пятницу вечером заходит в бар, заказывает пиво.
Бармен спрашивает:
— Вам светлое или тёмное?
Айтишник (задумавшись):
— А в чем разница? В производительности?
Айтишник в пятницу вечером заходит в бар, заказывает пиво.
Бармен спрашивает:
— Вам светлое или тёмное?
Айтишник (задумавшись):
— А в чем разница? В производительности?
😁5🤔1
Всем привет! На этой неделе не оставлю Вас без задачи!
Даны две таблицы ORDERS (заказы) и ORDER_ITEMS (позиции заказов). Таблица ORDERS, имеет следующую структуру:
CREATE TABLE
PRIMARY KEY (
);
Таблица ORDER_ITEMS имеет структуру:
CREATE TABLE
PRIMARY KEY (
INDEX
CONSTRAINT
CONSTRAINT
);
Каждый заказ может иметь несколько позиций заказа (несколько строк в таблице ORDER_ITEMS). Столбец ID_PRODUCT указывает на товар позиции заказа, а в столбце AMOUNT хранится его количество (сколько штук товара взято в позицию заказа). Задача: написать запрос, выводящий номера заказов, где все позиции заказа имеют количество (значение в столбце AMOUNT) равным одному.
Решение, как всегда, попозже! Сначала попробуйте, пожалуйста, сами!
Даны две таблицы ORDERS (заказы) и ORDER_ITEMS (позиции заказов). Таблица ORDERS, имеет следующую структуру:
CREATE TABLE
ORDERS
(ID
INT(11) NOT NULL,DATE_ORDER
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,ID_CLIENT
INT(11) NOT NULL,PRIMARY KEY (
ID
) USING BTREE);
Таблица ORDER_ITEMS имеет структуру:
CREATE TABLE
ORDER_ITEMS
(ID
INT(11) NOT NULL,ID_ORDER
INT(11) NOT NULL,ID_PRODUCT
INT(11) NOT NULL DEFAULT '1',AMOUNT
INT(11) NOT NULL DEFAULT '1',PRIMARY KEY (
ID
) USING BTREE,INDEX
indOrder
(ID_ORDER
) USING BTREE,CONSTRAINT
FK_ORDER_ITEMS_ORDERS1
FOREIGN KEY (ID_ORDER
) REFERENCES ORDERS
(ID
) ON UPDATE NO ACTION ON DELETE NO ACTION,CONSTRAINT
FK_ORDER_ITEMS_ORDERS2
FOREIGN KEY (ID_PRODUCT
) REFERENCES PRODUCTS
(ID
) ON UPDATE NO ACTION ON DELETE NO ACTION);
Каждый заказ может иметь несколько позиций заказа (несколько строк в таблице ORDER_ITEMS). Столбец ID_PRODUCT указывает на товар позиции заказа, а в столбце AMOUNT хранится его количество (сколько штук товара взято в позицию заказа). Задача: написать запрос, выводящий номера заказов, где все позиции заказа имеют количество (значение в столбце AMOUNT) равным одному.
Решение, как всегда, попозже! Сначала попробуйте, пожалуйста, сами!
👍3
Спасибо всем за активное участие!
Задачи, похожие на предыдущую, удобно решать с помощью оператора ALL, который, в нашем примере, мог бы проверить что у всех позиций заказа количество такое-то, или, например, единица измерения всех позиций - килограммы.
Решение с помощью оператора ALL:
SELECT ID /* или любую другую информацию о заказах*/
FROM ORDERS
WHERE 1 = ALL (SELECT AMOUNT FROM ORDER_ITEMS WHERE ID_ORDER = ORDERS.ID)
Задачи, похожие на предыдущую, удобно решать с помощью оператора ALL, который, в нашем примере, мог бы проверить что у всех позиций заказа количество такое-то, или, например, единица измерения всех позиций - килограммы.
Решение с помощью оператора ALL:
SELECT ID /* или любую другую информацию о заказах*/
FROM ORDERS
WHERE 1 = ALL (SELECT AMOUNT FROM ORDER_ITEMS WHERE ID_ORDER = ORDERS.ID)
👍12
Вот ещё одна классная задача по SQL (на примере СУБД PostgreSQL).
Таблица GOODS имеет структуру:
CREATE TABLE GOODS (
ARTICLE VARCHAR(20) NOT NULL PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
DATE_CREATE DATE DEFAULT CURRENT_DATE).
Таблица GOODS имеет структуру:
CREATE TABLE GOODS (
ARTICLE VARCHAR(20) NOT NULL PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
DATE_CREATE DATE DEFAULT CURRENT_DATE).
При выполнении команды INSERT INTO GOODS (ARTICLE, NAME, DATE_CREATE) VALUES ('111', 'Некоторый товар', NULL) какое значение вставится в столбце DATE_CREATE?
Anonymous Quiz
37%
Текущая дата
43%
NULL
19%
Будет ошибка выполнения данной команды
👍1
Хочу поделиться одним замечательным отзывом, который недавно получил от ученика после прохождения курса "Программирования в PL/SQL (ORACLE)":
Спасибо Вам большое за этот курс и возможность прокачать свои знания в PLSQL!
Курс оказался невероятно полезным и структурированным. Материал подается доступно, с практическими примерами, что позволяет легко усваивать даже сложные темы.
Особенно понравилось, что было много практических заданий, которые помогли закрепить теорию на практике.
После прохождения курса я чувствую себя гораздо увереннее в написании сложных SQL-запросов, работе с хранимыми процедурами и оптимизации кода.
Обязательно буду рекомендовать этот курс коллегам и друзьям!
Еще раз большое спасибо за ваш труд и качественное обучение!
Сергей, Вам спасибо, что обучались разработке в ORACLE со мной! Был очень рад пройти с Вами весь курс программирования!
Спасибо Вам большое за этот курс и возможность прокачать свои знания в PLSQL!
Курс оказался невероятно полезным и структурированным. Материал подается доступно, с практическими примерами, что позволяет легко усваивать даже сложные темы.
Особенно понравилось, что было много практических заданий, которые помогли закрепить теорию на практике.
После прохождения курса я чувствую себя гораздо увереннее в написании сложных SQL-запросов, работе с хранимыми процедурами и оптимизации кода.
Обязательно буду рекомендовать этот курс коллегам и друзьям!
Еще раз большое спасибо за ваш труд и качественное обучение!
Сергей, Вам спасибо, что обучались разработке в ORACLE со мной! Был очень рад пройти с Вами весь курс программирования!
👍8🔥4
Всем доброго понедельника!
В базе данных, помимо прочих, есть таблица PRODUCTS:
CREATE TABLE PRODUCTS (
ID INT PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
DESCRIPTION VARCHAR(300) NULL DEFAULT NULL);
и таблица PRICES_HIST:
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)
)
В базе данных, помимо прочих, есть таблица PRODUCTS:
CREATE TABLE PRODUCTS (
ID INT PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
DESCRIPTION VARCHAR(300) NULL DEFAULT NULL);
и таблица PRICES_HIST:
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)
)
👍2
Какая связь между таблицами PRODUCTS и PRICES_HIST?
Anonymous Quiz
17%
Один к одному
70%
Один ко многим
6%
Многие ко многим
7%
Между таблицами связи нет
Тестовые задачи по SQL.pdf
78.9 KB
Небольшой сборник задач на написание SQL-запросов (от простых к сложным). Ссылка на скачивание тестовой базы данных (PostgreSQL) в файле.
🐳9👍5❤1❤🔥1
🚀 Стартует интенсив по SQL и PostgreSQL! 🚀
📅 3 мая | 👥 Группа до 10 человек | 🕘 По Сб и Вс в 9:00
🔹 10 насыщенных онлайн-занятий (с записями)
🔹 Максимум практики – работаем вместе, а не просто слушаем!
🔹 Закрытый Telegram-чат с материалами и поддержкой
🔹 Сертификат после завершения курса
🔹 Помощь с резюме для старта в профессии
💡 Идеально для тех, кто хочет:
✅ Освоить PostgreSQL с нуля
✅ Научиться писать эффективные запросы
✅ Получить реальные навыки для работы
📌 Успей записаться! Группа маленькая – места ограничены.
🔗 Подробнее: https://prime-soft.biz/courses/postgresql
📅 3 мая | 👥 Группа до 10 человек | 🕘 По Сб и Вс в 9:00
🔹 10 насыщенных онлайн-занятий (с записями)
🔹 Максимум практики – работаем вместе, а не просто слушаем!
🔹 Закрытый Telegram-чат с материалами и поддержкой
🔹 Сертификат после завершения курса
🔹 Помощь с резюме для старта в профессии
💡 Идеально для тех, кто хочет:
✅ Освоить PostgreSQL с нуля
✅ Научиться писать эффективные запросы
✅ Получить реальные навыки для работы
📌 Успей записаться! Группа маленькая – места ограничены.
🔗 Подробнее: https://prime-soft.biz/courses/postgresql
prime-soft.biz
Prime | Курс SQL, PostgreSql
Уроки и курсы SQL, PostgreSQL, Базы данных.
Всем привет!
Предлагаю очередную задачу. В базе данных 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.
Предлагаю очередную задачу. В базе данных 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.
Как можно оптимизировать выполнение этого запроса?
Anonymous Quiz
17%
Поменять условие: WHERE DATE_CREATE::DATE = CURRENT_DATE
31%
Поменять условие:WHERE DATE_CREATE >= CURRENT_DATE AND DATE_CREATE < CURRENT_DATE + INTERVAL '1 day'
9%
Поменять условие: WHERE to_char(DATE_CREATE, 'dd.mm.yyyy') = to_char(CURRENT_DATE, 'dd.mm.yyyy')
25%
Добавить индекс: CREATE INDEX IND_INVOICES_DATE_CREATE2 ON INVOICES (EXTRACT(DAY FROM DATE_CREATE))
4%
Удалить индекс: DROP INDEX IF EXISTS IND_INVOICES_DATE_CREATE
13%
Оптимизация такого запроса невозможна
👍2
Ещё одна небольшая задача с нашей табличкой GOODS (только попробуйте ответить неправильно 😉):
CREATE TABLE GOODS (
ARTICLE VARCHAR(20) NOT NULL PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
DATE_CREATE DATE DEFAULT CURRENT_DATE)
CREATE TABLE GOODS (
ARTICLE VARCHAR(20) NOT NULL PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
DATE_CREATE DATE DEFAULT CURRENT_DATE)
При выполнении команды INSERT INTO GOODS (ARTICLE, NAME, DATE_CREATE) VALUES ('111', 'Некоторый товар') какое значение вставится в столбце DATE_CREATE?
Anonymous Quiz
55%
Текущая дата
11%
NULL
33%
Будет ошибка выполнения данной команды
Таблица 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
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
Какое значение будет получено в результате запроса:
SELECT SUM(AMOUNT) AS PAY_SUM FROM PAYMENTS
SELECT SUM(AMOUNT) AS PAY_SUM FROM PAYMENTS
Anonymous Quiz
1%
0
1%
150
0%
300
70%
450
14%
null
14%
Будет ошибка выполнения запроса
Всем привет!
Предлагаю небольшую задачу по 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';
При этом выполнение запроса занимает значительное время.
Предлагаю небольшую задачу по 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';
При этом выполнение запроса занимает значительное время.
Какой из способов наиболее эффективно улучшит производительность этого запроса?
Anonymous Quiz
8%
Добавить индекс по полю STATUS
23%
Добавить индекс по полю USER_ID
1%
Добавить индекс по полю DATE_CREATE
61%
Добавить составной индекс по полям (USER_ID, STATUS)
6%
Поменять условия во WHERE местами: ... WHERE STATUS = 'completed' AND USER_ID = 123;
Всем доброе утро!
Есть таблица сессий 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
Есть таблица сессий 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
👍4