IliaHohlov

IliaHohlov

Студия Прайм
На Пикабу
Дата рождения: 30 апреля 1985
4M4DEUS
4M4DEUS оставил первый донат
поставил 2 плюса и 0 минусов
отредактировал 1 пост
проголосовал за 1 редактирование
5798 рейтинг 661 подписчик 1 подписка 69 постов 14 в горячем

Вернуть значение строки после команды UPDATE в MySql

Вернуть значение строки после команды UPDATE в MySql Программирование, IT, Собеседование, Mysql, SQL, Задача, Длиннопост

Есть несколько способов. Самый простой из них - это использовать вычисления.

Рассмотрим на примере. Пусть в некоторой процедуре есть команда обновления остатка товара на складе:

UPDATE GOODS
SET ITEMS_COUNT = ITEMS_COUNT - V_SOLD_COUNT
WHERE ID = P_ID_GOOD;

После изменения остатка, если его новое значение стало меньше нуля, нужно выдать ошибку и откатить транзакцию (и ещё можно журналировать эту ошибку).

Итак, как получить новое значение строки, которое устанавливается в столбце ITEMS_COUNT в результате команды UPDATE для последующего его анализа.

MySql поддерживает разные типы переменных: с собачкой (@) и без этого предварительного символа. Первые переменные называются пользовательскими, а вторые - локальными. Ещё есть системные переменные (с двумя собачками), но о них в другой раз.

Пример присвоения значения пользовательской переменной (с собачкой):
SET @Var1 = 5;

Пример присвоения локальной переменной (без собачки):
SET var1 = 5;

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

SELECT @var1 := 5  SOME_FIELD
FROM DUAL

В результате и в переменную запишется число 5 и можно сразу использовать значение переменной, например, чтобы вывести её командой SELECT (как в примере выше).

Вернуть значение строки после команды UPDATE в MySql Программирование, IT, Собеседование, Mysql, SQL, Задача, Длиннопост

И нашу задачу, из-за которой я решил написать эту мини статью, это очень хорошо решает. Прямо в команде UPDATE мы запишем новое значение для строки в переменную и тут же используем её:

UPDATE GOODS
SET ITEMS_COUNT = @var1 := ITEMS_COUNT - V_SOLD_COUNT
WHERE ID = P_ID_GOOD;

Текущее значение строки за вычетом V_SOLD_COUNT будет присвоено переменной @var1 и её значение сразу же будет использовано для команды UPDATE.

И еще теперь переменную @var1 можно использовать и после команды UPDATE. Проверим установленное в строке значение и, если оно стало меньше нуля, откатим операции и выдадим ошибку.

UPDATE GOODS
SET ITEMS_COUNT = @var1 := ITEMS_COUNT - V_SOLD_COUNT
WHERE ID = P_ID_GOOD;

IF @var1 < 0 THEN
...
ROLLBACK;
SIGNAL ....;
ЛОГИРУЕМ ФАКТ ОШИБКИ;
END IF;

Использование переменной в команде UPDATE позволит запомнить новое значение строки и на основе него строить последующую логику (например, проверить на отрицательное значение). Только необходимо принимать во внимание наличие триггера на команду UPDATE уровня строки. Вдруг непосредственно перед установкой нового значения оно может быть подкорректировано триггером. Тогда лучше запоминать новое установленное значение прямо в триггере. Для справки: некоторые СУБД поддерживают опцию RETURNING DML команд, тогда финальное сохранённое значение в любом столбце можно получить и без вычислений, и не обращая внимание на наличие триггеров.

Подобные и другие задачи решаем на нашем онлайн интенсиве по разработке в MySql. Следующий поток уже в марте! Записывайся! Буду тебя ждать!

Поставь лайк, если понравилась, статья или подпишись!

Показать полностью 2

Задача по SQL. Вывести текст по вертикали

Вывод текста построчно. Использование рекурсии. CONNECT BY

Телеграм-канал: https://t.me/sql_oracle_databases

Показать полностью

Задачи с собеседования по SQL про псевдостолбцы

Задачи с собеседования по SQL про псевдостолбцы Программирование, IT, Собеседование, База данных, Oracle, Mysql, Ms SQL, Postgresql, SQL, Длиннопост

Здравствуйте, друзья!

Готовы порешать SQL-задачи на тему псевдостолбцов? Что такое псевдостолбцы и примеры их использования можно почитать тут.

Эти и другие задачи с собеседования опубликованы в нашем Телеграм-канале.

Итак, задача номер 1:

В таблице TEMP_TABLE один столбец и пять строк.
Запрос SELECT 1 FROM TEMP_TABLE

а) выведет данные из первого столбца для всех строк;

б) выведет просто цифру 1;

в) выведет пять строк, в каждой из которых будет цифра 1;

г) выдаст ошибку.

Здесь нужно поставить чтение на паузу и выбрать правильный вариант ответа.
На сегодня разброс ответов на задачу такой (правильный ответ в зелёном цвете):

Задачи с собеседования по SQL про псевдостолбцы Программирование, IT, Собеседование, База данных, Oracle, Mysql, Ms SQL, Postgresql, SQL, Длиннопост

Объяснение: данный в задаче запрос выводит данные из таблицы TEMP_TABLE (так как SELECT..FROM TEMP_TABLE), поэтому будут выводиться строки из неё (все сколько есть). Но в блоке SELECT не указан ни один из (настоящих) столбцов таблицы. Не выбираются данные из какого-либо столбца.
В нашем примере указано что пока выводятся строки из таблицы TEMP_TABLE нужно выводить цифру 1, а не показывать данные какого-либо столбца.

Задача 2:
Дана следующая таблица TEST_TABLE с тремя строками:
SELECT * FROM TEST_TABLE
ID  NAME
1  NULL
2  NULL
3  NULL
Каков будет результат следующего запроса: SELECT SUM(1) FROM TEST_TABLE?

Здесь опять нужно поставить чтение на паузу и написать правильный вариант ответа. На сегодня разброс ответов на задачу такой (правильный ответ в зелёном цвете):

Задачи с собеседования по SQL про псевдостолбцы Программирование, IT, Собеседование, База данных, Oracle, Mysql, Ms SQL, Postgresql, SQL, Длиннопост

Объяснение: здесь тоже речь идёт о псевдостолбце. Пока выводятся данные из TEST_TABLE блок SELECT выводит единицу, а не какой-либо реальный столбец таблицы. Пока не смотрите на функцию SUM. Итого единица выведется три раза (по количеству строк в таблице). И вот теперь, с помощью функции SUM получим сумму всех введённых чисел (единичек), то есть число 3.

Ещё больше SQL-задач с собеседований и реальной практики в разных СУБД в нашем Телеграм-канале.

Заходи на наш Youtube-канал и найдёшь много интересного и полезного про базы данных и язык SQL.

Показать полностью 2

SQL задача про IN и NOT IN с объяснением

SQL задача про IN и NOT IN с объяснением Программирование, IT, Собеседование, SQL, Ms SQL, Oracle, Субд, База данных, Telegram (ссылка)

Всем отличного начала нового года! Вчера утром в своём Телеграм-канале опубликовал интересную задачу по SQL с собеседования про IN и NOT IN.

С первого взгляда кажущееся правильным решение на самом деле ложно. Чтобы верно ответить в задаче, нужно знать как СУБД обрабатывает элементы множества, указанные для оператора IN / NOT IN в запросе.

Вначале вот текст самой задачи. Ниже я поясню правильное решение:

В таблице CLIENTS пять строк. В первых двух строках в поле CLIENT_TYPE значение 1, ещё в двух строках в CLIENT_TYPE значение 2 и в последней строке поле CLIENT_TYPE не заполнено, то есть в последней строке в поле CLIENT_TYPE значение NULL.

Есть два запроса:
1)
SELECT * FROM CLIENTS WHERE CLIENT_TYPE IN (1)
2)
SELECT * FROM CLIENTS WHERE CLIENT_TYPE NOT IN (2, NULL)
Результирующие наборы данных, полученные в результате выполнения этих запросов, будут одинаковыми или разными?

Здесь поставь чтение на паузу и ответь на вопрос самостоятельно.

На сегодня на канале следующий разброс ответов:

SQL задача про IN и NOT IN с объяснением Программирование, IT, Собеседование, SQL, Ms SQL, Oracle, Субд, База данных, Telegram (ссылка)

Первый запрос отбирает клиентов, у которых в столбце тип указано значение 1. В результате будут отобраны две строки. Здесь все понятно. Так как в таблице клиентов ещё остаются строки, не попавшие в выбор первого запроса, со значениями в столбце тип 2 и NULL, то видится, что второй запрос должен как раз вернуть такой же результирующий набор данных. Однако, тут дело в коварном NULL в значениях для оператора NOT IN. СУБД представляет оператор NOT IN:

SELECT * FROM CLIENTS WHERE CLIENT_TYPE NOT IN (2, NULL)

в результате должны быть отобраны клиенты, у которых значение в столбце тип не равно каждому из перечисленных во множестве значений:

SELECT * FROM CLIENTS WHERE ( (CLIENT_TYPE <> 2) AND (CLIENT_TYPE <> NULL) )

С NULL не допустимо использовать операторы сравнения. При сравнении с NULL (= NULL, <> NULL) результат будет всегда отрицательным.

Второй запрос не вернёт ни одной строки данных.

Ещё больше полезного и интересного в моём Телеграмм-Канале.

Показать полностью 1

Barcode to PC Scanner теперь и для iOS

Barcode to PC Scanner теперь и для iOS Офис, Смартфон, Сканер, Штрихкод, Сканер штрихкодов, QR-код, IT, Программирование

Новый год - новое приложение!

Теперь Barcode to PC Scanner доступен и для iOS!

Итак, загрузить наше приложение из AppStore можно здесь.

Версию для Android можно скачать из Google Play и RuStore.

Клиент для ПК (приложение, принимающее данные со смартфона) есть пока только для Windows, скачать можно тут. В течение нескольких дней будет версия и для MacOS!

Ещё одна хорошая новость: скоро будет доступна версия приложения, умеющая сканировать прямо в компьютер/ноутбук через WiFi. Доступ в Интернет будет больше не нужен. Штрихкода, коды QR и другая информация будет передаваться напрямую на компьютер совершенно без задержек!

Почитать руководство к программе можно здесь.

Показать полностью 1

Как перенести данные из Excel в таблицу базы данных

Разберём два простых способа как быстро вставить данные в таблицу базы данных, скопировав их, например, из Excel. Первый способ: через select for update. Второй способ: с помощью генерации команд DML в Экселе.

Телеграм-канал: https://t.me/sql_oracle_databases

#SQL #уроки #select_for_update

Показать полностью

Небольшая SQL задача с подзапросом и аналитикой

Небольшая SQL задача с подзапросом и аналитикой IT, Программирование, Программист, Длиннопост

По условиям задачи, нам даны две таблицы:

таблица CLIENTS (клиенты), имеющая, среди прочих, столбцы:
ID_CLIENT  NUMBER  PRIMARY KEY,
NAME_CLIENT  VARCHAR(100) NOT NULL;

и таблица INVOICES (счета клиентам) со столбцами:
ID_INVOICE  NUMBER  PRIMARY KEY,
ID_CLIENT  NUMBER  NOT NULL,
AMOUNT  NUMBER NOT NULL.

В таблице INVOICES столбец ID_CLIENT определён как внешний ключ (foreign key), ссылающийся на таблицу CLIENTS на поле ID_CLIENT.

Необходимо вывести все столбцы из таблицы клиентов, а также дополнительными столбцами вывести "количество продаж для каждого клиента" и "ранг клиента". Чем больше счетов выставлено клиенту, тем выше его ранг, такие клиенты должны быть выведены первыми в отчёте.

Здесь нужно поставить чтение на паузу. Попробуй сначала решить задачу самостоятельно.

Ещё больше интересных задач найдёшь в нашем Телеграм-канале.

Итак, ниже рассмотрим решение задачи.

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

Выходит, что информацию о количестве выставленных счетов каждому клиенту лучше всего вывести подзапросом:

SELECT C.*,
(SELECT COUNT(*)
FROM INVOICES I
WHERE I.ID_CLIENT = C.ID_CLIENT) COUNT_INVOICES
FROM CLIENTS C

Получим:

Небольшая SQL задача с подзапросом и аналитикой IT, Программирование, Программист, Длиннопост

Теперь осталось проранжировать полученные данные. Поставим ранг 1 клиенту с наибольшим количеством счетов. Воспользуемся аналитической (оконной) функцией RANK(). Так как чем больше счетов имеет клиент, тем меньше должно быть значение ранга, выходит, что в функции ранжирования нужно применить обратную сортировку - то есть ORDER BY COUNT_INVOICES DESC.

Сделаем выборку из только что полученной таблицы данных. Выведем имеющиеся столбцы и добавим новый - Ранг клиента:

Небольшая SQL задача с подзапросом и аналитикой IT, Программирование, Программист, Длиннопост

Ещё больше задач по SQL и базам данных с собеседований, а также разборов реальных практических ситуаций найдёшь в нашем Телеграм-канале.

UPD:

Если требуется без пропуска номеров в ранжировании, то заместо RANK нужно DENSE_RANK использовать.

Показать полностью 3

Как быстро начать разбираться в SQL

Ровно две недели назад, 20 октября опубликовал свои первые бесплатные курсы по MS Excel на stepik-е (ссылки на курсы MS Excel здесь) и собрал уже более 1.600 учеников и ещё много хороших отзывов 🙏🎉

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

И еще спасибо за донат! Мой первый донат в 50 р с платформы Пикабу!

На этой неделе наконец завершил публикацию ещё оного своего курса - "SQL. Базы данных. ORACLE. MS SQL. MySQL" на платформе. Наконец то мой курс по SQL теперь на Stepik-е😌

Ссылка на курс: https://stepik.org/course/183400

В курс входит огромное количество уроков (мы изучим SQL с нуля до уровня специалиста с трёхлетним стажем), все уроки сопровождаются практикой, мы будем работать в реальной базе данных, будет много самостоятельных практических задач, выполнение которых мы будем контролировать: проверять Ваши решения, помогать оптимизировать код, находить ошибки. И ещё снабдили курс автоматическими тестами по теории. Правильность ответов будет проверять сама платформа! Все это за совсем небольшую стоимость!

По завершению обучения - сертификат Stepik-а.

Доступ к курсу бессрочный!

Буду Вас ждать!

Отличная работа, все прочитано!