mirror of
https://github.com/clockworklabs/SpacetimeDB.git
synced 2026-05-15 04:08:02 -04:00
383 lines
88 KiB
HTML
383 lines
88 KiB
HTML
<!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 ( '*' | table '.' '*' )</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"> ></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"> ></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 '=' 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"> <</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"> = '='</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"> | '>'</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"> | '>' '='</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"> | '<' '>'</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">></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">></span><span style="color:#F8F8F2"> {X} </span><span style="color:#FF79C6">AND</span><span style="color:#F8F8F2"> amount </span><span style="color:#FF79C6"><</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"> = '*'</span><br></span><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"> | projExpr { ',' 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 '(' '*' ')' [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 [ '(' column { ',' column } ')' ] VALUES '(' literal { ',' literal } ')'</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">'</span><span style="color:#F1FA8C">health1</span><span style="color:#E9F284">'</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">'</span><span style="color:#F1FA8C">health1</span><span style="color:#E9F284">'</span><span style="color:#F8F8F2">), (</span><span style="color:#BD93F9">2</span><span style="color:#F8F8F2">, </span><span style="color:#E9F284">'</span><span style="color:#F1FA8C">health2</span><span style="color:#E9F284">'</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 [ '(' assignment { ',' assignment } ')' ] [ 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 '=' 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"> '</span><span style="color:#F1FA8C">new name</span><span style="color:#E9F284">'</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 | '=' ) 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"> = [ '+' | '-' ] NUM</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | [ '+' | '-' ] NUM 'E' [ '+' ] 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">></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">></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">></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"> = [ '+' | '-' ] [ NUM ] '.' NUM</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | [ '+' | '-' ] [ NUM ] '.' NUM 'E' [ '+' | '-' ] 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">></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">></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">></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"> = "'" { "''" | CHAR } "'"</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"> '</span><span style="color:#F1FA8C">John</span><span style="color:#E9F284">'</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"> = 'X' "'" { HEXIT } "'"</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | '0' 'x' { 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 | '_' }</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"> | '"' { '""' | CHAR } '"'</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"> "</span><span style="color:#F1FA8C">Order</span><span style="color:#E9F284">"</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"> "</span><span style="color:#F1FA8C">Balance$</span><span style="color:#E9F284">"</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"> "</span><span style="color:#F1FA8C">Inventory</span><span style="color:#E9F284">"</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"> "</span><span style="color:#F1FA8C">product_name</span><span style="color:#E9F284">"</span><span style="color:#F8F8F2">, BTree </span><span style="color:#FF79C6">=</span><span style="color:#F8F8F2"> [</span><span style="color:#E9F284">"</span><span style="color:#F1FA8C">name</span><span style="color:#E9F284">"</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"> "</span><span style="color:#F1FA8C">Customers</span><span style="color:#E9F284">"</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"> "</span><span style="color:#F1FA8C">Orders</span><span style="color:#E9F284">"</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 '.' 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> |