Практический курс по SQL для начинающих - #10 Функции pl/pgSQL

Поделиться
HTML-код
  • Опубликовано: 26 окт 2024

Комментарии • 49

  • @aidaosmonova4798
    @aidaosmonova4798 2 года назад +15

    самый лучший курс💘
    все четко, ясно и по порядку, задания практические
    у автора хорошая речь, которую не скучно и слушать🧨
    весь курс универа проходила смотря ваши уроки. Спасибо🤌🏻✨

  • @Джолубеб
    @Джолубеб 4 месяца назад

    Большое спасибо. Вы спасли жизнь как минимум одного человека =) Очень подробно и кратко, ничего лишнего. Подписка однозначно.

  • @F_C_T_L
    @F_C_T_L Год назад +7

    Идеальный курс, учитывая что он бесплатный. Я думааю качество некоторых платных курсов будет не таким высоким. Просмотрев плейлист, я решил что буду покупать ваш курс по Django.

  • @picklerick405
    @picklerick405 Год назад +1

    Потрясающее видео!

  • @azizasuleymen7338
    @azizasuleymen7338 6 месяцев назад +1

    Хороший курс по PostgreSQL, однако я искала объяснения WITH TABL AS (если я ничего не пропустила). Было бы отлично, если бы показали и это.

  • @АлексейГорулёв-я6у
    @АлексейГорулёв-я6у 2 года назад +7

    Спасибо больше тебе за твои старания. Все доступно и понятно)
    Только дз не могу найти по ссылке в описании. Там находятся только скрипты из урока.

  • @alexkibuk8950
    @alexkibuk8950 Год назад

    Спасибо, за ваш труд. Материал действительно очень хорош

  • @RaptorT1V
    @RaptorT1V Год назад +2

    22:05 Периметр -- это сумма всех сторон многоугольника. БЕЗ деления на 2

    • @EngineerSpock
      @EngineerSpock  Год назад

      Ляпнул, да. Это semi-perimeter

  • @fedordostoevskiy4209
    @fedordostoevskiy4209 Год назад

    👍👍👍, многим людям поможет.

  • @sovrinfo
    @sovrinfo 2 года назад

    Спасибо за видео.Коммент в поддержку!

  • @daniil6779
    @daniil6779 2 года назад +8

    Можете подсказать, есть ссылка на текстовый вид задачек? Просто на Gitе вроде бы нет :(
    Спасибо большое за уроки, вообще не видел такого развернутого описания, по сути всего лишь по одному курсу можно выучить SQL на джуна!

    • @EngineerSpock
      @EngineerSpock  2 года назад

      Есть там все на гите

    • @daniil6779
      @daniil6779 2 года назад +1

      @@EngineerSpock В папке HW-functions (если HW - это HomeWork) 10 строчек кода без заданий, может быть не туда смотрю, в любом случае спасибо большое за уроки!

    • @EngineerSpock
      @EngineerSpock  2 года назад +2

      @@daniil6779 гляну

    • @alexandershurakoff9506
      @alexandershurakoff9506 2 года назад +1

      @@EngineerSpock И все же - нет ДЗ по уроку:(

    • @RaptorT1V
      @RaptorT1V Год назад +1

      *вот тебе ДЗ*
      1. Создать функцию, которая делает бэкап таблицы customers (копирует все данные в другую таблицу), предварительно стирая таблицу для бэкапа, если такая уже существует (чтобы в случае многократного запуска таблица для бэкапа перезатиралась).
      2. Создать функцию, которая возвращает средний фрахт (freight) по всем заказам
      3. Написать функцию, которая принимает два целочисленных параметра, используемых как нижняя и верхняя границы для генерации случайного числа в пределах этой границы (включая сами граничные значения).
      Функция random генерирует вещественное число от 0 до 1.
      Необходимо вычислить разницу между границами и прибавить единицу.
      На полученное число умножить результат функции random() и прибавить к результату значение нижней границы.
      Применить функцию floor() к конечному результату, чтобы не "уехать" за границу и получить целое число.
      4. Создать функцию, которая возвращает самые низкую и высокую зарплаты среди сотрудников заданного города
      5. Создать функцию, которая корректирует зарплату на заданный процент, но не корректирует зарплату, если её уровень превышает заданный уровень при этом верхний уровень зарплаты по умолчанию равен 70, а процент коррекции равен 15%.
      6. Модифицировать функцию, корректирующую зарплату таким образом, чтобы в результате коррекции, она так же выводила бы изменённые записи.
      7. Модифицировать предыдущую функцию так, чтобы она возвращала только колонки last_name, first_name, title, salary
      8. Написать функцию, которая принимает метод доставки и возвращает записи из таблицы orders в которых freight меньше значения, определяемого по следующему алгоритму:
      - ищем максимум фрахта (freight) среди заказов по заданному методу доставки
      - корректируем найденный максимум на 30% в сторону понижения
      - вычисляем среднее значение фрахта среди заказов по заданному методому доставки
      - вычисляем среднее значение между средним найденным на предыдущем шаге и скорректированным максимумом
      - возвращаем все заказы в которых значение фрахта меньше найденного на предыдущем шаге среднего
      9. Написать функцию, которая принимает:
      уровень зарплаты, максимальную зарплату (по умолчанию 80) минимальную зарплату (по умолчанию 30), коээфициет роста зарплаты (по умолчанию 20%)
      Если зарплата выше минимальной, то возвращает false
      Если зарплата ниже минимальной, то увеличивает зарплату на коэффициент роста и проверяет не станет ли зарплата после повышения превышать максимальную.
      Если превысит - возвращает false, в противном случае true.
      Проверить реализацию, передавая следующие параметры
      (где c - уровень з/п, max - макс. уровень з/п, min - минимальный уровень з/п, r - коэффициент):
      c = 40, max = 80, min = 30, r = 0.2 - должна вернуть false
      c = 79, max = 81, min = 80, r = 0.2 - должна вернуть false
      c = 79, max = 95, min = 80, r = 0.2 - должна вернуть true

  • @KorolElizavetaR
    @KorolElizavetaR 3 месяца назад

    1:36:43 Хотя технически автор не нарушает своего условия, искать общее количество заказов по всем шип_виа исходя из вычисленной средней фрахты по одному шип_виа немножко странно. Оставляю, кстати, свое решение, мало ли кому понравится.
    CREATE OR REPLACE FUNCTION return_by_freight (val_ship_via smallint) RETURNS SETOF orders AS $$
    SELECT * FROM orders
    WHERE freight < (SELECT (MAX(freight)*0.7+AVG(freight))/2 from orders
    WHERE ship_via = val_ship_via
    GROUP BY ship_via) AND ship_via = val_ship_via
    $$ Language sql;
    select count(*) from return_by_freight(CAST(1 AS smallint));
    Если убрать AND ship_via = val_ship_via, ответ отличается на два. Вполне возможно, что у меня где-то не достает две заветные записи до равной с автором цифрой.

  • @uberfull5418
    @uberfull5418 Год назад

    я обязательно отправлю денег с первой зарплаты. этот курс этого заслуживает

  • @СергейГаранин-о5л
    @СергейГаранин-о5л 2 года назад +3

    EXIT WHEN count = 5
    1, 1, 2, 3
    fib(4)
    3

    • @veronikamorozova1422
      @veronikamorozova1422 Год назад

      да, правильно, там не больше n должно быть ка кв уроке, а равно!

  • @RaptorT1V
    @RaptorT1V Год назад

    1:20:14 Я нашёл этот пример на postgresqltutorial
    Разве нельзя без floor() обойтись? Если мы указываем тип данных int, то тут всяко не будет числа с точкой. Это если бы real был, тогда да, согласен.

  • @andreykrauch5027
    @andreykrauch5027 Год назад

    Здорово! Спасибо.

  • @MeduzaOdessa
    @MeduzaOdessa Год назад +4

    Нет ДЗ по этой части лекций, учитель. Хоть вы и озвучиваете каждое задание перед решением, но мы привыкли получать задания целиком отдельно.

    • @RaptorT1V
      @RaptorT1V Год назад +1

      *Держи ДЗ*
      1. Создать функцию, которая делает бэкап таблицы customers (копирует все данные в другую таблицу), предварительно стирая таблицу для бэкапа, если такая уже существует (чтобы в случае многократного запуска таблица для бэкапа перезатиралась).
      2. Создать функцию, которая возвращает средний фрахт (freight) по всем заказам
      3. Написать функцию, которая принимает два целочисленных параметра, используемых как нижняя и верхняя границы для генерации случайного числа в пределах этой границы (включая сами граничные значения).
      Функция random генерирует вещественное число от 0 до 1.
      Необходимо вычислить разницу между границами и прибавить единицу.
      На полученное число умножить результат функции random() и прибавить к результату значение нижней границы.
      Применить функцию floor() к конечному результату, чтобы не "уехать" за границу и получить целое число.
      4. Создать функцию, которая возвращает самые низкую и высокую зарплаты среди сотрудников заданного города
      5. Создать функцию, которая корректирует зарплату на заданный процент, но не корректирует зарплату, если её уровень превышает заданный уровень при этом верхний уровень зарплаты по умолчанию равен 70, а процент коррекции равен 15%.
      6. Модифицировать функцию, корректирующую зарплату таким образом, чтобы в результате коррекции, она так же выводила бы изменённые записи.
      7. Модифицировать предыдущую функцию так, чтобы она возвращала только колонки last_name, first_name, title, salary
      8. Написать функцию, которая принимает метод доставки и возвращает записи из таблицы orders в которых freight меньше значения, определяемого по следующему алгоритму:
      - ищем максимум фрахта (freight) среди заказов по заданному методу доставки
      - корректируем найденный максимум на 30% в сторону понижения
      - вычисляем среднее значение фрахта среди заказов по заданному методому доставки
      - вычисляем среднее значение между средним найденным на предыдущем шаге и скорректированным максимумом
      - возвращаем все заказы в которых значение фрахта меньше найденного на предыдущем шаге среднего
      9. Написать функцию, которая принимает:
      уровень зарплаты, максимальную зарплату (по умолчанию 80) минимальную зарплату (по умолчанию 30), коээфициет роста зарплаты (по умолчанию 20%)
      Если зарплата выше минимальной, то возвращает false
      Если зарплата ниже минимальной, то увеличивает зарплату на коэффициент роста и проверяет не станет ли зарплата после повышения превышать максимальную.
      Если превысит - возвращает false, в противном случае true.
      Проверить реализацию, передавая следующие параметры
      (где c - уровень з/п, max - макс. уровень з/п, min - минимальный уровень з/п, r - коэффициент):
      c = 40, max = 80, min = 30, r = 0.2 - должна вернуть false
      c = 79, max = 81, min = 80, r = 0.2 - должна вернуть false
      c = 79, max = 95, min = 80, r = 0.2 - должна вернуть true

  • @mslq
    @mslq 9 месяцев назад

    Вы такой умный, такой молодец, так вы уже решили задачу как сохранять связанный список? Или так всем и предложите те костыли в приложении типа скриптов которыми все пользуются.

  • @shtormish
    @shtormish Год назад +2

    22:30 у вас не периметр, а полупериметр, не надо путать)

  • @alexey.zaitsev
    @alexey.zaitsev Год назад

    37:43 если выполнить запрос SELECT get_season(13); то функция вернет "зима" )

    • @EngineerSpock
      @EngineerSpock  Год назад

      Да мы не делали здесь защиту от дурака. Возможно там где с ошибками работаем это поправим, но точно уже не помню

  • @EngineerSpock
    @EngineerSpock  Год назад

    Данный курс на RUclips - сильно укороченная (демо) версия полного курса, который вы можете приобрести на stepik (с карточкой из РФ) или Udemy (с карточкой не из РФ)
    Купить полный курс на stepik:
    www.engineerspock.com/buy-postgres-youtube-stepik - получите скидку 30%
    Купить полный курс на udemy:
    www.engineerspock.com/buy-postgres-youtube-udemy
    Все курсы от EngineerSpock: www.engineerspock.com/offer-spock-youtube
    *****
    Подпишись на канал в Telegram: t.me/engineerspock_it
    Подписка на Boosty: boosty.to/engineerspock
    Донаты на развитие: pay.cloudtips.ru/p/1f080f72
    Чат в Telegram: t.me/python_devs
    Ссылка на репозиторий в GitHub: github.com/EngineerSpock/postgres-course-ru
    *****

    • @Ragnos91
      @Ragnos91 Год назад

      36:50
      я бы поправил:
      drop function if exists get_season;
      create or replace function get_season(month_number int) returns text AS $$
      declare
      season text;
      begin
      if month_number BETWEEN 3 and 5 then
      season = 'Spring';
      elsif month_number BETWEEN 6 and 8 then
      season = 'Summer';
      elsif month_number BETWEEN 9 and 11 then
      season = 'Autumn';
      elsif month_number BETWEEN 1 and 2 OR month_number = 12 then
      season = 'Winter';
      else
      season = 'error';
      end if;
      return season;
      end;
      $$ language plpgsql;
      select get_season(12)

    • @Ragnos91
      @Ragnos91 Год назад

      1:12:06
      дз (09-дз.sql) нету на гите - ни заданий не решений:
      вот:
      -- 1
      -- создать функию которая делает бэкап таблицы customers в другую таблицу, предварительно стирая таблицу дл бэкапа если такая существует
      create or replace function backup_customers() returns void as $$
      drop table if exists backup_customers;
      create table backup_customers as
      select * from customers;
      --select * into backup_customers
      --from customers;
      $$ language sql;
      select backup_customers();
      select count(*) from customers;
      -- 2
      -- создать функию которая возвращает средний фрахт
      create or replace function get_avg_freight() returns float8 as $$
      select avg(freight)
      from orders;
      $$ language sql ;
      select * from get_avg_freight();
      -- 3
      -- создать функцию которая принимает два числовых параметра - пределов для генерации случайного числа между ними
      create or replace function random_between(low int, high int) returns int as $$
      begin
      return floor(random() * (high - low + 1) + low);
      end
      $$ language plpgsql ;
      select random_between(0, 1)
      from generate_series(1,10)
      -- 4
      -- создать функцию которая возвращает самую низкую и самыю высокую зарплату сотрудников в данном городе
      create or replace function get_salary_bounds_by_city(emp_city varchar, out min_salary numeric , out max_salary numeric ) as $$
      select MIN(salary), MAX(salary)
      from employees
      where city = emp_city
      $$ language sql;
      select * from get_salary_bounds_by_city('London');
      -- 5
      -- создать функцию которая корректирует зарплату на некоторый заданный процент из входящего аргумента, но не корректирует если текущий уровень
      -- зарплаты равен некоторому заданному верхнему уровню. При этом верхний уровень зарплаты по-умолчанию равен 70, процент коррекции равен 15%
      create or replace function correct_salary(upper_boundary numeric default 100, correction_rate numeric default 0.15)
      returns void as $$
      update employees
      set salary = salary + (salary * correction_rate)
      where salary max_salary then
      return false;
      else
      return true;
      end if;
      END
      $$ language plpgsql;
      select should_increase_salary(40, 80, 30, 0.2);
      select should_increase_salary(79, 81, 80, 0.2);
      select should_increase_salary(79, 95, 80, 0.2);

  • @korumika3798
    @korumika3798 Год назад

    CREATE OR REPLACE FUNCTION sum_product(discont int) RETURNS bigint AS $$
    BEGIN
    RETURN sum(units_in_stock)
    FROM products
    WHERE discont = discontinued;
    END;
    $$ LANGUAGE plpgsql
    Вот не могу понять, попробовал впихнуть сюда такой функционал. Если вызвать голую функцию, он решит ее как мы на примере из видео, заигнорив что туда нужно вбить 1 или 0 , будто есть DEFAULT на выполение функции без доп функционала о_О не понял почему

  • @Omega515X
    @Omega515X Год назад

    где можно найти дз?

  • @RaptorT1V
    @RaptorT1V Год назад

    1:23:11 у меня попросту нету столбца Salary в табличке Employees

    • @RaptorT1V
      @RaptorT1V Год назад

      1:24:12 воо вот я об этом
      а когда "мы сами добавили" salary ???

    • @RaptorT1V
      @RaptorT1V Год назад

      Пришлось самостоятельно добавить. Вот вам функция добавки рандомных зарплат в пределах 100 условных единиц.
      CREATE OR REPLACE FUNCTION AddRandomSalaries() RETURNS VOID AS $$
      BEGIN
      ALTER TABLE employees ADD COLUMN IF NOT EXISTS salary NUMERIC; -- Добавляем столбец "salary" в таблицу "employees"
      -- Заполняем столбец "salary" случайными значениями для первых 9 строк
      EXECUTE 'UPDATE employees
      SET salary = (random() * 100)::double precision
      WHERE employee_id IN (SELECT employee_id FROM employees LIMIT 9)';
      END;
      $$ LANGUAGE plpgsql;
      SELECT AddRandomSalaries(); -- Вызываем функцию
      SELECT employee_id, salary FROM employees ORDER BY employee_id; -- Проверяем

  • @СергейГаранин-о5л
    @СергейГаранин-о5л 2 года назад

    Вопрос
    Как работает % в RAISE NOTICE 'Counter: %', counter;

  • @kazakman7772
    @kazakman7772 2 года назад +1

    gde users? ili roles? like create role or user.
    ty vse zdachi sdelal postgres superuser

  • @keysi391
    @keysi391 2 года назад +1

    Долгие лекции трудно слушать, лучше было бы разбитое по частям одно видео. Но всёравно, так курс очень полезный благодарю)

    • @EngineerSpock
      @EngineerSpock  2 года назад

      Таймкоды не помогают?

    • @keysi391
      @keysi391 2 года назад

      Мозг иначе воспринимает информацию, хочется сразу и залпом пройти🤣

    • @ivanshipilov4265
      @ivanshipilov4265 2 года назад +2

      Этот же курс разбитый на кусочки ruclips.net/p/PLXo5HrBxMS-2pY6zA6iKyKZLwwTiCrGME существует

    • @keysi391
      @keysi391 2 года назад

      @@ivanshipilov4265 То что надо)

    • @sandy_kingdom
      @sandy_kingdom 2 года назад

      @@ivanshipilov4265 Плейлист не существует

  • @psylo1841
    @psylo1841 Год назад

    1:24:20

  • @Zhuf82
    @Zhuf82 Год назад

    Думаю кто программировал на процедурных языках такой код для Фибоначи понятнее будет:
    CREATE OR REPLACE FUNCTION GetFibonachi(n int) RETURNS int AS
    $$
    DECLARE
    fibonachi int = 0;
    pred int = 0;
    tek int = 1;
    BEGIN
    IF (n