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، ارے اور رینجز، CTEs اور ونڈو فنکشنز، upsert اور RETURNING، ڈیٹا ٹائپس، انڈیکسز، رولز اور مراعات، مینٹیننس اور EXPLAIN، بیک اپ اور ریسٹور، اور ایکسٹینشنز۔
یہ ان چیزوں پر زور دیتی ہے جو Postgres کو دوسرے ڈیٹا بیسز سے مختلف بناتی ہیں: JSONB آپریٹرز، ارے اور رینج ٹائپس، RETURNING کے ساتھ ON CONFLICT upserts، GIN اور GiST انڈیکسز، اور EXPLAIN ANALYZE کا وہ آؤٹ پٹ جو کوئری سست ہونے پر آپ پڑھتے ہیں؛ ساتھ ہی روزمرہ SELECT، JOIN اور DDL سنٹیکس کا بھی احاطہ کرتی ہے۔
شیٹ مفت اور کلائنٹ سائیڈ ہے: سرچ باکس سے قطاروں کو لائیو فلٹر کریں، چپکے رہنے والی فہرست مضامین سے حصوں کے درمیان کودیں، ایک کلک سے کوئی بھی سٹیٹمنٹ کاپی کریں اور میز کے حوالے کے طور پر صفحہ پرنٹ کریں۔
PostgreSQL چیٹ شیٹ استعمال کرنے کا طریقہ
- حصوں پر نظر ڈالیں، psql meta-commands اور Querying سے لے کر Indexes سے ہوتے ہوئے Extensions تک۔
- JSONB، ON CONFLICT یا EXPLAIN جیسا کوئی کلیدی لفظ تلاش کریں تاکہ ہر قطار لائیو فلٹر ہو جائے۔
- جب آپ کو سنٹیکس کے بجائے اسٹوریج اور کارکردگی کی تفصیلات چاہیے ہوں تو Data types یا Indexes پر جائیں۔
- SQL کو اپنی کلپ بورڈ پر کاپی کرنے کے لیے کسی سٹیٹمنٹ یا اس کے کاپی آئیکن پر کلک کریں۔
- آف لائن PostgreSQL حوالے کے لیے شیٹ پرنٹ کریں۔