Trong bài viết này chúng ta sẽ đi tìm hiểu SQL là gì và làm cách nào để sử dụng nó với một cơ sở dữ liệu phổ biến hiện nay là PostgreSQL. Chúng ta sẽ có 50 ví dụ mô tả các kiểu truy vấn, các chức năng và cách sử dụng chúng trong PostgreSQL.

SQL là gì?

SQL là viết tắt của cụm từ "Structured Query Language" (Ngôn ngữ truy vấn có cấu trúc). Ban đầu nó được gọi là SEQUEL (Structured English Query Language) và được sử dụng để lưu trữ và thao tác dữ liệu với các database. Ngày nay SQL là một ngôn ngữ chung cho tất cả hệ thống cơ sở dữ liệu quan hệ(RDBMS) trong đó có PostgreSQL.

SQL có thể:

  • Thực hiện các truy vấn dữ liệu
  • Thêm, sửa, xóa các bản ghi trong database (câu lệnh DML)
  • Tạo mới các đối tượng trong database (câu lệnh DDL)
  • Phân quyền cho các bảng
  • Và còn nhiều nữa...

Các ví dụ truy vấn với SQL

Bây giờ chúng ta hãy khám phá một số ví dụ về các truy vấn PostgreSQL phổ biến và hữu ích có thể được sử dụng trong các tình huống khác nhau.

1. CREATE TABLE trong PostgreSQL

CREATE TABLE là từ khóa để khởi tạo một bảng rỗng mới trong CSDL. Bảng này sẽ thuộc sở hữu của user đã viết ra câu lệnh này:

postgres=# create table dummy_table(name varchar(20),address text,age int);
CREATE TABLE

Câu lệnh trên tạo ra 1 bảng có tên là dummy_table và bảng đó chứa 3 cột name, address và age.

2. INSERT trong PostgreSQL

Câu lệnh INSERT được sử dụng để chèn dữ liệu vào một bảng:

postgres=# insert into dummy_table values('XYZ','location-A',25);
INSERT 0 1
postgres=# insert into dummy_table values('ABC','location-B',35);
INSERT 0 1
postgres=# insert into dummy_table values('DEF','location-C',40);
INSERT 0 1
postgres=# insert into dummy_table values('PQR','location-D',54);
INSERT 0 1

Phía trên chúng ta đã dùng 4 câu lệnh insert để chèn thêm bốn hàng dữ liệu vào bảng dummy_table

3. SELECT trong PostgreSQL

Câu lệnh SELECT (khi không có tùy chọn WHERE) sẽ tìm đến hết tất cả các dữ liệu có trong bảng:

postgres=# select * from dummy_table;
name |  address   | age
---------+--------------+ -----
XYZ   | location-A |  25
ABC   | location-B |  35
DEF   | location-C |  40
PQR   | location-D |  54
(4 rows)

4. UPDATE trong PostgreSQL

Câu lệnh UPDATE được sử dụng để cập nhật các dữ liệu trong bảng. Trong ví dụ dưới đây, sử dụng UPDATE để thay đổi tuổi của một người có tên là 'PQR':

postgres=# update dummy_table set age=50 where name='PQR';
UPDATE 1
postgres=# select * from dummy_table;
name |  address   | age
--------+--------------+-------
XYZ  | location-A |  25
ABC  | location-B |  35
DEF  | location-C |  40
PQR  | location-D |  50
(4 rows)

Tiếp theo, chúng ta sẽ sử dụng lệnh UPDATE để thay đổi tên và tuổi của một người có địa chỉ là 'location-D':

postgres=# update dummy_table set name='GHI',age=54 where address='location-D';
UPDATE 1
postgres=# select * from dummy_table;
 name |  address   | age
------+------------+-----
 XYZ  | location-A |  25
 ABC  | location-B |  35
 DEF  | location-C |  40
 GHI  | location-D |  54
(4 rows)

Nếu chúng ta muốn sửa đổi tất cả các giá trị trong address và cột age trong bảng dummy_table, thì chúng ta không cần sử dụng mệnh đề WHERE. Truy vấn UPDATE sẽ trông giống như sau:

postgres=# update dummy_table set age=54,address='location-X';
UPDATE 4
postgres=# select * from dummy_table ;
 name |  address   | age
------+------------+--------
 XYZ  | location-X |  54
 ABC  | location-X |  54
 DEF  | location-X |  54
 GHI  | location-X |  54
(4 rows)

Mệnh đề RETURNING trả về các hàng đã cập nhật. Đây là tùy chọn trong UPDATE:

postgres=# update dummy_table set age=30 where name='XYZ' returning age as age_no;
 age_no
---------
30
(1 row)

5. DELETE trong PostgreSQL

Câu lệnh DELETE được sử dụng để xóa các hàng trong bảng.Điều kiện WHERE tùy chọn, nhưng hãy lưu ý: nếu thiếu điều kiện WHERE, lệnh sẽ xóa tất cả các hàng, để lại cho bạn một bảng trống.

postgres=# delete from dummy_table where age=65;
DELETE 1

6. Các toán tử so sánh trong PostgreSQL

Trong PostgreSQL, với sự trợ giúp của các toán tử so sánh, chúng ta có thể lấy được kết quả bằng điều kiện hoặc giá trị đã chỉ định.

Nhỏ hơn hoặc bằng

postgres=# select * from dummy_table where age <=50;
 name |  address   | age
------+------------+-----
 XYZ  | location-A |  25
 ABC  | location-B |  35
 DEF  | location-C |  40
 PQR  | location-D |  50
(4 rows)```

### Lớn hơn hoặc bằng

```sql
postgres=# select * from dummy_table where age>=50;
 name |  address   | age
------+------------+-----
 PQR  | location-D |  50
(1 row)

Khác

postgres=# select * from dummy_table where age<>50;
 name |  address   | age
------+------------+-----
 XYZ  | location-A |  25
 ABC  | location-B |  35
 DEF  | location-C |  40
(3 rows)

Bằng chính xác

postgres=# select * from dummy_table where age=50;
 name |  address   | age
------+------------+-----
 PQR  | location-D |  50
(1 row)

7. SELECT DISTINCT trong PostgreSQL

Câu lệnh SELECT DISTINCT được sử dụng để trả về các giá trị riêng biệt từ bảng. Nó loại bỏ mọi giá trị trùng lặp:

SELECT không có mệnh đề DISTINCT

postgres=# select age from dummy_table order by 1;
 age
-----
   1
   1
   2
   2
   3
(5 rows)

SELECT có mệnh đề DISTINCT

postgres=# select distinct age from dummy_table order by 1;
 age
-----
   1
   2
   3
(3 rows)

8. TRUNCATE trong PostgreSQL

Lệnh TRUNCATE được sử dụng để làm trống một bảng:

postgres=# truncate table dummy_table;
TRUNCATE TABLE

9. DROP TABLE trong PostgreSQL

Lệnh DROP TABLE này được sử dụng để xóa một bảng khỏi cơ sở dữ liệu:

postgresql=# drop table if exists dummy;
NOTICE:  table "dummy" does not exist, skipping
DROP TABLE

Lệnh này đã xóa toàn bộ bảng, bao gồm mọi dữ liệu liên quan, chỉ mục, quy tắc và ràng buộc cho bảng đó.

10. CREATE VIEW trong PostgreSQL

Lệnh CREATE VIEW được sử dụng để tạo các views trong database. Views là các "bảng tạm", nó được sử dụng để trình bày một bảng đầy đủ, tập hợp con hoặc chọn các cột từ bảng:

postgres=# CREATE OR REPLACE VIEW vi AS SELECT * FROM dummy_table WHERE age IS NULL;
CREATE VIEW

11. Tạo một bảng trong Postgresql bằng câu lệnh SELECT

Sử dụng cú pháp trong ví dụ dưới đây, chúng ta có thể tạo một bảng bằng câu lệnh SELECT:

postgres=# select 'My name  is X' as col1 , 10 as col2, 'Address is -XYZ location' as col3  into new_table;
SELECT 1
postgres=# select * from new_table ;
     col1      | col2 |           col3
---------------+------+--------------------------
 My name  is X |   10 | Address is -XYZ location
(1 row)

12. Query timeout trong PostgreSQL

Chúng ta có thể ra lệnh cho một truy vấn hết thời gian chờ sau một khoảng thời gian nhất định với sự trợ giúp của các tham số GUC như statement_timeout, hủy bỏ bất kỳ câu lệnh nào mất nhiều hơn số mili giây được chỉ định:

postgresql=# set statement_timeout=10;
SET
postgresql=# select pg_sleep(20);
ERROR:  canceling statement due to statement timeout

13. Sử dụng CREATE SEQUENCE với truy vấn INSERT trong PostgreSQL

Lệnh CREATE SEQUENCE là một trình tạo số tuần tự. Sau khi trình tự được tạo, chúng tôi có thể sử dụng các hàm nextval() và hàm currval() để chèn các giá trị vào bảng:

postgres=# create sequence seq;
CREATE SEQUENCE
postgres=# create table tab(n int);
CREATE TABLE
postgres=# insert into tab values (nextval('seq'));
INSERT 0 1
postgres=# insert into tab values (currval('seq'));
INSERT 0 1
postgres=# insert into tab values (nextval('seq'));
INSERT 0 1
postgres=# select * from tab;
 n
---
 1
 1
 2
(3 rows)

14.Nhập dữ liệu kiểu BLOB vào PostgreSQL

PostgreSQL không hỗ trợ trực tiếp kiểu BLOB (binary large objects), nhưng chúng ta có thể làm việc với chúng bằng các phương pháp sau:

Giả sử bạn có một hình ảnh (ở định dạng png) được tải xuống trong thư mục / home / edb /:

[edb@localhost]$ ls /home/edb/mypic.png
/home/edb/mypic.png

Chúng ta muốn lưu trữ hình ảnh này trong cơ sở dữ liệu PostgreSQL.

Mở psql:

postgres=# Create table testing(n int,n1 oid);
CREATE TABLE
postgres=# insert into testing values (1,lo_import('/home/edb/mypic.png'));
INSERT 0 1

Hàm lo_import() tải tệp đã đặt tên vào pg_largeobject và trả về giá trị OID (mã định danh đối tượng) sẽ tham chiếu đến đối tượng lớn. Việc chọn bảng testing sẽ chỉ hiển thị OID chứ không hiển thị các bit đã tạo nên bức ảnh này.

15. ILIKE trong PostgreSQL

ILIKE là một toán tử so sánh tương đương, không phân biệt chữ hoa chữ thường.

postgres=# select * from ted;
  n
-----
 TAR
 TaR
 Tar
 tar
(4 rows)

Sử dụng ILIKE với điều kiện WHERE

postgres=# select * from ted where n ilike 'TAR%';
  n
-----
 TAR
 TaR
 Tar
 tar
(4 rows)

16. Hàm length() trong PostgreSQL

Hàm length trả về số ký tự hoặc số byte trong một biến chuỗi được chỉ định.

Truy vấn SELECT cơ bản

postgres=# select name,age from dummy_table;
 name | age
------+-----
 XYZ  |  25
 ABC  |  35
 DEF  |  40
 PQR  |  54
 PQR  |
(5 rows)

Truy vấn với hàm length() cho tên cột name và age

postgres=# select length(name),length(age) from dummy_table;
 length | length
--------+--------
      3 |      2
      3 |      2
      3 |      2
      3 |      2
      3 |
(5 rows)

17. Xuất kết quả truy vấn sang file text trong PostgreSQL

Với sự trợ giúp của lệnh COPY, chúng ta có thể xuất dữ liệu từ bảng sang file .txt bên ngoài cũng như nhập dữ liệu từ file vào bảng.

Xuất dữ liệu từ bảng sang file text

postgres=#  copy dummy_table to '/tmp/abc.txt';
COPY 5

postgres=# \! cat /tmp/abc.txt
XYZ    location-A    25
ABC    location-B    35
DEF    location-C    40
PQR    location-D    50
CXC    1    50

Nhập dữ liệu từ file vào bảng

postgres=# copy dummy_table from '/tmp/abc.txt';
COPY 5

18. Liệt kê các cơ sở dữ liệu trong PostgreSQL

Truy vấn sau có thể được sử dụng để hiển thị tất cả các cơ sở dữ liệu đã tạo:

postgres=# select oid,datname from pg_database;
  oid     |  datname
-----------+-----------
 13743 | postgres
     1     | template1
 13742 | template0
(3 rows) 

19. Kiểm tra thời gian thực hiện truy vấn trong PostgreSQL

Chúng ta có thể kiểm tra thời gian cần thiết để truy vấn thực thi bằng cách bật \timing tại psql prompt:

postgres=# \timing
Timing is on

Truy vấn SELECT bây giờ sẽ hiển thị thời gian thực hiện:

postgres=# select * from dummy_table;
 name |  address   | age
------+------------+--------
 XYZ  | location-A | 25
 ABC  | location-B | 35
 DEF  | location-C | 40
 PQR  | location-D | 50
 CXC  | 1               | 50
(5 rows)

Time: 0.440 ms

20. COUNT

Truy vấn COUNT trả về số hàng trong bảng. Nếu chúng ta sử dụng (*), nó sẽ bao gồm các giá trị null; nếu không giá trị null sẽ bị loại trừ.

postgres=# select count(*) from dummy_table;
 count
-------
     5
(1 row)

postgres=# select count(avg) from dummy_table;
 count
-------
     4
(1 row)

21. LIMIT và OFFSET

Mệnh đề LIMIT được sử dụng để giới hạn lượng dữ liệu được trả về bởi câu lệnh SELECT. Truy vấn bên dưới sẽ chỉ hiển thị 1 hàng:

postgres=# select * from dummy_table  limit 1;
 name |  address   | age
------+------------+-----
 XYZ  | location-A |  25
(1 row)

OFFSET được sử dụng khi chúng ta muốn bỏ qua một số hàng cụ thể:

postgres=# select * from dummy_table  offset 4;
 name | address | age
------+---------+-----
 cxc  | 1       |  50
(1 row)

22. Biểu thức IF… ELSE trong PostgreSQL

Chúng ta có thể sử dụng các câu lệnh điều kiện như IF ... ELSE trong một anonymous block. Ví dụ bên dưới kiểm tra xem giá trị của các biến abc và xyz có khớp nhau không và in ra kết quả

postgres=# Do
             $$
             Declare
              abc int;
              xyz int;
              begin
              abc:=100;
              xyz:=abc;
              if abc=xyz then
               xyz=150;
              raise notice '%',xyz;
             else
             end if;
             end;
               $$
;
NOTICE:  150
DO

23. INNER JOIN

Lệnh INNER JOIN sẽ tìm các hàng từ hai (hoặc nhiều) bảng trong đó dữ liệu các cột được chỉ định trong bảng khớp với nhau:

postgres=# select *  from x inner join  y on  x.n1 = y.n1;
 n |     n1     | n |     n1
---+------------+---+------------
 1 | abc        | 1 | abc
 2 | xyz        | 2 | xyz
(2 rows)

24. Biểu thức CASE trong PostgreSQL

Biểu thức CASE là một biểu thức điều kiện chung, tương tự như câu lệnh IF… ELSE.

postgres=# SELECT age,
       CASE age WHEN 25 THEN 'one'
              WHEN 50 THEN 'two'
              ELSE 'other'
       END
    FROM  dummy_table;
 age | case
-----+-------
  25 | one
  35 | other
  40 | other
  50 | two
  50 | two
(5 rows)

25. Sử dụng một biến trong truy vấn PostgreSQL

Chúng ta có thể khai báo một biến trong PostgreSQL tại psql prompt:

postgres=# \set cond 50

Sử dụng một biến với điều kiện WHERE

postgres=# select * from dummy_table where age=:cond;
 name |  address   | age
------+------------+-----
 PQR  | location-D |  50
(1 row)

26. Truy vấn ngày trong PostgreSQL

PostgreSQL cung cấp các hàm cho ngày và giờ có thể được sử dụng trong các truy vấn.

postgres=# select now();
               now
----------------------------------
 22-SEP-20 03:08:42.636385 +05:30
(1 row)

postgres=# select current_date;
 current_date
--------------
 22-SEP-20
(1 row)

postgres=# select current_time;
     current_time
-----------------------
 03:08:53.648466+05:30
(1 row)

Chúng ta cũng có thể thực hiện truy vấn tìm các hàng có giá trị giữa hai khoảng thời gian:

postgres=# create table datetable(n int,n1 date);
CREATE TABLE

postgres=# insert into datetable values (1,'12-01-1980');
INSERT 0 1
postgres=# insert into datetable values (2,'12-01-2020');
INSERT 0 1
postgres=# insert into datetable values (3,'12-01-2000');
INSERT 0 1
postgres=# select * from datetable where n1 between '12-01-1980' and '12-01-2000';
 n |         n1
---+--------------------
 1 | 12-JAN-80 00:00:00
 3 | 12-JAN-00 00:00:00
(2 rows)

27. Truy vấn song song PostgreSQL

Các truy vấn song song trong PostgreSQL cho phép bạn hoàn thành các truy vấn nhanh hơn bằng cách sử dụng nhiều CPU. Các tham số GUC này được đặt trong tệp postgresql.conf

max_parallel_maintenance_workers = 2   # taken from max_parallel_workers
max_parallel_workers_per_gather = 2    # taken from max_parallel_workers
parallel_leader_participation = on
max_parallel_workers = 8               # maximum number of max_worker_processes that

28. Các toán tử logic trong PostgreSQL

Có ba toán tử logic cơ bản có sẵn trong PostgreSQL: AND, OR và NOT.

AND: Nếu cả hai biểu thức đều đúng, thì kết quả là TRUE

postgresql=# select 1=1/1 and 200=2+198 as result_and_operator;
result_and_operator
---------------------
t
(1 row)

AND: Nếu một biểu thức là true và một biểu thức khác là NULL, thì kết quả là NULL

postgresql=# select 4=4 and null;
?column?
---------------------

(1 row)

OR: Nếu có một biểu thức là đúng, thì kết quả là TRUE

postgres=# select 1=100 OR 2=2;
?column?
---------------------
t
(1 row)

29. Truy vấn các hàng trùng lặp

Trong truy vấn SQL sau, có hai bản ghi có giá trị 50:

 postgres=# select age from dummy_table;
 age
-----
  25
  35
  40
  50
  50
(5 rows)

Chúng ta có thể sử dụng truy vấn SELECT… HAVING để tìm các hàng trùng lặp:

postgres=#  select age, count(age) from dummy_table group by age having count(age)>1;
 age | count
-----+-------
  50 |     2
(1 row)

30. Enum query

Kiểu Enumerated (enum) là kiểu dữ liệu bao gồm một tập giá trị tĩnh, có thứ tự.

postgres=# CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
CREATE TYPE
postgres=# create table testi(n int, n1 mood);
CREATE TABLE
postgres=# insert into testi values (1,'happy');
INSERT 0 1
postgres=# insert into testi values (1,'sad');
INSERT 0 1
postgres=# insert into testi values (1,'ok');
INSERT 0 1

Nếu enum chưa được chỉ định, nó sẽ báo lỗi:

postgres=# insert into testi values (1,'happyo');
ERROR:  invalid input value for enum mood: "happyo"

31. Pivot query

Pivot là một cách hữu ích để phân tích số lượng lớn dữ liệu bằng cách sắp xếp nó thành một định dạng dễ quản lý hơn.

CREATE TABLE newtb(id SERIAL, rowid varchar(10), attri varchar(10), val varchar(10));
INSERT INTO newtb(rowid, attri, val) values('t1','a1','v1');
INSERT INTO newtb(rowid, attri, val) values('t1','a2','v2');
INSERT INTO newtb(rowid, attri, val) values('t1','a3','v3');
INSERT INTO newtb(rowid, attri, val) values('t1','a4','v4');
INSERT INTO newtb(rowid, attri, val) values('t2','a1','v5');
INSERT INTO newtb(rowid, attri, val) values('t2','a2','v6');
INSERT INTO newtb(rowid, attri, val) values('t2','a3','v7');
INSERT INTO newtb(rowid, attri, val) values('t2','a4','v8');

Để tạo bảng tổng hợp, bạn cần cài đặt extention tablefunc:

postgres=# create extension tablefunc;
CREATE EXTENSION

Select *
FROM crosstab(
  'select rowid, attri, val
   from newtb
   where attri = ''a2'' or attri = ''a3''
   order by 1,2')
AS newtb(row_name varchar(10), category_1 varchar(10), category_2 varchar(10), category_3 varchar(10));
 row_name | category_1 | category_2 | category_3
----------+------------+------------+--------------------------
   t1       |              v2        |            v3    |
   t2       |             v6         |             v7   |
(2 rows)

32. SELF JOIN

Khi chúng ta JOIN một bảng so với chính nó, điều này được gọi là SELF JOIN.

Điều này có thể được thực hiện bằng cách sử dụng INNER JOIN hoặc LEFT JOIN. SELF JOIN hữu ích khi so sánh các cột của các hàng trong cùng một bảng

postgres=# create table emp1(emp_id int, firstname char(10), lastname char(10) , manager_id int);
CREATE TABLE
postgres=#
postgres=#
postgres=# insert into emp1 values(1,'ABC','XYZ',NULL);
INSERT 0 1
postgres=# insert into emp1 values(2,'TYU','BGV',1);
INSERT 0 1
postgres=# insert into emp1 values(3,'TEU','ZZV',1);
INSERT 0 1
postgres=# insert into emp1 values(4,'REU','AZV',2);
INSERT 0 1
postgres=# insert into emp1 values(5,'QREU','WZV',2);
INSERT 0 1
postgres=# insert into emp1 values(6,'DREU','QZV',3);
INSERT 0 1

postgres=# select a.firstname,b.lastname from emp1 a inner join emp1 b on a.emp_id=b.manager_id order by 1 ;
 firstname  |  lastname
------------+------------
 ABC        | ZZV
 ABC        | BGV
 TEU        | QZV
 TYU        | WZV
 TYU        | AZV
(5 rows)

postgres=# 

33. Định nghĩa một biến trong một truy vấn trong PostgreSQL

Sử dụng một anonymous block, chúng ta có thể xác định nghĩa một biến có thể được truyền vào câu truy vấn:

postgres=# do
$$
declare
a int;
begin
select age into a from dummy_table
where name ='XYZ';
raise notice '%',a;
end;
$$;
NOTICE:  25
DO

34. Câu lệnh PREPARE trong PostgreSQL

PREPARE được sử dụng để tối ưu hóa hiệu suất. Khi câu lệnh PREPARE được thực thi, nó không chỉ được parsed mà còn được phân tích, và khi kích hoạt lệnh EXECUTE, câu lệnh đã chuẩn bị sẽ được lập kế hoạch và thực thi.

Các câu lệnh chuẩn bị sẵn có thể chấp nhận các tham số.

postgres=# prepare test(int) as
select * from dummy_table where age=$1;
PREPARE

postgres=# execute test(50);
 name |  address   | age
------+------------+---------
 PQR  | location-D |  50
 CXC | 1                |  50
(2 rows)

35. Kiểm tra giá trị NULL trong PostgreSQL

Để xác định hoặc select các hàng có giá trị NULL, điều kiện IS NULL có thể được sử dụng trong mệnh đề WHERE.

postgres=# select * from dummy_table;
 name |  address   | age
------+------------+-----
 XYZ  | location-A |  25
 ABC  | location-B |  35
 DEF  | location-C |  40
 PQR  | location-D |  54
 PQR  | location-D |
(5 rows)

Xác định các giá trị NULL trong cột 'age':

postgres=# select name from dummy_table where age is null;
 name
------
 PQR
(1 row)

36. Kiểm tra xem truy vấn có trống trong PostgreSQL không

Chúng ta có thể sử dụng EXISTS để kiểm tra xem một truy vấn có trống hay không. EXISTS là một toán tử boolean kiểm tra sự tồn tại của các hàng trong một truy vấn con.

postgres=# select exists(select * from (select 'true' where 1=3));
 exists
--------
 f
(1 row)

postgres=# select exists(select * from (select 'true' where 1=1));
 exists
--------
 t
(1 row)

37. Log truy vấn trong PostgreSQL

Để xem log thời gian thực thi của một truy vấn, bạn cần bật các tham số GUC có liên quan:

postgresql=# set log_min_duration_statement=0;
SET
postgresql=# set log_statement='all';
SET

Bây giờ, nếu chúng ta kiểm tra file log, được tạo trong thư mục data/log , chúng ta sẽ nhận được thông báo thời gian thực thi:

2020-09-23 02:47:12.887 +0530 [30737] LOG:  statement: create table gg1(n int);
2020-09-23 02:47:12.888 +0530 [30737] LOG:  duration: 1.165 ms
2020-09-23 02:47:28.092 +0530 [30737] LOG:  statement: insert into gg1 values (generate_series(1,100000));
2020-09-23 02:47:28.182 +0530 [30737] LOG:  duration: 94.858 ms 

38. Toán tử UNION trong PostgreSQL

UNION được sử dụng để kết hợp các kết quả của hai hoặc nhiều câu lệnh SQL trong khi loại bỏ các hàng trùng lặp giữa các bảng.

postgres=# create table tab1(n int);
CREATE TABLE

postgres=# insert into tab1 values (1),(2);
INSERT 0 2
postgres=# create table tab2(n int);
CREATE TABLE

postgres=# insert into tab2 values (3),(2);
INSERT 0 2

postgres=# select * from tab1 union select * from tab2;
 n
---
 2
 1
 3
(3 rows)

39. ALTER TABLE trong PostgreSQL

Lệnh ALTER TABLE được sử dụng để thêm hoặc sửa đổi các cột trong bảng:

postgres=# alter table dummy_table add col1 int;
ALTER TABLE
postgres=# alter table dummy_table  rename col1 to col2;
ALTER TABLE
postgres=#  alter table dummy_table alter column col2 type char;
ALTER TABLE
postgres=# alter table dummy_table drop column col2;
ALTER TABLE

40. COMMENT

PostgreSQL có một tính năng cho chúng ta có thể tạo nhận xét về một đối tượng cơ sở dữ liệu bằng cách sử dụng câu lệnh COMMENT.

postgres=# Comment on table dummy_table  is 'This was a testing table';
COMMENT

postgres=# Comment on function f is 'Don''t update the function please' ;
COMMENT

Sử dụng pg_description system catalog , chúng ta có thể lấy ra nhận xét.