SQL Academy: всё о реляционных БД и SQL
По всем вопросам и коммерческим предложениям писать @LadanovNick Купить рекламу: https://telega.in/c/sqlacademyofficial Чат студентов SQL Academy https://t.me/sqlacademyorg
نمایش بیشتر📈 تحلیل کانال تلگرام SQL Academy: всё о реляционных БД и SQL
کانال SQL Academy: всё о реляционных БД и SQL (@sqlacademyofficial) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 11 363 مشترک است و جایگاه 10 911 را در دسته فناوری و برنامهها و رتبه 57 339 را در منطقه روسيا دارد.
📊 شاخصهای مخاطب و پویایی
از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 11 363 مشترک جذب کرده است.
بر اساس آخرین دادهها در تاریخ 27 ژوئن, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر 173 و در ۲۴ ساعت گذشته برابر 1 بوده و همچنان دسترسی گستردهای حفظ شده است.
- وضعیت تأیید: تأیید نشده
- نرخ تعامل (ER): میانگین تعامل مخاطب 17.59% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً N/A% واکنش نسبت به کل مشترکان کسب میکند.
- دسترسی پستها: هر پست به طور میانگین 1 997 بازدید دریافت میکند. در اولین روز معمولاً 0 بازدید جمعآوری میشود.
- واکنشها و تعامل: مخاطبان بهطور فعال حمایت میکنند؛ میانگین واکنش به هر پست 16 است.
- علایق موضوعی: محتوا بر موضوعات کلیدی مانند sql, строка, индекс, auto_increment, created_at تمرکز دارد.
📝 توضیح و سیاست محتوایی
نویسنده این فضا را محل بیان دیدگاههای شخصی توصیف میکند:
“По всем вопросам и коммерческим предложениям писать @LadanovNick
Купить рекламу: https://telega.in/c/sqlacademyofficial
Чат студентов SQL Academy
https://t.me/sqlacademyorg”
به لطف بهروزرسانیهای پرتکرار (آخرین داده در تاریخ 28 ژوئن, 2026)، کانال همواره بهروز و دارای دسترسی بالاست. تحلیلها نشان میدهد مخاطبان بهطور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامهها تبدیل کردهاند.
SHOW VARIABLES LIKE 'event_scheduler';
Если он OFF, включаем его:
SET GLOBAL event_scheduler = ON;
🔹 Создание событий в MySQL
Простейший пример однократного события:
CREATE EVENT delete_old_logs
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;
💡 Это событие запустится один раз через 1 час и удалит старые логи.
🔹 Периодическое выполнение событий
Если нужно выполнять задачу регулярно, используем EVERY:
CREATE EVENT update_stats
ON SCHEDULE EVERY 1 DAY
DO
UPDATE statistics SET last_updated = NOW();
Это событие будет обновлять таблицу каждый день.
🔹 Управление событиями
📌 Посмотреть все события в базе:
SHOW EVENTS;
📌 Остановить событие:
ALTER EVENT update_stats DISABLE;
📌 Запустить снова:
ALTER EVENT update_stats ENABLE;
📌 Удалить событие:
DROP EVENT delete_old_logs;
🔹 Что важно помнить?
1️⃣ События привязаны к БД, где они созданы.
Если сделать USE другая_БД, событие не будет видно.
2️⃣ События выполняются от имени пользователя, который их создал, с его правами.
3️⃣ Если сервер MySQL перезапустится, события сохраняются, но Event Scheduler может выключиться — проверяйте его статус! ✅
INSERT INTO users (username, password) VALUES ('kolya', 'mypassword123');
👉 Это ужасная практика! Если база данных утечёт, злоумышленники сразу получат доступ ко всем аккаунтам! 😱
2. Использование MD5/SHA1:
INSERT INTO users (username, password) VALUES ('kolya', 'bff149a0b87f5b0e00d9dd364e9ddaa0');
👉 MD5 и SHA1 устарели и больше не считаются безопасными! Их можно взломать с помощью радужных таблиц (rainbow tables) 🌈 или перебора (brute force). 🛑
✅ Хороший способ: хеширование паролей 🔒
Лучший способ защитить пароли — использовать bcrypt или Argon2. В MySQL есть встроенная функция PASSWORD(), но её не рекомендуют использовать, так как она небезопасна!
😕 Вместо этого используем bcrypt. 🎉
🔹 Как хешировать пароль в Python (рекомендуется)
import bcrypt
password = b'mypassword123'
hashed_password = bcrypt.hashpw(password, bcrypt.gensalt())
print(hashed_password)
🔹 Как хранить хеш в базе:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(255) UNIQUE,
password_hash VARCHAR(255)
);
INSERT INTO users (username, password_hash) VALUES ('kolya', '$2y$10$abcdefghijABCDEFGHIJ1234567890');
👉 Здесь password_hash хранит уже захешированный пароль, а не сам пароль! 🔐
🔓 Как проверить пароль при входе?
В Python:
if bcrypt.checkpw(b'mypassword123', stored_hash.encode()):
print('Пароль верный! ✅')
else:
print('Неправильный пароль! ❌')
🛡 Итог
❌ НЕ храните пароли в открытом виде! 🚫
❌ НЕ используйте MD5 или SHA1! ❗️
✅ ИСПОЛЬЗУЙТЕ bcrypt или Argon2! 🔥
✅ ИСПОЛЬЗУЙТЕ bcrypt.hashpw() и bcrypt.checkpw() в Python! 🏆
Следуя этим правилам, вы защитите данные пользователей и сделаете свой сервис безопаснее! 🔒💪
SELECT AVG(salary) FROM salaries;
👉 Средняя зарплата: 490 000
Но разве это отражает реальность? Большинство сотрудников получают 40 000, а один выбивает статистику.
✅ Медиана (MEDIAN) — это значение, которое делит отсортированные данные пополам: половина значений меньше, половина больше. В данном случае медиана = 40 000, что лучше отражает ситуацию.
📌 Как посчитать медиану в MySQL?
В отличие от AVG(), в MySQL нет встроенной функции MEDIAN(), но её можно посчитать разными способами.
1️⃣ Метод через ORDER BY LIMIT (для нечётного количества записей)
Если записей нечётное количество, медиана — это значение в центре списка:
SELECT salary FROM salaries
ORDER BY salary
LIMIT 1 OFFSET (SELECT COUNT(*) FROM salaries) / 2;
⚠️ Минус: Работает только для нечётного количества записей.
2️⃣ Метод через ROW_NUMBER() (универсальный способ)
Этот метод работает и для чётного, и для нечётного количества записей:
WITH ordered AS (
SELECT salary, ROW_NUMBER() OVER (ORDER BY salary) AS rn,
COUNT(*) OVER () AS total
FROM salaries
)
SELECT AVG(salary) FROM ordered
WHERE rn IN (FLOOR((total + 1) / 2), CEIL((total + 1) / 2));
🔹 Мы нумеруем строки с ROW_NUMBER().
🔹 Выбираем одно или два центральных значения.
🔹 Берём их среднее (AVG()) — для чётного числа записей берётся среднее двух центральных значений.
🏆 Итог
✅ Медиана полезнее среднего арифметического, когда есть выбросы в данных.
✅ В MySQL нет встроенной MEDIAN(), но её можно вычислить с ROW_NUMBER().
✅ Используйте медиану, если хотите честную аналитику! 🚀
CREATE TABLE items (
id INT AUTO_INCREMENT PRIMARY KEY,
price DECIMAL(10,2),
quantity INT,
-- Генерируемый столбец, который будет хранить итоговую стоимость
total_cost DECIMAL(10,2) AS (price * quantity) STORED
);
🔹AS (price * quantity) — формула, по которой будет вычисляться столбец total_cost.
🔹STORED означает, что итоговая стоимость будет записываться в таблицу и быстренько выдаваться из физического хранения.
🔹При вставке или обновлении записи MySQL сама позаботится о том, чтобы total_cost пересчитался.
А если сделать виртуальный столбец? 💡
Чтобы не занимать место на диске, используем VIRTUAL:
CREATE TABLE items_virtual (
id INT AUTO_INCREMENT PRIMARY KEY,
price DECIMAL(10,2),
quantity INT,
total_cost DECIMAL(10,2)
AS (price * quantity) VIRTUAL
);
🔹 Поле total_cost не хранится физически. Оно вычисляется при каждом чтении строки.
🔹При частом чтении большого количества строк запросы могут работать чуть медленнее, ведь каждый раз идёт пересчёт.
🔹Зато при редких выборках и частых обновлениях виртуальный столбец может быть выгоднее, так как не используется дополнительное место на хранение.
Индексация и ограничения 🔑
🔹STORED столбцы можно индексировать, а значит, быстрее искать по ним.
🔹VIRTUAL столбцы индексировать нельзя
Подводим итоги 🏆
🔹Генерируемые столбцы избавляют от необходимости самостоятельно следить за обновлением вычисляемых значений.
🔹Выбор между VIRTUAL и STORED зависит от частоты чтения/записи, а также необходимости индексации.
🔹Такой подход упрощает архитектуру БД и код приложения: формула одна, лежит «рядом с данными», все операции прозрачны и понятны.
Если вам нужно ускорить расчёт «сложной формулы» или хранить результат для аналитических задач — выбирайте STORED. Если поле лишь вспомогательное, используйте VIRTUAL.
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
