ورقة مرجعية لـ PostgreSQL
مرجع PostgreSQL قابل للبحث والطباعة — أوامر psql وJSONB والمصفوفات وCTEs ودوال النوافذ والفهارس والأدوار و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 في مرجع واحد قابل للبحث: أوامر psql الوصفية، والاستعلام، وJSONB، والمصفوفات والنطاقات، وتعابير CTE ودوال النافذة، وupsert وRETURNING، وأنواع البيانات، والفهارس، والأدوار والصلاحيات، والصيانة وEXPLAIN، والنسخ الاحتياطي والاستعادة، والإضافات.
تعتمد على ما يميّز Postgres عن قواعد البيانات الأخرى — معاملات JSONB، وأنواع المصفوفات والنطاقات، وعمليات upsert بـ ON CONFLICT مع RETURNING، وفهارس GIN وGiST، ومخرجات EXPLAIN ANALYZE التي تقرؤها حين يكون الاستعلام بطيئًا — مع تغطية بنية SELECT وJOIN وDDL اليومية أيضًا.
الورقة مجانية وتعمل من جانب العميل: صفِّ الصفوف مباشرة عبر مربع البحث، وتنقّل بين الأقسام عبر جدول المحتويات الملتصق، وانسخ أي جملة بنقرة واحدة، واطبع الصفحة كمرجع على مكتبك.
كيفية استخدام ورقة مرجعية لـ PostgreSQL
- تصفّح الأقسام سريعًا، من «أوامر psql الوصفية» و«الاستعلام» مرورًا بـ«الفهارس» وصولًا إلى «الإضافات».
- ابحث عن كلمة مفتاحية مثل JSONB أو ON CONFLICT أو EXPLAIN لتصفية كل صف مباشرة.
- انتقل إلى «أنواع البيانات» أو «الفهارس» عندما تحتاج إلى تفاصيل التخزين والأداء بدلًا من البنية النحوية.
- انقر على جملة أو أيقونة النسخ الخاصة بها لنسخ الـ SQL إلى الحافظة.
- اطبع الورقة للحصول على مرجع PostgreSQL يعمل دون اتصال.