# SQL Cheat Sheet
## Connect to a Database
```sql
-- MySQL
mysql -u username -p database_name
-- PostgreSQL
psql -U username -d database_name
```
---
# Create Database
```sql
CREATE DATABASE company;
```
```sql
DROP DATABASE company;
```
---
# Use Database
```sql
USE company; -- MySQL
```
---
# Create Table
```sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(255) UNIQUE,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
PostgreSQL:
```sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(255) UNIQUE,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
# Insert Data
```sql
INSERT INTO users (name, email, age)
VALUES
('John', 'john@example.com', 25),
('Alice', 'alice@example.com', 31);
```
---
# Select
```sql
SELECT * FROM users;
```
```sql
SELECT name, email
FROM users;
```
---
# WHERE
```sql
SELECT *
FROM users
WHERE age > 18;
```
```sql
SELECT *
FROM users
WHERE age BETWEEN 18 AND 30;
```
```sql
SELECT *
FROM users
WHERE name = 'John';
```
---
# LIKE
```sql
SELECT *
FROM users
WHERE name LIKE 'A%';
```
Starts with A.
```sql
WHERE name LIKE '%son';
```
Ends with son.
```sql
WHERE name LIKE '%abc%';
```
Contains abc.
---
# IN
```sql
SELECT *
FROM users
WHERE age IN (18, 21, 25);
```
---
# NULL
```sql
SELECT *
FROM users
WHERE email IS NULL;
```
```sql
SELECT *
FROM users
WHERE email IS NOT NULL;
```
---
# ORDER BY
```sql
SELECT *
FROM users
ORDER BY age ASC;
```
```sql
ORDER BY age DESC;
```
---
# LIMIT
```sql
SELECT *
FROM users
LIMIT 10;
```
---
# OFFSET
```sql
SELECT *
FROM users
LIMIT 10 OFFSET 20;
```
---
# UPDATE
```sql
UPDATE users
SET age = 30
WHERE id = 1;
```
---
# DELETE
```sql
DELETE FROM users
WHERE id = 1;
```
---
# TRUNCATE
```sql
TRUNCATE TABLE users;
```
---
# DROP TABLE
```sql
DROP TABLE users;
```
---
# COUNT
```sql
SELECT COUNT(*)
FROM users;
```
---
# DISTINCT
```sql
SELECT DISTINCT age
FROM users;
```
---
# MIN / MAX
```sql
SELECT MIN(age), MAX(age)
FROM users;
```
---
# AVG
```sql
SELECT AVG(age)
FROM users;
```
---
# SUM
```sql
SELECT SUM(price)
FROM orders;
```
---
# GROUP BY
```sql
SELECT country,
COUNT(*)
FROM users
GROUP BY country;
```
---
# HAVING
```sql
SELECT country,
COUNT(*)
FROM users
GROUP BY country
HAVING COUNT(*) > 10;
```
---
# INNER JOIN
```sql
SELECT users.name,
orders.total
FROM users
INNER JOIN orders
ON users.id = orders.user_id;
```
---
# LEFT JOIN
```sql
SELECT users.name,
orders.total
FROM users
LEFT JOIN orders
ON users.id = orders.user_id;
```
---
# RIGHT JOIN
```sql
SELECT users.name,
orders.total
FROM users
RIGHT JOIN orders
ON users.id = orders.user_id;
```
---
# FULL OUTER JOIN (PostgreSQL)
```sql
SELECT *
FROM users
FULL OUTER JOIN orders
ON users.id = orders.user_id;
```
---
# Aliases
```sql
SELECT name AS username
FROM users;
```
---
# UNION
```sql
SELECT email
FROM customers
UNION
SELECT email
FROM employees;
```
---
# UNION ALL
```sql
SELECT email
FROM customers
UNION ALL
SELECT email
FROM employees;
```
---
# EXISTS
```sql
SELECT *
FROM users u
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.user_id = u.id
);
```
---
# Subquery
```sql
SELECT *
FROM users
WHERE id IN (
SELECT user_id
FROM orders
);
```
---
# CASE
```sql
SELECT name,
CASE
WHEN age >= 18 THEN 'Adult'
ELSE 'Minor'
END AS status
FROM users;
```
---
# CREATE INDEX
```sql
CREATE INDEX idx_email
ON users(email);
```
---
# DROP INDEX
```sql
DROP INDEX idx_email;
```
(PostgreSQL)
---
# Transactions
```sql
BEGIN;
UPDATE accounts
SET balance = balance - 100
WHERE id = 1;
UPDATE accounts
SET balance = balance + 100
WHERE id = 2;
COMMIT;
```
Rollback:
```sql
ROLLBACK;
```
---
# View
```sql
CREATE VIEW active_users AS
SELECT *
FROM users
WHERE active = TRUE;
```
---
# Foreign Key
```sql
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id)
);
```
---
# Upsert
PostgreSQL
```sql
INSERT INTO users(id, name)
VALUES (1, 'John')
ON CONFLICT(id)
DO UPDATE
SET name = EXCLUDED.name;
```
MySQL
```sql
INSERT INTO users(id, name)
VALUES (1, 'John')
ON DUPLICATE KEY UPDATE
name = VALUES(name);
```
---
# Common Date Functions
```sql
SELECT NOW();
```
```sql
SELECT CURRENT_DATE;
```
```sql
SELECT CURRENT_TIMESTAMP;
```
---
# String Functions
```sql
UPPER(name)
LOWER(name)
LENGTH(name)
TRIM(name)
CONCAT(first_name, ' ', last_name)
```
---
# Numeric Functions
```sql
ROUND(price, 2)
ABS(number)
CEIL(number)
FLOOR(number)
```
---
# Pagination
```sql
SELECT *
FROM products
ORDER BY id
LIMIT 20 OFFSET 40;
```
---
# Find Duplicates
```sql
SELECT email,
COUNT(*)
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
```
---
# Delete Duplicates
```sql
DELETE FROM users
WHERE id NOT IN (
SELECT MIN(id)
FROM users
GROUP BY email
);
```
---
# Top 10 Highest Salaries
```sql
SELECT *
FROM employees
ORDER BY salary DESC
LIMIT 10;
```
---
# Random Row
PostgreSQL
```sql
SELECT *
FROM users
ORDER BY RANDOM()
LIMIT 1;
```
MySQL
```sql
SELECT *
FROM users
ORDER BY RAND()
LIMIT 1;
```
---
# Show Tables
MySQL
```sql
SHOW TABLES;
```
PostgreSQL
```sql
\dt
```
---
# Describe Table
MySQL
```sql
DESCRIBE users;
```
PostgreSQL
```sql
\d users
```
---
# Backup
MySQL
```bash
mysqldump -u root -p database > backup.sql
```
PostgreSQL
```bash
pg_dump database > backup.sql
```
---
# Restore
MySQL
```bash
mysql database < backup.sql
```
PostgreSQL
```bash
psql database < backup.sql
```
Anonymous pastes are kept up to 90 days. Sign up free to keep yours and track views.