Поколение Python 🐍
50.3K subscribers
2K photos
16 videos
6 files
866 links
Серия курсов по языку Python от BEEGEEK 🐝.

Сайт: pygen.ru
Мерч: shop.pygen.ru
Чат: @pygen_ru_comments
Бот: @pygen_ru_bot
Поддержка: @pygen_ru_support

Перечень РКН: https://www.gosuslugi.ru/snet/673650d605391b3bfb5541c0
Download Telegram
Друзья, сегодня поговорим о видах соединений таблиц в SQL.

📎 Соединение таблиц (JOIN) — это операция объединения двух таблиц в одну таблицу согласно определенному правилу. Таблица, получаемая в результате соединения, включает все поля соединяемых таблиц, что значительно упрощает работу с исходными данными, поскольку вся необходимая информация автоматически собирается вместе и предоставляется в виде одной таблицы.

📎 Существуют следующие виды соединений:

✔️ Внутреннее соединение — отбираются все пары записей двух таблиц, для которых выполняется условие соединения. Если записи невозможно поставить в пару запись из другой таблицы так, чтобы условие соединения выполнялось, запись будет отброшена.

Внутреннее соединение выполняется с помощью оператора INNER JOIN. Общий синтаксис имеет следующий вид:

<первая таблица> INNER JOIN <вторая таблица> ON <условие соединения>

✔️ Внешнее соединение бывает двух видов:

🟢Левое внешнее соединение — отбираются все пары записей двух таблиц, для которых выполняется условие соединения, а также все оставшиеся записи из левой таблицы, для которых пара не нашлась.

Левое внешнее соединение выполняется с помощью оператора LEFT JOIN. Общий синтаксис имеет следующий вид:

<первая таблица> LEFT JOIN <вторая таблица> ON <условие соединения>

🟢Правое внешнее соединение — отбираются все пары записей двух таблиц, для которых выполняется условие соединения, а также все оставшиеся записи из правой таблицы, для которых пара не нашлась.

Правое внешнее соединение выполняется с помощью оператора RIGHT JOIN. Общий синтаксис имеет следующий вид:

<первая таблица> RIGHT JOIN <вторая таблица> ON <условие соединения>

При внешнем соединении записям без пары в соответствие ставятся значения NULL.

✔️ Перекрестное соединение — каждая запись из одной таблицы сопоставляется с каждой записью из другой таблицы. При этом условие соединения не требуется, поскольку сопоставление записей выполняется не по какому-либо правилу, а перебором всех возможных комбинаций.

Перекрестное соединение выполняется с помощью оператора CROSS JOIN. Общий синтаксис имеет следующий вид:

<первая таблица> CROSS JOIN <вторая таблица>

☝️☝️☝️☝️ Подробно о соединении таблиц рассказываем в курсе "Базы данных и SQL". Купить курс можно на нашем официальном сайте по ссылке.

Ставьте реакцию:

🔥 — если знали о видах соединений таблиц
👀 — если слышите о них впервые

#поколениеpython #базыданных #sql
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥75👀348❤5221
Друзья, сегодня поговорим о представлениях в языке SQL. 😌

📌 Представление — это виртуальная таблица. В отличие от обычных таблиц, содержащих фактические данные, представление содержит запрос, который динамически извлекает данные тогда, когда это необходимо.

📌 Представления можно использовать точно так же, как и обычные таблицы: извлекать из них данные, фильтровать и сортировать, объединять с другими таблицами или представлениями.

📌 Так как представления не содержат фактических данных, а извлекают их из других таблиц, при изменении этих таблиц изменится и содержимое связанных с ними представлений.

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

📌 Для создания представлений используется оператор CREATE VIEW, синтаксис которого имеет следующий вид:

CREATE VIEW <имя представления> AS
<извлекающий запрос>

📌 Запрос, который используется в представлении, может быть изменен. Для этого используется оператор ALTER VIEW, синтаксис которого имеет следующий вид:

ALTER VIEW <имя представления> AS
<новый извлекающий запрос>

📌 Представление может быть удалено. Для этого используется оператор DROP VIEW, синтаксис которого имеет следующий вид:

DROP VIEW <имя представления>

☝️☝️☝️☝️ Подробно о представлениях рассказываем в курсе "Базы данных и SQL". Купить курс можно на нашем официальном сайте по ссылке.

Ставьте реакцию:

🔥 — если знали о представлениях в SQL
👀 — если слышите о них впервые

#поколениеpython #базыданных #sql
Please open Telegram to view this post
VIEW IN TELEGRAM
4👀69🔥45❤15332👍1👏1😁1🆒1
Друзья, сегодня поговорим о подзапросах в SQL. 😎

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

📌 Подзапрос — это запрос, вложенный в другой запрос. Он заключен в круглые скобки и обычно выполняется перед основным запросом. Подзапросы являются обычными запросами, и для них не предусмотрен какой-либо отдельный синтаксис, поэтому для составления подзапросов достаточно уметь составлять обычные запросы.

📎 Предположим, что наша база данных содержит таблицу Books, включающую информацию о названиях книг, их авторах и ценах. Агрегатные функции нельзя использовать для фильтрации записей, поэтому если мы захотим извлечь данные о книгах, чья стоимость превышает среднюю стоимость всех книг, то сделать это с помощью следующего запроса не сможем:

SELECT * 
FROM Books
WHERE price > AVG(price);


поскольку его результатом является ошибка:

ERROR 1111: Invalid use of group function


Для решения данной задачи мы можем воспользоваться подзапросом, чтобы сперва вычислить среднюю стоимость книг, а затем выполнить сравнение с полученным значением:

SELECT * 
FROM Books
WHERE price > (SELECT AVG(price)
FROM Books);


Здесь в условии фильтрации значение поля price сравнивается с результатом подзапроса. Подзапрос обращается к таблице Books и вычисляет среднее арифметическое всех значений ее поля price. Таблица, получаемая в результате подзапроса, состоит из одной записи и одного поля, то есть содержит единственное значение, с которым и происходит последующее сравнение значения поля price.

☝️☝️☝️☝️ Сравнение значения поля price с таблицей возможно именно по той причине, что эта таблица содержит лишь одно значение, и СУБД использует это значение для выполнения операции сравнения. Если бы таблица содержала более одного значения, такая операция была бы невозможна.

⏰⏰⏰⏰⏰⏰⏰ Подробнее рассказываем о подзапросах в нашем курсе "Базы данных и SQL". Его можно купить на нашем сайте pygen.ru.

Ставьте реакцию:

🔥 — если знаете о подзапросах
👀 — если узнали о них впервые

#sql #подзапросы #поколениеpython
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥60👀38❤15🙊432👍1🎄11
Друзья, сегодня поговорим про обобщенные табличные выражения. 😉

📌 Обобщенное табличное выражение (или CTE, Common Table Expressions) — это временная таблица, к которой можно обращаться в рамках одного запроса. Для простоты CTE можно считать именованным подзапросом, который определен отдельно от основного запроса. Использование CTE позволяет писать сложные запросы в более читаемой форме, разбивая их на небольшие логические шаги.

Для написания запросов с использованием CTE предназначен оператор WITH со следующим синтаксисом:

WITH <имя CTE> AS (
<извлекающий запрос, определяющий содержимое CTE>
)

<основной запрос, который может обращаться к CTE>


Как видно из шаблона выше, чтобы воспользоваться CTE, ему необходимо дать имя, по которому к нему можно будет обращаться, а затем определить его содержимое. Обратите внимание: определение CTE не отделяется от основного запроса точкой с запятой, поскольку вся конструкция (определение CTE и основной запрос) воспринимается как одно целое.

😎 CTE часто используют для создания подзапросов, которые используются в рамках основного запроса несколько раз, чтобы избежать повторного написания одних и тех же подзапросов.

⚠️ После оператора WITH допустимо определить несколько CTE. Для этого достаточно перечислить их определения через запятую. Если блок WITH включает определение нескольких CTE, то их создание выполняется последовательно: сначала первое, затем второе, и так далее. Таким образом, во время определения очередного CTE все определенные ранее CTE уже являются созданными, поэтому каждое следующее определенное CTE может ссылаться на любое предыдущее.

☝️☝️☝️☝️ CTE является обычной таблицей, поэтому с ней допустимо выполнять любые необходимые операции: извлекать данные, фильтровать и сортировать, объединять с другими таблицами, представлениями или CTE.

⏰⏰⏰⏰⏰⏰⏰ Подробнее рассказываем о CTE в курсе "Базы данных и SQL". Его можно купить на нашем сайте pygen.ru.

Ставьте реакцию:

🔥 — если умеете использовать CTE
👀 — если еще не применяли CTE на практике

#CTE #sql #поколениеpython
Please open Telegram to view this post
VIEW IN TELEGRAM
1👀82🔥5410❤5👍221
Друзья, сегодня поговорим о текстовых функция в SQL. 🖥

Как и большинство языков программирования, SQL имеет множество встроенных функций, которые позволяют выполнять различные манипуляции с данными.

✅ Одними из самых важных являются текстовые функции, так как таблицы баз данных зачастую содержат немало текстовой информации.

К текстовым функциям относятся:

⏺CHAR_LENGTH() — для вычисления длины строки
⏺LOWER() — для перевода строки в нижний регистр
⏺UPPER() — для перевода строки в верхний регистр
⏺LTRIM() — для отсечения ведущих пробелов
⏺RTRIM() — для отсечения пробелов справа
⏺REVERSE() — для переворота строки
⏺REPEAT() — для повторения строки
⏺LPAD() — для увеличения длины строки до определенного значения путем добавления в ее начало другой строки
⏺RPAD() — для увеличения длины строки до определенного значения путем добавления в ее конец другой строки
⏺LEFT() — для извлечения определенного количества символов из начала строки
⏺RIGHT() — для извлечения определенного количества символов из конца строки
⏺LOCATE() — для определения местоположения подстроки в строке
⏺REPLACE() — для замены подстроки в строке
⏺SUBSTRING() — для извлечения подстроки из строки
⏺SUBSTRING_INDEX() — для извлечения подстроки из строки с помощью разделителя
⏺TRIM() — для удаления всех вхождений подстроки из начала и/или конца строки

🩵 Функции могут применяться как в блоке оператора SELECT, так и в блоках операторов WHERE и ORDER BY.

🩵 Все текстовые функции при вызове с аргументом NULL возвращают значение NULL.

🩵 Почитать подробнее о текстовых функциях можно по ссылке.

Ставьте реакцию:

🔥 — если знали все перечисленные текстовые функции
👀 — если некоторые увидели впервые

#SQL #полезныйматериал #поколениеpython
Please open Telegram to view this post
VIEW IN TELEGRAM
25👀97🔥36❤14👍11✍222🆒1💘11
Друзья, в одном из предыдущих постов мы рассмотрели текстовые функции SQL, которые позволяют обрабатывать текстовые данные. 📖

🔢 В этом посте расскажем про числовые функции, которые позволяют выполнять различные операции с числами.

К числовым функциям относятся:

⏺ ABS() — для вычисления модуля числа
⏺ ROUND() — для округления числа
⏺POW() — для возведения числа в определенную степень
⏺SQRT() — для вычисления квадратного корня
⏺RAND() — для генерации случайных чисел.
⏺DEGREES() — для перевода значения из радиан в градусы
⏺RADIANS() — для перевода значения из градусов в радианы
⏺PI() — для получения числа пи
⏺SIN(), COS() и TAN() — для вычисления синуса, косинуса и тангенса соответственно
⏺LEAST() — для поиска минимального значения
⏺GREATEST() — для поиска максимального значения
⏺CONV() — для перевода числа из одной системы счисления в другую
⏺FORMAT() — для округления и форматирования числа

💡 Кроме того, в SQL существуют операторы DIV и MOD, которые позволяют выполнять операции целочисленного деления и деления с остатком над числами. Операцию деления с остатком можно также выполнять с помощью оператора % и одноименной функции MOD().

🩵 Почитать подробнее о текстовых функциях можно по ссылке.

⏰⏰⏰⏰⏰⏰⏰ О текстовых и числовых функциях рассказываем в курсе "Базы данных и SQL". Его можно купить на нашем сайте pygen.ru. Промокод HAPPYBD33 дает скидку 33%.

Ставьте реакцию:

🔥 — если знали все перечисленные числовые функции
👀 — если некоторые увидели впервые

#SQL #полезныйматериал #поколениеpython
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥44👀34⚡10❤7👍55❤‍🔥1🆒111
Друзья, сегодня поговорим о функциях даты и времени в SQL. 🖥

🗓 С помощью функций даты и времени можно получить текущую дату или время, выполнять арифметические операции с датой и временем, извлекать интересующую информацию и многое другое.

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

👀 К функциям даты и времени относятся:

1️⃣ NOW(), CURDATE() и CURTIME() используются для получения текущей даты и времени в локальном часовом поясе
2️⃣ UTC_TIMESTAMP(), UTC_DATE() и UTC_TIME() используются для получения текущей даты и времени в UTC, то есть нулевом часовом поясе.
3️⃣ MAKEDATE() и MAKETIME() используются для создания даты и времени.
4️⃣ DATE() и TIME() используются для получения даты и времени из даты и времени
5️⃣ HOUR(), MINUTE(), SECOND() и MICROSECOND() используются для определения количества часов, минут, секунд и микросекунд во времени
6️⃣ YEAR(), MONTH() и DAY() используются для извлечения значения года, месяца и дня из даты
7️⃣ DAYOFYEAR(), WEEK() и WEEKDAY() используются для вычисления номера дня в году, номера недели в году и номера дня недели
8️⃣ DAYNAME() и MONTHNAME() используются для вычисления названия дня недели и названия месяца на основе даты
9️⃣ ADDDATE() и SUBDATE() используются для прибавления и вычитания временного интервала из даты и времени
1️⃣0️⃣ ADDTIME() и SUBTIME() используются для прибавления и вычитания временного значения из даты и времени
1️⃣1️⃣ DATEDIFF() используется для вычисления разницы в днях между двумя значениями даты и времени
1️⃣2️⃣ TIMEDIFF() используется для вычисления разницы во времени между двумя значениями даты и времени
1️⃣3️⃣ TIMESTAMPDIFF() используется для вычисления разницы между двумя значениями даты и времени в определенных единицах измерения
1️⃣4️⃣ TIMESTAMP() используется для объединения даты и временного значения
1️⃣5️⃣ DATEFORMAT() и TIMEFORMAT() используются для форматирования даты и времени

Почитать подробнее о функциях для работы с датой и временем можно по ссылке.

⏰⏰⏰⏰⏰⏰⏰ О функциях для работы с датой временем мы рассказываем в курсе "Базы данных и SQL". Его можно купить на нашем сайте pygen.ru.

Ставьте реакцию:

🔥 — если знали все перечисленные функции
👀 — если некоторые увидели впервые

#функциидатыивремени #sql #поколениеpython
Please open Telegram to view this post
VIEW IN TELEGRAM
👀74🔥28❤9💔4222
Друзья, сегодня расскажем про триггеры в SQL. 😉

✏️ Триггер — это запрос, который автоматически выполняется во время применения операций INSERT, DELETE или UPDATE по отношению к определенной таблице. Например, триггер, ассоциированный с оператором DELETE по отношению к условной таблице Table, будет выполняться всякий раз, когда из этой таблицы будут удаляться записи.

💡 Общий шаблон для создания триггера имеет следующий вид:
DELIMITER //
CREATE TRIGGER <имя триггера>
<время срабатывания триггера> <операция, которая вызывает триггер>
ON <имя таблицы>
FOR EACH ROW
BEGIN
<тело триггера>;
END //
DELIMITER ;


⚠️ Операция, вызывающая триггер, всегда связана с какой-либо записью таблицы, и триггер имеет доступ к значениям этой записи.

Уровень доступа определяется типом триггера:

🟡BEFORE INSERT
🟣AFTER INSERT
🟡BEFORE UPDATE
🟣AFTER UPDATE
🟡BEFORE DELETE
🟣AFTER DELETE

Триггеры применяются для самых разных задач, например:

📌 автоматическое преобразование добавляемых в таблицу данных в нужный формат, чтобы обеспечить непротиворечивость данных
📌 выполнение действий по отношению к одной таблице на основе изменений, которые были сделаны в другой таблице, что может быть полезно для ведения журнала событий

⏰⏰⏰⏰⏰⏰⏰ Подробнее о триггерах мы рассказываем в курсе "Базы данных и SQL". Его можно купить на нашем сайте pygen.ru.

Ставьте реакцию:

🔥 — если знали все о триггерах в SQL
👀 — если знаете только триггеры в реальной жизни

#триггеры #sql #поколениеpython
Please open Telegram to view this post
VIEW IN TELEGRAM
👀66🔥32❤54👍333
Друзья, не так давно мы рассказывали про подзапросы в SQL. Сегодня поговорим об их разновидностях, а именно о коррелированных и некоррелированных подзапросах. 😎

🚨 Некоррелированные подзапросы могут выполняться автономно от основного запроса. Перед тем как их результат будет использоваться в основном запросе, можно посмотреть, что они возвращают.

👀 Предположим, что наша база данных содержит таблицу Books, включающую информацию о названиях книг, их авторах и оценках критиков. В качестве примера использования некоррелированного подзапроса напишем запрос, извлекающий данные о книгах с минимальной оценкой критиков:

SELECT title, critic_score 
FROM Books
WHERE critic_score = (SELECT MIN(critic_score)
FROM Books);


Здесь подзапрос используется для вычисления наименьшего значения поля critic_score, то есть для определения минимальной оценки критиков. СУБД запоминает это значение и в дальнейшем просто использует его.

Таким образом, обработка запроса, содержащего некоррелированный подзапрос, происходит в два этапа:

1️⃣ выполняется подзапрос, определяется его результат
2️⃣ полностью выполняется основной запрос с использованием результата подзапроса

🚨 Коррелированные подзапросы используются в том случае, когда для каждой записи таблицы, анализируемой основным запросом, подзапрос должен вернуть результат, зависящий от значений в этой записи.

👀 В качестве примера использования коррелированного подзапроса напишем запрос, извлекающий данные о книгах, оценка критиков которых больше, чем у предыдущей книги в таблице, то есть у книги с идентификатором на один меньше:

SELECT title, user_score
FROM Books
WHERE critic_score > (SELECT critic_score
FROM Books AS InnerBooks
WHERE id = Books.id - 1);


Здесь подзапрос используется для вычисления оценки критика, у которого идентификатор на единицу меньше, чем у критика в текущей записи таблицы. СУБД выполняет такой подзапрос для каждой записи таблицы отдельно и возвращает результат, полученный на основе ее значений.

⏰⏰⏰⏰⏰⏰⏰ Подробнее рассказываем о подзапросах в нашем курсе "Базы данных и SQL". Его можно купить на нашем сайте pygen.ru.

Ставьте реакцию:

🔥 — если знали о разновидностях подзапросов
👀 — если узнали о них впервые

#sql #подзапросы #поколениеpython
Please open Telegram to view this post
VIEW IN TELEGRAM
👀52🔥24❤7👍2🗿2211
Друзья, ранее мы рассказывали про обобщенные табличные выражения (CTE). Сегодня расскажем про одну из их разновидностей. 🖥

📌 Рекурсивное CTE — это CTE, содержимое которого последовательно формируется на основе самого себя. Тело рекурсивного CTE, в отличие от обычного CTE, включает два извлекающих запроса:

🟣первый (нерекурсивный) — для однозначного определения содержимого первой записи CTE
🟣второй (рекурсивный) — для определения правила формирования всех остальных записей

📎 Содержимое каждой записи рекурсивного CTE, кроме первой, зависит только от содержимого предыдущей записи. Так, содержимое второй записи определяется на основе первой записи, содержимое третьей — на основе второй и так далее.

👀 Например, если первая запись CTE включает число 1, а правило, определяющее оставшиеся записи CTE, имеет вид <значение предыдущей записи> + 1, то вторая запись будет включать число 2, третья — 3 и так далее.

Синтаксис создания рекурсивного CTE практически повторяет синтаксис создания обычного CTE и имеет следующий вид:

WITH RECURSIVE <имя CTE> AS (
<извлекающий запрос, определяющий первую запись CTE>
<пара ключевых слов UNION ALL или UNION DISTINCT>
<извлекающий запрос, определяющий правило формирования очередной записи CTE (второй, третьей и так далее)>
)

<основной запрос, который может обращаться к рекурсивному CTE>


Как видно из шаблона, для создания рекурсивного CTE перед его именем необходимо указать ключевое слово RECURSIVE, а затем предоставить два извлекающих запроса, связав их парой ключевых слов:

🟣UNION ALL — при этом CTE будет включать повторяющиеся записи, если они возникнут при формировании
🟣UNION DISTINCT — при этом все повторяющиеся записи будут удалены

⏰⏰⏰⏰⏰⏰⏰ Подробнее рассказываем про обобщенные табличные выражения в нашем курсе "Базы данных и SQL". Его можно купить на нашем сайте pygen.ru.

Ставьте реакцию:

🔥 — если знали о существовании рекурсивных СТЕ
👀 — если узнали о них впервые

#sql #СТЕ #поколениеpython
Please open Telegram to view this post
VIEW IN TELEGRAM
👀69🔥32❤9211
Друзья, сегодня рассказываем про оконные функции в SQL. 😎

🪟 Оконная функция — это функция, которая выполняет вычисления на основе определенного набора записей и возвращает одиночное значение. Набор записей, с которым работает оконная функция, называют окном.

✏️ Определение окна выполняется с помощью оператора WINDOW, синтаксис использования которого имеет следующий вид:

WINDOW <название окна> AS (<спецификация окна>)

Спецификация окна, заключаемая в круглые скобки, может включать три базовых элемента:

⏩ секционирование (разбиение на секции)
⏩ упорядочивание
⏩ определение границ окна

Предположим, что у нас есть таблица с именем Employees, которая содержит информацию о сотрудниках некоторой компании и имеет следующие поля:

❤️id (идентификатор сотрудника)
❤️fullname (имя и фамилия сотрудника)
❤️department (отдел, в котором работает сотрудник)
❤️salary (заработная плата).

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

WINDOW all_rows AS (PARTITION BY department ORDER BY salary)

Таким образом, запрос, решающий эту задачу, может выглядеть так:
SELECT full_name, 
ROW_NUMBER() OVER all_rows AS row_num
FROM Employees
WINDOW all_rows AS (PARTITION BY department ORDER BY salary);


Оператор PARTITION BY разбивает окно на секции подобно тому, как это делает оператор GROUP BY. Оператор ORDER BY сортирует данные в рамках каждой секции, а затем функция ROW_NUMBER() в каждой секции устанавливает номера по порядку, начиная с 1.

💡 Определить окно можно без использования оператора WINDOW. Для этого достаточно предоставить спецификацию окна, заключенную в круглые скобки, сразу после ключевого слова OVER:
SELECT full_name, 
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary) AS row_num
FROM Employees;


☝️☝️☝️☝️ Более подробно про оконные функции мы рассказываем в курсе по SQL, который доступен к покупке на нашем официальном сайте.

Ставьте реакцию:

🔥 — если знакомы с оконными функциями в SQL
👀 — если знаете только об окнах в домах и в Windows

#sql #поколениеpython #оконныефункции
Please open Telegram to view this post
VIEW IN TELEGRAM
👀78🔥58❤8644❤‍🔥1🤩1💘1
Друзья, ранее мы говорили об оконных функциях в SQL. Сегодня хотим рассказать о наиболее часто используемых оконных функциях. 😉

1️⃣ ROW_NUMBER() вычисляет порядковый номер записи в рамках указанного окна (начиная с 1)
2️⃣ DENSE_RANK() вычисляет ранг записи в рамках указанного окна без пропусков
3️⃣ RANK() вычисляет ранг записи в рамках указанного окна с пропусками
4️⃣ NTILE() используется для разбиения окна на заданное количество групп
5️⃣ FIRST_VALUE() используется для получения значения, которое содержится в определенном поле первой записи окна
6️⃣ LAST_VALUE() используется для получения значения, которое содержится в определенном поле последней записи окна
7️⃣ NTH_VALUE() используется для получения значения, которое содержится в определенном поле n-й записи окна (начиная с 1)
8️⃣ LAG() используется для получения значения, которое содержится в определенном поле записи окна, отстающей от текущей на n
9️⃣ LEAD() используется для получения значения, которое содержится в определенном поле записи окна, опережающей текущую на n``

🚨 Также в качестве оконных функций могут использоваться агрегатные функции AVG(), COUNT(), MIN(), MAX() и SUM().

⏰⏰⏰⏰⏰⏰⏰ Подробнее рассказываем об оконных функциях в курсе "Базы данных и SQL". Его можно купить на нашем сайте pygen.ru.

Ставьте реакцию:

🔥 — если знали все перечисленные функции
👀 — если о некоторых узнали впервые

#sql #оконныефункции #поколениеpython
Please open Telegram to view this post
VIEW IN TELEGRAM
👀65🔥34❤1175😁2❤‍🔥1🙉1
Друзья, помните наши посты про оконные функции в SQL: первый и второй? Они уже успели стать прошлогодними, так что мы принесли новый!

📌 Сегодня поговорим про важную часть оконных функций — границы окна. Именно они определяют, с какими строками будет работать функция.

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

Определить границы окна можно двумя способами.

1️⃣ Оператор ROWS — когда важен порядок строк. Считает строки по позициям. Синтаксис:

ROWS BETWEEN <начальная граничная точка> AND <конечная граничная точка>


Примеры:

🔵ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING — предыдущая, текущая и следующая строки
🔵ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW — от первой записи окна до текущей строки включительно
🔵ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING — следующая и следующая после нее записи

2️⃣ Оператор RANGE — когда важны значения. Ориентируется не на номер строки, а на значения поля сортировки. Синтаксис:

RANGE BETWEEN <начало> AND <конец>


Примеры:

🟢RANGE BETWEEN 2000 PRECEDING AND 2000 FOLLOWING — все записи, у которых значение отличается от текущего не более чем на 2000 в большую или меньшую сторону
🟢RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW — начальной границей являются все записи с минимальным или максимальным значением в окне (в зависимости от направления сортировки), а конечной — все записи, значения которых равны значению текущей записи

⚠️ Некоторые функции, например, LAG() и LEAD(), игнорируют границы и работают со всем окном.

Ставьте реакцию:

🔥 — если уверенно работаете с оконными функциями
❤️ — если знали, но не использовали их на практике
👀 — если узнали о них из наших постов

#sql
Please open Telegram to view this post
VIEW IN TELEGRAM
👀68❤37🔥2588❤‍🔥2⚡1👍1🍾1
Друзья, давненько не было постов про SQL. Исправляемся! 😁

⭐️ В этом посте мы рассказали про текстовые функции. К ним относится функция CHAR_LENGTH(), которая вычисляет длину строки. В MySQL есть похожая функция — LENGTH(), которая делает то же самое.

Результатом приведенного ниже запроса:
SELECT CHAR_LENGTH('Beegeek') AS result1,
LENGTH('Beegeek') AS result2;


является:
+---------+---------+
| result1 | result2 |
+---------+---------+
| 7 | 7 |
+---------+---------+


👀 Разница в способе вычисления длины строки:

🔘 функция CHAR_LENGTH() считает количество символов строки
🔘 функция LENGTH() считает количество байтов строки

⚠️ Если строка кроме ASCII-символов будет включать и другие символы (например, смайлики, которые состоят из нескольких байтов), то функции вернут разный результат.

Результатом приведенного ниже запроса:
SELECT CHAR_LENGTH('Beegeek 🐝') AS result1,
LENGTH('Beegeek 🐝') AS result2;


является:
+---------+---------+
| result1 | result2 |
+---------+---------+
| 9 | 12 |
+---------+---------+


Ставьте реакцию:

🔥 — если знали обе функции
👀 — если разобрались с ними только сейчас

#sql
Please open Telegram to view this post
VIEW IN TELEGRAM
👀193🔥2720❤5👾4🆒3⚡2👍2💋2🎄1
Друзья, сегодня хотим рассказать про оператор FILTER, который используется в SQL-запросах. 👌

📌 В SQL есть оператор WHERE, который используется для фильтрации записей. Оператор FILTER также используется для фильтрации записей, но не в рамках всего запроса, а для отдельных извлекаемых значений.

👀 Возьмем таблицу Orders, хранящую информацию о заказах. Нам нужно узнать, сколько всего есть заказов, в которых количество товара меньше либо равно 10, а также количество заказов, в которых количество товара больше 10.

Для решения этой задачи можно использовать агрегатную функцию COUNT(). Но у нас есть два противоречивых условия, которые мы не можем указать в условии фильтрации оператора WHERE одновременно и получить однозначный ответ.

💡 Здесь и пригодится оператор FILTER — он указывается сразу после агрегатной функции, а за ним в скобках указывается оператор WHERE и условие фильтрации:

SELECT COUNT(*) FILTER (WHERE amount <= 10) AS count_le_10,
COUNT(*) FILTER (WHERE amount > 10) AS count_gt_10
FROM Orders;


В примере выше в поле count_le_10 будут отфильтрованы и посчитаны только те заказы, в которых количество товара меньше либо равно 10, а в поле count_gt_10 — количество заказов, в которых количество товара больше 10.

😒 Оператор FILTER поддерживается не всеми СУБД, например, в MySQL он отсутствует.

Ставьте реакцию:

🔥 — если сталкивались с оператором FILTER
👀 — если узнали о нем впервые

#sql
Please open Telegram to view this post
VIEW IN TELEGRAM
👀139🔥44❤72⚡1👨‍💻1👾11
Друзья, привет! 👩‍❤️‍👨

😎 Мы — команда «Поколения Python», авторы курсов по программированию на платформе Stepik. В нашей линейке не только Python, но и курсы по алгоритмам и SQL.

В этом канале мы собираем сообщество людей, которые учатся программировать: мотивируем друг друга, делимся полезными материалами и объясняем сложные темы простым языком. Мы считаем, что учиться вместе продуктивнее и интереснее!

Рубрики канала:

🖥 #python #полезныйматериал — все про Python: особенности, фишки, библиотеки
🗓 #словонедели — объясняем термины простым языком
❓#ответнавопрос — автор курсов Тимур Гуев отвечает на вопросы наших студентов
🧠 #задача и #разборзадачи — тренируем логическое мышление
✅ #тесты — короткие вопросы на знание программирования с вариантами ответа
📈 #курспоалгоритмам — все об алгоритмах и структурах данных
🖥 #sql — все об SQL и базах данных
🌎 #япознаюмир — познавательные посты о технологиях и обучении
🎤#интервью — большие видео, где мы общаемся с начинающими и опытными разработчиками
🤯 #сложнонепонятно — рубрика, в которой разбираем самые сложные задачи из наших курсов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤41👍11❤‍🔥1053✍2🔥2👀2🥰1🤩1🙉1
Друзья, хорошие новости! В курсе «Поколение Python: базы данных и SQL» появился новый модуль, посвященный транзакциям в SQL. 😍

Темы модуля «Транзакции»:
 
💚проблемы конкурентного доступа и целостности данных
💚транзакционные требования ACID
💚уровни изоляции баз данных
💚способы создания и настройки транзакций
💚точки сохранения транзакций
💚примеры параллельного выполнения транзакций
💚транзакции в хранимых процедурах
💚использование обработчика исключений в транзакциях

✔️ В модуле 42 тестовые задачи и 5 задач на написание SQL-запросов. После того, как решите их все, у вас точно не останется вопросов о транзакциях!
 
Ставьте реакцию:

🔥 — если уже знакомы с транзакциями
👀 — если впервые слышите этот термин

#sql
Please open Telegram to view this post
VIEW IN TELEGRAM
17👀105🔥86❤‍🔥17❤6🤩5🎉4✍3👍1
Друзья, разбираем новое слово недели! 😍

📌 Денормализация — это намеренное дублирование данных в базе данных ради повышения скорости работы системы.

👀 В обычной нормализованной базе данные стараются хранить без повторений. Например, информация о пользователях лежит в одной таблице, а заказы — в другой. Это уменьшает дублирование и делает структуру аккуратной.

⚠️ Минус такого подхода — для получения данных часто приходится делать сложные JOIN-запросы, которые могут работать медленно на больших объемах. Тогда используют денормализацию, то есть часть данных хранят в нескольких местах. Например:

🔘 имя пользователя — в таблице заказов
🔘 количество комментариев — в таблице постов
🔘 информацию о товаре — внутри записи заказа

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

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

Ставьте реакцию:

🔥 — если уже сталкивались с понятием денормализации
👀 — если узнали о нем впервые

#словонедели #sql
Please open Telegram to view this post
VIEW IN TELEGRAM
👀145🔥48❤74⚡2✍2❤‍🔥1👨‍💻11
Друзья, сегодня расскажем про Redis. 😤

📌 Redis (Remote Dictionary Server) — это нереляционная система управления базами данных (СУБД), работающая со структурами типа ключ — значение.

⚡️ Главная особенность Redis в том, что он хранит данные в оперативной памяти, благодаря чему обеспечивает очень быстрый доступ к ним.

Для чего обычно используют Redis:

⏺кэширование часто запрашиваемых данных
⏺хранение сессий пользователей
⏺обработка очередей задач
⏺временное хранение данных с быстрым доступом
⏺хранение счетчиков и статистики в реальном времени
⏺другие задачи, требующие высокой скорости работы с данными

⭐️ Redis позволяет разгрузить основную базу данных и ускорить работу приложения за счет хранения часто используемой информации в оперативной памяти.

Ставьте реакцию:

🔥 — если уже слышали про Redis
👀 — если узнали о нем впервые

#полезныйматериал #sql
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥118👀102❤7🤝3💋2✍1🆒1
Друзья, что-то давненько не вспоминали с вами об SQL и базах данных. 😉

📌 В одном из прошлых постов мы рассказывали про обобщенные табличные выражения. Сегодня хотим поговорить об оптимизации запросов с CTE.
 
При выполнении SQL-запросов, включающих CTE, СУБД может использовать одну из двух стратегий:

1⃣ MERGE — СУБД объединяет CTE с основным запросом и выполняет это CTE каждый раз при выполнении основного запроса.

2⃣MATERIALIZE — СУБД выполняет CTE один раз и временно сохраняет полученный результат в оперативной памяти. Такая оптимизация позволяет СУБД сразу обращаться к данным, полученным с помощью CTE, не выполняя соответствующий запрос многократно.

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

🟡 /*+ MERGE(<имя CTE>) */ — выбор стратегии MERGE
🟡 /*+ NO_MERGE(<имя CTE>) */ — выбор стратегии MATERIALIZE
 
В приведенном ниже запросе используется стратегия MERGE:
WITH CTE AS (…)
SELECT /*+ MERGE(<имя CTE>) */  *
FROM CTE;


В приведенном ниже запросе используется стратегия MATERIALIZE:
WITH CTE AS (…)
SELECT /*+ NO_MERGE(<имя CTE>) */  *
FROM CTE;


⚠️ Если комментарий будет указан не после оператора SELECT основного запроса, а где-либо в другом месте (в том числе после перечисления полей или между ними), соответствующая стратегия автоматически применяться не будет. В этом случае СУБД будет сама определять необходимую стратегию так же, как и в ситуации, если бы комментарий не был указан.

Ставьте реакцию:

🔥 — если знали о существовании этих стратегий
👀 — если узнали о них впервые

#sql #базыданных
Please open Telegram to view this post
VIEW IN TELEGRAM
👀76🔥168❤6👌1💘1