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.
MỤCLỤC
- SQL là gì?
- Các ví dụ truy vấn với SQL
- 1. CREATE TABLE trong PostgreSQL
- 2. INSERT trong PostgreSQL
- 3. SELECT trong PostgreSQL
- 4. UPDATE trong PostgreSQL
- 5. DELETE trong PostgreSQL
- 6. Các toán tử so sánh trong PostgreSQL
- Nhỏ hơn hoặc bằng
- Khác
- Bằng chính xác
- 7. SELECT DISTINCT trong PostgreSQL
- SELECT không có mệnh đề DISTINCT
- SELECT có mệnh đề DISTINCT
- 8. TRUNCATE trong PostgreSQL
- 9. DROP TABLE trong PostgreSQL
- 10. CREATE VIEW trong PostgreSQL
- 11. Tạo một bảng trong Postgresql bằng câu lệnh SELECT
- 12. Query timeout trong PostgreSQL
- 13. Sử dụng CREATE SEQUENCE với truy vấn INSERT trong PostgreSQL
- 14.Nhập dữ liệu kiểu BLOB vào PostgreSQL
- 15. ILIKE trong PostgreSQL
- Sử dụng ILIKE với điều kiện WHERE
- 16. Hàm length() trong PostgreSQL
- Truy vấn SELECT cơ bản
- 17. Xuất kết quả truy vấn sang file text trong PostgreSQL
- Nhập dữ liệu từ file vào bảng
- 18. Liệt kê các cơ sở dữ liệu trong PostgreSQL
- 19. Kiểm tra thời gian thực hiện truy vấn trong PostgreSQL
- 20. COUNT
- 21. LIMIT và OFFSET
- 22. Biểu thức IF… ELSE trong PostgreSQL
- 23. INNER JOIN
- 24. Biểu thức CASE trong PostgreSQL
- 25. Sử dụng một biến trong truy vấn PostgreSQL
- Sử dụng một biến với điều kiện WHERE
- 26. Truy vấn ngày trong PostgreSQL
- 27. Truy vấn song song PostgreSQL
- 28. Các toán tử logic trong PostgreSQL
- 29. Truy vấn các hàng trùng lặp
- 30. Enum query
- 31. Pivot query
- 32. SELF JOIN
- 33. Định nghĩa một biến trong một truy vấn trong PostgreSQL
- 34. Câu lệnh PREPARE trong PostgreSQL
- 35. Kiểm tra giá trị NULL trong PostgreSQL
- 36. Kiểm tra xem truy vấn có trống trong PostgreSQL không
- 37. Log truy vấn trong PostgreSQL
- 38. Toán tử UNION trong PostgreSQL
- 39. ALTER TABLE trong PostgreSQL
- 40. COMMENT
- SQL là gì?
- Các ví dụ truy vấn với SQL
- 1. CREATE TABLE trong PostgreSQL
- 2. INSERT trong PostgreSQL
- 3. SELECT trong PostgreSQL
- 4. UPDATE trong PostgreSQL
- 5. DELETE trong PostgreSQL
- 6. Các toán tử so sánh trong PostgreSQL
- Nhỏ hơn hoặc bằng
- Khác
- Bằng chính xác
- 7. SELECT DISTINCT trong PostgreSQL
- SELECT không có mệnh đề DISTINCT
- SELECT có mệnh đề DISTINCT
- 8. TRUNCATE trong PostgreSQL
- 9. DROP TABLE trong PostgreSQL
- 10. CREATE VIEW trong PostgreSQL
- 11. Tạo một bảng trong Postgresql bằng câu lệnh SELECT
- 12. Query timeout trong PostgreSQL
- 13. Sử dụng CREATE SEQUENCE với truy vấn INSERT trong PostgreSQL
- 14.Nhập dữ liệu kiểu BLOB vào PostgreSQL
- 15. ILIKE trong PostgreSQL
- Sử dụng ILIKE với điều kiện WHERE
- 16. Hàm length() trong PostgreSQL
- Truy vấn SELECT cơ bản
- 17. Xuất kết quả truy vấn sang file text trong PostgreSQL
- Nhập dữ liệu từ file vào bảng
- 18. Liệt kê các cơ sở dữ liệu trong PostgreSQL
- 19. Kiểm tra thời gian thực hiện truy vấn trong PostgreSQL
- 20. COUNT
- 21. LIMIT và OFFSET
- 22. Biểu thức IF… ELSE trong PostgreSQL
- 23. INNER JOIN
- 24. Biểu thức CASE trong PostgreSQL
- 25. Sử dụng một biến trong truy vấn PostgreSQL
- Sử dụng một biến với điều kiện WHERE
- 26. Truy vấn ngày trong PostgreSQL
- 27. Truy vấn song song PostgreSQL
- 28. Các toán tử logic trong PostgreSQL
- 29. Truy vấn các hàng trùng lặp
- 30. Enum query
- 31. Pivot query
- 32. SELF JOIN
- 33. Định nghĩa một biến trong một truy vấn trong PostgreSQL
- 34. Câu lệnh PREPARE trong PostgreSQL
- 35. Kiểm tra giá trị NULL trong PostgreSQL
- 36. Kiểm tra xem truy vấn có trống trong PostgreSQL không
- 37. Log truy vấn trong PostgreSQL
- 38. Toán tử UNION trong PostgreSQL
- 39. ALTER TABLE trong PostgreSQL
- 40. COMMENT
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.
=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội
=============================