چیت شیت PostgreSQL
یک مرجع PostgreSQL قابلجستجو و قابلچاپ: دستورات psql، JSONB، آرایهها، CTE ها، توابع پنجره، ایندکسها، نقشها و EXPLAIN. رایگان.
psql meta-commands
15psql -U user -d mydb -h localhost
\l
\c mydb
\dt
\d users
\d+ users
\dn
\df
\du
\x
\timing
\e
\i script.sql
\copy users TO 'users.csv' CSV HEADER
\q
Querying
10SELECT * FROM users LIMIT 10;
WHERE name ILIKE '%ann%'
WHERE name ~* '^a.*z$'
ORDER BY score DESC NULLS LAST
SELECT DISTINCT ON (user_id) * FROM orders ORDER BY user_id, created_at DESC;
LIMIT 10 OFFSET 20
FETCH FIRST 5 ROWS ONLY
SELECT ... FOR UPDATE SKIP LOCKED
TABLESAMPLE SYSTEM (1)
LATERAL (SELECT ... LIMIT 3)
JSONB
14data->'user'
data->>'name'
data#>>'{user,address,city}'
data @> '{"active": true}'
data ? 'email'
data ?| array['a', 'b']
jsonb_set(data, '{name}', '"Sam"')
data - 'legacy_field'
data || '{"active": true}'
jsonb_array_elements(data->'items')
jsonb_each(data)
jsonb_build_object('id', id, 'name', name)
jsonb_agg(row_to_json(t))
jsonb_pretty(data)
Arrays & ranges
13tags TEXT[]
ARRAY['a', 'b', 'c']
tags[1]
WHERE 'php' = ANY(tags)
WHERE tags @> ARRAY['php','sql']
WHERE tags && ARRAY['php','go']
array_agg(name ORDER BY name)
unnest(tags)
array_length(tags, 1)
string_to_array('a,b', ',')
period tstzrange
WHERE period @> now()
EXCLUDE USING gist (room WITH =, period WITH &&)
CTEs & window functions
12WITH recent AS (SELECT ...) SELECT * FROM recent;
WITH RECURSIVE tree AS (... UNION ALL ...)
WITH del AS (DELETE ... RETURNING *) INSERT ...
ROW_NUMBER() OVER (ORDER BY score DESC)
RANK() / DENSE_RANK() OVER (...)
OVER (PARTITION BY user_id ORDER BY at)
LAG(price) OVER (ORDER BY day)
LEAD(price, 2) OVER (...)
SUM(amount) OVER (ORDER BY day)
AVG(x) OVER (ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)
NTILE(4) OVER (ORDER BY score)
FIRST_VALUE(name) OVER (...)
Upsert & RETURNING
9INSERT ... ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name;
ON CONFLICT DO NOTHING
ON CONFLICT ON CONSTRAINT users_pkey DO UPDATE ...
EXCLUDED.column
DO UPDATE ... WHERE users.updated_at < EXCLUDED.updated_at
INSERT ... RETURNING id;
UPDATE ... RETURNING *;
DELETE ... RETURNING id, email;
MERGE INTO t USING src ON ... (PG 15+)
Data types
13id BIGINT GENERATED ALWAYS AS IDENTITY
SERIAL / BIGSERIAL
UUID DEFAULT gen_random_uuid()
TEXT
NUMERIC(10, 2)
TIMESTAMPTZ
INTERVAL '2 days 3 hours'
BOOLEAN
JSONB
BYTEA
INET / CIDR / MACADDR
CREATE TYPE status AS ENUM ('new', 'done');
col TEXT GENERATED ALWAYS AS (lower(email)) STORED
Indexes
12CREATE INDEX idx_users_email ON users (email);
CREATE UNIQUE INDEX ... ON users (lower(email));
CREATE INDEX ... ON orders (user_id) WHERE status = 'open';
CREATE INDEX ... USING gin (data);
CREATE INDEX ... USING gin (to_tsvector('english', body));
CREATE INDEX ... USING gist (location);
CREATE INDEX ... USING brin (created_at);
CREATE INDEX CONCURRENTLY ...
CREATE INDEX ... ON t (a, b DESC);
CREATE INDEX ... ON t (a) INCLUDE (b);
REINDEX INDEX CONCURRENTLY idx_name;
DROP INDEX CONCURRENTLY idx_name;
Roles & privileges
11CREATE ROLE app LOGIN PASSWORD 'secret';
CREATE ROLE readonly NOLOGIN;
GRANT readonly TO app;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
GRANT USAGE ON SCHEMA public TO app;
REVOKE INSERT ON users FROM app;
ALTER ROLE app SET statement_timeout = '30s';
ALTER TABLE users OWNER TO app;
ALTER TABLE docs ENABLE ROW LEVEL SECURITY;
CREATE POLICY own ON docs USING (owner_id = current_user_id());
Maintenance & EXPLAIN
12EXPLAIN SELECT ...;
EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
VACUUM (VERBOSE) users;
VACUUM FULL users;
ANALYZE users;
SELECT * FROM pg_stat_activity;
SELECT pg_cancel_backend(pid);
SELECT pg_terminate_backend(pid);
SELECT pg_size_pretty(pg_total_relation_size('users'));
SELECT pg_size_pretty(pg_database_size('mydb'));
SELECT * FROM pg_stat_user_indexes;
SELECT * FROM pg_locks WHERE NOT granted;
Backup & restore
12pg_dump mydb > mydb.sql
pg_dump -Fc mydb > mydb.dump
pg_dump -Fd mydb -j 4 -f dumpdir/
pg_dump -t users -t orders mydb
pg_dump --schema-only mydb
pg_dump --data-only mydb
psql mydb < mydb.sql
pg_restore -d mydb -j 4 mydb.dump
pg_restore -l mydb.dump
pg_restore -t users -d mydb mydb.dump
pg_dumpall --globals-only > roles.sql
pg_basebackup -D /backup -Fp -Xs -P
Extensions
11CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE EXTENSION "uuid-ossp";
CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION pg_trgm;
CREATE EXTENSION postgis;
CREATE EXTENSION vector;
CREATE EXTENSION hstore;
CREATE EXTENSION postgres_fdw;
CREATE EXTENSION citext;
SELECT * FROM pg_available_extensions;
\dx
هیچ موردی با «:q» مطابقت ندارد.
درباره چیت شیت PostgreSQL
این تقلبنامه PostgreSQL دستورهایی از Postgres را که واقعاً تایپ میکنید در یک مرجع قابلجستجو گرد هم میآورد: فرمانهای meta psql، پرسوجو، JSONB، آرایهها و range ها، CTE ها و توابع پنجره، upsert و RETURNING، انواع داده، ایندکسها، نقشها و مجوزها، نگهداری و EXPLAIN، پشتیبانگیری و بازیابی، و افزونهها.
بر چیزهایی تکیه میکند که Postgres را از دیگر پایگاهدادهها متفاوت میکند: عملگرهای JSONB، انواع آرایه و range، upsert های ON CONFLICT با RETURNING، ایندکسهای GIN و GiST، و خروجی EXPLAIN ANALYZE که هنگام کند بودن یک پرسوجو میخوانید؛ در حالی که نحو روزمره SELECT، JOIN و DDL را هم پوشش میدهد.
این برگه رایگان و سمتکلاینت است: ردیفها را زنده با جعبه جستجو فیلتر کنید، با فهرست مطالب چسبان بین بخشها بپرید، هر عبارت را با یک کلیک کپی کنید و صفحه را بهعنوان مرجع روی میز چاپ کنید.
نحوه استفاده از چیت شیت PostgreSQL
- بخشها را مرور کنید، از فرمانهای meta psql و Querying تا Indexes و Extensions.
- برای فیلتر زنده هر ردیف، کلیدواژهای مانند JSONB، ON CONFLICT یا EXPLAIN را جستجو کنید.
- وقتی به جزئیات ذخیرهسازی و کارایی نیاز دارید نه نحو، به Data types یا Indexes بروید.
- روی یک عبارت یا آیکون کپی آن کلیک کنید تا SQL در کلیپبورد شما کپی شود.
- برگه را برای یک مرجع آفلاین PostgreSQL چاپ کنید.