<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>alchemmist — Sql</title><link>https://alchemmist.xyz/tags/sql/</link><description>Последние записи в блоге alchemmist</description><generator>Hugo 0.163.3</generator><language>en</language><atom:link href="https://alchemmist.xyz/tags/sql/index.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Sun, 12 Oct 2025 18:55:00 +0300</lastBuildDate><item><title>Note on SQL Basics</title><link>https://alchemmist.xyz/articles/sql-basics-note/</link><pubDate>Sun, 12 Oct 2025 18:55:00 +0300</pubDate><dc:creator>alchemmist</dc:creator><guid>https://alchemmist.xyz/articles/sql-basics-note/</guid><description>This is my simple note about basic data types in SQL and foundation of SQL — relation algebra. Let’s start from little cheat sheet of data types:
Whole numbers:
TINYINT — from $-128$ to $127$. SMALLINT — from $-32 768$ to $32 767$. INTAGER — from $−2 147 483 648$ to $−2 147 483 647$. BIGINT — very big! Float numbers:
FLOAT — single precision, approximately 7-8 significant digits. DOUBLE — double precision, approximately 15-16 significant digits. NUMERIC / DECIMAL — fixed precision, use as NUMERIC(precision, scale), where precision – total digits count, scale – count digits after dot. Strings:</description><content:encoded><![CDATA[<p>This is my simple note about basic data types in SQL and foundation of SQL — relation algebra. Let’s start from little cheat sheet of data types:</p>
<p><strong>Whole numbers:</strong></p>
<ul>
<li><code>TINYINT</code> — from $-128$ to $127$.</li>
<li><code>SMALLINT</code> — from $-32 768$ to $32 767$.</li>
<li><code>INTAGER</code> — from $−2 147 483 648$ to $−2 147 483 647$.</li>
<li><code>BIGINT</code> — very big!</li>
</ul>
<p><strong>Float numbers:</strong></p>
<ul>
<li><code>FLOAT</code> — single precision, approximately 7-8 significant digits.</li>
<li><code>DOUBLE</code> — double precision, approximately 15-16 significant digits.</li>
<li><code>NUMERIC</code> / <code>DECIMAL</code> — fixed precision, use as <code>NUMERIC(precision, scale)</code>, where <code>precision</code> – total digits count, <code>scale</code> – count digits after dot.</li>
</ul>
<p><strong>Strings:</strong></p>
<ul>
<li><code>CHAR(n)</code> — string of fixed length. <code>n</code> defined maximum string length, if string less than <code>n</code> it sill be fill with spaces.</li>
<li><code>VARCHAR(n)</code> — string of variable length. <code>n</code> defined maximum string length. It’s more optimized and effective, because keep only real string length.</li>
<li><code>TEXT</code> — string of variable length, without limits (it depends on DBMS).</li>
<li><code>ENUM</code> — enumerate. Keep only one from defined list values, for example <code>ENUM('male', 'female', 'other')</code>.</li>
</ul>
<p><strong>Date and time:</strong></p>
<ul>
<li><code>DATE</code> — store only date (year, month, day).</li>
<li><code>TIME</code> — store only time (hours, minutes, seconds).</li>
<li><code>DATETIME</code> — store time and date.</li>
<li><code>TIMESTAMP</code> — store date and time, considering time zone.</li>
</ul>
<p><strong>Logical data:</strong></p>
<ul>
<li><code>BOOLEAN</code> — store logical value: <code>TRUE</code> or <code>FALSE</code>. Some time can be represented as <code>TINYINT</code> with $1 = \texttt{TRUE}$ and $2 = \texttt{FALSE}$.</li>
</ul>
<p><strong>Binary data:</strong></p>
<ul>
<li><code>BLOB</code> (<em>Binary Large Object</em>) — store big binary data, like images, videos, audios and so on.</li>
<li><code>BINARY(n)</code> — binary string with fixed length <code>n</code>.</li>
<li><code>VARBINARY(n)</code> — binary string with variable length, but max length is <code>n</code>.</li>
</ul>
<p><strong>Other:</strong></p>
<ul>
<li><code>JSON</code> — store the json data.</li>
<li><code>XML</code> — store xml data.</li>
</ul>

<h2 id="relation-algebra">
  <a class="link" href="#relation-algebra">
    #
  </a>
  Relation algebra
</h2>

<p>Relational algebra serves is the theoretical basis for SQL. This means that any query that can be expressed in SQL can also be expressed in relational algebra, and vice versa. Understanding relational algebra helps you understand how SQL queries are processed and optimized.</p>
<p>Key concepts:</p>
<ul>
<li><strong>Relation</strong> — in relation algebra it’s the similar as table in database: columns and rows.</li>
<li><strong>Attribute</strong> — column in relation.</li>
<li><strong>Tuple</strong> — row in relation.</li>
<li><strong>Relation Schema</strong> — description structure of relation, which include attributes names and data types.</li>
</ul>
<p>Let’s see on operators of relation algebra. You can try all of this examples in <a href="https://dbis-uibk.github.io/relax/calc/local/uibk/local/0">RealX</a>.</p>
<p><strong>π (pi)</strong> — Operation, that create new relation, selecting specified attributes from source relation. It’s similar as <code>SELECT</code> in SQL. For example we can get the list of all books titles and authors:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="err">π</span><span class="w"> </span><span class="n">author</span><span class="p">,</span><span class="w"> </span><span class="n">title</span><span class="w"> </span><span class="p">(</span><span class="n">books</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p>As result:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-plaintext" data-lang="plaintext"><span class="line"><span class="cl">+-----------------+-----------------------------+
</span></span><span class="line"><span class="cl">| author          | title                       |
</span></span><span class="line"><span class="cl">|-----------------+-----------------------------|
</span></span><span class="line"><span class="cl">| Salinger        | The catcher in the Rye      |
</span></span><span class="line"><span class="cl">| Robert Martin   | Clean code                  |
</span></span><span class="line"><span class="cl">| Platon          | The State                   |
</span></span><span class="line"><span class="cl">+-----------------+-----------------------------+
</span></span></code></pre></div><p><strong><code>σ</code> (sigma)</strong> — Operation, that create new relation contains only tuples, which satisfy specified condition. It’s similar as <code>WHERE</code> in SQL. This example give me the books only from Salinger:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="err">σ</span><span class="w"> </span><span class="n">author</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&#34;Salinger&#34;</span><span class="w"> </span><span class="p">(</span><span class="n">books</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p><strong><code>∪</code> (union)</strong> — Operation, that create new relation contains all tuples, which exists at least one of two source relations. Its similar as <code>UNION</code> in SQL. I can union books from Salinger and books published at 2024-01-05:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="p">(</span><span class="err">σ</span><span class="w"> </span><span class="n">author</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;Selinger&#39;</span><span class="w"> </span><span class="p">(</span><span class="n">books</span><span class="p">))</span><span class="w"> </span><span class="err">∪</span><span class="w"> </span><span class="p">(</span><span class="err">σ</span><span class="w"> </span><span class="n">publish_at</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;2024-01-05&#39;</span><span class="w"> </span><span class="p">(</span><span class="n">books</span><span class="p">))</span><span class="w">
</span></span></span></code></pre></div><p><strong><code>−</code> (subtraction)</strong> — Operation, that create new relation, includes tuples, which contains into first relation but missing in second. Next example show ids of books, that no from Salinger.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="err">π</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="p">(</span><span class="n">books</span><span class="p">)</span><span class="w"> </span><span class="err">–</span><span class="w"> </span><span class="err">π</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="p">(</span><span class="err">σ</span><span class="w"> </span><span class="n">author</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;Salinger&#39;</span><span class="w"> </span><span class="p">(</span><span class="n">books</span><span class="p">))</span><span class="w">
</span></span></span></code></pre></div><p><strong><code>×</code> (cross join)</strong> — Operation, that create new relation contains all combinations of tuples from two source relations. It’s similar as <code>CROSS JOIN</code> in SQL. For example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="p">(</span><span class="err">σ</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="p">(</span><span class="n">books</span><span class="p">))</span><span class="w"> </span><span class="err">×</span><span class="w"> </span><span class="p">(</span><span class="err">σ</span><span class="w"> </span><span class="n">book_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="p">(</span><span class="n">reviews</span><span class="p">))</span><span class="w">
</span></span></span></code></pre></div><p><strong><code>⋈</code> (natural join)</strong> — Operation, that create new relation, contains tuples from two source relations, that have same values in attributes with same name. Duplicated attributes remove from result relation. It’s similar as <code>NATURAL JOIN</code> in SQL. For example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="n">books</span><span class="w"> </span><span class="err">⋈</span><span class="w"> </span><span class="n">reviews</span><span class="w">
</span></span></span></code></pre></div><p><strong><code>⋈ θ</code> (theta join)</strong> — Operation, that create new relation, contains tuples from two source relations and satisfy specified condition <code>θ</code>. Condition can include operators: <code>=</code>, <code>≠</code>, <code>&gt;</code>, <code>&lt;</code>, <code>≥</code>, <code>≤</code>.  For example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="p">(</span><span class="n">books</span><span class="p">)</span><span class="w"> </span><span class="err">⋈</span><span class="w"> </span><span class="n">books</span><span class="p">.</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">reviews</span><span class="p">.</span><span class="n">book_id</span><span class="w"> </span><span class="p">(</span><span class="n">reviews</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p><strong><code>⋈ =</code> (equjoin)</strong> — A special case of theta join, where condition is equal values of attributes. The previous example show this.</p>
<p><strong><code>÷</code> (division)</strong> — Binary operation, that create new relation, contains tuples from first source relation, that connected with all tuples from second source relation. This is a powerful operator for solving tasks like: “Find all X, that connected with Y.” For example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="err">π</span><span class="w"> </span><span class="n">title</span><span class="p">,</span><span class="w"> </span><span class="n">author</span><span class="w"> </span><span class="p">(</span><span class="err">σ</span><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;available&#39;</span><span class="w"> </span><span class="p">(</span><span class="n">library</span><span class="p">))</span><span class="w"> </span><span class="err">÷</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="err">π</span><span class="w"> </span><span class="n">title</span><span class="w"> </span><span class="p">(</span><span class="err">σ</span><span class="w"> </span><span class="n">author</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;Selinjer&#39;</span><span class="w"> </span><span class="p">(</span><span class="n">books</span><span class="p">))</span><span class="w">
</span></span></span></code></pre></div><p>Here is two terms, first is <code>π title, author (σ status = 'available' (library))</code> and it’s return the available books with <code>title</code> and <code>author</code> attributes:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-plaintext" data-lang="plaintext"><span class="line"><span class="cl">+-----------------+-----------------------------+
</span></span><span class="line"><span class="cl">| author          | title                       |
</span></span><span class="line"><span class="cl">|-----------------+-----------------------------|
</span></span><span class="line"><span class="cl">| Salinger        | The catcher in the Rye      |
</span></span><span class="line"><span class="cl">| Robert Martin   | Clean Code                  |
</span></span><span class="line"><span class="cl">| Platon          | The State                   |
</span></span><span class="line"><span class="cl">| Selinjer        | Advanced Algebra            |
</span></span><span class="line"><span class="cl">| Selinjer        | Linear Algebra              |
</span></span><span class="line"><span class="cl">+-----------------+-----------------------------+
</span></span></code></pre></div><p>Second term <code>π title (σ publish_at = '2024-01-05' (books))</code> is return the list of <code>Selinjer</code> books:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-plaintext" data-lang="plaintext"><span class="line"><span class="cl">+------------------+
</span></span><span class="line"><span class="cl">| author           |
</span></span><span class="line"><span class="cl">|------------------|
</span></span><span class="line"><span class="cl">| Selinjer         |
</span></span><span class="line"><span class="cl">| Stive Machonnel  |
</span></span><span class="line"><span class="cl">+------------------+
</span></span></code></pre></div><p>Division of this two relations will return the list of titles where authors equals and drop author attribute:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-plaintext" data-lang="plaintext"><span class="line"><span class="cl">+-----------------------------+
</span></span><span class="line"><span class="cl">| title                       |
</span></span><span class="line"><span class="cl">|-----------------------------|
</span></span><span class="line"><span class="cl">| Advanced Algebra            |
</span></span><span class="line"><span class="cl">| Linear Algebra              |
</span></span><span class="line"><span class="cl">+-----------------------------+
</span></span></code></pre></div><p>This is the available books in library from author published it at <code>'2024-01-05'</code>.</p>
<p><strong><code>γ</code> (aggregation)</strong> — Operation, that groups tuples by specified attributes and execute aggregate function (<em>sum, max, min, count, average</em>). It’s similar as <code>GROUP BY</code> in SQL. For example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="err">γ</span><span class="w"> </span><span class="n">title</span><span class="p">;</span><span class="w"> </span><span class="k">COUNT</span><span class="p">(</span><span class="n">author</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="k">count</span><span class="w"> </span><span class="p">(</span><span class="n">books</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div>]]></content:encoded><category>sql</category></item></channel></rss>