Oracle Developer👨🏻‍💻
3.21K subscribers
607 photos
68 videos
2 files
485 links
🔝 канал о разработке в СУБД Oracle:
SQL, PL/SQL, оптимизация, архитектура и многое другое...

Backend-pro.ru - обучение по различным программам, связанных с backend-разработкой для ФЛ и ЮЛ.

Отец-основатель: @denis_dbd Кивилёв Денис
Download Telegram
🚀 Курс "Оптимизация Oracle SQL.Основы" - это отличная возможность освоить искусство оптимизации SQL запросов по уникальной программе "с нуля до уверенного специалиста, который может решать 80-90% типовых проблем".

Старт: 20е мая, окончание 29е августа.

Цели
🔺научиться находить и решать проблемы в PROD среде;
🔺научиться писать сразу оптимальные запросы;
🔺успешно проходить блок по оптимизации на собеседованиях;
🔺систематизировать знания.

Кратко
🔸теория по понедельникам, практика по четвергам, встречи в Zoom;
🔸11 домашних заданий + 7 тестов + курсовая работа;
🔸содержание курса структурировано таким образом, чтобы знания можно было применять уже после первой лекции.
🔸6 блоков с фокусом на решении реальных проблем:
1️⃣ Выявление проблемных запросов.
2️⃣ Чтение и понимание планов запросов.
3️⃣ Анализ планов запросов.
4️⃣ Решение проблем.
5️⃣ Внесение изменений.
(планы, хинты, awr,ash, v$active_session_history, статистика, трассировка, tkprof, nested loops, hash join, index, full table scan и многое многое другое).

Стоимость: 79K рублей или 42 тысячи рублей в рассрочку на 2 месяца (оплата любым способом из любой страны с чеком, крипта).
Сначала бронируйте участие. Оплата ближе к запуску.

Осталось мест: не осталось. Следующая возможность попасть на курс - сентябрь. Бронируйте заранее.

Минимальные требования: знаете SQL, имели опыт работы с PL/SQL, имеете представление о СУБД Oracle. Отлично, если сталкиваетесь с задачами по оптимизации и не можете их решить. Высокая мотивация дойти до конца. QA, аналитик, разработчик.

Отзывы
Видео-отзывы ребят первого и второго потоков. Скрины отзывов в посте выше. Если у вас есть сомнения, посмотрите.

Реальная жизнь
А теперь представьте себе такую ситуацию
К вам прибегают пользователи/аналитики/начальник и кричат "все пропало! все тормозит! нужно срочно решать проблему, PROD стоит!" 😱
Еще 5 минут назад вы предвкушали спокойный день, попивая халявный кофе на кофепоинте, весело общаясь с коллегой. А теперь нужно срочно куда-то бежать, что-то делать, решать проблему, которой "лучше бы не было". Вы просто обычный специалист, который ищет медленные запросы "через дебаг кода". Что делать будете? 😁

Можно еще усложнить, добавив в эту ситуацию то, что сломалась не ваша ламповая базенка в вашей же организации, до которой дотянуться легко и просто, а где-то на площадке заказчика, в банке😳
Прошел холодок по спине? Руки вспотели? Как дебажить будете? Полетите с Новосибирска в Москву (доступов то нет)? 😁

Ответы на курсе. Бронируйте пока еще есть 1 место Мест нет 🤷🏻‍♂️
Следующая возможность попасть на курс - сентябрь. Бронируйте заранее.

#оптимизация #курс
Канал Oracle Developer | Чатик 💬
🔥7👍3
SQL марафон из 5 задач с призом 🏆

Друзья, всем привет!

Решил попробовать новый формат. Это будут задачи для начинающих. Однако, мидлам и сеньерам тоже будет полезно размять мозг 🧠
Примерно такого уровня вопросы, мне попадались на собеседованиях на Java-разработчика.

Особенность - ответы будут сразу публиковаться с задачкой, но в скрытом режиме. Всего будет 5 постов-задач, с интервалом в 1.5 часа.

🔹Рекомендую, перед открытием спойлера, посидеть и подумать 😉
🔹Синтаксис, естественно, для Oracle.
🔹Я привожу не все возможные решения 👌
🔹Оставляем "за бортом" вопросы оптимизации.
🔹Определения для таблиц можно взять с репозитория
🔹Телега не позволяет использовать спойлер и SQL-форматирование одновременно😔

⚠️ Для интереса. Автору, опубликовавшему max количество оригинальных решений суммарно на все задачки в чатике, будет вручен денежный приз миллион - 5000 рублей или эквивалент USDT 💸💸 Добавляйте в ответ #решение_n.

Первая задача в 11:00 МСК

#задача #sql #марафон
Oracle Developer | Чат 💬
👍104🔥2
SQL марафон. Задача 1.

Постановка
Необходимо найти вторую по величине зарплату сотрудников (salary).
Сотрудники - таблица employees.

Решения
1️⃣
select max(salary)
from employees
where salary not in (select max(salary) from employees);

2️⃣
select max(salary) as secondhighestsalary
from employees
where salary < (select max(salary) from employees);

3️⃣
select salary
from (select salary
,row_number() over(order by salary desc) as rnk
from employees)
where rnk = 2;


Опубликуйте свое решение в чатике с тегом #решение1 💬

#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
👍72🔥1
SQL марафон. Задача 2.

Постановка
Найдите максимальную зарплату для каждого департамента.
Выведете - имя департамента (department_name) и максимальную зарплату для него (salary).
Если у департамента нет сотрудников - максимальная зарплата должна быть "0".
Отсортируйте по имени департамента.

Департаменты - таблица departments.
Сотрудники - таблица employees.

Решения
1️⃣
select d.department_name
,nvl(max(salary), 0)
from departments d
left join employees e on e.department_id = d.department_id
group by department_name
order by department_name;


2️⃣
select d.department_name,
nvl((select max(salary)
from employees e
where e.department_id = d.department_id), 0) as max_salary
from departments d
order by d.department_name;


Опубликуйте свое решение в чатике с тегом #решение2 💬

#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
SQL марафон. Задача 3.

Постановка
Нужно найти сотрудников, которые работают дольше всех в своей должности (job_id).
Выведите все поля из таблицы employees.

Сотрудники - таблица employees.

Решения
1️⃣
select e.*
from employees e
where hire_date =
(select min(hire_date) from employees where job_id = e.job_id);


2️⃣
select e.*
from employees e
join (select job_id
,min(hire_date) min_hire_date
from employees
group by job_id) m
on e.job_id = m.job_id
and e.hire_date = m.min_hire_date;


Опубликуйте свое решение в чатике с тегом #решение3 💬

#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
🤩1
SQL марафон. Задача 4.

Постановка
Нужно найти отделы с общей зарплатой сотрудников более 50000.
Вывести - ID отдела (department_id).

Сотрудники - таблица employees.

Решения
1️⃣
select department_id
from employees
group by department_id
having sum(salary) > 50000;


2️⃣
select d.department_id
from departments d
where (select sum(salary)
from employees e
where e.department_id = d.department_id) > 50000;


3️⃣
with dept_salaries as
(select department_id
,sum(salary) as total_salary
from employees
group by department_id)
select department_id
from dept_salaries
where total_salary > 50000;


Опубликуйте свое решение в чатике с тегом #решение4 💬

#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
1👍1
SQL марафон. Задача 5.

Постановка
Нужно найти всех сотрудников, у которых зарплата выше средней зарплаты в таблице employees.
Вывести - все столбцы из таблицы employees.

Сотрудники - таблица employees.

Решения
1️⃣
select e.*
from employees e
where e.salary > (select sum(salary) / count(*) from employees);

2️⃣
with avg_sal as
(select avg(salary) as avg_salary from employees)
select e.*
from avg_sal a
join employees e on e.salary > a.avg_salary;


Опубликуйте свое решение в чатике с тегом #решение5 💬

#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
Вот и закончился наш SQL-марафон 👯‍♀️

Победителя оглашу в пятницу. Так что у вас есть время догнать и перегнать 🏆
Напомню, засчитываются оригинальные решения:
🔸 не те, что скрываются под спойлером;
🔸 не те, которые опубликовали ДО вас.
Добавляйте в ответ тег #решениеN.

Приз - 5000 рублей или эквивалент в крипте (USDT) 😁

Все таки, основная цель марафона не заработать денег, а порешать задачки, которые могут встретиться на собеседованиях на Junior, Middle- позиции🎓

Если формат зайдет, будем периодически проводить такое 👍

По моим ощущениям, 5 запросиков в 1 день многовато.
Что думаете?
Обсудить в чатике 💬

#марафон
Канал Oracle Developer | Чатик 💬
👍13
Друзья, всем привет )

Сегодня пятница, а значит пора выдать награду за участие в марафоне 🏆

Приз - 5000 рублей или эквивалент в крипте (USDT) 😁

Посидел, проанализировал решения... Есть прям очень оригинальные, есть модификации +- того, что уже и так опубликовали. Поэтому, чтоб никого не обидеть, решил наградить первых 5 человек, кто набрал больше всего ответов 💪🏻

Список ребят: Александр, Городецкий Олег, Konstantin Danilov, Dmitry Bykov, Abdulmutalib

Каждому по 1К руб или эквиваленту в USDT. На пятничный пивас или кефир, кому что нравится. Напишите мне плиз.
Всем остальным спасибо за участие, был интересно посмотреть на полет фантазии🔥👍

Все таки, основная цель марафона не заработать денег, а порешать задачки, которые могут встретиться на собеседованиях на Junior, Middle- позиции🎓

Следующий раз, задачки будут разделены по дням. Кажется, что тяжеловато в течение рабочего дня решать с интервалом в 1.5 часа 🤷🏻‍♂️

Хорошей пятницы 👯‍♀️

Обсудить в чатике 💬

#марафон
Канал Oracle Developer | Чатик 💬
🔥14👍3
Задача с PL/SQL-коллекциями

Коллеги, всем привет!
Давно у нас не было PL/SQL. В запасниках откопал одну из задачек с реального собеса (DataArt).

Вариант 1 - мой доработанный, вариант 2 - с подковыркой, как был на собесе.

-- Вариант 1
declare
type t_arr is table of varchar2(128) index by pls_integer;
a1 t_arr;
a2 t_arr;
begin
a1(0) := 'zero';
a2 := a1;
a1(0) := 'empty';

dbms_output.put_line(a1(0) || ' | ' || a2(0));
end;
/

-- Вариант 2
declare
type t_arr is table of varchar2(128) index by pls_integer;
type t_arr2 is table of varchar2(128) index by pls_integer;
a1 t_arr;
a2 t_arr2;
begin
a1(0) := 'zero';
a2 := a1;
a1(0) := 'empty';

dbms_output.put_line(a1(0) || ' | ' || a2(0));
end;
/


Вопрос: что будет выведено в буфер?

⚠️ Рекомендую не жульничать, а попытаться решить в уме.

Разбор задачи в четверг 🎓

Обсудить в чатике 💬

#задача
Oracle Developer
👍3🔥1
Задача с PL/SQL-коллекциями. Решение

Постановка в посте вторника.

Решение и анализ

1️⃣й вариант
🔹 t_arr - это ассоциативный массив, объявлен как локальный тип в анонимном PL/SQL-блоке. Ключ - числа, значение - varchar2(128).
🔹 a1 и a2 - это две переменных = два массива.
🔹 Инициализация асоциативного массива не требуется. Поэтому, когда происходит присвоение значения к a1(0) ошибки не будет. “0” - это ключ для значения ‘zero’.
🔹 a2 := a1; - значения первой коллекции копируются во вторую. Если бы это была Java, то мы бы присвоили ссылку a2 на а1.
🔹 a1(0) := 'empty'; - присваивается новое значение в старой коллекции, при этом значение в a2 не меняется (привет вопросам на собесе по Java).

Ответ: empty | zero

2️⃣й вариант
Я бы сказал, рассчитан на внимательность. Честно говоря, не очень люблю такие задачки. Особенно они популярны на Oracle-сертификации.
🔹t_arr и t_arr2 - два локальных типа ассоциативного массива. Да, по сути они одинаковы, но все же это разные типы.
🔹эта строка a2 := a1; вызовет глубокое недоумение у СУБД. Как объекты с разным типом могут быть присвоены друг другу? никак.

Ответ: Тут вообще, произойдет ошибка. Блок не выполнится. Ничего не будет выведено.

Палец вверх, если понравилось 👍

Обсудить в чатике 💬

#решениезадачи
Oracle Developer
👍51🔥21
Задача. Спроектировать отношение между таблицами.

Дано: таблицы - “клиенты” и “адреса”

create table client(
id number(38) not null primary key,
other fields
);

create table address(
id number(38) not null primary key,
other fields
);


У одного клиента может быть более одного адреса, и у адреса может быть более одного клиента.

Как вы опишите в коде эту взаимосвязь? Что для этого потребуется?
Подумайте над ключами, индексами и т.д.

Результат выполнения: набор DDL-команд.

Разбор задачи в четверг 🎓

Обсудить в чатике 💬

#задача
Oracle Developer
👍31
Решение задачи. Спроектировать отношение между таблицами.

Постановка в посте вторника.

Решение
1️⃣ Поскольку, у нас отношение многие-ко-многим, придется создать таблицу связки/маппинга, в которой будет храниться отношение сущностей к друг другу.

2️⃣ Как минимум три столбца:
id - уникальный ID в таблице
client_id - уникальный ID в таблице “клиенты”
address_id - уникальный ID в таблице “адреса”

Может возникнуть вопрос, зачем нам ID? ведь можно использовать пару столбцов для PK.
Генерация и хранение ID практически ничего не стоят. Как минимум, различного рода репликации, переливки ооочень любят ID, а еще б какую-нибудь временную метку.
С ID однозначно идентифицирующую строку - работать проще. В некоторых компаниях, явно прописывается наличие суррогантного ID в любой таблице.


3️⃣ Связка должна быть уникальна, поэтому будет уникальный ключ на пару столбцов - client_id/address_id.
За кадром, Oracle создаст уникальный индекс, который будет поддерживать уникальность на физическом уровне. При наличии этого индекса, мы легко сможем искать по client_id (лидирующий столбец).

4️⃣ Также необходим еще один индекс по address_id.
Почему? Велком на курс по Оптимизации 🎓

5️⃣ Не забудем про foreign keys на таблицы client и address, которые будут контролировать целостность данных.

Итого
create table client_address
(
id number(38) not null,
client_id number(38) not null,
address_id number(38) not null
);

alter table client_address add constraint client_address_pk primary key (id);

alter table client_address add constraint client_address_cl_ad_uq unique (client_id, address_id);

create index client_address_address_i on client_address (address_id);

alter table client_address add constraint client_address_address_fk foreign key (address_id)
references address (id);
alter table client_address add constraint client_address_client_fk foreign key (client_id)
references client (id);


Задачка на архитектуру - довольно простая и короткая, но очень показательная.
Бывает так, что ставит в тупик крепкого мидла или сеньера (по их версии). Лично мне она попадалась в Сбер-банке.

Я люблю её спрашивать на Mock-собеседованиях. Это такие тренировочные собеседования, симуляции. Можно без страха, попробовать, подсветить свои пробелы и т.д.
Например, перед тем как пробоваться на позицию Java-разработчика, я прошел парочку Mock-собеседований. Это хороший прогрев перед поиском. Если, вдруг, интересно попробовать - пишите в личку.

Да, тут много чего можно еще навертеть. Чем ребята в чатике успешно занимались 😉👍

Обсудить в чате 💬

#решениезадачи #архитектура
Канал Oracle Developer | Чатик 💬
👍13🤯2
Внимание! Конкурс

Друзья, всем привет!

Что-то у нас давно не было денежных конкурсов 💸
Реклама публикуется, а доход не делится — не порядок 😊

Давайте сделаем так:

1️⃣ Во вторник я опубликую задачку с собеседования.
Её мне подкинул один из участников канала.

2️⃣ До четверга 13:00 можно будет публиковать свои решения в чатике.
Шанс и мозг размять, и на пиво/кефир заработать 🍺

3️⃣ В четверг я опубликую голосование, и вы сможете выбрать один из вариантов.
публика решает, чье решение достойно 😎

4️⃣ В пятницу "подведем итоги, наградим непричастных и накажем невиновных" 🎁

Как вам такая идея? 💡

#конкурс
Канал Oracle Developer | Чатик 💬
🎉8
Конкурс на лучшее решение. Rest History

Условия участия
1️⃣ Публикуете свои решения в чатике с тегом #конкурсRestHistory
2️⃣ Повторные решения одним и тем же подходом/способом не засчитываются. Кто первый - того и тапки.
3️⃣ Пользуйтесь разметкой кода в телеграме.
4️⃣ Оценивать будем по количеству реакций на каждом решении.
5️⃣ Если участник отправил несколько решений, то считается сумма реакций.
6️⃣ Решения принимаются до 13:00 20.06 (чт).
7️⃣ Голосовать можно до 9:00 21.06 (пт).
8️⃣ Награждение победителя денежным призом - 21.06 (пт).

Задача
Задача была дана на собеседовании в одном из банков нашему подписчику.
Поэтому все стоны о нечетких формулировках задачи и т.п. направляем в “Спортлото” 😊

Имеется таблица остатков rest_history.
▫️id_dog - id договора
▫️dt - дата изменения остатка
▫️balance - остаток на конце дня dt (0 или положительный)

Условия:
▫️на каждую дату максимум одна запись, если остаток менялся;
▫️ в таблице для каждого договора первой строкой является строка с ненулевым остатком.

Необходимо написать SQL-запрос:
▫️для каждого договора вычислить периоды, когда он имел ненулевой остаток;
▫️период закрывается датой dt-1 строки с нулевым остатком;
▫️eсли ненулевой остаток остается, то период закрывается датой 31.12.2999.

Тестовые данные:
with rest_history (id_dog, dt, balance) as (
select 111, to_date('10.07.2022', 'dd.mm.yyyy'), 10 from dual union all
select 111, to_date('15.08.2022', 'dd.mm.yyyy'), 0 from dual union all
select 111, to_date('20.09.2022', 'dd.mm.yyyy'), 15 from dual union all
select 111, to_date('15.07.2022', 'dd.mm.yyyy'), 25 from dual union all
select 111, to_date('15.07.2022', 'dd.mm.yyyy'), 35 from dual union all
select 222, to_date('15.07.2022', 'dd.mm.yyyy'), 5 from dual union all
select 222, to_date('15.08.2022', 'dd.mm.yyyy'), 7 from dual union all
select 222, to_date('15.09.2022', 'dd.mm.yyyy'), 0 from dual union all
select 222, to_date('03.03.2023', 'dd.mm.yyyy'), 33 from dual union all
select 222, to_date('04.04.2023', 'dd.mm.yyyy'), 44 from dual union all
select 222, to_date('10.05.2023', 'dd.mm.yyyy'), 0 from dual
) select * from rest_history


Результат для данного примера:
111 | 10.07.2022 | 14.08.2022
111 | 20.09.2022 | 31.12.2999
222 | 15.07.2022 | 14.09.2022
222 | 03.03.2023 | 09.05.2023

Всем удачи 🖖🏻

#конкурс
Канал Oracle Developer | Чатик 💬
3👍1
Активно голосуем за решения

Друзья, всем привет!

Во вторник у нас стартанул #конкурсRestHistory по решению задачки уровня Junior/Middle.
Отправил мне её один из подписчиков.

Что у нас получилось
Откликнулось 5 коллег, некоторые из них придумали аж 2 решения 🔥

1️⃣ Дмитрий - решение1
2️⃣ Kirill Leontev - решение1, решение2
3️⃣ Александр Олифер - решение1, решение2
4️⃣ Ilya Kochegarov - решение1, решение2
5️⃣ Ruslan Shevyrev - решение 1

Спасибо ребятам, кто решил тряхнуть своими знаниями SQL 👍
Как говорится, зарядка для ума не кому не повредит 🧠🏋️‍♂️, а если за неё еще и денежку заплатят, так вообще красота 😊

Кстати, был бы я расторопным хедхантером, я бы как минимум постарался с ними пообщаться 😈

Что требуется от тебя, дорогой подписчик?
Посмотреть на решения и поставить лайк, тем, которые понравились.

Победителя выберем по наибольшему количеству реакций 🏆

Итоги подведем завтра. Всем удачи 🖖🏻

#конкурс
Канал Oracle Developer | Чатик 💬
🔥7👍3
Итоги конкурса #конкурсRestHistory

Друзья, всем привет!
Подводим итоги голосования.

Участники и количество реакций
Реакции по решениям суммируются.

1️⃣ Дмитрий - решение1 - 2
2️⃣ Kirill Leontev - решение1, решение2 - 7
3️⃣ Александр Олифер - решение1, решение2 - 21
4️⃣ Ilya Kochegarov - решение1, решение2 - 8
5️⃣ Ruslan Shevyrev - решение 1 - 29

Победители и призы
🥇Ruslan Shevyrev - решение 1 - 3К руб
🥈Александр Олифер - решение1, решение2 - 2К руб
🥉Ilya Kochegarov - решение1, решение2 - 1К руб

Приятный бонус на пятничный пивас или кефир, кому что нравится. Победители, напишите мне плиз.

Всем остальным спасибо за участие, был интересно посмотреть на полет фантазии🔥👍

Все таки, основная цель конкурса не заработать денег, а порешать задачки, себя показать и на других посмотреть 😉

Понравилось? Ставь 👍

Хорошей пятницы 👯‍♀️

Обсудить итоги в чатике 💬

#конкурсRestHistory
Канал Oracle Developer | Чатик 💬
👍29
This media is not supported in your browser
VIEW IN TELEGRAM
👍2
Друзья, всем привет! 🌟

У меня для вас важные новости.

Наверное, вы заметили, что в последнее время я немного сбавил темп. Скоро все исправим, не переживайте.

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

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

Надеюсь, вам зайдет 😊

Канал Oracle Developer | Чатик 💬
👍65🔥4
Чат GPT вред или польза?

Друзья, всем привет! 🌟

У всех на слуху новый модный молодежный инструмент ChatGPT и другие нейросети. Да, я сам время от времени ими пользуюсь, пытаясь облегчить себе работу в написании кода, но приходится постоянно вносить правки в написанный код. Нейросети на данный момент полностью нас заменить не могут. Поэтому можете вздохнуть спокойно и идти работать дальше. Деньги сами себя не заработают 😉

Какую пользу я вижу от ChatGPT для разработчиков?
Я считаю, если ты опытный программист и хорошо понимаешь код, то ты сможешь облегчить себе работу и сэкономить 20-30% своего времени. Почему только на 20-30%? Потому что все равно придется исправлять за нейросетью код, ведь это программа, написанная машиной, а не человеком.
Может быть, через 3-4 года ChatGPT сможет делать полноценное функциональное приложение. Но сейчас это скорее виртуальный помощник, который постоянно развивается и улучшается.

Как опытному разработчику использовать ChatGPT и получать от него пользу?
Можно очень быстро создать каркас необходимого приложения. Но для этого нужно подумать, что необходимо сделать, какой функционал должен быть в приложении и так далее. Это похоже на постановку задачи с прописыванием ТЗ, чтобы все было максимально понятно сотруднику.
Даже если максимально правильно описать ТЗ и ChatGPT создаст заготовку, она может быть не рабочей. Поэтому необходимо понимать, что при генерации скелета, на него нужно нанизывать небольшое количество "мяса". Чтобы это ожило, нужно знание предметной области, то есть программирование на том языке, на котором генерируется приложение, будь то Oracle PL/SQL, Java, JavaScript – не суть важно.

Без знания хотя бы базовой разработки не обойтись. Желательно, чтобы уровень был средним и выше. Как минимум, необходимо пройти хотя бы базовые курсы по разработки.

Просто взять, использовать ChatGPT и говорить, что вы теперь программист, пока не получится. А может быть и к счастью. Нас пока не могут заменить 🤖

Канал Oracle Developer | Чатик 💬
👍23🔥2👎1