Cheat Sheet Library

MySQL & PostgreSQL CLI Cheat Sheet

The mysql and psql command-line clients side by side. For SQL itself, see the SQL sheet. In psql, backslash commands need no ;. SQL statements always end with ;.

  • 39 entries
  • 8 sections
  • Updated
  • Click a command to see all its options

39 entries

On this page

Connect #

TaskMySQL / MariaDBPostgreSQL
Connect
Remote / port / db
Connection URLmysql://user:pw@host:3306/db
As the system admin (Linux)
Quitexit or \q\q
Helphelp\? (psql) / \h SELECT (SQL)

Explore #

TaskMySQLPostgreSQL
List databasesSHOW DATABASES;\l
Switch databaseUSE app;\c app
Current databaseSELECT DATABASE();SELECT current_database();
List tablesSHOW TABLES;\dt
Describe a tableDESCRIBE users;\d users
Show CREATE statementSHOW CREATE TABLE users;\d+ users
List users / rolesSELECT user, host FROM mysql.user;\du
List indexesSHOW INDEX FROM users;\di
Running queriesSHOW PROCESSLIST;SELECT * FROM pg_stat_activity;
Server versionSELECT VERSION();SELECT version();

Client Tricks #

TaskMySQLPostgreSQL
Vertical (row-per-line) outputend with \G instead of ;\x (toggle)
Show query timeshown automatically\timing
Run a .sql file
Edit the query in an editor\e\e
Export to CSVSELECT ... INTO OUTFILE '/tmp/x.csv'\copy (SELECT ...) TO 'x.csv' CSV HEADER
Clear the current input\c\r

Create a Database & User #

-- MySQL
CREATE DATABASE app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app'@'%' IDENTIFIED BY 'strong-password';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'%';

-- PostgreSQL
CREATE USER app WITH PASSWORD 'strong-password';
CREATE DATABASE app OWNER app;

Backup & Restore #

TaskMySQLPostgreSQL
Dump one database
Compressed / custom format
Restore
Restore custom format—
Dump everything

SQL Dialect Differences #

FeatureMySQLPostgreSQL
Auto-increment idid INT AUTO_INCREMENT PRIMARY KEYid INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY (or SERIAL)
Quote identifiers`order`"order"
Join stringsCONCAT(a, b)a || b or CONCAT(a, b)
UpsertINSERT ... ON DUPLICATE KEY UPDATE x = VALUES(x)INSERT ... ON CONFLICT (id) DO UPDATE SET x = EXCLUDED.x
JSONJSONJSON / JSONB (indexable)
BooleanTINYINT(1) (alias BOOLEAN)BOOLEAN
Case-insensitive LIKEdefault collationILIKE
Return inserted row—INSERT ... RETURNING id

Run It Quickly with Docker #

docker run -d --name pg -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres:17
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=secret -p 3306:3306 mysql:8.4
docker exec -it pg psql -U postgres
docker exec -it mysql mysql -u root -p

Service Control (Linux) #

TaskMySQLPostgreSQL
Status
Restart
Config file/etc/mysql/my.cnf/etc/postgresql/<version>/main/postgresql.conf
Allow remote accessbind-address = 0.0.0.0listen_addresses = '*' + pg_hba.conf