Bảng tra cứu nhanh PostgreSQL
Tài liệu tra cứu PostgreSQL có thể tìm kiếm và in: lệnh psql, JSONB, mảng, CTE, window functions, index, vai trò và EXPLAIN. Miễn phí.
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
Không có mục nào khớp với “:q”.
Giới thiệu về Bảng tra cứu nhanh PostgreSQL
Bảng tra cứu PostgreSQL này gom những gì bạn thực sự gõ trong Postgres vào một tài liệu tham khảo có thể tìm kiếm: meta-command của psql, truy vấn, JSONB, mảng và range, CTE và hàm cửa sổ, upsert và RETURNING, kiểu dữ liệu, chỉ mục, vai trò và đặc quyền, bảo trì và EXPLAIN, sao lưu và khôi phục, cùng các tiện ích mở rộng.
Nó tựa vào điều làm Postgres khác các cơ sở dữ liệu khác: toán tử JSONB, kiểu mảng và range, upsert ON CONFLICT với RETURNING, chỉ mục GIN và GiST, và đầu ra EXPLAIN ANALYZE bạn đọc khi một truy vấn chậm; đồng thời vẫn bao gồm cú pháp SELECT, JOIN và DDL hằng ngày.
Bảng miễn phí và chạy phía máy khách: lọc hàng trực tiếp bằng ô tìm kiếm, nhảy giữa các phần bằng mục lục cố định, sao chép bất kỳ câu lệnh nào chỉ với một cú nhấp và in trang làm tài liệu tham khảo tại bàn làm việc.
Cách sử dụng Bảng tra cứu nhanh PostgreSQL
- Lướt qua các phần, từ meta-command của psql và Truy vấn qua Chỉ mục đến Tiện ích mở rộng.
- Tìm một từ khóa như JSONB, ON CONFLICT hoặc EXPLAIN để lọc mọi hàng trực tiếp.
- Nhảy tới Kiểu dữ liệu hoặc Chỉ mục khi bạn cần chi tiết về lưu trữ và hiệu năng thay vì cú pháp.
- Nhấp vào một câu lệnh hoặc biểu tượng sao chép của nó để sao chép SQL vào khay nhớ tạm.
- In bảng để có tài liệu tham khảo PostgreSQL ngoại tuyến.