# SQL Reference

# Data types

  • INTEGER
  • BOOLEAN
  • VARCHAR
  • BLOB
  • TIMESTAMP

# Creating tables

CREATE TABLE IF NOT EXISTS customers (id INTEGER, customer_name VARCHAR, email VARCHAR, address VARCHAR, city VARCHAR, ip VARCHAR, country VARCHAR, age INTEGER, active BOOLEAN, PRIMARY KEY id);
CREATE TABLE IF NOT EXISTS products (id INTEGER, product VARCHAR, price VARCHAR, PRIMARY KEY id);
CREATE TABLE IF NOT EXISTS orders (id INTEGER, customerid INTEGER, productid INTEGER, PRIMARY KEY id);

# Indexes

CREATE INDEX ON customers(customer_name);

# Inserting or updating data

INSERT INTO customers (id, customer_name, email, address, city, ip, country, age, active) values (1, 'Isidro Behnen', 'ibehnen0@mail.ru', 'ibehnen0@chronoengine.com', 'Arvika', '2.124.67.107', 'SE', 24, true);
INSERT INTO products (id, product, price) values (1, 'Juice - V8, Tomato', '$4.04');

UPSERT will update the value if a row with the same primary key already exists:

UPSERT INTO customers (id, customer_name, email, address, city, ip, country, age, active) values (1, 'Isidro Behnen', 'ibehnen0@mail.ru', 'ibehnen0@chronoengine.com', 'Arvika', '2.124.67.108', 'SE', 24, true);
UPSERT INTO customers (id, customer_name, email, address, city, ip, country) values (2, 'Claudianus Boldt', 'cboldt1@adobe.com', 'cboldt1@elpais.com', 'Kimhae', '125.89.31.130', 'KR');
UPSERT INTO products (id, product, price) values (2, 'Grapes - Red', '$5.03');
UPSERT INTO orders (id, customerID, productID) values (1, 1, 2);

# Querying

SELECT id, customer_name, ip FROM customers;
SELECT id, customer_name, email FROM customers WHERE country = 'SE' AND city = 'Arvika';
SELECT id, customer_name FROM customers ORDER BY customer_name ASC;
SELECT COUNT() FROM orders INNER JOIN customers ON orders.productid = customers.id;
SELECT COUNT() FROM orders INNER JOIN customers ON orders.productid = customers.id WHERE orders.productid = 2;
SELECT * FROM customers GROUP BY country;
SELECT product FROM products WHERE product LIKE 'J';
SELECT id, product FROM products WHERE (id > 0 AND NOT products.id >= 10) AND (products.product LIKE 'J');

# Parameters

SELECT c.id, c.customer_name AS name, active FROM (customers AS c) WHERE id <= 3 AND active = true;

# Aggregations

  • COUNT
  • SUM
  • MAX
  • MIN
  • AVG
SELECT COUNT() AS c, SUM(age), MIN(age), MAX(age), AVG(age) FROM customers;
SELECT active, COUNT() as c, MIN(age), MAX(age) FROM customers GROUP BY active HAVING COUNT() > 0 ORDER BY active DESC;
SELECT active, COUNT() as c, MIN(age), MAX(age) FROM customers GROUP BY active HAVING COUNT() > 0 ORDER BY customer_name DESC;

# Transactions

BEGIN TRANSACTION; UPSERT INTO customers (id, age) VALUES (1, 25); UPSERT INTO products (id, price) VALUES (2, '$5.76'); COMMIT;

# Time travel

Time travel could be achieved in two ways

# by adding the 'BEFORE TX <TX_ID>' within the table name
# latest data
SELECT id, customer_name, ip as name FROM customers;

# past data
SELECT id, customer_name, ip FROM (customers BEFORE TX 5);
# or using the 'USE SNAPSHOT BEFORE TX <TX_ID>' command that will influence all the following commands
# latest data
SELECT id, customer_name as name FROM customers;

# past data
USE SNAPSHOT BEFORE TX 5;
SELECT id, customer_name, ip FROM customers;

After using the 'USE SNAPSHOT BEFORE TX <TX_ID>' command, it's then possible to reset to the latest with

USE SNAPSHOT BEFORE TX <LATEST_TX_ID>;