Bỏ túi cheatsheet PostgreSQL hữu ích cho mọi developer

296

Bài viết được sự cho phép của tác giả Nguyễn Thành Nam

I. Tổng hợp PostgreSQL Cheatsheet

1. Cơ bản

Các lệnh dưới đây giúp bạn bắt đầu với PostgreSQL, bao gồm chuyển đổi và kết nối, liệt kê cơ sở dữ liệu, kết nối đến một cơ sở dữ liệu cụ thể, và ngắt kết nối.

# Chuyển đổi và kết nối
$ sudo -u postgres psql
# Liệt kê tất cả cơ sở dữ liệu
postgres=# l
# Kết nối đến cơ sở dữ liệu có tên là postgres
postgres=# c postgres
# Ngắt kết nối
postgres=# q
postgres=# !

⚡️ Các lệnh psql

Tùy chọn Ví dụ Mô tả
[-d] <database> psql -d mydb Kết nối đến cơ sở dữ liệu
-U psql -U john mydb Kết nối với một người dùng cụ thể
-h -p psql -h localhost -p 5432 mydb Kết nối đến một máy chủ/địa chỉ cụ thể
-U -h -p -d psql -U admin -h 192.168.1.5 -p 2506 -d mydb Kết nối PostgreSQL từ xa
-W psql -W mydb Yêu cầu nhập mật khẩu
-c psql -c ‘c postgres’ -c ‘dt’ Thực thi một truy vấn SQL hoặc lệnh
-H psql -c “l+” -H postgres > database.html Tạo báo cáo HTML
-l psql -l Liệt kê tất cả các cơ sở dữ liệu
-f psql mydb -f file.sql Thực thi các lệnh từ một tập tin
-V psql -V In phiên bản của psql

⚡️ Nhận trợ giúp: Chạy trong PostgreSQL console

Lệnh Mô tả
h Trợ giúp về cú pháp của các lệnh SQL
h DELETE Cú pháp câu lệnh SQL DELETE
? Danh sách các lệnh PostgreSQL

2. PostgreSQL Working

⚡️ Recon: Các truy vấn SQL được sử dụng để thu thập thông tin về phiên bản, trạng thái hệ thống, biến môi trường, người dùng, cơ sở dữ liệu, bảng, và hàm trong PostgreSQL.

-- Hiển thị phiên bản
SHOW SERVER_VERSION;
-- Hiển thị trạng thái hệ thống
conninfo
-- Hiển thị biến môi trường
SHOW ALL;
-- Liệt kê người dùng
SELECT rolname FROM pg_roles;
-- Hiển thị người dùng hiện tại
SELECT current_user;
-- Hiển thị quyền của người dùng hiện tại
du
-- Hiển thị cơ sở dữ liệu hiện tại
SELECT current_database();
-- Hiển thị tất cả các bảng trong cơ sở dữ liệu
dt
-- Liệt kê các hàm
df <schema>

⚡️ Databases

-- Liệt kê các cơ sở dữ liệu
l
-- Kết nối đến cơ sở dữ liệu
c <database_name>
-- Hiển thị cơ sở dữ liệu hiện tại
SELECT current_database();
-- Tạo cơ sở dữ liệu
CREATE DATABASE <database_name> WITH OWNER <username>;
-- Xóa cơ sở dữ liệu
DROP DATABASE IF EXISTS <database_name>;
-- Đổi tên cơ sở dữ liệu
ALTER DATABASE <old_name> RENAME TO <new_name>;

⚡️ Tables

-- Liệt kê các bảng trong cơ sở dữ liệu hiện tại
dt

-- Hoặc
SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;
-- Liệt kê tất cả các bảng toàn cầu
dt *.*.

-- Hoặc
SELECT * FROM pg_catalog.pg_tables
-- Hiển thị schema của bảng
d <table_name>

-- Hoặc
d+ <table_name>

-- Hoặc
SELECT column_name, data_type, character_maximum_length
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = '<table_name>';
-- Tạo bảng
CREATE TABLE <table_name>(
  <column_name> <column_type>,
  <column_name> <column_type>
);
-- Tạo bảng với khóa chính tự tăng
CREATE TABLE <table_name> (
  <column_name> SERIAL PRIMARY KEY
);
-- Xóa bảng
DROP TABLE IF EXISTS <table_name> CASCADE;

⚡️ Quyền hạn (Permissions)

-- Trở thành người dùng postgres, nếu bạn gặp lỗi quyền hạn
sudo su - postgres
psql
-- Cấp tất cả quyền hạn cho cơ sở dữ liệu
GRANT ALL PRIVILEGES ON DATABASE <db_name> TO <user_name>;
-- Cấp quyền kết nối cho cơ sở dữ liệu
GRANT CONNECT ON DATABASE <db_name> TO <user_name>;
-- Cấp quyền sử dụng cho schema
GRANT USAGE ON SCHEMA public TO <user_name>;
-- Cấp quyền thực thi cho các hàm
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO <user_name>;
-- Cấp quyền chọn, cập nhật, thêm mới vào tất cả các bảng
GRANT SELECT, UPDATE, INSERT ON ALL TABLES IN SCHEMA public TO <user_name>;
-- Cấp quyền chọn, cập nhật, thêm mới vào một bảng
GRANT SELECT, UPDATE, INSERT ON <table_name> TO <user_name>;
-- Cấp quyền chọn cho tất cả các bảng trong schema public
GRANT SELECT ON ALL TABLES IN SCHEMA public TO <user_name>;

⚡️ Cột (Columns)

-- Thêm cột
ALTER TABLE <table_name> IF EXISTS
ADD <column_name> <data_type> [<constraints>];
-- Cập nhật cột
ALTER TABLE <table_name> IF EXISTS
ALTER <column_name> TYPE <data_type> [<constraints>];
-- Xóa cột
ALTER TABLE <table_name> IF EXISTS
DROP <column_name>;
-- Cập nhật cột để làm khóa chính tự tăng
ALTER TABLE <table_name>
ADD COLUMN <column_name> SERIAL PRIMARY KEY;
-- Chèn dữ liệu vào bảng, với khóa chính tự tăng
INSERT INTO <table_name>
VALUES (DEFAULT, <value1>);

-- Hoặc
INSERT INTO <table_name> (<column1_name>, <column2_name>)
VALUES (<value1>, <value2>);

⚡️ Dữ liệu (databases): Các câu lệnh được sử dụng để truy vấn và thao tác dữ liệu trong PostgreSQL.

-- Chọn tất cả dữ liệu
SELECT * FROM <table_name>;
-- Đọc một hàng dữ liệu
SELECT * FROM <table_name> LIMIT 1;
-- Tìm kiếm dữ liệu
SELECT * FROM <table_name> WHERE <column_name> = <value>;
-- Chèn dữ liệu
INSERT INTO <table_name> VALUES(<value_1>, <value_2>);
-- Cập nhật dữ liệu
UPDATE <table_name>
SET <column_1> = <value_1>, <column_2> = <value_2>
WHERE <column_1> = <value>;
-- Xóa tất cả dữ liệu
DELETE FROM <table_name>;
-- Xóa dữ liệu cụ thể
DELETE FROM <table_name>
WHERE <column_name> = <value>;

⚡️ Người dùng (Users)

-- Liệt kê các vai trò
SELECT rolname FROM pg_roles;
-- Tạo người dùng
CREATE USER <user_name> WITH PASSWORD '<password>';
-- Xóa người dùng
DROP USER IF EXISTS <user_name>;
-- Thay đổi mật khẩu người dùng
ALTER ROLE <user_name> WITH PASSWORD '<password>';

⚡️ Schema

-- Liệt kê các schema
dn

-- Hoặc
SELECT schema_name FROM information_schema.schemata;

-- Hoặc
SELECT nspname FROM pg_catalog.pg_namespace;
-- Tạo schema
CREATE SCHEMA IF NOT EXISTS <schema_name>;
-- Xóa schema
DROP SCHEMA IF EXISTS <schema_name> CASCADE;

⚡️ Dates

-- Hiển thị ngày hiện tại theo định dạng YYYY-MM-DD
SELECT current_date;
-- Tính tuổi giữa hai ngày
SELECT age(timestamp, timestamp);
-- Hiển thị thời gian hiện tại với múi giờ
SELECT current_time;
-- Tạo ngày sử dụng các số nguyên
SELECT make_date(2021, 03, 25);

3. PostgreSQL Commands

⚡️ Tables

Lệnh Mô tả
d <table> Miêu tả bảng
d+ <table> Miêu tả bảng với chi tiết
dt Liệt kê bảng từ schema hiện tại
dt . Liệt kê bảng từ tất cả schemas
dt <schema>.* Liệt kê bảng cho một schema
dp Liệt kê quyền truy cập bảng
det[+] Liệt kê bảng ngoại trời

⚡️ Query buffer: các lệnh thường được sử dụng để chỉnh sửa và quản lý nội dung của bộ lệnh truy vấn trong PostgreSQL.

Lệnh Mô tả
e [FILE] Chỉnh sửa bộ lệnh truy vấn (hoặc file)
ef [FUNC] Chỉnh sửa định nghĩa hàm
p Hiển thị nội dung
r Đặt lại (xóa) bộ lệnh truy vấn
s [FILE] Hiển thị lịch sử hoặc lưu nó vào file
w FILE Ghi bộ lệnh truy vấn vào file

⚡️ Thông tin

  • S: hiển thị các đối tượng hệ thống.
  • +: chi tiết bổ sung.
Lệnh Mô tả
l[+] Liệt kê tất cả cơ sở dữ liệu
dn[S+] Liệt kê các schema
di[S+] Liệt kê các chỉ mục
du[+] Liệt kê các vai trò
ds[S+] Liệt kê các chuỗi số
df[antw][S+] Liệt kê các hàm
deu[+] Liệt kê các ánh xạ người dùng
dv[S+] Liệt kê các view
dl Liệt kê các đối tượng lớn
dT[S+] Liệt kê các loại dữ liệu
da[S] Liệt kê các hợp nhất
db[+] Liệt kê các không gian bảng
dc[S+] Liệt kê các chuyển đổi
dC[+] Liệt kê các chuyển đổi
ddp Liệt kê quyền mặc định
dd[S] Hiển thị mô tả đối tượng
dD[S+] Liệt kê các miền
des[+] Liệt kê máy chủ ngoại trời
dew[+] Liệt kê các bọc dữ liệu ngoại trời
dF[+] Liệt kê cấu hình tìm kiếm văn bản
dFd[+] Liệt kê từ điển tìm kiếm văn bản
dFp[+] Liệt kê bộ phân tích tìm kiếm văn bản
dFt[+] Liệt kê mẫu tìm kiếm văn bản
dL[S+] Liệt kê ngôn ngữ thủ tục
do[S] Liệt kê các toán tử
dO[S+] Liệt kê các so sánh
drds Liệt kê cài đặt vai trò mặc định
dx[+] Liệt kê các tiện ích mở rộng

⚡️ Kết nối (Connection)

Lệnh Mô tả
c [DBNAME] Kết nối đến cơ sở dữ liệu mới
encoding [ENCODING] Hiển thị hoặc đặt mã hóa máy khách
password [USER] Thay đổi mật khẩu
conninfo Hiển thị thông tin

⚡️ Định dạng (Formatting)

Lệnh Mô tả
a Chuyển đổi giữa chế độ không căn chỉnh và căn chỉnh
C [STRING] Đặt tiêu đề bảng, hoặc hủy nếu không có
f [STRING] Hiển thị hoặc đặt ngăn cách trường cho chế độ không căn chỉnh
H Chuyển đổi chế độ xuất HTML
t [on|off] Hiển thị chỉ các hàng
T [STRING] Đặt hoặc hủy bỏ các thuộc tính thẻ HTML <table>
x [on|off] Chuyển đổi đầu ra mở rộng

⚡️ Input/Output

Lệnh Mô tả
copy … Nhập/xuất bảng
echo [STRING] In chuỗi
i FILE Thực thi tệp
o [FILE] Xuất tất cả kết quả ra file
qecho [STRING] Chuỗi đầu ra luồng

⚡️ Variables

Lệnh Mô tả
prompt [TEXT] NAME Đặt biến
set [NAME [VALUE]] Đặt biến (hoặc liệt kê tất cả nếu không có tham số)
unset NAME Xóa biến

⚡️ Misc

Lệnh Mô tả
cd [DIR] Thay đổi thư mục
timing [on|off] Chuyển đổi đồng hồ
! [COMMAND] Thực thi trong shell
! ls -l Liệt kê tất cả trong shell

4. Miscellaneous

⚡️ Sao lưu (Backup): sao lưu cơ sở dữ liệu PostgreSQL bằng các công cụ pg_dump và pg_dumpall

# Sử dụng pg_dumpall để sao lưu tất cả cơ sở dữ liệu
$ pg_dumpall -U postgres > all.sql
# Sử dụng pg_dump để sao lưu một cơ sở dữ liệu
$ pg_dump -d mydb -f mydb_backup.sql
  -a   Dump chỉ dữ liệu, không có cấu trúc
  -s   Dump chỉ cấu trúc, không có dữ liệu
  -c   Xóa cơ sở dữ liệu trước khi tái tạo
  -C   Tạo cơ sở dữ liệu trước khi khôi phục
  -t   Dump chỉ bảng(s) được đặt tên
  -F   Định dạng (c: tùy chỉnh, d: thư mục, t: tar)

Sử dụng pg_dump -? để xem danh sách đầy đủ các tùy chọn.

⚡️ Khôi phục (Restore): khôi phục cơ sở dữ liệu PostgreSQL bằng các công cụ psql và pg_restore.

# Khôi phục một cơ sở dữ liệu với psql
$ psql -U user mydb < mydb_backup.sql
# Khôi phục một cơ sở dữ liệu với pg_restore
$ pg_restore -d mydb mydb_backup.sql -c
  -U   Chỉ định người dùng cơ sở dữ liệu
  -c   Xóa cơ sở dữ liệu trước khi tái tạo
  -C   Tạo cơ sở dữ liệu trước khi khôi phục
  -e   Thoát nếu gặp lỗi
  -F   Định dạng (c: tùy chỉnh, d: thư mục, t: tar, p: văn bản thô sql (mặc định))

Sử dụng pg_restore -? để xem danh sách đầy đủ các tùy chọn.

⚡️ Truy cập từ xa (Remote access): sử dụng để cấu hình và khởi động lại PostgreSQL để cho phép truy cập từ xa.

# Lấy vị trí của postgresql.conf
$ psql -U postgres -c 'SHOW config_file'
# Thêm vào postgresql.conf
listen_addresses = '*'
# Thêm vào pg_hba.conf (Cùng vị trí với postgresql.conf)
host  all  all  0.0.0.0/0  md5
host  all  all  ::/0       md5
# Khởi động lại máy chủ PostgreSQL
$ sudo systemctl restart postgresql

⚡️ Nhập/Xuất CSV

# Xuất bảng vào tệp CSV
copy table TO '<path>' CSV
copy table(col1,col1) TO '<path>' CSV
copy (SELECT...) TO '<path>' CSV
# Nhập tệp CSV vào bảng
copy table FROM '<path>' CSV
copy table(col1,col1) FROM '<path>' CSV

Bài viết gốc được đăng tải tại blog.thanhnamnguyen.dev

Xem thêm:

Đừng bỏ lỡ nhiều việc làm IT hấp dẫn trên TopDev nhé!