Forwarded from БАШНЯ
HARD SKILLS❗️
Продолжаем разбирать hard skills🔥
Сегодня поговорим про SQL - что это такое и что спрашивают по нему на собеседованиях👨💻
Делитесь этим постом с друзьями и пишите свои вопросы в комментарии ✍️
Автор поста:
Владимир Лунев, ментор в Башне
#hardskills
Продолжаем разбирать hard skills
Сегодня поговорим про SQL - что это такое и что спрашивают по нему на собеседованиях
Делитесь этим постом с друзьями и пишите свои вопросы в комментарии ✍️
Автор поста:
Владимир Лунев, ментор в Башне
#hardskills
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👾6💯4
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣25🗿11🌚3
Привет, ранее уже базово затрагивал темы обычных представлений и материализованных, однако, сегодня словил желание остановится на MView по подробнее.
🧊 Что такое материализованное представление?
Материализованное представление (Materialized View) — это реальный объект базы данных, содержащий предрасчитанные данные.
В отличие от обычного VIEW, здесь:
🧊 Архитектурно материализованное представление — это:
🧊 Ключевые особенности
🧊 Общий синтаксис для создания материализованного представления:
CREATE MATERIALIZED VIEW имя_представления AS
SELECT ...
FROM ...
[WHERE ...]
[GROUP BY ...]
[ORDER BY ...];
Дополнительно можно указать:
WITH NO DATA — представление создаётся, но не заполняется (нужно REFRESH).
WITH DATA (по умолчанию) — данные вычисляются сразу при создании.
🧊 Допустим, у нас есть таблица orders, в которой хранятся заказы клиентов. Она может содержать такие поля:
-----------------------------
id SERIAL
order_date TIMESTAMP
customer_id INT
amount NUMERIC
Таблица обновляется постоянно: пользователи делают заказы, и каждая строка — это один заказ.
Часто требуется строить отчёты:
Запрос к такой таблице может быть тяжёлым, особенно если в orders миллионы строк. Поэтому создаём материализованное представление — заранее рассчитанный агрегат, чтобы анализировать среднюю сумму заказов по дням:
CREATE MATERIALIZED VIEW daily_avg_orders AS
SELECT
order_date::date AS day,
COUNT(*) AS total_orders,
AVG(amount) AS avg_order_value
FROM orders
GROUP BY day
ORDER BY day;
Что делает это материализованное представление:
После выполнения CREATE MATERIALIZED VIEW — СУБД физически сохраняет результат запроса. Теперь мы можем быстро выполнять:
SELECT * FROM daily_avg_orders;
И получать результат без перерасчёта данных каждый раз.
🛠 Обновление (refresh)
Чтобы MView оставалось актуальным, его нужно обновлять вручную или автоматически.
При ручном обновлении, чтобы обновить данные в представлении после изменений в таблице orders, выполняем:
REFRESH MATERIALIZED VIEW daily_avg_orders;
Если при создании добавили WITH NO DATA — первый REFRESH обязателен.
Можно настроить автообновление через:
⚙️ Индексы и уникальность
Во многих СУБД материализованные представления поддерживают индексы, особенно если нужно обеспечить уникальность:
CREATE UNIQUE INDEX ON имя_представления(ключ);
Для того чтобы представление можно было обновлять инкрементально (а не полностью), часто требуется уникальный ключ.
👾 Где это особенно нужно?
Так что, материализуемся
#Views #Materialized_views #SQL
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👾3💯2 2
Привет, нашел прикольную шпаргалку по основным джоинам от ByteByteGo.
Для инфо, JOIN в SQL — это операция, которая позволяет объединять данные из двух или более таблиц по связанному столбцу (обычно по ключу: первичному и внешнему).
Ранее писал посты про базовые джоины, однако, есть еще куча необычных join-операторов, конечно, в обиходе не все они используются часто, но кто знает, куда неофитов могут завести скитания по базе данных 😂
Скоро напишу пост про специфические джоины.
Лайк если надо👩💻
Для инфо, JOIN в SQL — это операция, которая позволяет объединять данные из двух или более таблиц по связанному столбцу (обычно по ключу: первичному и внешнему).
Ранее писал посты про базовые джоины, однако, есть еще куча необычных join-операторов, конечно, в обиходе не все они используются часто, но кто знает, куда неофитов могут завести скитания по базе данных 😂
Скоро напишу пост про специфические джоины.
Лайк если надо
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥28👾4😱2
Итак, давайте разберем необычные виды join, про которые не так часто вспоминают, но они по своему прекрасны. Погнали.
SELF JOIN используется, когда нам нужно сравнить строки внутри одной и той же таблицы.
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.id;
Где полезен:
Обратить внимание:
Каждая строка из первой таблицы соединяется со всеми строками второй.
SELECT c.color, s.size
FROM colors c
CROSS JOIN sizes s;
Где полезен:
Пример:
Таблица colors:
red
blue
Таблица sizes:
S
M
L
Результат:
color size
red S
red M
red L
blue S
blue M
blue L
Обратить внимание:
Автоматически соединяет таблицы по колонкам с одинаковыми именами и типами.
SELECT *
FROM orders
NATURAL JOIN customers;
Где полезен:
Обратить внимание:
Ищем строки в первой таблице, у которых нет пары во второй.
На SQL делается через:
SELECT c.id
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.id IS NULL;
ИЛИ:
SELECT c.id
FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o WHERE o.customer_id = c.id
);
Где полезен:
Обратить внимание:
Найти строки из одной таблицы, у которых есть хотя бы одна пара в другой таблице, но не вытаскивать её. Забавно, но его синтаксис это JOIN без JOIN:
SELECT c.id
FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.customer_id = c.id
);
В отличие от INNER JOIN, мы не получаем orders.* — только customers.
Где полезен:
Обратить внимание:
Поддержка:
#Join #SQL
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14 6💯4
Пишу пост про SQLi*, до конца недели опубликую. В июле, скорее всего буду много говорить о безопасности БД, методах их защиты, плюс затронем выдачу и управление правами пользователей в СУБД и бэкапы.
*⚠️ SQL-инъекция (SQL injection)— это атака, при которой злоумышленник внедряет вредоносный SQL-код через поля ввода, например, на сайте (логин, пароль, поисковая строка), чтобы получить несанкционированный доступ к базе данных.
*
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9🌚7 5
This media is not supported in your browser
VIEW IN TELEGRAM
Когда удалил не ту таблицу. Ну, главное, чтобы не на проде 😂
🤣16🔥5😱3🌚2
Привет, вписался в конкурс каналов с качественным авторским контентом. Потом будут голосования за лучшие посты по номинациям среди каналов и все такое — здесь @tg_contest_main. Так что, не удивляйтесь, иногда буду просить вас голосовать))
Ну а вобще, я считаю, круто, что мой канал начинает участвовать в таких штуках, для меня это своеобразный признак оценки моих стараний (как и ваши реакции)😁
Ну а вобще, я считаю, круто, что мой канал начинает участвовать в таких штуках, для меня это своеобразный признак оценки моих стараний (как и ваши реакции)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15🌚3💯3
Недавно писал важный скрипт на работе, где необходимо было считать дельты внутри колонок (сегодня минус вчера). Подумал, что это очень полезное знание и решил передать его вам, моим подписчикам. Собственно вычисление между текущим и предыдущим значением внутри колонки мы и рассмотрим.
SQL-инструмент для расчёта такой дельты — оконная функция LAG()
LAG(столбец, смещение, значение_по_умолчанию)
OVER (PARTITION BY ... ORDER BY ...)
Допустим, у нас есть таблица sales:
sale_date amount
2024-06-01 1000
2024-06-02 1200
2024-06-03 800
Запрос:
select
sale_date,
amount,
amount - LAG(amount) OVER (ORDER BY sale_date) AS delta
FROM sales;
Результат:
sale_date amount delta
2024-06-01 1000 NULL
2024-06-02 1200 200
2024-06-03 800 -400
Что происходит в запросе?
Если у нас несколько магазинов в таблице store_sales:
store_id sale_date amount
1 2024-06-01 1000
1 2024-06-02 1200
2 2024-06-01 700
2 2024-06-02 900
Запрос:
select
store_id,
sale_date,
amount,
amount - LAG(amount) OVER (PARTITION BY store_id ORDER BY sale_date) AS delta
FROM store_sales;
Что получится в результате:
store_id sale_date amount delta
1 2024-06-01 1000 NULL
1 2024-06-02 1200 200
2 2024-06-01 700 NULL
2 2024-06-02 900 200
Доп.ситуация:
Если значения amount могут быть NULL, то delta будет NULL даже при корректном LAG(). Можно использовать COALESCE():
amount - COALESCE(LAG(amount) OVER (...), 0) AS delta
#LAG #SQL
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18 7👾5
Привет, немного порассуждал над собесами и подготовкой к ним, совместно с @bashnya_education
🔥7
Forwarded from БАШНЯ
РАЗБОР РУБРИКИ НОРМ ИЛИ СТРЕМ ❗️
Владимир Лунев - наш ментор подготовил разбор, где детально рассмотрел каждый наш вопрос🔥
Не забывайте, что уже сейчас можно записаться на занятие с ментором через нашего менеджера - @bashnya_edu🤯
Более подробно про менторство можно узнать в нашем миниаппе💪
#mini_app
Владимир Лунев - наш ментор подготовил разбор, где детально рассмотрел каждый наш вопрос
Не забывайте, что уже сейчас можно записаться на занятие с ментором через нашего менеджера - @bashnya_edu
Более подробно про менторство можно узнать в нашем миниаппе
#mini_app
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17💯7👾5🤣1
Привет, обещал рассказать про SQL-инъекции. Начнем с теории, а потом расскажу пару интересных кейсов, как от этого пострадали крупные компании.
SQL-инъекция — это уязвимость, при которой злоумышленник может внедрить произвольный SQL-код в запрос и изменить его поведение. Обычно возникает, когда значения из внешнего ввода (пользователя) напрямую вставляются в SQL-запрос без очистки и параметризации.
Представим, что на сайте есть форма входа, и backend формирует такой запрос на основе ввода пользователя:
SELECT * FROM users
WHERE username = 'admin' AND password = '1234';
Но если пользователь введёт в поле password значение:
' OR '1'='1
Запрос превратится в нечто вроде:
SELECT * FROM users
WHERE username = 'admin' AND password = '' OR '1'='1';
А это всегда истина. В итоге, пользователь войдёт без знания пароля.
Урон: более 130 миллионов украденных номеров кредитных карт.
Хакеры использовали SQL-инъекцию на публично доступном веб-сервере, чтобы получить доступ к внутренней сети компании. Далее они установили кейлоггер, чтобы собирать данные с систем обработки платежей.
Последствия:
Урон: более 1 миллиона аккаунтов пользователей, включая пароли, e-mail и адреса.
Группа LulzSec заявила, что использовала простую SQL-инъекцию на одном из сайтов Sony, не требующую особых технических знаний. База данных была не зашифрована.
Последствия:
Урон: утечка данных более 150 тыс. клиентов, включая банковские данные и номера карт.
Хакер использовал простейшую SQL-инъекцию в форме запроса на сайте, где не была проведена должная проверка входных данных.
Последствия:
Урон: утечка информации о безопасности выборов, продажа на чёрном рынке.
Что произошло:
SQL-инъекция позволила злоумышленникам получить доступ к серверу агентства. Они смогли создать привилегированную учётную запись администратора и продали доступ к базе данных на хакерских форумах.
Последствия:
🔐 SQL-инъекция — это не баг кода, а баг архитектуры. Её можно полностью избежать, если изначально строить систему основанной на принципах безопасности данных.
Что объединяет все эти случаи?
🔒Короткую методичку по защите от этого типа атак можно тезисно охарактеризовать так (подробно расписывать не буду, так как поста не хватит, если интересно почитать подробнее о способах защиты, пишите в коменты, сделаю отдельный пост):
#SQL_Injection #SQL
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👾6🤔3😱2 1
И смешно и грустно. Но по моему опыту ИИ неплохие результаты показывает, ибо многие аналитики предочитают не думать об оптимизации запросов, ибо целью является, просто получение нужных данных через страдания CPU и прочих механизмов сервера 🖥
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣10👾4🔥2🤔1
Привет, сегодня факультативный пост без разборов кода. Все слышали про SQL, многие с ним работали и работают, но давайте разберем откуда он вобще взялся и почему стал так популярен. Это язык, который пережил несколько поворотных технологических эпох в мире ИТ и до сих пор является самым актуальным и популярным инструментом управления данными.
🛠 Рождение: 1970-е
В реальности — получилось не совсем так.
🛠 Стандартизация и рост
🧊 Реальный мир
🧊 SQL сегодня
Сегодня есть ряд глобальных проблем, среди них:
Некоторые плюсы:
Вобщем, SQL, еще долго будет с нами, полноценного альтернативного решения, еще не изобрели, так что учим)
#История_SQL #SQL
Please open Telegram to view this post
VIEW IN TELEGRAM
💯9👾6 4🔥2