Пишем на SQL @sql_oracle_databases Channel on Telegram

Пишем на SQL

@sql_oracle_databases


Уроки по SQL. Изучаем базы данных на примере СУБД ORACLE, MySQL, MS SQL Server, PostgreSql

Пишем на SQL (Russian)

Пишем на SQL - это канал, который предлагает уроки по языку структурированных запросов SQL. Здесь вы сможете изучить базы данных на примере таких систем управления базами данных, как ORACLE, MySQL, MS SQL Server и PostgreSql. С помощью наших уроков вы сможете понять основы работы с базами данных, научиться писать сложные запросы, оптимизировать работу с данными и многое другое. На канале вы найдете как теоретические материалы по SQL, так и практические уроки с пошаговыми инструкциями и примерами. Если вам интересно расширить свои навыки работы с базами данных или вы просто начинаете свой путь в этой области - присоединяйтесь к нам на канале "Пишем на SQL" и станьте настоящим экспертом в этой области!

Пишем на SQL

11 Feb, 18:18


Спасибо за активное участие!

Большое количество ответов. И немного дискуссии - всё как любят в айти)

Мне понравилось решерие Бориса, именно такой способ в качестве решения этой задачи я и хотел написать! Он самый простой и будет работать на всех современных СУБД (PostgreSql, MySql, ORACLE, MS SQL Server и т.д.).

Решение с помощью INSERT-а на основе SELECT-а. INSERT вставляет в целевую таблицу строки, которые начитывает (готовит) SELECT.

Борис отобрал значения из таблицы CODES_2024 для которых не нашлось ещё такого кода в таблице CODES_ALL. Эти значения и будут вставлены в CODES_ALL.

Решения подобных проблем я описал в своей статье в Дзене: https://dzen.ru/a/YrBUMUU2jxB4P8Ry

Пишем на SQL

10 Feb, 07:05


Всем привет! Очень рад узнать, что соскучались по задачкам (прочёл в комментарии).

Вот ещё одна задачка по SQL. В базе данных, среди прочих, есть таблицы CODES_ALL и CODES_2024, у которых есть всего один столбец CODE, определённый как первичный ключ.

Не используя подзапросы, напишите такую команду INSERT, которая бы вставила в таблицу CODES_ALL коды из таблицы CODES_2024 которых ещё нет в таблице CODES_ALL.

Позже напишу один из вариантов решения этой задачи!

Пишем на SQL

03 Feb, 12:01


Всем хорошего понедельника!
Написал небольшую статью про интересные возможности СУБД PostgreSQL! https://dzen.ru/a/Z6CFVDYbRyD1JoNY
Буду рад Вашему лайку!

Пишем на SQL

29 Jan, 14:00


И у нас скидки! До конца января можно записаться на курс SQL или курс программирования в PL/SQL (ORACLE) по цене прошлого года.

Всё обучение со мной! Я буду Вашим куратором, буду объяснять сложный материал, проверять Вашу работу, помогать оптимизировать код и исправлять ошибки!
Курс SQL 10.900. Записаться тут:
https://prime-soft.biz/courses/sql
Курс программирования в PL/SQL(ORACLE) 14.900. Записаться тут:
https://prime-soft.biz/courses/plsql

Вопросы оставляйте, пожалуйста, под этим постом.

Пишем на SQL

29 Jan, 11:27


Спасибо всем за активное участие!

При выполнении скрипта из трёх команд, вторая команда не сможет выполниться и вернёт SQL-ошибку (для гуру: нарушение ограничения уникальности).

Выполнение командой INSERT вставки данных (которые готовит SELECT), привело бы к наличию строк в таблице DRIVERS с одинаковым значением в столбце ID_PERS, который является первичным ключом, а это недопустимо.

Из-за того, что в запросе SELECT, который готовит данные для INSERT-а, к таблице PERS присоединяется таблица CARS, данные строки PERS могут быть выведены несколько раз (по количеству приджоинившихся автомобилей к одному и тому же сотруднику). Лучше всего, если не понятно, прочитать предыдущее предложение два раза. Итак, одно и тот же значение из столбца ID таблицы PERS могло бы быть выведено несколько раз. Самым простым способом доработать скрипт, чтобы он больше не "падал" на этой ошибке, могло бы быть использование DISTINCT сразу после слова SELECT:


TRUNCATE TABLE DRIVERS;

INSERT INTO DRIVERS
  (ID_PERS)
SELECT DISTINCT p.ID
  FROM PERS p
   JOIN  CARS c
       On c.ID_PERS_OWNER = p.ID;

SELECT COUNT(*)
   FROM DRIVERS;

Пишем на SQL

27 Jan, 09:37


Чуть позже напишу объяснение правильного варианта ответа!

Пишем на SQL

27 Jan, 09:25


В базе данных (на примере СУБД ORACLE), среди прочих, есть три таблицы, определённые следующим образом:

/* Таблица Сотрудники */
CREATE TABLE PERS (
ID NUMBER PRIMARY KEY,
FIO VARCHAR(100) NOT NULL,
PHONE VARCHAR(10) DEFAULT '' NOT NULL);

/* Автомобили сотрудников */
CREATE TABLE CARS (
ID NUMBER PRIMARY KEY,
BRAND VARCHAR(50) NOT NULL,
MODEL VARCHAR(50) NOT NULL,
ID_PERS_OWNER NUMBER NOT NULL,
CONSTRAINT FK_CAR_OWNER FOREIGN KEY
(ID_PERS_OWNER) REFERENCES PERS(ID)
);

/* Сотрудники-водители */
CREATE TABLE DRIVERS (
ID_PERS NUMBER PRIMARY KEY,
DRIVE_LICENSE_NUM VARCHAR(20) DEFAULT NULL,
CONSTRAINT FK_PERS_DRIVER FOREIGN KEY
(ID_PERS) REFERENCES PERS(ID)
);

В таблице PERS данные:
ID FIO PHONE
1 Иванов И.И. 9057553111
2 Петров П.П. 9104454545
3 Сидоров А.И. 9113457778

В таблице CARS данные:
ID BRAD MODEL ID_PERS_OWNER
1 Ауди А4 1
2 Фиат Панда 2
3 Форд Мондео 2

Какой результат вернёт выполнение следующего SQL-скрипта, состоящего из трёх команд?

TRUNCATE TABLE DRIVERS;

INSERT INTO DRIVERS
(ID_PERS)
SELECT p.ID
FROM PERS p
JOIN CARS c
On c.ID_PERS_OWNER = p.ID;

SELECT COUNT(*)
FROM DRIVERS;

Пишем на SQL

20 Jan, 11:27


Есть два SQL запроса, предназначенные для выполнения на разных СУБД.

Запрос для PostgreSql:
SELECT * FROM ORDERS ORDER BY DATE_CREATE DESC NULLS LAST LIMIT 10

Запрос для ORACLE:
SELECT * FROM (SELECT * FROM ORDERS ORDER BY DATE_CREATE DESC NULLS LAST) WHERE ROWNUM <= 10

Пишем на SQL

13 Jan, 15:55


Добрый день, друзья!

Вот хорошая SQL-задачка на начало года! Итак, пусть в некоторой базе данных есть таблица изменения цен товаров - PRICES_HIST. При каждом изменении цены товара, в таблицу записывается идентификатор товара, дата, с которой начинает действовать новая цена, и само значение цены. Таблица PRICES_HIST определена следующим образом:
CREATE TABLE PRICES_HIST (
ID_PRODUCT INT,
DATE_PRICE DATE,
VALUE_PRICE DECIMAL(10, 2),
PRIMARY KEY (ID_PRODUCT, DATE_PRICE)
)


ID_PRODUCT - идентификатор продукта; DATE_PRICE - дата, начиная с которой действует цена указанного продукта;
VALUE_PRICE - само значение цены.

Первичный ключ таблицы - составной. Состоит из столбцов ID_PRODUCT и DATE_PRICE. Невозможно на одну и ту же дату одному и тому же товару устанавливать цену несколько раз.

Запрос ниже должен возвращать идентификаторы продуктов с их актуальной стоимостью (на текущую дату).

SELECT ph.*
FROM PRICES_HIST ph
WHERE DATE_PRICE = (SELECT MAX(DATE_PRICE) FROM PRICES_HIST WHERE ID_PRODUCT = ph.ID_PRODUCT AND DATE_PRICE <= CURRENT_DATE)


СУБД PostgreSQL

Пишем на SQL

31 Dec, 17:19


Друзья, всех с наступающими праздниками!

С НОВЫМ ГОДОМ И РОЖДЕСТВОМ! 🎉

Всего самого наилучшего в новом году, новых достижений, доброго здоровья и мирного неба над головой!

Всего самого наилучшего!
🥳🎄🙂

Пишем на SQL

26 Dec, 15:28


Всем доброго вечера!

В ряде случаев, помимо вывода требуемой информации, SQL-запросы пишут так, чтобы получать дополнительные какие-то числа или текст. К примеру, может потребоваться номер строки выводимых данных (по порядку) или какой-то признак четная строка или нечётная.
В разных СУБД такое можно сделать разными способами, но часто алгоритмы похожи.

Для вывода номера строки (вместе с остальными выводящимися данными) можно использовать аналитическую (оконную) функцию ROW_NUMBER.

Для вывода признака чётная строка или нечётная можно использовать обычную функцию MOD, возвращающую остаток от деления. Если число (например, номер строки таблицы) разделилось полностью на два (без остатка), значит число чётное (значит строка чётная).

Для чего может потребоваться выводить признак строки чётная строка или нечётная? Например, для дальнейшего цветового оформления выводимых табличных данных: если в строке в столбце-признаке такое-то значение, то сделать фон строки немного темнее/светлее.
Или, например, для равномерного распределения строк выводимых данных на две группы. А если функции MOD указать не число 2 в качестве делителя, а какое-то другое, то можно равномерно распределить все строки таблицы на это указанное количество групп.

Пишем на SQL

29 Nov, 06:57


Всем доброе пятничное утро🙂

Один монитор - скорее всего работает в айти.
Два монитора - программист.
Три монитора - системный администратор.
Четыре монитора - охранник.

Пишем на SQL

25 Nov, 12:38


Всем привет!

В таблицах TBL1 и TBL2 есть столбец NOMER. В таблице TBL1 три строки, в таблице TBL2 четыре строки.

Какое минимальное и какое максимальное количество строк мы можем получить в результате следующего запроса?

SELECT *
FROM TBL1
LEFT JOIN TBL2
ON TBL1.NOMER = TBL2.NOMER

Пишем на SQL

21 Nov, 11:40


В базе данных есть таблицы TMP_TABLE и TMP_TABLE2, определённые следующим образом:
CREATE TABLE TMP_TABLE(
VAL_STR VARCHAR(100) DEFAULT NULL);

CREATE TABLE TMP_TABLE2(
VAL_STR VARCHAR(100) NOT NULL);

В обеих перечисленных таблицах нет ни одной строки. Что произойдёт при выполнении следующей команды?

Пишем на SQL

15 Nov, 08:16


Доброе утро, друзья!

Напоминаю, что завтра начинаем интенсив по SQL, PostgreSQL. Обучение будет идти по выходным по утрам. Всего 10 онлайн занятий (5 недель). Плюс закрытая группа Телеграм, куда я буду выкладывать записи наших онлайн встреч. На онлайн уроках будет интерактив, будем работать, не просто смотреть. После каждого урока - самостоятельная практическая работа, решение которой я буду проверять индивидуально. По завершению интенсива - сертификат!
Записаться и оплатить рос.картой здесь: https://prime-soft.biz/pay/209
Для оплаты из-за граница напишите на [email protected]

Пишем на SQL

12 Nov, 17:50


Отзыв ученицы предыдущего потока он-лайн интенсива по SQL, PostgreSql

Пишем на SQL

12 Nov, 17:48


Друзья, набираем небольшую группу для обучения SQL и PostgreSql по выходным. Планируем начинать уже в эту субботу.

Присоединяйтесь! В этом году это последний набор на SQL. PostgreSql!

👉 сб и вс с 9:30 до 11:00
👉 всего 10 онлайн занятий
🧑‍💻 на уроках работаем, а не просто смотрим
👨‍💻 д/з с индивидуальным разобором и корректировкой

Всего 8.900 р за все!

Программа курса:
https://prime-soft.biz/courses/postgresql
Записаться и оплатить тут:
https://prime-soft.biz/pay/209

С удовольствием отвечу на все вопросы!

Пишем на SQL

12 Nov, 09:37


Всем привет!

Небольшая задача по SQL на внимательность (и на базовые знания):

В таблице PERSONS четыре записи:
ID NAME
1 Иванов Иван Иванович
2 Петров Павел Сергеевич
3 Сидовова Наталья Ивановна
4 Некрасов Иван Ильич

Пишем на SQL

24 Oct, 10:44


Всем привет!

Предлагаю решить ещё одну задачу по SQL🙂💪

В таблице SALES_TOTAL хранятся итоги по продажам каждого товара за каждый день. Запрос
SELECT t.*
FROM SALES_TOTAL t
WHERE t.PRODUCT_ID = 8
AND t.SALE_DATE >= '2024-01-01'
ORDER BY t.SALE_DATE
возвращает данные по продажам некоторого товара с идентификатором 8 за каждый день, начиная с начала 2024 года:
PRODUCT_ID SALE_DATE AMOUNT
8 2024-01-01 5
8 2024-01-02 4
8 2024-01-03 7
8 2024-01-04 8
...

В столбце AMOUNT отображается количество штук проданного товара за каждый день.

Пишем на SQL

17 Oct, 10:06


Напоминаю, что на наши курсы действует скидка:

Курс "SQL, базы данных, ORACLE, MS SQL Server, MySql" можно пройти за 8.900 р

и

Курс "Программирование в PL/SQL (ORACLE)" пока стоит 11.900 р

Скидка действует до конца этой недели!

Подробнее:
https://prime-soft.biz/courses

Пишем на SQL

16 Oct, 20:44


Сегодня получил такой замечательный отзыв - благодарность от ученика курса по SQL и базам данных!
Спасибо большое за такие слова!

Пишем на SQL

14 Oct, 14:49


Всем доброго понедельника!

Лёгкая задачка по SQL. Ставлю одну звезду уровня сложности из пяти.

Пишем на SQL

07 Oct, 11:52


В базе данных имеются, среди прочих, таблицы CLIENTS и CLIENTS_JUR_INFO, определённые следующим образом:
CREATE TABLE CLIENTS (
ID_CLIENT NUMBER NOT NULL PRIMARY KEY,
NAME_CLIENT VARCHAR(100) NOT NULL,
PHONE VARCHAR(30) DEFAULT NULL,
EMAIL VARCHAR(30) DEFAULT NULL,
IS_JUR NUMBER(2) DEFAULT 0 NOT NULL);

CREATE TABLE CLIENTS_JUR_INFO (
ID_CLIENT NUMBER NOT NULL PRIMARY KEY,
INN VARCHAR(20) DEFAULT NULL,
KPP VARCHAR(20) DEFAULT NULL,
CONSTRAINT FK1 FOREIGN KEY (ID_CLIENT) REFERENCES CLIENTS (ID_CLIENT));

Пишем на SQL

23 Sep, 18:10


Обучение на ошибках (особенно на своих 😀) - один из самых эффективных методов обучения!
Здесь нужно было заметить неправильное использование EXISTS.

Оператор EXISTS используют для проверки того, возвращается ли что-то подзапросом, указанным в скобках. Как правило, в скобках для оператора EXISTS/NOT EXISTS пишут:

SELECT *

или:

SELECT 1

В задаче выше нарочно допущена ошибка (в EXISTS нарочно написал SELECT COUNT).

SELECT COUNT всегда будет возвращать данные. Написанный в скобочках подзапрос всегда будет возвращать количество, хоть и иногда 0. Но данные-то есть. Ноль - это тоже данные. Поэтому EXISTS будет давать TRUE для каждой из трех строчек основного запроса.

И еще немного по теме COUNT напомню: COUNT всегда возвращает значение. Никогда не возвращает NULL. Если по условиям WHERE (под)запроса не будет подходящих данных, то COUNT вернёт 0, не NULL.

Пишем на SQL

23 Sep, 17:09


В таблице CLIENTS три строки:

ID NAME
1 АО "Проблемы и решения"
2 АО "Решения без проблем"
3 ИП "Иванов Иван Иванович"

В таблице INVOICES две строки:
ID ID_CLIENT DATE_INV
1 1 03.09.2024
2 1 03.09.2024

Пишем на SQL

23 Sep, 15:46


Всем доброго понедельника!

Надеюсь, неделя началась отлично, или, по крайней мере, не плохо☺️

Предлашаю небольшую задачу по SQL, похожую на одну из тех, что мы с Вами уже решали.

Пишем на SQL

20 Sep, 11:33


Друзья, всем отличной пятницы!

На следующей неделе начинаем интенсив SQL, PostgreSQL!

У нас будет:
10 насыщенных онлайн занятий (с записью эфира);

Много совместной работы в режиме онлайн! Будет много практики! Готовимся работать, не просто слушать:)

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

Сертификат по окончанию он-лайн курса! И помощь в составлении резюме если потребуется!

Подробнее:
https://prime-soft.biz/courses/postgresql

Пишем на SQL

16 Sep, 10:35


Друзья, всем добрый день!

Очередная задача по SQL! 

В базе данных есть две таблицы CODES и CODES2, в каждой из которых есть столбец CODE. В таблицах CODES и CODES2 всего по три строки. В первой строке обеих таблиц в столбце CODE - значение: 1, во второй строке значение тоже 1 и в третьей строке - NULL.

Пишем на SQL

13 Sep, 09:08


Всем хорошей пятницы!

Действительно ли, что:

Oracle запрос SQL, использующий условие EXISTS очень неэффективен, так как подзапрос перезапускается для каждой строки в таблице внешнего запроса.
Есть более эффективные способы написания большинства запросов, которые бы не использовали условие EXISTS.

Ответ:
Для решения каждой задачи есть свои эффективные методы. Если EXISTS применяется в основном запросе выборки из небольшой таблицы для проверки данных в большой таблице, и если выборка из большой таблицы будет вестись по индексам, то его использование будет очень эффективно. Вот пример:

В таблице клиентов не более 1000 строк.
В таблице PAYMENTS миллион строк и таблица проиндексована по столбцу CLIENT_ID.
Нужно выбрать клиентов, по которым была хотя бы одна оплата.

SELECT *
   FROM CLIENTS
WHERE EXISTS (SELECT 1 FROM PAYMENTS WHERE PAYMENTS.CLIENT_ID = CLIENTS.CLIENT_ID)

По таблице CLIENTS мы видим полный перебор строк (TABLE ACCESS FULL), но с проверкой есть ли платеж по клиенту. Запрос, отбирая клиентов, проверит есть ли в таблице PAYMENTS хотя бы одна строчка с таким CLIENT_ID. Хотя бы одна. И, так как на таблицу PAYMENTS есть индекс для выборки по столбцу CLIENT_ID, то таблица PAYMENTS вообще не будет читаться! Согласно приведённому запросу нам от неё не нужны данные. Нужно просто проверить есть ли строчка, где бы в столбце CLIENT_ID было бы конкретное значение. СУБД посмотрит в индекс и сразу поймёт есть ли строчка с таким то значением CLIENT_ID. Самого чтения миллионной таблицы не будет.

Многие СУБД, при правильной их настройке, хранят индексы постоянно используемых таблиц в оперативной памяти.

Стоит, всё же, заметить, что при использовании EXISTS или других подзапросов в транзакциях в некоторых СУБД могут быть проблемы.
Расскажу об этом дополнительно!

Пишем на SQL

09 Sep, 09:53


Всем отличного понедельника!

Новая задача с собеседования. Базовый уровень.
В базе данных есть таблица адресов клиентов CLIENT_ADDR. Таблица CLIENT_ADDR, среди прочих, имеет столбец CITY_NAME (город). Какой из запросов ниже покажет 10 городов клиентов (10 значений из столбца CITY_NAME)? Один и тот же город не должен быть показан в результирующей таблице более одного раза. Полученный список городов клиентов должен быть упорядочен по алфавиту.

Пишем на SQL

06 Sep, 07:28


Какая ошибка допущена в следующей SQL команде?

CREATE VIEW CLIENTS_INFO
AS SELECT INN, NAME, PHONE
FROM CLIENTS, CLIENT_CONTACTS
WHERE CLIENTS.CLIENT_ID = CLIENT_CONTACTS.CLIENT_ID

Пишем на SQL

06 Sep, 07:27


Как насчёт ещё одной задачи по SQL?
Задача-тест с собеседования.
Необходимо создать представление (VIEW) с названием CLIENTS_INFO, содержащее следующую информацию о клиентах: INN, NAME, PHONE.