Files
SpacetimeDB/docs/build/sql/index.html
T
Julien Lavocat c20c30524b Remove old docs
2025-10-21 12:12:01 +02:00

383 lines
88 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-SQL/SQL-Reference" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.9.1">
<title data-rh="true">SQL Reference | SpacetimeDB docs</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://docs.spacetimedb.com/sql"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="SQL Reference | SpacetimeDB docs"><meta data-rh="true" name="description" content="SpacetimeDB supports two subsets of SQL:"><meta data-rh="true" property="og:description" content="SpacetimeDB supports two subsets of SQL:"><link data-rh="true" rel="icon" href="/images/favicon.ico"><link data-rh="true" rel="canonical" href="https://docs.spacetimedb.com/sql"><link data-rh="true" rel="alternate" href="https://docs.spacetimedb.com/sql" hreflang="en"><link data-rh="true" rel="alternate" href="https://docs.spacetimedb.com/sql" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://QBC7Z9KXS2-dsn.algolia.net" crossorigin="anonymous"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"SQL Reference","item":"https://docs.spacetimedb.com/sql"}]}</script><link rel="search" type="application/opensearchdescription+xml" title="SpacetimeDB docs" href="/opensearch.xml"><link rel="stylesheet" href="/assets/css/styles.0cb9f7a7.css">
<script src="/assets/js/runtime~main.d71df0f5.js" defer="defer"></script>
<script src="/assets/js/main.31d95d83.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<svg style="display: none;"><defs>
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="https://spacetimedb.com/images/brand.png"><div role="region" aria-label="Skip to main content"><a class="skipToContent_6jFv" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="https://spacetimedb.com/images/brand.png" alt="SpacetimeDB Logo" class="themedComponent_rvet themedComponent--light_mbAJ"><img src="https://spacetimedb.com/images/brand.png" alt="SpacetimeDB Logo" class="themedComponent_rvet themedComponent--dark_Ncy6"></div></a><div class="navbarSearchContainer_AesG"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search (Command+K)"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://spacetimedb.com/install" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Install</a><a href="https://spacetimedb.com/pricing" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Pricing</a><a href="https://spacetimedb.com/maincloud" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Maincloud</a><a href="https://spacetimedb.com/blog" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Blog</a><a href="https://spacetimedb.com/community" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Community</a></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_hV_y"><div class="docsWrapper_f07g"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_MJiz" type="button"></button><div class="docRoot_Gd2s"><aside class="theme-doc-sidebar-container docSidebarContainer_fSpF"><div class="sidebarViewport_YElg"><div class="sidebar_kjg4"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_AG0n"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/"><span title="Intro" class="categoryLinkLabel_EDYQ">Intro</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/deploying/maincloud"><span title="Deploying" class="categoryLinkLabel_EDYQ">Deploying</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/unity"><span title="Unity tutorial" class="categoryLinkLabel_EDYQ">Unity tutorial</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/unreal"><span title="Unreal Tutorial" class="categoryLinkLabel_EDYQ">Unreal Tutorial</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/cli-reference"><span title="CLI Reference" class="categoryLinkLabel_EDYQ">CLI Reference</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/modules"><span title="Server Module Languages" class="categoryLinkLabel_EDYQ">Server Module Languages</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/sdks"><span title="Client SDK Languages" class="categoryLinkLabel_EDYQ">Client SDK Languages</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true" href="/sql"><span title="SQL" class="categoryLinkLabel_EDYQ">SQL</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/sql"><span title="SQL Reference" class="linkLabel_dpMB">SQL Reference</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/sql/pg-wire"><span title="PostgreSQL Wire Protocol (PGWire)" class="linkLabel_dpMB">PostgreSQL Wire Protocol (PGWire)</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/subscriptions"><span title="Subscriptions" class="categoryLinkLabel_EDYQ">Subscriptions</span></a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/rls"><span title="Row Level Security" class="linkLabel_dpMB">Row Level Security</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/how-to/incremental-migrations"><span title="How-To" class="categoryLinkLabel_EDYQ">How-To</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/spacetimeauth"><span title="SpacetimeAuth" class="categoryLinkLabel_EDYQ">SpacetimeAuth</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/http/authorization"><span title="HTTP API" class="categoryLinkLabel_EDYQ">HTTP API</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_ggI5 menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/webassembly-abi"><span title="Internals" class="categoryLinkLabel_EDYQ">Internals</span></a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/appendix"><span title="Appendix" class="linkLabel_dpMB">Appendix</span></a></li></ul></nav></div></div></aside><main class="docMainContainer_dkUT"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_w2oE"><div class="docItemContainer_f71m"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_xsLZ" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_oyay"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">SQL</span></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">SQL Reference</span></li></ul></nav><div class="tocCollapsible_dqme theme-doc-toc-mobile tocMobile_Z34P"><button type="button" class="clean-btn tocCollapsibleButton_QMSE">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>SQL Support</h1></header>
<p>SpacetimeDB supports two subsets of SQL:
One for queries issued through the <a href="/cli-reference#spacetime-sql">cli</a> or <a href="/http/database#post-v1databasename_or_identitysql">http</a> api.
Another for subscriptions issued via the <a href="/sdks/rust#subscribe-to-queries">sdk</a> or WebSocket api.</p>
<h2 class="anchor anchorWithStickyNavbar_wKCU" id="subscriptions">Subscriptions<a href="#subscriptions" class="hash-link" aria-label="Direct link to Subscriptions" title="Direct link to Subscriptions" translate="no"></a></h2>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">SELECT projection FROM relation [ WHERE predicate ]</span><br></span></code></pre></div></div>
<p>The subscription language is strictly a query language.
Its sole purpose is to replicate a subset of the rows in the database,
and to <strong>automatically</strong> update them in realtime as the database changes.</p>
<p>There is no context for manually updating this view.
Hence data manipulation commands like <code>INSERT</code> and <code>DELETE</code> are not supported.</p>
<blockquote>
<p>NOTE: Because subscriptions are evaluated in realtime,
performance is critical, and as a result,
additional restrictions are applied over ad hoc queries.
These restrictions are highlighted below.</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="select">SELECT<a href="#select" class="hash-link" aria-label="Direct link to SELECT" title="Direct link to SELECT" translate="no"></a></h3>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">SELECT ( &#x27;*&#x27; | table &#x27;.&#x27; &#x27;*&#x27; )</span><br></span></code></pre></div></div>
<p>The <code>SELECT</code> clause determines the table that is being subscribed to.
Since the subscription api is purely a replication api,
a query may only return rows from a single table,
and it must return the entire row.
Individual column projections are not allowed.</p>
<p>A <code>*</code> projection is allowed when the table is unambiguous,
otherwise it must be qualified with the appropriate table name.</p>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="examples">Examples<a href="#examples" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h4>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Subscribe to all rows of a table</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Inventory</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6272A4">-- Qualify the `*` projection with the table</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#F8F8F2"> item.</span><span style="color:#FF79C6">*</span><span style="color:#FF79C6"> from</span><span style="color:#F8F8F2"> Inventory item</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6272A4">-- Subscribe to all customers who have orders totaling more than $1000</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#F8F8F2"> customer.</span><span style="color:#FF79C6">*</span></span>
<span class="line"><span style="color:#FF79C6">FROM</span><span style="color:#F8F8F2"> Customers customer </span><span style="color:#FF79C6">JOIN</span><span style="color:#F8F8F2"> Orders o </span><span style="color:#FF79C6">ON</span><span style="color:#BD93F9"> customer</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">id</span><span style="color:#FF79C6"> =</span><span style="color:#BD93F9"> o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">customer_id</span></span>
<span class="line"><span style="color:#FF79C6">WHERE</span><span style="color:#BD93F9"> o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">amount</span><span style="color:#FF79C6"> &gt;</span><span style="color:#BD93F9"> 1000</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6272A4">-- INVALID: Must return `Customers` or `Orders`, but not both</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span></span>
<span class="line"><span style="color:#FF79C6">FROM</span><span style="color:#F8F8F2"> Customers customer </span><span style="color:#FF79C6">JOIN</span><span style="color:#F8F8F2"> Orders o </span><span style="color:#FF79C6">ON</span><span style="color:#BD93F9"> customer</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">id</span><span style="color:#FF79C6"> =</span><span style="color:#BD93F9"> o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">customer_id</span></span>
<span class="line"><span style="color:#FF79C6">WHERE</span><span style="color:#BD93F9"> o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">amount</span><span style="color:#FF79C6"> &gt;</span><span style="color:#BD93F9"> 1000</span></span></code></pre>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="from">FROM<a href="#from" class="hash-link" aria-label="Direct link to FROM" title="Direct link to FROM" translate="no"></a></h3>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">FROM table [ [AS] alias ] [ [INNER] JOIN table [ [AS] alias ] ON column &#x27;=&#x27; column ]</span><br></span></code></pre></div></div>
<p>While you can only subscribe to rows from a single table,
you may reference two tables in the <code>FROM</code> clause using a <code>JOIN</code>.
A <code>JOIN</code> selects all combinations of rows from its input tables,
and <code>ON</code> determines which combinations are considered.</p>
<p>Subscriptions do not support joins of more than two tables.</p>
<p>For any column referenced in <code>ON</code> clause of a <code>JOIN</code>,
it must be qualified with the appropriate table name or alias.</p>
<p>In order for a <code>JOIN</code> to be evaluated efficiently,
subscriptions require an index to be defined on both join columns.</p>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="example">Example<a href="#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no"></a></h4>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Subscribe to all orders of products with less than 10 items in stock.</span></span>
<span class="line"><span style="color:#6272A4">-- Must have an index on the `product_id` column of the `Orders` table,</span></span>
<span class="line"><span style="color:#6272A4">-- as well as the `id` column of the `Product` table.</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#F8F8F2"> o.</span><span style="color:#FF79C6">*</span></span>
<span class="line"><span style="color:#FF79C6">FROM</span><span style="color:#F8F8F2"> Orders o </span><span style="color:#FF79C6">JOIN</span><span style="color:#F8F8F2"> Inventory product </span><span style="color:#FF79C6">ON</span><span style="color:#BD93F9"> o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">product_id</span><span style="color:#FF79C6"> =</span><span style="color:#BD93F9"> product</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">id</span></span>
<span class="line"><span style="color:#FF79C6">WHERE</span><span style="color:#BD93F9"> product</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">quantity</span><span style="color:#FF79C6"> &lt;</span><span style="color:#BD93F9"> 10</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6272A4">-- Subscribe to all products that have at least one purchase</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#F8F8F2"> product.</span><span style="color:#FF79C6">*</span></span>
<span class="line"><span style="color:#FF79C6">FROM</span><span style="color:#F8F8F2"> Orders o </span><span style="color:#FF79C6">JOIN</span><span style="color:#F8F8F2"> Inventory product </span><span style="color:#FF79C6">ON</span><span style="color:#BD93F9"> o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">product_id</span><span style="color:#FF79C6"> =</span><span style="color:#BD93F9"> product</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">id</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6272A4">-- INVALID: Must qualify the column names referenced in `ON`</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#F8F8F2"> product.</span><span style="color:#FF79C6">*</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Orders </span><span style="color:#FF79C6">JOIN</span><span style="color:#F8F8F2"> Inventory product </span><span style="color:#FF79C6">ON</span><span style="color:#F8F8F2"> product_id </span><span style="color:#FF79C6">=</span><span style="color:#F8F8F2"> id</span></span></code></pre>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="where">WHERE<a href="#where" class="hash-link" aria-label="Direct link to WHERE" title="Direct link to WHERE" translate="no"></a></h3>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">predicate</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = expr</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | predicate AND predicate</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | predicate OR predicate</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">expr</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = literal</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | column</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | expr op expr</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">op</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = &#x27;=&#x27;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | &#x27;&lt;&#x27;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | &#x27;&gt;&#x27;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | &#x27;&lt;&#x27; &#x27;=&#x27;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | &#x27;&gt;&#x27; &#x27;=&#x27;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | &#x27;!&#x27; &#x27;=&#x27;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | &#x27;&lt;&#x27; &#x27;&gt;&#x27;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">literal</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = INTEGER</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | STRING</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | HEX</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | TRUE</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | FALSE</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span></code></pre></div></div>
<p>While the <code>SELECT</code> clause determines the table,
the <code>WHERE</code> clause determines the rows in the subscription.</p>
<p>Arithmetic expressions are not supported.</p>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="examples-1">Examples<a href="#examples-1" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h4>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Find products that sell for more than $X</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Inventory </span><span style="color:#FF79C6">WHERE</span><span style="color:#F8F8F2"> price </span><span style="color:#FF79C6">&gt;</span><span style="color:#F8F8F2"> {X}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6272A4">-- Find products that sell for more than $X and have fewer than Y items in stock</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Inventory </span><span style="color:#FF79C6">WHERE</span><span style="color:#F8F8F2"> price </span><span style="color:#FF79C6">&gt;</span><span style="color:#F8F8F2"> {X} </span><span style="color:#FF79C6">AND</span><span style="color:#F8F8F2"> amount </span><span style="color:#FF79C6">&lt;</span><span style="color:#F8F8F2"> {Y}</span></span></code></pre>
<h2 class="anchor anchorWithStickyNavbar_wKCU" id="query-and-dml-data-manipulation-language">Query and DML (Data Manipulation Language)<a href="#query-and-dml-data-manipulation-language" class="hash-link" aria-label="Direct link to Query and DML (Data Manipulation Language)" title="Direct link to Query and DML (Data Manipulation Language)" translate="no"></a></h2>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="statements">Statements<a href="#statements" class="hash-link" aria-label="Direct link to Statements" title="Direct link to Statements" translate="no"></a></h3>
<ul>
<li><a href="#select-1">SELECT</a></li>
<li><a href="#insert">INSERT</a></li>
<li><a href="#delete">DELETE</a></li>
<li><a href="#update">UPDATE</a></li>
<li><a href="#set">SET</a></li>
<li><a href="#show">SHOW</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="select-1">SELECT<a href="#select-1" class="hash-link" aria-label="Direct link to SELECT" title="Direct link to SELECT" translate="no"></a></h3>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">SELECT projection FROM relation [ WHERE predicate ] [LIMIT NUM]</span><br></span></code></pre></div></div>
<p>The query languge is a strict superset of the subscription language.
The main differences are seen in column projections and <a href="#from-clause">joins</a>.</p>
<p>The subscription api only supports <code>*</code> projections,
but the query api supports both individual column projections,
as well as aggregations in the form of <code>COUNT</code>.</p>
<p>The subscription api limits the number of tables you can join,
and enforces index constraints on the join columns,
but the query language has no such constraints or limitations.</p>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="select-clause">SELECT Clause<a href="#select-clause" class="hash-link" aria-label="Direct link to SELECT Clause" title="Direct link to SELECT Clause" translate="no"></a></h4>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">projection</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = &#x27;*&#x27;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | table &#x27;.&#x27; &#x27;*&#x27;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | projExpr { &#x27;,&#x27; projExpr }</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | aggExpr</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">projExpr</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = column [ [ AS ] alias ]</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">aggExpr</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = COUNT &#x27;(&#x27; &#x27;*&#x27; &#x27;)&#x27; [AS] alias</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span></code></pre></div></div>
<p>The <code>SELECT</code> clause determines the columns that are returned.</p>
<h5 class="anchor anchorWithStickyNavbar_wKCU" id="examples-2">Examples<a href="#examples-2" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h5>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Select the items in my inventory</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Inventory;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6272A4">-- Select the names and prices of the items in my inventory</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#F8F8F2"> item_name, price </span><span style="color:#FF79C6">FROM</span><span style="color:#F8F8F2"> Inventory</span></span></code></pre>
<p>It also allows for counting the number of input rows via the <code>COUNT</code> function.
<code>COUNT</code> always returns a single row, even if the input is empty.</p>
<h5 class="anchor anchorWithStickyNavbar_wKCU" id="example-1">Example<a href="#example-1" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no"></a></h5>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Count the items in my inventory</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#8BE9FD"> COUNT</span><span style="color:#F8F8F2">(</span><span style="color:#FF79C6">*</span><span style="color:#F8F8F2">) </span><span style="color:#FF79C6">AS</span><span style="color:#F8F8F2"> n </span><span style="color:#FF79C6">FROM</span><span style="color:#F8F8F2"> Inventory</span></span></code></pre>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="from-clause">FROM Clause<a href="#from-clause" class="hash-link" aria-label="Direct link to FROM Clause" title="Direct link to FROM Clause" translate="no"></a></h4>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">FROM table [ [AS] alias ] { [INNER] JOIN table [ [AS] alias ] ON predicate }</span><br></span></code></pre></div></div>
<p>Unlike <a href="#from">subscriptions</a>, the query api supports joining more than two tables.</p>
<h5 class="anchor anchorWithStickyNavbar_wKCU" id="examples-3">Examples<a href="#examples-3" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h5>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Find all customers who ordered a particular product and when they ordered it</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#BD93F9"> customer</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">first_name</span><span style="color:#F8F8F2">, </span><span style="color:#BD93F9">customer</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">last_name</span><span style="color:#F8F8F2">, </span><span style="color:#BD93F9">o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">date</span></span>
<span class="line"><span style="color:#FF79C6">FROM</span><span style="color:#F8F8F2"> Customers customer</span></span>
<span class="line"><span style="color:#FF79C6">JOIN</span><span style="color:#F8F8F2"> Orders o </span><span style="color:#FF79C6">ON</span><span style="color:#BD93F9"> customer</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">id</span><span style="color:#FF79C6"> =</span><span style="color:#BD93F9"> o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">customer_id</span></span>
<span class="line"><span style="color:#FF79C6">JOIN</span><span style="color:#F8F8F2"> Inventory product </span><span style="color:#FF79C6">ON</span><span style="color:#BD93F9"> o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">product_id</span><span style="color:#FF79C6"> =</span><span style="color:#BD93F9"> product</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">id</span></span>
<span class="line"><span style="color:#FF79C6">WHERE</span><span style="color:#BD93F9"> product</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">name</span><span style="color:#FF79C6"> =</span><span style="color:#F8F8F2"> {product_name}</span></span></code></pre>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="where-clause">WHERE Clause<a href="#where-clause" class="hash-link" aria-label="Direct link to WHERE Clause" title="Direct link to WHERE Clause" translate="no"></a></h4>
<p>See <a href="#where">Subscriptions</a>.</p>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="limit-clause">LIMIT clause<a href="#limit-clause" class="hash-link" aria-label="Direct link to LIMIT clause" title="Direct link to LIMIT clause" translate="no"></a></h4>
<p>Limits the number of rows a query returns by specifying an upper bound.
The <code>LIMIT</code> may return fewer rows if the query itself returns fewer rows.
<code>LIMIT</code> does not order or transform its input in any way.</p>
<h5 class="anchor anchorWithStickyNavbar_wKCU" id="examples-4">Examples<a href="#examples-4" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h5>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Fetch an example row from my inventory</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Inventory </span><span style="color:#FF79C6">LIMIT</span><span style="color:#BD93F9"> 1</span></span></code></pre>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="insert">INSERT<a href="#insert" class="hash-link" aria-label="Direct link to INSERT" title="Direct link to INSERT" translate="no"></a></h3>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">INSERT INTO table [ &#x27;(&#x27; column { &#x27;,&#x27; column } &#x27;)&#x27; ] VALUES &#x27;(&#x27; literal { &#x27;,&#x27; literal } &#x27;)&#x27;</span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="examples-5">Examples<a href="#examples-5" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h4>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Inserting one row</span></span>
<span class="line"><span style="color:#FF79C6">INSERT INTO</span><span style="color:#F8F8F2"> Inventory (item_id, item_name) </span><span style="color:#FF79C6">VALUES</span><span style="color:#F8F8F2"> (</span><span style="color:#BD93F9">1</span><span style="color:#F8F8F2">, </span><span style="color:#E9F284">&#x27;</span><span style="color:#F1FA8C">health1</span><span style="color:#E9F284">&#x27;</span><span style="color:#F8F8F2">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6272A4">-- Inserting two rows</span></span>
<span class="line"><span style="color:#FF79C6">INSERT INTO</span><span style="color:#F8F8F2"> Inventory (item_id, item_name) </span><span style="color:#FF79C6">VALUES</span><span style="color:#F8F8F2"> (</span><span style="color:#BD93F9">1</span><span style="color:#F8F8F2">, </span><span style="color:#E9F284">&#x27;</span><span style="color:#F1FA8C">health1</span><span style="color:#E9F284">&#x27;</span><span style="color:#F8F8F2">), (</span><span style="color:#BD93F9">2</span><span style="color:#F8F8F2">, </span><span style="color:#E9F284">&#x27;</span><span style="color:#F1FA8C">health2</span><span style="color:#E9F284">&#x27;</span><span style="color:#F8F8F2">);</span></span></code></pre>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="delete">DELETE<a href="#delete" class="hash-link" aria-label="Direct link to DELETE" title="Direct link to DELETE" translate="no"></a></h3>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">DELETE FROM table [ WHERE predicate ]</span><br></span></code></pre></div></div>
<p>Deletes all rows from a table.
If <code>WHERE</code> is specified, only the matching rows are deleted.</p>
<p><code>DELETE</code> does not support joins.</p>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="examples-6">Examples<a href="#examples-6" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h4>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Delete all rows</span></span>
<span class="line"><span style="color:#FF79C6">DELETE</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Inventory;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6272A4">-- Delete all rows with a specific item_id</span></span>
<span class="line"><span style="color:#FF79C6">DELETE</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Inventory </span><span style="color:#FF79C6">WHERE</span><span style="color:#F8F8F2"> item_id </span><span style="color:#FF79C6">=</span><span style="color:#BD93F9"> 1</span><span style="color:#F8F8F2">;</span></span></code></pre>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="update">UPDATE<a href="#update" class="hash-link" aria-label="Direct link to UPDATE" title="Direct link to UPDATE" translate="no"></a></h3>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">UPDATE table SET [ &#x27;(&#x27; assignment { &#x27;,&#x27; assignment } &#x27;)&#x27; ] [ WHERE predicate ]</span><br></span></code></pre></div></div>
<p>Updates column values of existing rows in a table.
The columns are identified by the <code>assignment</code> defined as <code>column &#x27;=&#x27; literal</code>.
The column values are updated for all rows that match the <code>WHERE</code> condition.
The rows are updated after the <code>WHERE</code> condition is evaluated for all rows.</p>
<p><code>UPDATE</code> does not support joins.</p>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="examples-7">Examples<a href="#examples-7" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h4>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Update the item_name for all rows with a specific item_id</span></span>
<span class="line"><span style="color:#FF79C6">UPDATE</span><span style="color:#F8F8F2"> Inventory </span><span style="color:#FF79C6">SET</span><span style="color:#F8F8F2"> item_name </span><span style="color:#FF79C6">=</span><span style="color:#E9F284"> &#x27;</span><span style="color:#F1FA8C">new name</span><span style="color:#E9F284">&#x27;</span><span style="color:#FF79C6"> WHERE</span><span style="color:#F8F8F2"> item_id </span><span style="color:#FF79C6">=</span><span style="color:#BD93F9"> 1</span><span style="color:#F8F8F2">;</span></span></code></pre>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="set">SET<a href="#set" class="hash-link" aria-label="Direct link to SET" title="Direct link to SET" translate="no"></a></h3>
<blockquote>
<p>WARNING: The <code>SET</code> statement is experimental.
Compatibility with future versions of SpacetimeDB is not guaranteed.</p>
</blockquote>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">SET var ( TO | &#x27;=&#x27; ) literal</span><br></span></code></pre></div></div>
<p>Updates the value of a system variable.</p>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="show">SHOW<a href="#show" class="hash-link" aria-label="Direct link to SHOW" title="Direct link to SHOW" translate="no"></a></h3>
<blockquote>
<p>WARNING: The <code>SHOW</code> statement is experimental.
Compatibility with future versions of SpacetimeDB is not guaranteed.</p>
</blockquote>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">SHOW var</span><br></span></code></pre></div></div>
<p>Returns the value of a system variable.</p>
<h2 class="anchor anchorWithStickyNavbar_wKCU" id="system-variables">System Variables<a href="#system-variables" class="hash-link" aria-label="Direct link to System Variables" title="Direct link to System Variables" translate="no"></a></h2>
<blockquote>
<p>WARNING: System variables are experimental.
Compatibility with future versions of SpacetimeDB is not guaranteed.</p>
</blockquote>
<ul>
<li>
<p><code>row_limit</code></p>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Reject queries that scan more than 10K rows</span></span>
<span class="line"><span style="color:#FF79C6">SET</span><span style="color:#F8F8F2"> row_limit </span><span style="color:#FF79C6">=</span><span style="color:#BD93F9"> 10000</span></span></code></pre>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_wKCU" id="data-types">Data types<a href="#data-types" class="hash-link" aria-label="Direct link to Data types" title="Direct link to Data types" translate="no"></a></h2>
<p>The set of data types that SpacetimeDB supports is defined by SATS,
the Spacetime Algebraic Type System.</p>
<p>Spacetime SQL however does not support all of SATS,
specifically in the way of product and sum types.
The language itself does not provide a way to construct them,
nore does it provide any scalar operators for them.
Nevertheless rows containing them can be returned to clients.</p>
<h2 class="anchor anchorWithStickyNavbar_wKCU" id="literals">Literals<a href="#literals" class="hash-link" aria-label="Direct link to Literals" title="Direct link to Literals" translate="no"></a></h2>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">literal = INTEGER | FLOAT | STRING | HEX | TRUE | FALSE ;</span><br></span></code></pre></div></div>
<p>The following describes how to construct literal values for SATS data types in Spacetime SQL.</p>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="booleans">Booleans<a href="#booleans" class="hash-link" aria-label="Direct link to Booleans" title="Direct link to Booleans" translate="no"></a></h3>
<p>Booleans are represented using the canonical atoms <code>true</code> or <code>false</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="integers">Integers<a href="#integers" class="hash-link" aria-label="Direct link to Integers" title="Direct link to Integers" translate="no"></a></h3>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">INTEGER</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = [ &#x27;+&#x27; | &#x27;-&#x27; ] NUM</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | [ &#x27;+&#x27; | &#x27;-&#x27; ] NUM &#x27;E&#x27; [ &#x27;+&#x27; ] NUM</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">NUM</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = DIGIT { DIGIT }</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">DIGIT</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = 0..9</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span></code></pre></div></div>
<p>SATS supports multiple fixed width integer types.
The concrete type of a literal is inferred from the context.</p>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="examples-8">Examples<a href="#examples-8" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h4>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- All products that sell for more than $1000</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Inventory </span><span style="color:#FF79C6">WHERE</span><span style="color:#F8F8F2"> price </span><span style="color:#FF79C6">&gt;</span><span style="color:#BD93F9"> 1000</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Inventory </span><span style="color:#FF79C6">WHERE</span><span style="color:#F8F8F2"> price </span><span style="color:#FF79C6">&gt;</span><span style="color:#F8F8F2"> 1e3</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Inventory </span><span style="color:#FF79C6">WHERE</span><span style="color:#F8F8F2"> price </span><span style="color:#FF79C6">&gt;</span><span style="color:#F8F8F2"> 1E3</span></span></code></pre>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="floats">Floats<a href="#floats" class="hash-link" aria-label="Direct link to Floats" title="Direct link to Floats" translate="no"></a></h3>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">FLOAT</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = [ &#x27;+&#x27; | &#x27;-&#x27; ] [ NUM ] &#x27;.&#x27; NUM</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | [ &#x27;+&#x27; | &#x27;-&#x27; ] [ NUM ] &#x27;.&#x27; NUM &#x27;E&#x27; [ &#x27;+&#x27; | &#x27;-&#x27; ] NUM</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span></code></pre></div></div>
<p>SATS supports both 32 and 64 bit floating point types.
The concrete type of a literal is inferred from the context.</p>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="examples-9">Examples<a href="#examples-9" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h4>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- All measurements where the temperature is greater than 105.3</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Measurements </span><span style="color:#FF79C6">WHERE</span><span style="color:#F8F8F2"> temperature </span><span style="color:#FF79C6">&gt;</span><span style="color:#BD93F9"> 105</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">3</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Measurements </span><span style="color:#FF79C6">WHERE</span><span style="color:#F8F8F2"> temperature </span><span style="color:#FF79C6">&gt;</span><span style="color:#F8F8F2"> 1053e</span><span style="color:#FF79C6">-</span><span style="color:#BD93F9">1</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Measurements </span><span style="color:#FF79C6">WHERE</span><span style="color:#F8F8F2"> temperature </span><span style="color:#FF79C6">&gt;</span><span style="color:#F8F8F2"> 1053E</span><span style="color:#FF79C6">-</span><span style="color:#BD93F9">1</span></span></code></pre>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="strings">Strings<a href="#strings" class="hash-link" aria-label="Direct link to Strings" title="Direct link to Strings" translate="no"></a></h3>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">STRING</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = &quot;&#x27;&quot; { &quot;&#x27;&#x27;&quot; | CHAR } &quot;&#x27;&quot;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span></code></pre></div></div>
<p><code>CHAR</code> is defined as a <code>utf-8</code> encoded unicode character.</p>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="examples-10">Examples<a href="#examples-10" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h4>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Customers </span><span style="color:#FF79C6">WHERE</span><span style="color:#F8F8F2"> first_name </span><span style="color:#FF79C6">=</span><span style="color:#E9F284"> &#x27;</span><span style="color:#F1FA8C">John</span><span style="color:#E9F284">&#x27;</span></span></code></pre>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="hex">Hex<a href="#hex" class="hash-link" aria-label="Direct link to Hex" title="Direct link to Hex" translate="no"></a></h3>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">HEX</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = &#x27;X&#x27; &quot;&#x27;&quot; { HEXIT } &quot;&#x27;&quot;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | &#x27;0&#x27; &#x27;x&#x27; { HEXIT }</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">HEXIT</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = DIGIT | a..f | A..F</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span></code></pre></div></div>
<p>Hex literals can represent <a href="/#identity">Identity</a>, <a href="/#connectionid">ConnectionId</a>, or binary types.
The type is ultimately inferred from the context.</p>
<h4 class="anchor anchorWithStickyNavbar_wKCU" id="examples-11">Examples<a href="#examples-11" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h4>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#F8F8F2"> Program </span><span style="color:#FF79C6">WHERE</span><span style="color:#F8F8F2"> hash_value </span><span style="color:#FF79C6">=</span><span style="color:#F8F8F2"> 0xABCD1234</span></span></code></pre>
<h2 class="anchor anchorWithStickyNavbar_wKCU" id="identifiers">Identifiers<a href="#identifiers" class="hash-link" aria-label="Direct link to Identifiers" title="Direct link to Identifiers" translate="no"></a></h2>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">identifier</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = LATIN { LATIN | DIGIT | &#x27;_&#x27; }</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | &#x27;&quot;&#x27; { &#x27;&quot;&quot;&#x27; | CHAR } &#x27;&quot;&#x27;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">LATIN</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = a..z | A..Z</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span></code></pre></div></div>
<p>Identifiers are tokens that identify database objects like tables or columns.
Spacetime SQL supports both quoted and unquoted identifiers.
Both types of identifiers are case sensitive.
Use quoted identifiers to avoid conflict with reserved SQL keywords,
or if your table or column contains non-alphanumeric characters.</p>
<p>Because SpacetimeDB uses a postgres compatible parser, identifiers which are
reserved in postgres are automatically reserved in Spacetime SQL. See <a href="https://www.postgresql.org/docs/current/sql-keywords-appendix.html" target="_blank" rel="noopener noreferrer">SQL Key Words in the PostgreSQL documentation</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="example-2">Example<a href="#example-2" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no"></a></h3>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- `ORDER` is a sql keyword and therefore needs to be quoted</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#E9F284"> &quot;</span><span style="color:#F1FA8C">Order</span><span style="color:#E9F284">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6272A4">-- A table containing `$` needs to be quoted as well</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#FF79C6"> *</span><span style="color:#FF79C6"> FROM</span><span style="color:#E9F284"> &quot;</span><span style="color:#F1FA8C">Balance$</span><span style="color:#E9F284">&quot;</span></span></code></pre>
<h2 class="anchor anchorWithStickyNavbar_wKCU" id="best-practices-for-performance-and-scalability">Best Practices for Performance and Scalability<a href="#best-practices-for-performance-and-scalability" class="hash-link" aria-label="Direct link to Best Practices for Performance and Scalability" title="Direct link to Best Practices for Performance and Scalability" translate="no"></a></h2>
<p>When designing your schema or crafting your queries,
consider the following best practices to ensure optimal performance:</p>
<ul>
<li>
<p><strong>Add Primary Key and/or Unique Constraints:</strong><br>
<!-- -->Constrain columns whose values are guaranteed to be distinct as either unique or primary keys.
The query planner can further optimize joins if it knows the join values to be unique.</p>
</li>
<li>
<p><strong>Index Filtered Columns:</strong><br>
<!-- -->Index columns frequently used in a <code>WHERE</code> clause.
Indexes reduce the number of rows scanned by the query engine.</p>
</li>
<li>
<p><strong>Index Join Columns:</strong><br>
<!-- -->Index columns whose values are frequently used as join keys.
These are columns that are used in the <code>ON</code> condition of a <code>JOIN</code>.</p>
<p>Again, this reduces the number of rows that must be scanned to answer a query.
It is also critical for the performance of subscription updates --
so much so that it is a compiler-enforced requirement,
as mentioned in the <a href="#from">subscription</a> section.</p>
<p>If a column that has already been constrained as unique or a primary key,
it is not necessary to explicitly index it as well,
since these constraints automatically index the column in question.</p>
</li>
<li>
<p><strong>Optimize Join Order:</strong><br>
<!-- -->Place tables with the most selective filters first in your <code>FROM</code> clause.
This minimizes intermediate result sizes and improves query efficiency.</p>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_wKCU" id="example-3">Example<a href="#example-3" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no"></a></h3>
<p>Take the following query that was used in a previous example:</p>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Find all customers who ordered a particular product and when they ordered it</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#BD93F9"> customer</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">first_name</span><span style="color:#F8F8F2">, </span><span style="color:#BD93F9">customer</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">last_name</span><span style="color:#F8F8F2">, </span><span style="color:#BD93F9">o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">date</span></span>
<span class="line"><span style="color:#FF79C6">FROM</span><span style="color:#F8F8F2"> Customers customer</span></span>
<span class="line"><span style="color:#FF79C6">JOIN</span><span style="color:#F8F8F2"> Orders o </span><span style="color:#FF79C6">ON</span><span style="color:#BD93F9"> customer</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">id</span><span style="color:#FF79C6"> =</span><span style="color:#BD93F9"> o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">customer_id</span></span>
<span class="line"><span style="color:#FF79C6">JOIN</span><span style="color:#F8F8F2"> Inventory product </span><span style="color:#FF79C6">ON</span><span style="color:#BD93F9"> o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">product_id</span><span style="color:#FF79C6"> =</span><span style="color:#BD93F9"> product</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">id</span></span>
<span class="line"><span style="color:#FF79C6">WHERE</span><span style="color:#BD93F9"> product</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">name</span><span style="color:#FF79C6"> =</span><span style="color:#F8F8F2"> {product_name}</span></span></code></pre>
<p>In order to conform with the best practices for optimizing performance and scalability:</p>
<ul>
<li>An index should be defined on <code>Inventory.name</code> because we are filtering on that column.</li>
<li><code>Inventory.id</code> and <code>Customers.id</code> should be defined as primary keys.</li>
<li>Additionally non-unique indexes should be defined on <code>Orders.product_id</code> and <code>Orders.customer_id</code>.</li>
<li><code>Inventory</code> should appear first in the <code>FROM</code> clause because it is the only table mentioned in the <code>WHERE</code> clause.</li>
<li><code>Orders</code> should come next because it joins directly with <code>Inventory</code>.</li>
<li><code>Customers</code> should come next because it joins directly with <code>Orders</code>.</li>
</ul>
<div class="theme-tabs-container tabs-container tabList_MbSD"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_Ssy3 tabs__item--active">Rust</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_Ssy3">C#</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_sydm"><pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#F8F8F2">#[table(</span></span>
<span class="line"><span style="color:#F8F8F2"> name </span><span style="color:#FF79C6">=</span><span style="color:#8BE9FD;font-style:italic"> Inventory</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> index(name </span><span style="color:#FF79C6">=</span><span style="color:#F8F8F2"> product_name, btree </span><span style="color:#FF79C6">=</span><span style="color:#F8F8F2"> [name]),</span></span>
<span class="line"><span style="color:#F8F8F2"> public</span></span>
<span class="line"><span style="color:#F8F8F2">)]</span></span>
<span class="line"><span style="color:#FF79C6">struct</span><span style="color:#8BE9FD;font-style:italic"> Inventory</span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#F8F8F2"> #[primary_key]</span></span>
<span class="line"><span style="color:#F8F8F2"> id</span><span style="color:#FF79C6">:</span><span style="color:#8BE9FD;font-style:italic"> u64</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> name</span><span style="color:#FF79C6">:</span><span style="color:#8BE9FD;font-style:italic"> String</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#FF79C6"> ..</span></span>
<span class="line"><span style="color:#F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F8F8F2">#[table(</span></span>
<span class="line"><span style="color:#F8F8F2"> name </span><span style="color:#FF79C6">=</span><span style="color:#8BE9FD;font-style:italic"> Customers</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> public</span></span>
<span class="line"><span style="color:#F8F8F2">)]</span></span>
<span class="line"><span style="color:#FF79C6">struct</span><span style="color:#8BE9FD;font-style:italic"> Customers</span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#F8F8F2"> #[primary_key]</span></span>
<span class="line"><span style="color:#F8F8F2"> id</span><span style="color:#FF79C6">:</span><span style="color:#8BE9FD;font-style:italic"> u64</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> first_name</span><span style="color:#FF79C6">:</span><span style="color:#8BE9FD;font-style:italic"> String</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> last_name</span><span style="color:#FF79C6">:</span><span style="color:#8BE9FD;font-style:italic"> String</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#FF79C6"> ..</span></span>
<span class="line"><span style="color:#F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F8F8F2">#[table(</span></span>
<span class="line"><span style="color:#F8F8F2"> name </span><span style="color:#FF79C6">=</span><span style="color:#8BE9FD;font-style:italic"> Orders</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> public</span></span>
<span class="line"><span style="color:#F8F8F2">)]</span></span>
<span class="line"><span style="color:#FF79C6">struct</span><span style="color:#8BE9FD;font-style:italic"> Orders</span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#F8F8F2"> #[primary_key]</span></span>
<span class="line"><span style="color:#F8F8F2"> id</span><span style="color:#FF79C6">:</span><span style="color:#8BE9FD;font-style:italic"> u64</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> #[unique]</span></span>
<span class="line"><span style="color:#F8F8F2"> product_id</span><span style="color:#FF79C6">:</span><span style="color:#8BE9FD;font-style:italic"> u64</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> #[unique]</span></span>
<span class="line"><span style="color:#F8F8F2"> customer_id</span><span style="color:#FF79C6">:</span><span style="color:#8BE9FD;font-style:italic"> u64</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#FF79C6"> ..</span></span>
<span class="line"><span style="color:#F8F8F2">}</span></span></code></pre></div><div role="tabpanel" class="tabItem_sydm" hidden=""><pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#F8F8F2">[</span><span style="color:#8BE9FD;font-style:italic">SpacetimeDB</span><span style="color:#F8F8F2">.</span><span style="color:#8BE9FD;font-style:italic">Table</span><span style="color:#F8F8F2">(Name </span><span style="color:#FF79C6">=</span><span style="color:#E9F284"> &quot;</span><span style="color:#F1FA8C">Inventory</span><span style="color:#E9F284">&quot;</span><span style="color:#F8F8F2">)]</span></span>
<span class="line"><span style="color:#F8F8F2">[</span><span style="color:#8BE9FD;font-style:italic">SpacetimeDB</span><span style="color:#F8F8F2">.</span><span style="color:#8BE9FD;font-style:italic">Index</span><span style="color:#F8F8F2">(Name </span><span style="color:#FF79C6">=</span><span style="color:#E9F284"> &quot;</span><span style="color:#F1FA8C">product_name</span><span style="color:#E9F284">&quot;</span><span style="color:#F8F8F2">, BTree </span><span style="color:#FF79C6">=</span><span style="color:#F8F8F2"> [</span><span style="color:#E9F284">&quot;</span><span style="color:#F1FA8C">name</span><span style="color:#E9F284">&quot;</span><span style="color:#F8F8F2">])]</span></span>
<span class="line"><span style="color:#FF79C6">public</span><span style="color:#FF79C6"> partial</span><span style="color:#FF79C6"> struct</span><span style="color:#8BE9FD;font-style:italic"> Inventory</span></span>
<span class="line"><span style="color:#F8F8F2">{</span></span>
<span class="line"><span style="color:#F8F8F2"> [</span><span style="color:#8BE9FD;font-style:italic">SpacetimeDB</span><span style="color:#F8F8F2">.</span><span style="color:#8BE9FD;font-style:italic">PrimaryKey</span><span style="color:#F8F8F2">]</span></span>
<span class="line"><span style="color:#FF79C6"> public</span><span style="color:#FF79C6"> long</span><span style="color:#F8F8F2"> id;</span></span>
<span class="line"><span style="color:#FF79C6"> public</span><span style="color:#FF79C6"> string</span><span style="color:#F8F8F2"> name;</span></span>
<span class="line"><span style="color:#F8F8F2"> ..</span></span>
<span class="line"><span style="color:#F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F8F8F2">[</span><span style="color:#8BE9FD;font-style:italic">SpacetimeDB</span><span style="color:#F8F8F2">.</span><span style="color:#8BE9FD;font-style:italic">Table</span><span style="color:#F8F8F2">(Name </span><span style="color:#FF79C6">=</span><span style="color:#E9F284"> &quot;</span><span style="color:#F1FA8C">Customers</span><span style="color:#E9F284">&quot;</span><span style="color:#F8F8F2">)]</span></span>
<span class="line"><span style="color:#FF79C6">public</span><span style="color:#FF79C6"> partial</span><span style="color:#FF79C6"> struct</span><span style="color:#8BE9FD;font-style:italic"> Customers</span></span>
<span class="line"><span style="color:#F8F8F2">{</span></span>
<span class="line"><span style="color:#F8F8F2"> [</span><span style="color:#8BE9FD;font-style:italic">SpacetimeDB</span><span style="color:#F8F8F2">.</span><span style="color:#8BE9FD;font-style:italic">PrimaryKey</span><span style="color:#F8F8F2">]</span></span>
<span class="line"><span style="color:#FF79C6"> public</span><span style="color:#FF79C6"> long</span><span style="color:#F8F8F2"> id;</span></span>
<span class="line"><span style="color:#FF79C6"> public</span><span style="color:#FF79C6"> string</span><span style="color:#F8F8F2"> first_name;</span></span>
<span class="line"><span style="color:#FF79C6"> public</span><span style="color:#FF79C6"> string</span><span style="color:#F8F8F2"> last_name;</span></span>
<span class="line"><span style="color:#F8F8F2"> ..</span></span>
<span class="line"><span style="color:#F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F8F8F2">[</span><span style="color:#8BE9FD;font-style:italic">SpacetimeDB</span><span style="color:#F8F8F2">.</span><span style="color:#8BE9FD;font-style:italic">Table</span><span style="color:#F8F8F2">(Name </span><span style="color:#FF79C6">=</span><span style="color:#E9F284"> &quot;</span><span style="color:#F1FA8C">Orders</span><span style="color:#E9F284">&quot;</span><span style="color:#F8F8F2">)]</span></span>
<span class="line"><span style="color:#FF79C6">public</span><span style="color:#FF79C6"> partial</span><span style="color:#FF79C6"> struct</span><span style="color:#8BE9FD;font-style:italic"> Orders</span></span>
<span class="line"><span style="color:#F8F8F2">{</span></span>
<span class="line"><span style="color:#F8F8F2"> [</span><span style="color:#8BE9FD;font-style:italic">SpacetimeDB</span><span style="color:#F8F8F2">.</span><span style="color:#8BE9FD;font-style:italic">PrimaryKey</span><span style="color:#F8F8F2">]</span></span>
<span class="line"><span style="color:#FF79C6"> public</span><span style="color:#FF79C6"> long</span><span style="color:#F8F8F2"> id;</span></span>
<span class="line"><span style="color:#F8F8F2"> [</span><span style="color:#8BE9FD;font-style:italic">SpacetimeDB</span><span style="color:#F8F8F2">.</span><span style="color:#8BE9FD;font-style:italic">Unique</span><span style="color:#F8F8F2">]</span></span>
<span class="line"><span style="color:#FF79C6"> public</span><span style="color:#FF79C6"> long</span><span style="color:#F8F8F2"> product_id;</span></span>
<span class="line"><span style="color:#F8F8F2"> [</span><span style="color:#8BE9FD;font-style:italic">SpacetimeDB</span><span style="color:#F8F8F2">.</span><span style="color:#8BE9FD;font-style:italic">Unique</span><span style="color:#F8F8F2">]</span></span>
<span class="line"><span style="color:#FF79C6"> public</span><span style="color:#FF79C6"> long</span><span style="color:#F8F8F2"> customer_id;</span></span>
<span class="line"><span style="color:#F8F8F2"> ..</span></span>
<span class="line"><span style="color:#F8F8F2">}</span></span></code></pre></div></div></div>
<pre tabindex="0" class="codeBlockStandalone_pMzE thin-scrollbar codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="line"><span style="color:#6272A4">-- Find all customers who ordered a particular product and when they ordered it</span></span>
<span class="line"><span style="color:#FF79C6">SELECT</span><span style="color:#BD93F9"> c</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">first_name</span><span style="color:#F8F8F2">, </span><span style="color:#BD93F9">c</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">last_name</span><span style="color:#F8F8F2">, </span><span style="color:#BD93F9">o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">date</span></span>
<span class="line"><span style="color:#FF79C6">FROM</span><span style="color:#F8F8F2"> Inventory product</span></span>
<span class="line"><span style="color:#FF79C6">JOIN</span><span style="color:#F8F8F2"> Orders o </span><span style="color:#FF79C6">ON</span><span style="color:#BD93F9"> product</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">id</span><span style="color:#FF79C6"> =</span><span style="color:#BD93F9"> o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">product_id</span></span>
<span class="line"><span style="color:#FF79C6">JOIN</span><span style="color:#F8F8F2"> Customers c </span><span style="color:#FF79C6">ON</span><span style="color:#BD93F9"> c</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">id</span><span style="color:#FF79C6"> =</span><span style="color:#BD93F9"> o</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">customer_id</span></span>
<span class="line"><span style="color:#FF79C6">WHERE</span><span style="color:#BD93F9"> product</span><span style="color:#F8F8F2">.</span><span style="color:#BD93F9">name</span><span style="color:#FF79C6"> =</span><span style="color:#F8F8F2"> {product_name};</span></span></code></pre>
<h2 class="anchor anchorWithStickyNavbar_wKCU" id="appendix">Appendix<a href="#appendix" class="hash-link" aria-label="Direct link to Appendix" title="Direct link to Appendix" translate="no"></a></h2>
<p>Common production rules that have been used throughout this document.</p>
<div class="language-ebnf codeBlockContainer_HZVP theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_p1l2"><pre tabindex="0" class="prism-code language-ebnf codeBlock_qbrE thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_ckKi"><span class="token-line" style="color:#bfc7d5"><span class="token plain">table</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = identifier</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">alias</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = identifier</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">var</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = identifier</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">column</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> = identifier</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | identifier &#x27;.&#x27; identifier</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> ;</span><br></span></code></pre></div></div></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/sdks/typescript"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">TypeScript Reference</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/sql/pg-wire"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">PostgreSQL Wire Protocol (PGWire)</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_Ea_L thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#subscriptions" class="table-of-contents__link toc-highlight">Subscriptions</a><ul><li><a href="#select" class="table-of-contents__link toc-highlight">SELECT</a></li><li><a href="#from" class="table-of-contents__link toc-highlight">FROM</a></li><li><a href="#where" class="table-of-contents__link toc-highlight">WHERE</a></li></ul></li><li><a href="#query-and-dml-data-manipulation-language" class="table-of-contents__link toc-highlight">Query and DML (Data Manipulation Language)</a><ul><li><a href="#statements" class="table-of-contents__link toc-highlight">Statements</a></li><li><a href="#select-1" class="table-of-contents__link toc-highlight">SELECT</a></li><li><a href="#insert" class="table-of-contents__link toc-highlight">INSERT</a></li><li><a href="#delete" class="table-of-contents__link toc-highlight">DELETE</a></li><li><a href="#update" class="table-of-contents__link toc-highlight">UPDATE</a></li><li><a href="#set" class="table-of-contents__link toc-highlight">SET</a></li><li><a href="#show" class="table-of-contents__link toc-highlight">SHOW</a></li></ul></li><li><a href="#system-variables" class="table-of-contents__link toc-highlight">System Variables</a></li><li><a href="#data-types" class="table-of-contents__link toc-highlight">Data types</a></li><li><a href="#literals" class="table-of-contents__link toc-highlight">Literals</a><ul><li><a href="#booleans" class="table-of-contents__link toc-highlight">Booleans</a></li><li><a href="#integers" class="table-of-contents__link toc-highlight">Integers</a></li><li><a href="#floats" class="table-of-contents__link toc-highlight">Floats</a></li><li><a href="#strings" class="table-of-contents__link toc-highlight">Strings</a></li><li><a href="#hex" class="table-of-contents__link toc-highlight">Hex</a></li></ul></li><li><a href="#identifiers" class="table-of-contents__link toc-highlight">Identifiers</a><ul><li><a href="#example-2" class="table-of-contents__link toc-highlight">Example</a></li></ul></li><li><a href="#best-practices-for-performance-and-scalability" class="table-of-contents__link toc-highlight">Best Practices for Performance and Scalability</a><ul><li><a href="#example-3" class="table-of-contents__link toc-highlight">Example</a></li></ul></li><li><a href="#appendix" class="table-of-contents__link toc-highlight">Appendix</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer"><div class="container container-fluid"></div></footer></div>
</body>
</html>