<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>@sqlize</title><generator>teletype.in</generator><description><![CDATA[Most interesting SQL snippets from SQLize.online with comments]]></description><image><url>https://img4.teletype.in/files/30/c0/30c03cf9-a82c-4ced-b38f-b6b1e0288c39.png</url><title>@sqlize</title><link>https://blog.sqlize.online/</link></image><link>https://blog.sqlize.online/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/sqlize?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/sqlize?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sun, 12 Apr 2026 07:30:21 GMT</pubDate><lastBuildDate>Sun, 12 Apr 2026 07:30:21 GMT</lastBuildDate><item><guid isPermaLink="true">https://blog.sqlize.online/sqlize-embed</guid><link>https://blog.sqlize.online/sqlize-embed?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize</link><comments>https://blog.sqlize.online/sqlize-embed?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize#comments</comments><dc:creator>sqlize</dc:creator><title>Оживите свой блог: Интерактивная песочница SQLize для любого сайта</title><pubDate>Tue, 20 Jan 2026 13:29:37 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/58/e6/58e68256-c4ff-43b0-aad1-09f9a2d5e2ee.png"></media:content><tt:hashtag>sql</tt:hashtag><tt:hashtag>database</tt:hashtag><tt:hashtag>webdev</tt:hashtag><tt:hashtag>обучение</tt:hashtag><tt:hashtag>программирование</tt:hashtag><tt:hashtag>mysql</tt:hashtag><tt:hashtag>postgresql</tt:hashtag><tt:hashtag>sqlize</tt:hashtag><description><![CDATA[<img src="https://img3.teletype.in/files/ad/33/ad339e88-bf1d-4f6d-8ba6-1ba7bc2231a9.png"></img>Если вы ведете технический блог, пишете документацию к базе данных или создаете обучающие курсы по SQL, вы наверняка сталкивались с одной и той же проблемой: статические примеры кода скучны.]]></description><content:encoded><![CDATA[
  <figure id="40CN" class="m_column">
    <img src="https://img3.teletype.in/files/ad/33/ad339e88-bf1d-4f6d-8ba6-1ba7bc2231a9.png" width="2222" />
  </figure>
  <p id="sjd8">Если вы ведете технический блог, пишете документацию к базе данных или создаете обучающие курсы по SQL, вы наверняка сталкивались с одной и той же проблемой: статические примеры кода скучны. </p>
  <p id="GCfS">Чтобы читатель мог проверить ваш запрос, ему нужно: скопировать код, запустить локальный сервер или тяжелую IDE, развернуть схему и только потом нажать «Выполнить». Большинство просто пролистает статью дальше.</p>
  <p id="YRQ3">Сегодня мы представляем решение — <strong>SQLize Embed</strong>. Это легкая и отзывчивая интерактивная песочница, которую можно вставить на любой сайт за пару минут.</p>
  <h2 id="q8Je">Что такое SQLize Embed?</h2>
  <p id="sm0k"><strong>SQLize Embed</strong> — это клиентская библиотека, которая превращает обычные блоки &#x60;&lt;div&gt;&#x60; в полноценные редакторы SQL. Ваши читатели смогут редактировать и запускать запросы к реальным базам данных прямо в браузере, не покидая страницу.</p>
  <h2 id="ABfu">Ключевые возможности</h2>
  <ul id="FH7j">
    <li id="ZotZ"><strong>Поддержка 20+ движков:</strong> От классики вроде <strong>MySQL 8.0/9.3</strong>, <strong>PostgreSQL (14-18)</strong> и <strong>SQLite 3</strong>, до корпоративных гигантов <strong>MS SQL Server (2017-2025)</strong> и <strong>Oracle 23ai</strong>.</li>
    <li id="TcLi"><strong>Готовые наборы данных:</strong> Демонстрируйте сложные &#x60;JOIN&#x60; или оконные функции на популярных базах: <strong>Sakila</strong>, <strong>OpenFlights</strong>, <strong>Bookings</strong> или <strong>AdventureWorks</strong>.</li>
    <li id="U8Ys"><strong>Профессиональный редактор:</strong> В основе лежит <strong>Ace Editor</strong>, обеспечивающий подсветку синтаксиса, автоотступы и привычный UX.</li>
    <li id="87mQ"><strong>Адаптивность:</strong> Песочница отлично работает как на десктопах, так и на мобильных устройствах.</li>
    <li id="bSyl"><strong>Режим «Только для чтения»:</strong> Идеально подходит для демонстрации примеров, которые можно запускать, но нельзя изменять.</li>
  </ul>
  <h2 id="8KD8">Как начать работу за 30 секунд</h2>
  <p id="zZE7">Интеграция SQLize Embed так же проста, как вставка видео с YouTube.</p>
  <h3 id="WNze">1. Подключите скрипт</h3>
  <p id="S7tY"><br />Добавьте этот тег перед закрывающим тегом &#x60;&lt;/body&gt;&#x60;:</p>
  <pre id="4Q89" data-lang="html">&lt;script src=&quot;https://sqlize.online/js/sqlize-embed.js&quot;&gt;&lt;/script&gt;</pre>
  <h3 id="p4Pz">2. Добавьте песочницу</h3>
  <p id="HL58"><br />Создайте элемент &#x60;div&#x60; с атрибутом &#x60;data-sqlize-editor&#x60;. Укажите версию СУБД и начальный код:</p>
  <pre id="zqO1" data-lang="html">&lt;div data-sqlize-editor data-sql-version=&quot;mysql80&quot; code-rows=&quot;10&quot;&gt;
-- Создаем таблицу
CREATE TABLE sqlize_fans (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(100)
);

-- Добавляем данные
INSERT INTO sqlize_fans (username) VALUES (&#x27;pro_coder&#x27;), (&#x27;sql_ninja&#x27;);

— Проверяем результат
SELECT * FROM sqlize_fans;
&lt;/div&gt;</pre>
  <h2 id="PPy9">Настройка под себя</h2>
  <p id="3Yvx">Вы можете управлять внешним видом и поведением редактора через HTML-атрибуты:</p>
  <ul id="78NT">
    <li id="slwd"><strong>data-sql-version</strong> - Версия БД (например, &#x60;psql17&#x60;, &#x60;mssql2025&#x60;, &#x60;clickhouse&#x60;)</li>
    <li id="eMMv"><strong>code-rows -</strong> Высота редактора в строках. По умолчанию: <strong>12.</strong></li>
    <li id="KUDi"><strong>result-rows -</strong> Высота блока с результатами. По умолчанию: <strong>12.</strong></li>
    <li id="tDGR"><strong>data-read-only -</strong> <code>true</code>, если нужно запретить редактирование кода. По умолчанию <code>false</code></li>
  </ul>
  <h2 id="qjNI">Использование и лицензирование</h2>
  <p id="NybV"><strong>SQLize Embed</strong> — это мощный инструмент для образовательных платформ и корпоративной документации. Мы предлагаем гибкую систему лицензирования на основе подписки для каждого домена (TLD). </p>
  <p id="0UVS">Если вы хотите получить лицензионный ключ или индивидуальное предложение под ваш объем трафика, пишите нам на <a href="mailto:support@sqlize.com" target="_blank">support@sqlize.com</a>.</p>
  <h2 id="otHt">Попробуйте в действии!</h2>
  <p id="eLXi">Посмотреть все возможности и живые примеры можно на странице документации: <br />👉 <a href="https://sqlize.online/embed-example" target="_blank">SQLize Embed Documentation &amp; Demo</a></p>
  <p id="ueie">👉 <a href="https://querynomic.one/#/resources/core" target="_blank">SQLize Embed Showcase</a></p>
  <p id="VA1y">---</p>
  <p id="hEwj">Делайте свои статьи интерактивными — дайте читателям возможность не просто читать код, а чувствовать его!</p>
  <tt-tags id="CIRa">
    <tt-tag name="sql">#sql</tt-tag>
    <tt-tag name="database">#database</tt-tag>
    <tt-tag name="webdev">#webdev</tt-tag>
    <tt-tag name="обучение">#обучение</tt-tag>
    <tt-tag name="программирование">#программирование</tt-tag>
    <tt-tag name="mysql">#mysql</tt-tag>
    <tt-tag name="postgresql">#postgresql</tt-tag>
    <tt-tag name="sqlize">#sqlize</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.sqlize.online/sqltest_online_mariadb</guid><link>https://blog.sqlize.online/sqltest_online_mariadb?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize</link><comments>https://blog.sqlize.online/sqltest_online_mariadb?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize#comments</comments><dc:creator>sqlize</dc:creator><title>✅ Итоги MariaDB Meetup в Тель-Авиве: Встреча, Видение и Сотрудничество</title><pubDate>Fri, 28 Nov 2025 17:29:29 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/6d/77/6d776524-b153-4eae-b335-cb4c93711b3b.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/76/bf/76bf8e9e-36c0-4eca-af65-a9f3c3204566.jpeg"></img>Вчера я посетил Meetup Meet &quot;Monty&quot; в Тель-Авиве. Это было очень важное для меня событие: не только возможность услышать ключевые доклады, но и впервые встретиться лично с людьми, с которыми долгое время общался виртуально. Программа была насыщенной и содержательной: * Михаэль «Монти» Видениус в своем выступлении твердо обозначил курс на победу open-source над проприетарными решениями и подтвердил свою позицию относительно миграции с Oracle на MariaDB. В своем выступлении Михаэль так же рассказал о технических аспектах миграции и последних наработках команды MariaDB улучшающих производительность сервера. Были представлены тесты подтверждающие рост производительности более чем в 2.5 по сравнению с предыдущей версией. Были представлены...]]></description><content:encoded><![CDATA[
  <figure id="ESix" class="m_column">
    <img src="https://img4.teletype.in/files/76/bf/76bf8e9e-36c0-4eca-af65-a9f3c3204566.jpeg" width="2252" />
    <figcaption>Я и Михаэль  Видениус</figcaption>
  </figure>
  <p id="3Tow">Вчера я посетил Meetup Meet &quot;Monty&quot; в Тель-Авиве. Это было очень важное для меня событие: не только возможность услышать ключевые доклады, но и впервые встретиться лично с людьми, с которыми долгое время общался виртуально.<br />Программа была насыщенной и содержательной:<br /> * Михаэль «Монти» Видениус в своем выступлении твердо обозначил курс на победу open-source над проприетарными решениями и подтвердил свою позицию относительно миграции с Oracle на MariaDB. В своем выступлении Михаэль так же рассказал о технических аспектах миграции и последних наработках команды MariaDB улучшающих производительность сервера. Были представлены тесты подтверждающие рост производительности более чем в 2.5 по сравнению с предыдущей версией. Были представлены новые команды SQL и режим совместимости с Oracle облегчающий процесс миграции.<br /> * Анна Видениус (MariaDB Foundation CEO) поделилась стратегическим обзором и видением будущего развития MariaDB.<br /> * Сергей Голубчик провел глубокий обзор поддержки векторного типа данных в последних версиях MariaDB и рассказал как это изменит подходы к работе с AI.<br />🤝 Продуктивная встреча и конкретные планы:<br />Особенно ценным стало мое личное общение с Михаэлем и Анной Видениус. Рад, что наша дискуссия привела к конкретным планам по развитию сотрудничества.<br />Мы договорились о следующем:<br /> * <a href="https://sqlize.online" target="_blank">sqlize.online</a> расширит свою поддержку, расширив поддержку MariaDB до трёх версий, включая MariaDB 11.8 и ее векторные возможности.<br /> * На <a href="https://sqltest.online" target="_blank">sqltest.online</a> мы запустим новый набор учебных заданий, нацеленных на практическое освоение последних функций MariaDB.</p>
  <p id="3o0n"><br />Это сотрудничество позволит нам ускорить процесс обучения и внедрения инноваций MariaDB. </p>
  <p id="P8YM">Благодарю всех организаторов и участников за такой вдохновляющий и продуктивный день.</p>
  <p id="Co92"><br />#MariaDB #OpenSource #TechMeetup #ТельАвив #ВекторнаяБД #AI #Сотрудничество #SQL #Образование<br /></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.sqlize.online/Oracle-26ai</guid><link>https://blog.sqlize.online/Oracle-26ai?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize</link><comments>https://blog.sqlize.online/Oracle-26ai?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize#comments</comments><dc:creator>sqlize</dc:creator><title>SQLize.online: Oracle 26ai уже в песочнице! Тестируйте новые функции без установки 🚀</title><pubDate>Thu, 16 Oct 2025 10:20:15 GMT</pubDate><description><![CDATA[<img src="https://img3.teletype.in/files/aa/3e/aa3e9254-9dd3-4b26-ac8f-09ac9322b74c.jpeg"></img>Мы рады объявить об очередном обновлении на платформе sqlize.online: наш онлайн-песочница теперь полностью поддерживает последнюю версию Oracle Database 26ai!]]></description><content:encoded><![CDATA[
  <figure id="Foon" class="m_original">
    <img src="https://img3.teletype.in/files/aa/3e/aa3e9254-9dd3-4b26-ac8f-09ac9322b74c.jpeg" width="310" />
  </figure>
  <p id="Ha9s">Мы рады объявить об очередном обновлении на платформе sqlize.online: наш онлайн-песочница теперь полностью поддерживает последнюю версию Oracle Database 26ai!</p>
  <p id="r2zz">Это обновление открывает для разработчиков и аналитиков доступ к передовым возможностям Oracle прямо в браузере, устраняя необходимость в сложной локальной установке и настройке.</p>
  <p id="rCIw">Главное нововведение: Тестирование функций Oracle 26ai<br />Поддержка новой версии 26ai — это не просто обновление номера. Это возможность мгновенно протестировать ключевые функции, которые значительно упрощают и ускоряют анализ данных:</p>
  <p id="67Sa">1. QUALIFY Clause (Клауза QUALIFY)<br />Теперь вы можете освоить использование команды QUALIFY, которая позволяет элегантно фильтровать результаты оконных функций (Window Functions).</p>
  <p id="3bpt">Проблема до: Чтобы отфильтровать результат оконной функции (например, найти топ-10 сотрудников в каждом отделе), вам приходилось использовать подзапрос или Common Table Expression (CTE).</p>
  <p id="zMsL">Решение с QUALIFY: Теперь вы можете применить фильтрацию сразу после вычисления оконной функции, что делает код чище, проще для чтения и более эффективным.</p>
  <p id="kZvB">2. Интеграция AI и ML (Vector Search)<br />Oracle 26ai активно развивает возможности работы с векторами и ИИ в базе данных. В нашей песочнице вы сможете экспериментировать с новым синтаксисом и структурами данных, которые поддерживают векторный поиск (Vector Search) и другие ИИ-операции, не отвлекаясь на установку сложных зависимостей.</p>
  <p id="Bb9Z">Готовы попробовать?</p>
  <p id="u6lK">Приглашаем всех разработчиков и аналитиков протестировать возможности Oracle Database 26ai в нашей бесплатной онлайн-песочнице:</p>
  <p id="YZaO">➡️ https://sqlize.online/</p>
  <p id="3E6o">Делитесь своими находками и впечатлениями в комментариях!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.sqlize.online/clickhouse</guid><link>https://blog.sqlize.online/clickhouse?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize</link><comments>https://blog.sqlize.online/clickhouse?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize#comments</comments><dc:creator>sqlize</dc:creator><title>Откройте потенциал ClickHouse: Новая песочница на sqltest.online</title><pubDate>Sun, 03 Aug 2025 12:36:50 GMT</pubDate><description><![CDATA[<img src="https://img3.teletype.in/files/6f/86/6f862a81-625d-4f67-8586-aac23241e5d7.jpeg"></img>Вы когда-нибудь хотели освоить мощь ClickHouse, но не хотели возиться с установкой и настройкой?]]></description><content:encoded><![CDATA[
  <figure id="e4Il" class="m_original">
    <img src="https://img3.teletype.in/files/6f/86/6f862a81-625d-4f67-8586-aac23241e5d7.jpeg" width="400" />
  </figure>
  <p id="RNTl">Вы когда-нибудь хотели освоить мощь ClickHouse, но не хотели возиться с установкой и настройкой?</p>
  <p id="7GNB">У нас отличные новости для всего аналитического сообщества! Мы с гордостью объявляем о запуске новой <strong>песочницы ClickHouse</strong> на <a href="https://sqlize.online/sql/clickhouse/e8e8545bceefcfe6fe9a33a348451c28/" target="_blank">sqlize.online</a>.</p>
  <p id="dtnq">Мы долгое время помогали разработчикам и аналитикам оттачивать свои навыки SQL на таких базах данных, как MySQL и PostgreSQL. Теперь мы переносим этот же практический опыт в мир самой быстрой в мире  колоночной СУБД.</p>
  <h4 id="EvGN"><strong>Что такое песочница ClickHouse?</strong></h4>
  <p id="aMwF">Наша новая песочница — это среда, где вы можете:</p>
  <ul id="OQOj">
    <li id="0K3u"><strong>Практиковать SQL для ClickHouse</strong> прямо в браузере.</li>
    <li id="zi3l"><strong>Решать реальные аналитические задачи</strong>, разработанные для проверки ваших навыков.</li>
    <li id="NCFL"><strong>Выполнять запросы на живом экземпляре ClickHouse</strong> без какой-либо настройки.</li>
    <li id="9c5t"><strong>Тестировать и улучшать свои запросы</strong> с мгновенной обратной связью.</li>
  </ul>
  <p id="12vU">Мы уверены, что лучший способ учиться — это делать. Наши новые задачи по ClickHouse помогут вам освоить мощные функции, агрегацию и техники оптимизации запросов, которые уникальны для этой невероятной базы данных.</p>
  <p id="dUXO">Независимо от того, являетесь ли вы инженером по данным, BI-разработчиком или студентом, готовящимся к собеседованию, эта новая песочница станет вашим незаменимым ресурсом для превращения теории в практический опыт.</p>
  <p id="Vm3d">Готовы погрузиться и раскрыть свой потенциал?</p>
  <p id="Hmv1"><strong>Заходите в раздел ClickHouse на <a href="https://sqlize.online/sql/clickhouse/e8e8545bceefcfe6fe9a33a348451c28/" target="_blank">sqlize.online</a> уже сегодня и начните свой путь к тому, чтобы стать экспертом по ClickHouse!</strong></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.sqlize.online/postgresql-16-17</guid><link>https://blog.sqlize.online/postgresql-16-17?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize</link><comments>https://blog.sqlize.online/postgresql-16-17?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize#comments</comments><dc:creator>sqlize</dc:creator><title>Масштабное обновление — встречайте PostgreSQL 16/17 и прощай, MySQL 5.7!</title><pubDate>Sat, 01 Feb 2025 19:05:10 GMT</pubDate><description><![CDATA[<img src="https://img4.teletype.in/files/f4/23/f4237d54-d7a0-4620-8002-472ee5e2552b.png"></img>Друзья, рады сообщить о крупном обновлении на sqlize.online! Мы постоянно работаем над улучшением платформы, чтобы вы могли получать самые актуальные знания и практиковаться с использованием новейших технологий. В этот раз изменения коснулись поддержки СУБД, и вот что вас ждёт:]]></description><content:encoded><![CDATA[
  <p id="7fGD">Друзья, рады сообщить о крупном обновлении на <a href="https://sqlize.online" target="_blank">sqlize.online</a>! Мы постоянно работаем над улучшением платформы, чтобы вы могли получать самые актуальные знания и практиковаться с использованием новейших технологий. В этот раз изменения коснулись поддержки СУБД, и вот что вас ждёт:</p>
  <h3 id="B0CD">Новые горизонты с PostgreSQL 16/17</h3>
  <p id="weUp">Мы добавили поддержку самых свежих версий PostgreSQL — 16 и 17! Теперь вы можете изучать и оттачивать навыки работы с этими передовыми СУБД, используя все их возможности и нововведения. PostgreSQL 16/17 — это мощные инструменты, которые широко используются в современной разработке, и мы уверены, что их поддержка на sqlize.online будет для вас очень полезной.</p>
  <h3 id="lFAq">Прощай, MySQL 5.7</h3>
  <p id="lifU">К сожалению, нам пришлось отказаться от поддержки MySQL 5.7. Это было непростое решение, но оно необходимо для оптимизации работы платформы и сосредоточения ресурсов на поддержке наиболее актуальных и востребованных версий СУБД. Мы понимаем, что для некоторых пользователей это может быть неудобством, но надеемся на ваше понимание.</p>
  <h3 id="Yp4d">Что это значит для вас?</h3>
  <ul id="N39b">
    <li id="QUGa"><strong>Актуальность знаний:</strong> Вы сможете изучать и практиковать SQL на самых современных версиях PostgreSQL, что сделает ваши навыки более востребованными на рынке труда.</li>
    <li id="tpO5"><strong>Производительность:</strong> Платформа будет работать ещё быстрее и стабильнее благодаря оптимизации и отказу от устаревшей версии MySQL.</li>
    <li id="J0e0"><strong>Новые возможности:</strong> Вы сможете использовать все преимущества PostgreSQL 16/17, включая новые функции, улучшения производительности и безопасности.</li>
  </ul>
  <h3 id="CKpY">Мы продолжаем развиваться</h3>
  <p id="O01Q">Это обновление — лишь один шаг на пути к постоянному улучшению sqlize.online. Мы прислушиваемся к вашим отзывам и предложениям, чтобы сделать платформу ещё более удобной и полезной для вас. В ближайшее время вас ждут новые интересные материалы, обновления и улучшения.</p>
  <h3 id="Oj5O">Оставайтесь с нами!</h3>
  <p id="hefJ">Подписывайтесь на наш блог, чтобы быть в курсе всех новостей и обновлений. Мы всегда рады видеть вас на sqlize.online!</p>
  <p id="Zyod"><strong>P.S.</strong> Не забудьте поделиться этой новостью с друзьями и коллегами, которым будет интересно изучать SQL на современных версиях PostgreSQL!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.sqlize.online/null-safe-operator</guid><link>https://blog.sqlize.online/null-safe-operator?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize</link><comments>https://blog.sqlize.online/null-safe-operator?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize#comments</comments><dc:creator>sqlize</dc:creator><title>NULL-safe сравнение в SQL или как избежать ловушек NULL при сравнении в SQL.</title><pubDate>Sat, 16 Nov 2024 12:54:45 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/b5/90/b590cf86-df1b-4f93-8567-6641def1fe6f.png"></media:content><category>SQL tricks</category><description><![CDATA[<img src="https://img1.teletype.in/files/05/0c/050c6a77-681c-4c1a-9eaf-89122475f3f0.jpeg"></img>Введение]]></description><content:encoded><![CDATA[
  <figure id="jo1w" class="m_column">
    <img src="https://img4.teletype.in/files/76/53/765365c2-90d7-49fa-b405-a63037c41e9c.jpeg" width="2048" />
  </figure>
  <p id="zVNg"><strong>Введение</strong></p>
  <p id="MDnR">Если вы имеете опыт написания запросов на языке SQL, то вы конечно должны знать об особенностях NULL значений. На всякий случай напомню: NULL в SQL обозначает отсутствие значения в ячейке таблицы. NULL может быть использован в ячейке любого типа, если это не запрещено ограничением NOT NULL наложенным на столбец.</p>
  <p id="hPSU"><strong>Особенности сравнения NULL</strong></p>
  <p id="6yTk">Важным моментом котрый должен знать любой разработчик SQL это то как ведет себя NULL в сравнении с любыми другими значениями. Так вот любое сравнение вида =, &gt;, &lt;, &lt;&gt;, !=, &lt;=, &gt;= с NULL вернёт NULL. <a href="https://sqlize.online/s/lS" target="_blank">Попробуйте сами </a></p>
  <pre id="Qjo7" data-lang="sql">SELECT 2 = NULL;     -- NULL
SELECT NULL &lt;&gt; 2;    -- NULL 
SELECT NULL &gt; 2;     -- NULL 
SELECT &#x27;a&#x27; &gt; NULL;   -- NULL
SELECT NULL = NULL;  -- NULL
SELECT NULL != NULL; -- NULL</pre>
  <p id="fkkv">На первый взгяд кажется странным, но если вспомнить что NULL это эквивалент значения &quot;неизвестно&quot; то всё встаёт на свои места! </p>
  <blockquote id="L9Bh">Число 2 равно неизвестному значению? - неизвестно может да, а может и нет.<br />Неизвестное значение больше двух? - да кто ж его знает!<br />Может обно неизвесное значение равно другому? - понятия не имею!</blockquote>
  <p id="z9Hm">Вот так могут выглядеть эти запросы в переводе на русский. </p>
  <p id="JiXY">В связи с этой неопределенностью  до недавнего времени SQL мог однозначно ответить только на два вопроса относительно NULL: знаем мы значение в ячейке или нет. </p>
  <p id="xqrz">Для этого были введены специальные операторы <code>IS NULL</code> и <code>IS NOT NULL</code> </p>
  <pre id="PtLA" data-lang="sql">SELECT 2 IS NULL;       -- False
SELECT &#x27;a&#x27; IS NOT NULL; -- True
SELECT NULL IS NULL;    -- True</pre>
  <p id="wuMx">Такое поведение создавало много трудностей в написании запросов. Например в таблице сотрудников компании <code>EMPLOYEES</code> есть колонка <code>DEPARTRMENT </code>с указанием подразделения в котором работает каждый из них. Представим нам нужно найти всех сотрудников отдела кадров (HR) Это довольно просто:</p>
  <pre id="FoiL" data-lang="sql">SELECT * FROM EMPLOYEES WHERE DEPARTMENT = &#x27;HR&#x27;;</pre>
  <p id="EQYK">А теперь обратная задача - выбрать всех КРОМЕ отдела кадров. Просто! - скажете вы и напишете так:</p>
  <pre id="lDhU" data-lang="sql">SELECT * FROM EMPLOYEES WHERE DEPARTMENT &lt;&gt; &#x27;HR&#x27;;</pre>
  <p id="KTIH">И.. потеряете запись о генеральном директоре, который не относится ни к одному из подразделений и значение DEPARTMENT в его строке - NULL! Так и до увольнения недалеко!</p>
  <p id="ah4d">Как избежать таких проблем? До недавних пор проходилось всегда учитывать возможность NULL значений при помощи дополнинетьных условий типа:</p>
  <pre id="H7NH" data-lang="sql">SELECT * FROM EMPLOYEES WHERE DEPARTMENT &lt;&gt; &#x27;HR&#x27; OR DEPARTMENT IS NULL;</pre>
  <p id="kzTq">Либо конвертировать NULL значения к значениям годным для сравнений:</p>
  <pre id="NDTH" data-lang="sql">SELECT * FROM EMPLOYEES WHERE COALESCE(DEPARTMENT, &#x27;&#x27;) &lt;&gt; &#x27;HR&#x27;;</pre>
  <p id="PB2R">Я не буду объяснять работу оператора <code>COALESCE </code>- найдёте и прочитаете сами. Но думаю вам понятно что возможность появления NULL добавляет некоторое количество головной боли разработчику. </p>
  <p id="O8SP"><strong>NULL-безопасное сравнение</strong></p>
  <p id="4rpY">Что же сделали разработчики PostgreSQL чтобы облегчить нам, простым SQL-писателям жизнь? Придумывают NULL SAFE оператор! Который позволяет безопасно производить сравнения не опасаясь что NULL значения испортят результат!</p>
  <p id="CCGE">Итак - оператор <code>IS DISTINCT</code> / <code>IS NOT DISTICT</code> позволяет решать задачу сравнения следующим запросом:</p>
  <pre id="j4SL" data-lang="sql">SELECT * FROM EMPLOYEES WHERE DEPARTMENT IS DISTINCT FROM &#x27;HR&#x27;;</pre>
  <p id="eVSZ">В переводе на русский это значит - Выбери все записи где отдел отличечтся от &#x27;HR&#x27;. На мой взгляд очень красивая конструкция достойная того чтобы знать её и применять.  К сожалению не все СУБД поддерживают такую конструкцию. Например MySQL и MariaDB в принципе имеют NULL SAFE сравнение, но используют другой синтаксис:</p>
  <pre id="INi4" data-lang="sql">SELECT * FROM EMPLOYEES WHERE DEPARTMENT &lt;=&gt; &#x27;HR&#x27;;</pre>
  <p id="PfxM">А остальные СУБД пока не ввели данный оператов в своих базах данных.</p>
  <p id="Lqlb"><strong>Заключение</strong></p>
  <p id="cvzg">NULL-безопасное сравнение - это мощный инструмент для работы с данными в SQL. Он позволяет избежать распространенных ошибок, связанных с NULL, и делает ваши запросы более надежными и эффективными. Используйте этот оператор по умолчанию для сравнения значений, и ваши SQL-запросы станут проще и понятнее.</p>
  <p id="A8s1"> <strong>P.S.</strong></p>
  <p id="uLt2"><strong>Изучение SQL – это непрерывный процесс.</strong> Понимание нюансов работы с NULL и использование таких операторов, как IS DISTINCT FROM, значительно улучшает качество ваших запросов и делает вас более уверенным пользователем SQL.</p>
  <p id="WcBe"><strong>Хотите углубить свои знания?</strong> Отличный ресурс для практики и обучения – <strong><a href="https://sqltest.online.ru" target="_blank">SQLtest.online</a></strong>. Этот онлайн-сервис предоставляет множество интерактивных заданий, которые помогут вам закрепить теорию и отработать навыки написания SQL-запросов.</p>
  <p id="ANDb"><strong>Продолжайте исследовать мир SQL!</strong> С каждым новым навыком вы будете открывать для себя все новые возможности для анализа и управления данными.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.sqlize.online/all-what-you-want-to-know-about-auto-increment</guid><link>https://blog.sqlize.online/all-what-you-want-to-know-about-auto-increment?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize</link><comments>https://blog.sqlize.online/all-what-you-want-to-know-about-auto-increment?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize#comments</comments><dc:creator>sqlize</dc:creator><title>Всё, что вы хотели знать об автоинкременте, но стеснялись спросить</title><pubDate>Thu, 18 Apr 2024 16:57:50 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/ff/b6/ffb655f5-7275-4529-b4c3-ffec3a8c045a.png"></media:content><category>Проектирование баз данных</category><description><![CDATA[<img src="https://img1.teletype.in/files/43/36/4336b744-90b4-4bc5-bb8f-77920989a075.jpeg"></img>]]></description><content:encoded><![CDATA[
  <p id="ssm7">Автоинкремент — это функция в базах данных SQL, которая автоматически генерирует уникальный номер для каждой новой строки в таблице.</p>
  <figure id="OERH" class="m_column">
    <img src="https://img1.teletype.in/files/43/36/4336b744-90b4-4bc5-bb8f-77920989a075.jpeg" width="2048" />
    <figcaption>Разработчик узнавший об автоинкременте</figcaption>
  </figure>
  <p id="vnPp">Автоинкремент — это функция в базах данных, которая автоматически генерирует уникальный номер для каждой новой строки, добавленной в таблицу.</p>
  <p id="IIX0">Как правило этот номер используется в качестве первичного ключа для уникальной идентификации каждой строки в таблице.</p>
  <p id="JnVB">При добавлении новой строки в таблицу, где одна из колонок сконфигурирована как автоинкремент, база данных автоматически присваивает каждому новому ряду в этой колонке следующий доступный номер, избавляя пользователя от необходимости вручную управлять значениями первичного ключа. Это упрощает процесс добавления новых строк и гарантирует, что каждая строка имеет уникальный идентификатор.</p>
  <p id="PYge">Если вы хотите попрактиковаться в создании таблиц с &quot;автоинкрементальными&quot; колонками и выполнении операторов SQL, вы можете попробовать использовать онлайн-редактор SQL, такой как <a href="https://sqlize.online/" target="_blank">SQLize.online</a>, который позволяет создавать таблицы, вставлять данные и выполнять SQL-запросы в действующей базе данных.</p>
  <h2 id="eoeC">Создание таблицы</h2>
  <p id="55oU">Ниже показано, как создать таблицу с колонкой - автоинкемкнтом в различных РСУБД.</p>
  <h3 id="H6sU"><strong>SQLite:</strong></h3>
  <pre id="pe3X" data-lang="sql">CREATE TABLE example_table ( 
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name VARCHAR(50), age INT 
);</pre>
  <p id="suXc">В этом примере столбец id определен как целочисленный тип данных с ключевым словом <code>AUTOINCREMENT</code>. Он также задан как первичный ключ таблицы (<code>PRIMARY KEY</code>).</p>
  <h3 id="g0d6"><strong>MySQL и MariaDB:</strong></h3>
  <pre id="e9vA" data-lang="sql">CREATE TABLE example_table (
   id INTEGER PRIMARY KEY AUTO_INCREMENT,
   name VARCHAR(50),
   age INT
);</pre>
  <p id="kaQW">В этом примере столбец id определен как столбец с автоматическим инкрементом с помощью ключевого слова <code>AUTO_INCREMENT</code>. Он также установлен в качестве первичного ключа таблицы.</p>
  <h3 id="3EM3"><strong>SQL Server:</strong></h3>
  <pre id="AHtJ" data-lang="sql">CREATE TABLE example_table (
   id INTEGER PRIMARY KEY IDENTITY(1, 1),
   name VARCHAR(50),
   age INT
);</pre>
  <p id="T9WD">В отличии от двух первых примеров, в SQL Server не используется термин <code>AUTO INCREMENT</code>, Вместо этого столбец id определен как столбец идентичности с помощью ключевого слова <code>IDENTITY</code>. Он также определён как первичный ключ таблицы. Параметры (1, 1) задают начальное значение и шаг автоинкремента.  В приведённом примере поле id будет получать значения начиная с 1 и каждый раз увеличиваться на 1 для каждой новой строки. (1, 2, 3, ...) Максимальное значение ограничивается размерностью типа <code>INTEGER</code>. Изменив параметры на IDENTITY(100, 10) мы можем начать нумерацию с 100 и каждый раз прибавлять 10 (100, 110, 120, 130…). Больше того, в качестве начала и шага можно использовать отрицательные числа. Попробуйте сами <a href="https://sqlize.online/s/1B" target="_blank">здесь</a>.</p>
  <h3 id="7b7m"><strong>Oracle:</strong></h3>
  <p id="GxZP">В этой базе данных всё немного сложнее. Здесь нет простого механизма автонумерации и приходится использовать более сложный механизм - последовательности.</p>
  <pre id="BAXA" data-lang="sql">CREATE SEQUENCE example_table_seq;

CREATE TABLE example_table (
   id INTEGER DEFAULT example_table_seq.nextval PRIMARY KEY,
   name VARCHAR2(50),
   age INT
);</pre>
  <p id="hvDv">В этом примере сначала создается последовательность (<code>SEQUENCE</code>) с помощью оператора <code>CREATE SEQUENCE</code>. Затем столбец <code>id</code> определяется как числовой тип данных <code>INTEGER</code> со значением по умолчанию, равным следующему значению последовательности. Он также задается в качестве первичного ключа таблицы. В приведенном примере (по умолчанию) будет создана последовательность с начальным значением 1 и шагом 1. Если нам нужен другой вариант последовательности мы можем указать параметры <code>INCREMENT BY</code> и <code>START WITH</code> при её создании:</p>
  <pre id="HcvO" data-lang="sql">CREATE SEQUENCE example_table_seq 
    INCREMENT BY 10
    START WITH 10;</pre>
  <h3 id="25TS">PostgreSQL:</h3>
  <p id="JFsP">Данная СУБД имеет несколько вариантов определения автоинкрементного столбца. Наиболее простым и популярным является ключевое слово <code>SERIAL</code> - которое является псевдонимом для колонки типа INTEGER с автоувеличением. Также в PostgreSQL допустимы варианты <code>SMALLSERIAL</code> и <code>BIGSERIAL</code> для типов <code>SMALLINT</code> и <code>BIGINT</code> соответственно</p>
  <pre id="Eyvv" data-lang="sql">CREATE TABLE example_table (
   id SERIAL PRIMARY KEY,
   name VARCHAR(50),
   age INT
);</pre>
  <p id="QBTc">В этом примере столбец id определен как последовательный тип данных, что эквивалентно столбцу с автоматическим инкрементом в других СУБД. Он также задан как первичный ключ таблицы</p>
  <p id="JDaH">Кроме того, для создания автоинкрементного столбца в PostgreSQL можно использовать как синтаксис <code>IDENTITY</code>, так и синтаксис <code>SEQUENCE</code>. </p>
  <p id="A9dC">Вот примеры создания автоинкрементного столбца с использованием такого синтаксиса  в PostgreSQL:</p>
  <pre id="R9X9" data-lang="sql">CREATE TABLE example_table (
   id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   name VARCHAR(50),
   age INT
);</pre>
  <pre id="VYqb" data-lang="sql">CREATE SEQUENCE example_table_seq;

CREATE TABLE example_table (
   id INT DEFAULT nextval(&#x27;example_table_seq&#x27;) PRIMARY KEY,
   name VARCHAR(50),
   age INT
);</pre>
  <p id="cCgU">Как и в примере с Oracle DB, вариант с <code>SEQUENCE</code> предлагает возможности гибкой конфигурации автоинкремента в отличии от <code>SERIAL</code></p>
  <h2 id="L3ud">Добавление данных</h2>
  <p id="TZjX">Чтобы вставить новую строку в таблицу с автоинкрементным столбцом, мы можем использовать оператор INSERT INTO, указав для всех столбцов, кроме автоинкрементного:</p>
  <pre id="7QcG" data-lang="sql">INSERT INTO example_table (name, age) VALUES (&#x27;John Smith&#x27;, 30);</pre>
  <p id="cnMH">Большинство диалектов SQL позволяет вставлять несколько строк в один запрос.</p>
  <pre id="mIIV" data-lang="sql">INSERT INTO example_table (name, age)
VALUES
  (&#x27;Джейн Доу&#x27;, 25),
  (&#x27;Боб Джонсон&#x27;, 40),
  (&#x27;Элис Браун&#x27;, 35);</pre>
  <p id="C7nv">Если сейчас сделать выборку из таблицы Мы увидим что столбец &#x60;id&#x60; был автоматически заполнен последовательными числами:</p>
  <pre id="hqEz" data-lang="markdown">+====+=============+=====+
| id | name        | age |
+====+=============+=====+
| 1  | Джейн Доу   | 25  |
| 2  | Боб Джонсон | 40  |
| 3  | Элис Браун  | 35  |
+----+-------------+-----+</pre>
  <p id="RmEY">SQLite, MySQL &amp; MariaDB позволяет вставлять произвольные значения в столбец с автоматическим увеличением и обновлять последовательность.</p>
  <pre id="yruO" data-lang="sql">INSERT INTO example_table (id, name, age) VALUES (11, &#x27;John Smith&#x27;, 30);
INSERT INTO example_table (name, age) VALUES  
        (&#x27;Jane Doe&#x27;, 25),  (&#x27;Bob Johnson&#x27;, 40),  (&#x27;Alice Brown&#x27;, 35);

SELECT * FROM example_table;</pre>
  <p id="eS5H">В приведенном выше примере мы вставляем &#x27;John Smith&#x27; с id = 11 и затем ещё три строки без указания значений <code>id</code>. Эти строки будут вставлены со следующими значениями последовательности 12, 13, 14 Проверьте это <a href="https://sqlize.online/s/vB" target="_blank">здесь</a>.</p>
  <pre id="tdPF" data-lang="markdown">+====+=============+=====+
| id | name        | age |
+====+=============+=====+
| 11 | John Smith  | 30  |
| 12 | Jane Doe    | 25  |
| 13 | Bob Johnson | 40  |
| 14 | Alice Brown | 35  |
+----+-------------+-----+</pre>
  <p id="Gass">MS SQL Server по умолчанию не допускает такого волюнтаризма и вернёт нам ошибку если мы попытаемся это сделать.</p>
  <pre id="kvsr" data-lang="sql">INSERT INTO example_table (id, name, age) VALUES (11, &#x27;John Smith&#x27;, 30);</pre>
  <blockquote id="5ecL">[SQL Server]Cannot insert explicit value for identity column in table &#x27;example_table&#x27; when IDENTITY_INSERT is set to OFF. </blockquote>
  <p id="Nsw9">Поэтому, если нам нужно вставить значение в столбец identity, мы должны включить параметр<code>IDENTITY_INSERT</code> в нашей таблице (и не забыть выключить его после вставки):</p>
  <pre id="C1Lk" data-lang="sql">SET IDENTITY_INSERT example_table ON
INSERT INTO example_table (id, name, age) VALUES (11, &#x27;John Smith&#x27;, 30)
SET IDENTITY_INSERT example_table OFF;</pre>
  <p id="1l8M">Приведенный выше запрос вставляет запись с id = 11 и перемещает вверх счетчик для вставки последующих записей.</p>
  <p id="3O2I">А как насчет Oracle? Эта DB позволяет вставлять значения в столбец id, без влияния на последовательности, поэтому мы можем вставлять строку с произвольным id, но это может привести к конфликту, как в следующем примере:</p>
  <pre id="y1rc" data-lang="sql">CREATE SEQUENCE example_table_seq;

CREATE TABLE example_table (
   id NUMBER DEFAULT example_table_seq.nextval PRIMARY KEY,
   name VARCHAR2(50),
   age NUMBER
);
--вставляем строку с id = 3
INSERT INTO example_table (id, name, age) VALUES (3, &#x27;John Smith&#x27;, 30);

-- следующие запросы вставят строки с id 1 и 2
INSERT INTO example_table (name, age) VALUES (&#x27;Jane Doe&#x27;, 25); -- 1
INSERT INTO example_table (name, age) VALUES (&#x27;Bob Johns&#x27;, 40); -- 2

-- здесь получаем ошибку OCIStmtExecute: 
-- ORA-00001: unique constraint (0c7690dacb6b.SYS_C009760) violated 
INSERT INTO example_table (name, age) VALUES (&#x27;Alice Brown&#x27;, 35); 

SELECT * FROM example_table;</pre>
  <p id="0rwx">PostgreSQL с синтаксисом <code>SERIAL</code> или <code>SEQUENCE</code> для столбца с автоматическим увеличением показывают нам такое же поведение, как и Oracle (строка вставлена, последовательность не обновлена, ошибка при дублировании). Но при использовании синтаксиса <code>IDENTITY</code> вставка строки с произвольным идентификатором не допускается. Это ограничение может быть обойдено переопределением системного значения, как в следующем примере, но опять же это не обновляет последовательность и может вызвать конфликт.</p>
  <pre id="pU42" data-lang="sql">CREATE TABLE example_table (
   id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   name VARCHAR(50),
   age INT
);
INSERT INTO example_table (id, name, age) OVERRIDING SYSTEM VALUE VALUES (3, &#x27;John Smith&#x27;, 30);
INSERT INTO example_table (name, age) VALUES (&#x27;Jane Doe&#x27;, 25);
INSERT INTO example_table (name, age) VALUES (&#x27;Bob Johnson&#x27;, 40);
INSERT INTO example_table (name, age) VALUES (&#x27;Alice Brown&#x27;, 35);

SELECT * FROM example_table;</pre>
  <p id="AwOs">Двигаемся дальше! </p>
  <h2 id="m9xk">Как изменить значение автоинкремента?</h2>
  <h3 id="TyK5">SQLite:</h3>
  <p id="CxNx">В SQLite можно сбросить значение автоматического увеличения для таблицы с помощью таблицы <code>sqlite_sequence</code>.</p>
  <p id="VMEV">Таблица <code>sqlite_sequence</code> — это внутренняя таблица, используемая SQLite для отслеживания следующего значения автоинкремента для каждой таблицы в базе данных. Каждая строка в таблице <code>sqlite_sequence</code> представляет таблицу в базе данных, а в столбце <code>seq</code> хранится следующее значение автоматического увеличения для этой таблицы. Поэтому, когда нам нужно изменить его, просто попробуйте следующее:</p>
  <pre id="Ejgw" data-lang="sql">UPDATE sqlite_sequence SET seq = 100 WHERE name = &#x27;example_table&#x27;;

INSERT INTO example_table (name, age) VALUES (&#x27;John Gold&#x27;, 30);</pre>
  <p id="U7TU">Приведенный выше код изменит значение автоприращения на 100, а следующая вставленная строка получит id = 101;</p>
  <p id="hScl">Мы можем удалить автоинкремент следующим запросом:</p>
  <pre id="qkQm" data-lang="sql">DELETE FROM sqlite_sequence WHERE name = &#x27;example_table&#x27;;</pre>
  <p id="yugL">или установить его меньше максимального значения в автоматически увеличиваемом столбце, но после вставки новой строки <code>sqlite_sequence</code> будет исправлен автоматически. Просто посмотрите следующий фрагмент кода:</p>
  <pre id="xyeb" data-lang="sql">CREATE TABLE example_table (
   id INTEGER PRIMARY KEY AUTOINCREMENT,
   name VARCHAR(50),
   age INT
);

INSERT INTO example_table (name, age)
VALUES
  (&#x27;Jane Doe&#x27;, 25),
  (&#x27;Bob Johnson&#x27;, 40),
  (&#x27;Alice Brown&#x27;, 35);

SELECT * FROM sqlite_sequence WHERE name = &#x27;example_table&#x27;;</pre>
  <p id="w7Mj">данный код вернет следующий результат:</p>
  <pre id="Jtti" data-lang="markdown">+===============+=====+
| name          | seq |
+===============+=====+
| example_table | 3   |
+---------------+-----+</pre>
  <p id="eJZg">Удалим его и убедимся что данные исчезли:</p>
  <pre id="c40d" data-lang="sql">DELETE FROM sqlite_sequence WHERE name = &#x27;example_table&#x27;;

SELECT * FROM sqlite_sequence WHERE name = &#x27;example_table&#x27;;</pre>
  <p id="MxjP">но после следующей записи вставленное значение последовательности также будет восстановлено. <a href="https://sqlize.online/sql/sqlite3/3f07c11acf32ffc67581b388fd42e9b7/" target="_blank">Попробуйте здесь</a>.</p>
  <p id="8g2n"></p>
  <h3 id="smXO">MySQL &amp; MariaDB:</h3>
  <p id="Jfia">MySQL &amp; MariaDB также позволяет изменять автоинкремент с помощью запроса <code>ALTER TABLE</code>, но оно не может быть меньше максимального значения в автоматически увеличенном столбце:</p>
  <pre id="IYW4" data-lang="sql">ALTER TABLE example_table AUTO_INCREMENT = 100;</pre>
  <p id="MPFd">В Oracle можно изменить последовательность с помощью инструкции <code>ALTER SEQUENCE</code>. Этот оператор позволяет изменять характеристики последовательности, такие как минимальное и максимальное значения, шаг и начальное значение. Если необходимо внести более существенные изменения в последовательность, например изменить ее тип данных или полностью удалить ее, может потребоваться удалить и пересоздать последовательность.</p>
  <pre id="xZGb" data-lang="sql">DROP SEQUENCE example_table_seq;

CREATE SEQUENCE example_table_seq INCREMENT BY 1 START WITH 100;</pre>
  <p id="MR22">Обратите внимание, что в Oracle нет проверки конфликтов между новым значением последовательности и существующими записями. Поэтому важно проявлять осторожность и использовать эту функцию ответственно, чтобы избежать непредвиденных последствий.</p>
  <h3 id="0Kv4">PostgreSQL:</h3>
  <p id="YQ2s">В PostgreSQL не имеет значения, как создается столбец с автоматическим увеличением (<code>SERIAL</code>, <code>GENERATED ALWAYS AS IDENTITY</code> или с помощью <code>CREATE SEQUENCE</code>), поскольку для изменения последовательности можно использовать инструкцию <code>ALTER SEQUENCE</code>. Однако данная СУБД не гарантирует отсутствие конфликтов после модификации последовательности, поэтому важно проявлять осторожность.</p>
  <pre id="kfTQ" data-lang="sql">ALTER SEQUENCE example_table_id_seq RESTART WITH 100;</pre>
  <h2 id="mglJ">В качестве заключения</h2>
  <p id="1ekx">Автоинкремент — это функция баз данных, которая генерирует уникальный номер для каждой новой строки, добавляемой в таблицу, избавляя пользователя от необходимости вручную управлять значениями первичного ключа.</p>
  <p id="EswI">Эта функция поддерживается большинством СУБД и может быть легко реализована с использованием разного синтаксиса в каждой базе данных. SQLite, MySQL и MariaDB поддерживают столбцы с автоинкрементом, а также PostgreSQL и Oracle, которые также допускают более продвинутые параметры, такие как последовательности и последовательные типы данных.</p>
  <p id="yyQG">Хотя каждая база данных имеет свой собственный синтаксис для реализации и управления автоинкрементом.</p>
  <p id="563Y">В целом функция автоинкремента значительно упрощает процесс добавления новых строк и гарантирует, что каждая строка будет иметь уникальный идентификатор, что необходимо для многих операций с базой данных.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.sqlize.online/use-show-statements-for-investigate-mysql</guid><link>https://blog.sqlize.online/use-show-statements-for-investigate-mysql?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize</link><comments>https://blog.sqlize.online/use-show-statements-for-investigate-mysql?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize#comments</comments><dc:creator>sqlize</dc:creator><title>Исследуем структуру базы данных MySQL с помощью функций SHOW</title><pubDate>Mon, 01 Apr 2024 20:25:01 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/2a/37/2a373d15-7d76-4e5f-8db7-f6a799e5ebd1.png"></media:content><category>SQL tricks</category><description><![CDATA[<img src="https://img4.teletype.in/files/76/e4/76e4911c-7c03-41d7-bf92-ebd35faeff4f.jpeg"></img>Любая база данных это сложный набор всевозможных компонентов: таблиц, индексов, представлений, функций, процедур и других элементов. Для эффективной работы, и разработчику и тестировщику работающих с чужой базой данных важно иметь возможность исследовать все необходимые компоненты.]]></description><content:encoded><![CDATA[
  <p id="dIqu">Любая база данных это сложный набор всевозможных компонентов: таблиц, индексов, представлений, функций, процедур и других элементов. Для эффективной работы, и разработчику и тестировщику работающим с чужой базой данных важно иметь возможность исследовать все необходимые компоненты.</p>
  <p id="MpgV">В базе данных MySQL для этой цели существует целое семейство функций SHOW.</p>
  <p id="Hh43">Давайте ознакомимся с некоторыми из них и поймем, как они могут помочь QA специалистам и программистам.</p>
  <p id="Saxz">1. SHOW DATABASES - &quot;Покажи мне все свои хранилища&quot;</p>
  <p id="LjTr">Первым делом, когда вы открываете MySQL, вы можете воспользоваться <code>SHOW DATABASES</code>, чтобы увидеть все доступные базы данных. Это как список папок на компьютере. Пример ниже (и все следующие) с сайта <a href="https://sqlize.online/s/W5" target="_blank">sqlize.online</a> </p>
  <pre id="yTxK">mysql&gt; SHOW DATABASES;

|--------------------|
| Database           |
|--------------------|
| information_schema |
| sakila             |</pre>
  <p id="uJCl">Как вы видите эта команда выводит список всех доступных вам баз данных. Если у вашего пользователя нет доступа к какой-то из баз то вы не увидите её в списке. Это нужно учесть при вашем исследовании. </p>
  <p id="foht">2. SHOW TABLES - &quot;Покажи, что у тебя есть&quot;</p>
  <p id="zW9W">Когда вы хотите узнать, какие таблицы существуют в определенной базе данных, просто используйте <code>SHOW TABLES</code>. Это похоже на просмотр содержимого папки на компьютере. Для того что бы получить список таблиц в нужной нам базе перед выполнением команды <code>SHOW</code> нужно выполнить <code>USE dbname; </code></p>
  <pre id="h2IP">mysql&gt; USE sakila; -- в данном случае мы будем исследовать базу данных sakila

mysql&gt; SHOW TABLES;

|----------------------------|
| Tables_in_sakila           |
|----------------------------|
| actor                      |
| actor_info                 |
| address                    |
| category                   |
| city                       |
| country                    |
| customer                   |
| customer_list              |
| film                       |
| film_actor                 |
| film_category              |
| film_list                  |
| film_text                  |
| inventory                  |
| language                   |
| nicer_but_slower_film_list |
| payment                    |
| rental                     |
| sales_by_film_category     |
| sales_by_store             |
| staff                      |
| staff_list                 |
| store                      |</pre>
  <p id="bi34">Таким образом мы получили список таблиц.</p>
  <p id="8n3R">3. SHOW COLUMNS - &quot;Что у тебя внутри?&quot;</p>
  <p id="jt38">Если вам интересно, какие столбцы есть в таблице, просто воспользуйтесь <code>SHOW COLUMNS</code>. Так вы узнаете, какие данные вы можете там найти. Данная команда используется вместе с названием исследуемой таблицы следующим образом:</p>
  <pre id="FjEk">mysql&gt; SHOW COLUMNS FROM city;

|-------------|------------------|------|-----|-------------------|-----------------------------|
| Field       | Type             | Null | Key | Default           | Extra                       |
|-------------|------------------|------|-----|-------------------|-----------------------------|
| city_id     | int(10) unsigned | NO   | PRI | [null]            | auto_increment              |
| city        | varchar(50)      | NO   |     | [null]            |                             |
| country_id  | int(10) unsigned | NO   | MUL | [null]            |                             |
| last_update | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |</pre>
  <p id="dhO5">Данная команда возвращает более подробный результат. Вы видите не только наименования колонок но и их тип, возможность сохранения пустых значений (NULL) является ли поле ключевым, его значение по умолчанию и дополнительную информацию о колонке.</p>
  <p id="qW1b">Данное исследование может дать нам ответ на вопрос: Почему я не могу добавить запись не указав название, или почему в поле <code>last_update </code>появилось значение которое я не указывал.</p>
  <p id="ePPH">4. SHOW INDEX - &quot;Покажи мне твои секретные индексы&quot;</p>
  <p id="Uvw4">С <code>SHOW INDEX</code> вы можете посмотреть, какие индексы установлены в таблице. Это поможет вам понять, какие столбцы можно использовать для быстрого доступа к данным.</p>
  <pre id="cZfx">mysql&gt; SHOW INDEX FROM city;

|-------|------------|-------------------|--------------|-------------|-----------|-------------|----------|--------|------|------------|---------|---------------|
| Table | Non_unique | Key_name          | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
|-------|------------|-------------------|--------------|-------------|-----------|-------------|----------|--------|------|------------|---------|---------------|
| city  | 0          | PRIMARY           | 1            | city_id     | A         | 600         | [null]   | [null] |      | BTREE      |         |               |
| city  | 1          | idx_fk_country_id | 1            | country_id  | A         | 109         | [null]   | [null] |      | BTREE      |         |               |</pre>
  <p id="PRT5">Здесь мы видим что таблица имеет первичный ключ по полю <code>city_id</code> а также не уникальный индекс по полю <code>country_id</code>. Этой информации нам будет достаточно чтобы понять что выборка из таблицы городов по идентификатору страны должна быть очень быстрой.</p>
  <p id="RzY4">5. SHOW CREATE TABLE - &quot;Покажи, как создать это&quot;</p>
  <p id="Dh96">Хотите узнать, как создать определенную таблицу? Просто используйте <code>SHOW CREATE TABLE</code>, и MySQL покажет вам SQL-запрос для создания таблицы.</p>
  <pre id="XKyx">mysql&gt; SHOW CREATE TABLE city;

CREATE TABLE &#x60;city&#x60; (                                                                                            
 &#x60;city_id&#x60; int(10) unsigned NOT NULL AUTO_INCREMENT,                                                            
 &#x60;city&#x60; varchar(50) NOT NULL,                                                                                   
 &#x60;country_id&#x60; int(10) unsigned NOT NULL,                                                                        
 &#x60;last_update&#x60; timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,                        
 PRIMARY KEY (&#x60;city_id&#x60;),                                                                                       
 KEY &#x60;idx_fk_country_id&#x60; (&#x60;country_id&#x60;),                                                                        
 CONSTRAINT &#x60;fk_city_country&#x60; FOREIGN KEY (&#x60;country_id&#x60;) REFERENCES &#x60;country&#x60; (&#x60;country_id&#x60;) ON UPDATE CASCADE  
) ENGINE=InnoDB AUTO_INCREMENT=601 DEFAULT CHARSET=utf8                                                          
</pre>
  <p id="nPcy">Очень удобная штука! Таким образом вы видите всю структуру в компактном виде. Это удобно для сравнения структуры таблиц например на тестовом сервере и на боевом. Так же эта команда не заменив если кто-то просит вас показать DDL таблиц. Одна команда и всё готово. Кстати если вам нужно поделиться с коллегой  вы можете воспользоваться сайтом <a href="https://sqlize.online/s/t5" target="_blank">sqlize.online</a> - наберите или скопируйте свой SQL код, нажмите кнопку RUN чтобы код был выполнен системой, а затем кнопку SHARE чтобы получить в буфер обмена короткую ссылку на ваш код. Посе этого людой кто получит ссылку сможет продолжить работать с вашим кодом! </p>
  <p id="ZmOA">В дополнение к SHOW CREATE TABLE вы можете использовать <code>SHOW CREATE DATABASE / EVENT/FUNCTION / PROCEDURE / TRIGGER / USER / VIEW</code> то есть получить код создания любого объекта в базе данных</p>
  <p id="UXMu">6. SHOW TABLE STATUS - &quot;Сколько у тебя строк?&quot;</p>
  <p id="CAPF">Наконец, <code>SHOW TABLE STATUS</code> позволяет вам получить различную информацию о таблице, такую как количество строк или размер таблицы. Это полезно для оценки производительности и размера таблиц.</p>
  <pre id="YrV1">mysql&gt; SHOW TABLE STATUS LIKE &#x27;city&#x27;;

|------|--------|---------|------------|------|----------------|-------------|-----------------|--------------|-----------|----------------|---------------------|-------------|------------|--------------------|----------|----------------|---------|
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation          | Checksum | Create_options | Comment |
|------|--------|---------|------------|------|----------------|-------------|-----------------|--------------|-----------|----------------|---------------------|-------------|------------|--------------------|----------|----------------|---------|
| city | InnoDB | 10      | Dynamic    | 600  | 109            | 65536       | 0               | 16384        | 0         | 601            | 2024-03-15 09:57:44 | [null]      | [null]     | utf8mb3_general_ci | [null]   |                |         |</pre>
  <p id="H45b">Из полученной таблицы мы можем извлечь массу полезной информации: когда была создана таблица, когда была изменена, сколько в ней строк и каково значение автоинкремента о котором я писал <a href="https://tproger.ru/articles/vse-chto-vy-hoteli-by-znat-ob-avtoinkremente-no-stesnyalis-sprosit" target="_blank">здесь</a>.  В общем ещё один ценный инструмент в руках исследователя!</p>
  <p id="zMmq">7. SHOW GRANTS - &quot;Кто имеет доступ?&quot;</p>
  <p id="k39v">С помощью <code>SHOW GRANTS</code> можно узнать привилегии, предоставленные пользователям в MySQL. Это полезно для проверки безопасности и доступа к данным.</p>
  <pre id="JtG3">mysql&gt; SHOW GRANTS FOR &#x27;user&#x27;@&#x27;host&#x27;;</pre>
  <p id="m7ce">Если у вас достаточно привилегий в базе то при помощи этой команды можно узнать кто ещё может подключаться к базе и какие действия выполнять. Это очень полезная команда для сисадминов и пен-тестеров.</p>
  <p id="Gmqs">8. SHOW MASTER / REPLICA STATUS - &quot;Эй! Кто отстаёт?&quot;</p>
  <p id="tXnR">Эта команда необходима в случае репликации для того чтобы понять всё ли с ней в порядке и если нет - насколько всё плохо.</p>
  <p id="92z8">8. SHOW [GLOBAL] VARIABLES - &quot;Покажи настройки&quot;</p>
  <p id="1nZ3">Данная команда позволяет увидеть параметры конфигурации базы данных. Если вам нужно выбрать только нужные из большого списка - отфильтруйте их при помощи <code>LIKE как в примере ниже:</code></p>
  <pre id="j4tB">mysql&gt; SHOW VARIABLES LIKE &#x27;innodb_buffer_pool%&#x27;;

|-------------------------------------|----------------|
| Variable_name                       | Value          |
|-------------------------------------|----------------|
| innodb_buffer_pool_chunk_size       | 134217728      |
| innodb_buffer_pool_dump_at_shutdown | ON             |
| innodb_buffer_pool_dump_now         | OFF            |
| innodb_buffer_pool_dump_pct         | 25             |
| innodb_buffer_pool_filename         | ib_buffer_pool |
| innodb_buffer_pool_in_core_file     | ON             |
| innodb_buffer_pool_instances        | 1              |
| innodb_buffer_pool_load_abort       | OFF            |
| innodb_buffer_pool_load_at_startup  | ON             |
| innodb_buffer_pool_load_now         | OFF            |
| innodb_buffer_pool_size             | 134217728      |</pre>
  <p id="7RpB">Эти значения могут помочь вам в оптимизации работы сервера. </p>
  <p id="xFFI">Далее без лишних подробностей перечислю ещё несколько полезных команд которыми мне приходилось пользоваться:</p>
  <ul id="CorO">
    <li id="UTP7">SHOW ERRORS - показывает список ошибок.</li>
    <li id="Sr14">SHOW ENGINE STATUS - статус движка базы данных - позволяет увидеть DEAD LOCKS</li>
  </ul>
  <p id="W0aX">Таким образом я привел список наиболее употребимых команд из целого класса <a href="https://dev.mysql.com/doc/refman/8.0/en/show.html" target="_blank">SHOW SATEMENTS</a> которые могут сильно облегчить понимание устройства базы данных разработчиками и тестировщиками. Не стесняйтесь заглядывать в этот раздел команд если вам нужно вытащить какую либо информацию о имеющейся у вас базе.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.sqlize.online/EXCLUDE-in-PostgreSQL</guid><link>https://blog.sqlize.online/EXCLUDE-in-PostgreSQL?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize</link><comments>https://blog.sqlize.online/EXCLUDE-in-PostgreSQL?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize#comments</comments><dc:creator>sqlize</dc:creator><title>Оператор EXCLUDE в PostgreSQL: Продвинутые ограничения для базы данных</title><pubDate>Tue, 30 May 2023 10:12:37 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/7f/f8/7ff82656-2d16-4b8f-afce-5d5d16dbe30d.png"></media:content><category>SQL tricks</category><description><![CDATA[<img src="https://img4.teletype.in/files/38/7d/387db1fe-6e40-4e67-869d-99cf31bc123b.jpeg"></img>В процессе проектирования базы данных описанном в моей предыдущей статье я решил использовать ограничение EXCLUDE для поддержания корректности вносимых данных. Продолжая размышлять над этим я решил что оператор EXCLUDE достоин описания в отдельной статье.]]></description><content:encoded><![CDATA[
  <p id="75D7">В процессе проектирования базы данных описанном в моей предыдущей статье я решил использовать ограничение EXCLUDE для поддержания корректности вносимых данных. Продолжая размышлять над этим я решил что оператор EXCLUDE достоин описания в отдельной статье.</p>
  <figure id="89tA" class="m_column">
    <img src="https://img4.teletype.in/files/38/7d/387db1fe-6e40-4e67-869d-99cf31bc123b.jpeg" width="2304" />
  </figure>
  <h2 id="fGD4">Введение</h2>
  <p id="Wm1k">PostgreSQL известна множеством мощных функциональных возможностей, и одна из них — оператор EXCLUDE. Этот оператор позволяет создавать продвинутые ограничения на множества значений внутри столбцов таблицы. В этой статье хочу рассказать про оператор EXCLUDE, показать примеры его использования, чтобы вы могли лучше понять, как использовать его для создания гибких и эффективных баз данных.</p>
  <p id="NrG0">Оператор EXCLUDE как и UNIQUE в PostgreSQL используется для определения ограничений на множества значений внутри столбцов таблицы. В отличие от UNIQUE он позволяет указать правила, которые определяют, какие значения не могут существовать вместе в определенном столбце или наборе столбцов. Оператор EXCLUDE часто используется с индексом типа GiST или SP-GiST, чтобы обеспечить эффективность выполнения запросов, хотя может применяться и вместе с обычным B-Tree индексом.</p>
  <h2 id="SRKO">Примеры использования</h2>
  <p id="X2Oc">1. Стандартным примером использования EXCLUDE может служить ограничение на пересечение временных интервалов (например сеансов в кинозале).</p>
  <pre id="qNgo" data-lang="sql">create table events (
    id serial primary key,
    event_time tstzrange,        -- дата и время начала и конца
    constraint no_screening_time_overlap exclude using gist (
        event_time WITH &amp;&amp;     -- проверка на пересечение
    )
);

insert into events (event_time) values (&#x27;[&quot;2023-01-01 19:00:00&quot;, &quot;2023-01-01 20:45:00&quot;]&#x27;);</pre>
  <p id="tsJc">На примере выше код для создания таблицы и внесения одной записи. <a href="https://sqlize.online/sql/psql15/f560a464533bf811b6c8b902b9b509d8/" target="_blank">SQL можно проверить на SQLize.online</a></p>
  <p id="lmAt">После этого Вы можете попробовать вставить еще одну строку с интервалом пересекающим один из уже существующих в таблице. Скорей всего у Вас не получится и база данных вернет ошибку. Если же Вы преуспеете — отпишитесь в комментах!</p>
  <p id="JoS3">Так же как и UNIQUE, ограничение EXCLUDE может налагаться на группу столбцов. Например Вы можете использовать колонки event_start и event_end типа timestamp и также ограничить наложения по времени. Ниже пример:</p>
  <pre id="tjPi" data-lang="sql">CREATE TABLE events (
    event_id SERIAL PRIMARY KEY,
    event_name VARCHAR(100) NOT NULL,
    event_start TIMESTAMPTZ NOT NULL,
    event_end TIMESTAMPTZ NOT NULL,
    EXCLUDE USING GIST (event_start WITH &amp;&amp;, event_end WITH &amp;&amp;)
);</pre>
  <p id="L9Tq">Аналогично временным диапазонам можно накладывать ограничения на диапазону чисел:</p>
  <pre id="YHrS" data-lang="sql">CREATE TABLE ranges (
    range_id SERIAL PRIMARY KEY,
    start_value INTEGER NOT NULL,
    end_value INTEGER NOT NULL,
    EXCLUDE USING GIST (int4range(start_value, end_value, &#x27;[]&#x27;) WITH &amp;&amp;)
);</pre>
  <p id="l4ea">В этом примере создается таблица ranges, которая содержит числовые диапазоны. Оператор EXCLUDE с индексом GiST указывает, что числовые диапазоны в столбцах start_value и end_value не могут перекрываться.</p>
  <p id="BEZO">Другим важным применением может быть ограничение на пересечение геометрических фигур:</p>
  <pre id="YQ1O" data-lang="sql">CREATE TABLE polygons (
    polygon_id SERIAL PRIMARY KEY,
    polygon_data geometry(Polygon) NOT NULL,
    EXCLUDE USING GIST (polygon_data WITH &amp;&amp;)
);</pre>
  <p id="Ewtg">В этом примере создается таблица polygons, которая содержит информацию о многоугольниках. Оператор EXCLUDE с индексом GiST указывает, что геометрические объекты в столбце polygon_data не могут пересекаться или содержаться друг в друге.</p>
  <p id="HxoC">Во всех примерах выше мы использовали ограничение EXCLUDE основанное на GIST индексе. Однако для полноты картины можно привести пример использования R-Tree:</p>
  <pre id="OXyj" data-lang="sql">CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    email VARCHAR(255) NOT NULL,
    EXCLUDE USING btree (lower(email) WITH =)
);</pre>
  <p id="pLxE">В этом примере мы практически повторили функционал ограничения UNIQUE с небольшой доработкой: теперь наша уникальность не чувствительна к регистру.</p>
  <h2 id="SXie">Заключение</h2>
  <p id="Df9y">Оператор EXCLUDE в PostgreSQL предоставляет возможность создания продвинутых ограничений на множества значений внутри столбцов таблицы. Он позволяет определить правила, которые ограничивают комбинации значений, которые не могут существовать вместе. Это особенно полезно для обеспечения целостности данных и выполнения сложных проверок на уровне базы данных.</p>
  <p id="Efy5">В этой статье мы рассмотрели несколько примеров использования оператора EXCLUDE, включая ограничение на пересечение интервалов времени, запрет пересечения геометрических объектов и ограничение на неперекрывающиеся числовые диапазоны. Оператор EXCLUDE является мощным инструментом, который можно использовать для создания гибких и эффективных баз данных в PostgreSQL.</p>
  <p id="n1Lm">Используйте оператор EXCLUDE в своих проектах, чтобы создавать сложные ограничения и обеспечивать целостность данных на уровне базы данных. Это поможет вам сохранить структурированность и надежность вашей базы данных и обеспечить ее эффективное использование.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.sqlize.online/20-voprosov-na-znanie-SQL-SAKILA</guid><link>https://blog.sqlize.online/20-voprosov-na-znanie-SQL-SAKILA?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize</link><comments>https://blog.sqlize.online/20-voprosov-na-znanie-SQL-SAKILA?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sqlize#comments</comments><dc:creator>sqlize</dc:creator><title>20 вопросов на знание баз данных на примере базы SAKILA</title><pubDate>Tue, 23 May 2023 19:29:21 GMT</pubDate><category>Проектирование баз данных</category><description><![CDATA[Sakila — это пример базы данных, разработанный компанией MySQL, специально созданный для обучения и демонстрации возможностей систем управления базами данных (СУБД) на основе реляционной модели.]]></description><content:encoded><![CDATA[
  <p id="8erT">Sakila — это пример базы данных, разработанный компанией MySQL, специально созданный для обучения и демонстрации возможностей систем управления базами данных (СУБД) на основе реляционной модели.</p>
  <p id="3r70">Уникальность Sakila заключается в его содержании, представляющем вымышленную компанию, занимающуюся прокатом DVD-дисков. Внутри базы данных находятся подробные данные о клиентах, фильмах, прокатах и платежах. Структура базы данных была тщательно разработана для демонстрации различных функциональностей СУБД, включая создание таблиц, выполнение запросов, использование индексов, управление транзакциями и многое другое.</p>
  <p id="StUi">Sakila стал известным и широко используемым примером базы данных в обучающих материалах, учебниках и курсах по СУБД и SQL. Его популярность объясняется доступностью и готовностью использования для обучения и практического освоения концепций баз данных.</p>
  <p id="cWGp">База данных Sakila содержит 16 основных таблиц, описывающих различные аспекты компании по прокату DVD-дисков. Ниже приведен список этих таблиц:</p>
  <ol id="zdps">
    <li id="0mOz">actor — информация об актерах, которые участвовали в фильмах.</li>
    <li id="mP0A">address — информация об адресах, в которых зарегистрированы клиенты компании.</li>
    <li id="a8Sq">category — список категорий, к которым могут относиться фильмы.</li>
    <li id="SoR8">city — информация о городах, в которых расположены адреса клиентов.</li>
    <li id="YOLZ">country — информация о странах, в которых расположены города.</li>
    <li id="sP6t">customer — информация о клиентах, которые берут в аренду фильмы.</li>
    <li id="KxWd">film — информация о фильмах, доступных для проката.</li>
    <li id="29Pt">film_actor — связь между фильмами и актерами, которые участвуют в этих фильмах.</li>
    <li id="XXYS">film_category — связь между фильмами и категориями, к которым они относятся.</li>
    <li id="WmK6">film_text — полный текст сюжетов фильмов, доступных для проката.</li>
    <li id="cKUr">inventory — информация о DVD-дисках, доступных для проката.</li>
    <li id="BkDU">language — список языков, на которых доступны фильмы.</li>
    <li id="O8TT">payment — информация о платежах, сделанных клиентами за аренду фильмов.</li>
    <li id="H1Ui">rental — информация о факте аренды фильма клиентом.</li>
    <li id="SD9C">staff — информация о сотрудниках компании, работающих в магазине.</li>
    <li id="8Mgr">store — информация о магазинах компании по прокату DVD-дисков.</li>
  </ol>
  <p id="Bl8r">Ниже список заданий рекомендованных для проверки Ваших навыков написания запросов SQL на примере базы данных Sakila. Задания отсортированы по уровню сложности. Попробуйте выполнить все задания и оценить свой уровень подготовки.</p>
  <ol id="Oj3J">
    <li id="XGEr">Выведите все записи из таблицы customer.</li>
    <li id="GekP">Выведите все записи из таблицы film, отсортированные по алфавиту.</li>
    <li id="6Vco">Выведите список всех уникальных категорий из таблицы category.</li>
    <li id="KkKt">Выведите список всех языков из таблицы language.</li>
    <li id="NEZX">Выведите список всех фильмов, длительность которых больше 2 часов.</li>
    <li id="MQD3">Выведите список всех фильмов, отсортированный по возрастанию длительности.</li>
    <li id="gdoO">Выведите список всех клиентов из таблицы customer, живущих в городе с названием «London».</li>
    <li id="2pPK">Выведите список всех фильмов комедий.</li>
    <li id="P0Of">Выведите список всех фильмов, в которых играл актер с идентификатором 5.</li>
    <li id="AjCR">Выведите список всех фильмов, отсортированный по количеству аренд, начиная с самых популярных.</li>
    <li id="CJKu">Выведите список всех клиентов, которые сделали хотя бы один платеж на сумму более $10.</li>
    <li id="efGc">Выведите список всех клиентов, которые не брали ни одного фильма.</li>
    <li id="fjvm">Выведите сумму всех платежей для каждого месяца.</li>
    <li id="AEgX">Выведите список всех клиентов и количества аренд, которые они сделали.</li>
    <li id="c3Ft">Выведите список всех клиентов, которые не вернули как минимум один прокат.</li>
    <li id="ULGf">Выведите список всех фильмов, которые никогда не прокатывались.</li>
    <li id="TQUg">Выведите список всех клиентов, которые арендовали фильмы в период с 1 мая 2006 года по 31 мая 2006 года.</li>
    <li id="9kY7">Выведите список всех магазинов, в которых есть DVD-диски с фильмами ужасов.</li>
    <li id="aVic">Выведите список всех фильмов, которые прокатывались больше 30 раз в месяц.</li>
    <li id="M2BU">Выведите список всех клиентов, которые арендовали фильмы, общая стоимость которых превышает $50.</li>
  </ol>
  <p id="p37X">Все задания можно выполнять онлайн (бесплатно и без регистрации) на сайте <a href="https://sqlize.online/sql/mysql80_sakila/d41d8cd98f00b204e9800998ecf8427e/" target="_blank">SQLize.online</a> Если столкнетесь с проблемой которую не можете решить — обращайтесь за помощью в <a href="https://t.me/sqlize" target="_blank">одноимённый телеграм канал</a>.</p>

]]></content:encoded></item></channel></rss>