Câu lệnh truy vấn cơ bản với postgresql

Câu lệnh truy vấn cơ bản với PostgreSQL giúp chúng ta lấy và xử lý dữ liệu trong cơ sở dữ liệu.

Trong hệ quản trị cơ sở dữ liệu quan hệ, dữ liệu được lưu trữ trong các bảng (table). Khi cần xem hoặc khai thác thông tin, chúng ta sử dụng câu lệnh SELECT để truy vấn dữ liệu từ các bảng đó. Trong bài này, chúng ta sẽ học cách:

  • Lấy dữ liệu từ bảng
  • Chọn các cột cần thiết và đặt tên hiển thị cho dễ đọc
  • Lọc dữ liệu theo điều kiện
  • Sắp xếp kết quả
  • Giới hạn số dòng trả về
Câu lệnh truy vấn cơ bản với PostgreSQL

SELECT

SELECT là câu lệnh dùng để truy vấn dữ liệu từ một hoặc nhiều bảng trong PostgreSQL. Với SELECT, chúng ta có thể:

  • Lấy toàn bộ dữ liệu của bảng
  • Chọn một số cột cụ thể
  • Kết hợp với các mệnh đề khác để lọc, sắp xếp, gom nhóm hoặc kết nối nhiều bảng

Lấy tất cả thông tin từ một bảng

Khi bạn muốn xem toàn bộ dữ liệu trong một bảng , giống như “mở bảng lên xem”, dùng cú pháp:

SELECT * FROM  ten_bang  

Trong đó:

  • SELECT: mệnh đề SELECT dùng để chỉ định cột sẽ lấy dữ liệu
  • FROM: mệnh đề FROM dùng để chỉ định bảng sẽ lấy dữ liệu
  • ten_bang: là tên của bảng dữ liệu muốn lấy dữ liệu ra
  • * : đại diện cho tất cả các cột/trường của bảng

Ví dụ: Lấy tất cả dữ liệu từ bảng employees

SELECT * FROM employees

Lấy một số cột xác định từ một bảng

Trong thực tế, chúng ta thường chỉ cần một số cột thay vì toàn bộ bảng. Khi đó, liệt kê rõ tên các cột cần lấy:

SELECT ten_cot_1, ten_cot_2, ...  FROM ten_bang

Trong đó ten_cot_1,  ten_cot_2 là tên các cột muốn lấy dữ liệu Ví dụ:

SELECT employee_id, first_name, last_name, phone
FROM employees

Sử dụng bí danh ‘AS’ cho cột

Bí danh (AS) dùng để đặt tên hiển thị khác cho cột hoặc cho kết quả tính toán. Tên này chỉ có hiệu lực trong câu truy vấn, không làm thay đổi tên cột trong bảng. Cú pháp như sau:

SELECT ten_cot_1 AS  "ten_moi",  ten_cot_2  FROM ten_bang

Trong đó ten_moi là tên mới (phải dùng nháy kép chứ không được nháy đơn)

Ví dụ 1: Lấy thông tin employee_id đặt tên “Mã NV”, first_name, last_name, phone của tất cả nhân viên trong bảng employees

SELECT employee_id AS "Mã NV", first_name as "Ten", last_name as "Ho", phone
FROM employees

Ví dụ 2: Lấy thông tin employee_id đặt tên “Mã NV”, kết hợp first_name và last_name thành “Họ và tên”, “Lương năm” tính từ salary x 13 tháng của tất cả nhân viên trong bảng employees

SELECT
employee_id AS "Mã NV",
first_name || ' ' || last_name AS "Họ và tên",
salary * 13 AS "Lương năm"
FROM employees;

Trong câu lệnh sử dụng toán tử nối chuỗi ||, dùng để ghép nhiều chuỗi text lại với nhau: chuỗi_1 || chuỗi_2 || chuỗi_3

Sử dụng bí danh AS cho bảng

Bí danh cho bảng thường dùng khi: JOIN nhiều bảng hoặc tên bảng dài, hoặc muốn câu truy vấn ngắn gọn, dễ đọc. Cú pháp như sau:

SELECT * FROM ten_bang AS x 

Trong đó: x là tên mới của bảng 

Sau khi đặt bí danh, chúng ta có thể gọi các cột bằng cú pháp: x.ten_cot

SELECT
e.first_name AS "Tên",
e.last_name AS "Họ",
e.job_title AS "Chức vụ",
e.salary AS "Lương"
FROM employees AS e;

WHERE

WHERE dùng để lọc dữ liệu trong câu lệnh SELECT, UPDATE, DELETE. Nó xác định điều kiện mà mỗi dòng trong bảng phải thỏa mãn mới được chọn hoặc tác động.

Nếu điều kiện TRUE → dòng được giữ lại; nếu FALSE → bị loại bỏ; nếu NULL → coi như FALSE.

Cú pháp như sau:

SELECT column1, column2, ... FROM table_name WHERE condition;

Trong đó:  condition là điều kiện lọc

So sánh số trong điều kiện

Lọc các nhân viên có lương hơn 42 triệu

SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > 42000000;

Ví dụ 2: Lọc các nhân viên có lương từ 15 triệu đến 20 triệu

SELECT first_name, last_name, salary
FROM employees
WHERE salary >= 15000000  AND salary <= 20000000;

Chọn lọc ra các nhân viên có department_id = 20

SELECT first_name, last_name, department_id, job_title
FROM employees
WHERE department_id = 20;

Dùng boolean trong điều kiện

Ví dụ: Lọc ra các nhân viên đang làm việc

SELECT employee_id, first_name, last_name, job_title, is_active
FROM employees
WHERE is_active = TRUE;

So sánh chuỗi trong điều kiện

Sử dụng toán tử =

Dùng dấu = giống như so sánh số. Ví dụ: Tìm các nhân viên có họ “Nguyễn”

SELECT employee_id, first_name, last_name, phone
FROM employees
WHERE first_name = 'Nguyễn';

Sử dụng toán tử LIKE (phân biệt hoa – thường), ILIKE (không phân biệt hoa – thường)

SELECT * FROM ten_bang WHERE ten_cot LIKE  'template' 

Trong đó ‘template’ chứa những ký tự đặt biệt sau:

%:  đại diện cho 0 hoặc nhiều ký tự bất kỳ

_  :  đại diện cho chính xác 1 ký tự bất kỳ

\ : nếu muốn tìm ‘%‘ hoặc ‘_‘ trong chuỗi thì sử dụng ‘\

Ví dụ:

  • Chuỗi bắt đầu bằng ‘Nguyen’: ‘Nguyen%’
  • Chuỗi có chứa ‘Anh’: ‘%Anh%’
  • Chuỗi kết thúc bằng ‘.vn’: ‘%.vn’
  • Chuỗi có 4 kí tự bắt đầu bằng chữ T: ‘T___’

Ví dụ: Tìm các nhân viên có tên chứa chữ “An”

SELECT employee_id, first_name, last_name, phone
FROM employees
WHERE last_name LIKE '%An%';

Tìm các nhân viên mà email tận cùng bằng @company.com

SELECT employee_id, first_name, last_name, job_title
FROM employees
WHERE last_name LIKE '%ương';

So sánh ngày tháng

Ví dụ 1 : Lọc ra các nhân viên được tuyển từ đầu năm 2022

SELECT employee_id, first_name, last_name, hire_date
FROM employees
WHERE hire_date >= DATE '2022-01-01';

Ví dụ 2: Tìm các nhân viên sinh sau năm 2000

SELECT employee_id, first_name, last_name, birth_date
FROM employees
WHERE birth_date > '2000-01-01';

Dùng NULL trong điều kiện

Ví dụ 1: Tìm các nhân viên KHÔNG có số điện thoại

SELECT employee_id, first_name, last_name, phone
FROM employees
WHERE phone IS NULL;

Ví dụ 2: Tìm các nhân viên hoa hồng

SELECT employee_id, first_name, last_name, commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;

WHERE với toán tử logic AND, OR, NOT

– Tìm các nhân viên phòng kinh doanh – department_id = 10 và CÓ hoa hồng

SELECT employee_id, first_name, last_name, department_id, commission_pct
FROM employees
WHERE department_id = 10  AND commission_pct IS NOT NULL;

– Liệt kê các nhân viên có lương > 30 triệu HOẶC có hoa hồng > 5%

SELECT employee_id, first_name, last_name, salary, commission_pct
FROM employees
WHERE salary > 30000000 OR commission_pct > 0.05;

Lấy các nhân viên KHÔNG thuộc phòng IT (department_id = 20)

SELECT employee_id, first_name, last_name, department_id, job_title
FROM employees
WHERE NOT department_id = 20;

Ví dụ 4: Nhân viên phòng (20) có lương trên 25 triệu HOẶC nhân viên phòng (30) có lương trên 35 triệu

SELECT employee_id, first_name, last_name, salary, department_id
FROM employees
WHERE (salary > 25000000 AND department_id = 20)
OR (salary > 35000000 AND department_id = 30);

WHERE với IN , NOT IN

Ví dụ 1: Nhân viên trong các phòng 20, 30, 40

SELECT employee_id, first_name, last_name, department_id
FROM employees
WHERE department_id IN (20, 30, 40);

Ví dụ 2: Nhân viên KHÔNG thuộc phòng (10) và (40)

SELECT employee_id, first_name, last_name, department_id
FROM employees
WHERE department_id NOT IN (10, 40);

WHERE với BETWEEN

Between diễn tả khoảng giá trị.  BETWEEN A AND B nghĩa là từ A đến N (gồm cả A và B)

Ví dụ: Nhân viên có mức lương từ 15 triệu đến 25 triệu

SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary BETWEEN 15000000 AND 25000000;
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE birth_date BETWEEN '1995-1-1' AND '1995-12-31';

ORDER BY

Order by dùng để sắp xếp kết quả của truy vấn theo một hoặc nhiều cột. Mặc định sắp xếp ASC (tăng dần) ,  có thể dùng DESC để sắp giảm dần.

SELECT cot1, cot2, ...
FROM ten_bang
ORDER BY cot1 [ASC|DESC] ,  cot2 [ASC|DESC], ...;

Ví dụ 1: Liệt kê toàn bộ nhân viên IT (department_id = 20), xếp theo mức lương giảm dần

SELECT employee_id, first_name, last_name, salary, job_title
FROM employees
WHERE department_id = 20
ORDER BY salary DESC;

Ví dụ 2: Liệt kê toàn bộ nhân viên đang làm việc, xếp theo thứ tự mới nhất đến cũ nhất

SELECT employee_id, first_name, last_name, hire_date
FROM employees
WHERE is_active = TRUE
ORDER BY hire_date DESC;
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary> 30000000
ORDER BY first_name, last_name

LIMIT

Trong lệnh SQL, LIMIT dùng để giới hạn lại số dòng dữ liệu trong kết quả trả về (tức không muốn lấy hết tất cả các dòng thõa điều kiện). LIMIT cũng có thể kết hợp với OFFSET để bỏ qua 1 số dòng đầu tiên (nếu muốn)

SELECT cot1, cot2, ...
FROM ten_bang
ORDER BY cot1
LIMIT n
OFFSET m;

LIMIT n: lấy n dòng
OFFSET m: bỏ qua m dòng đầu tiên

Ví dụ 1: Liệt kê 3 nhân viên mới vào công ty

SELECT employee_id, first_name, last_name, hire_date
FROM employees
WHERE is_active = TRUE
ORDER BY hire_date DESC
LIMIT 3;

Ví dụ 2: Liệt kê 5 nhân viên có hoa hồng cao nhất

SELECT employee_id, first_name, last_name, commission_pct,
       salary * commission_pct AS monthly_commission
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY commission_pct DESC
LIMIT 5;

Thêm ví dụ nữa nhé, ví dụ 3 như sau: Liệt kê 5 nhân viên theo mức thu nhập cao xuống thấp, bỏ qua 2 nhân viên có mức lương cao nhất

SELECT employee_id, first_name, last_name, salary, job_title
FROM employees
ORDER BY salary DESC
LIMIT 5 OFFSET 2;

Ví dụ tổng hợp

1. Tìm nhân viên kinh doanh có hiệu suất cao:

  • Thuộc phòng kinh doanh (department_id = 10)
  • Có hoa hồng >= 3%
  • Lương >= 12 triệu
  • Đang làm việc
  • Được tuyển từ 2020 trở về sau
SELECT
e.first_name || ' ' || e.last_name AS "Họ tên",
e.email AS "Email liên hệ",
e.salary AS "Lương cơ bản",
e.commission_pct * 100 || '%' AS "Tỷ lệ hoa hồng",
e.salary * e.commission_pct AS "Hoa hồng tháng",
e.hire_date AS "Ngày vào làm",
EXTRACT(YEAR FROM AGE(e.hire_date)) || ' năm ' ||
EXTRACT(MONTH FROM AGE(e.hire_date)) || ' tháng' AS "Thâm niên"
FROM employees AS e
WHERE e.department_id = 10
AND e.commission_pct >= 0.03
AND e.salary >= 12000000
AND e.is_active = TRUE
AND e.hire_date >= '2020-01-01'
ORDER BY e.commission_pct DESC, e.salary DESC;

KẾT LUẬN

Bạn đã học qua các câu lệnh truy vấn cơ bản với PostgreSQL , chúng giúp bạn làm việc trực tiếp với dữ liệu trong cơ sở dữ liệu. Thông qua các mệnh đề như SELECT, FROM, WHERE, ORDER BY, LIMIT, bạn có thể lấy dữ liệu, lọc theo điều kiện, sắp xếp và giới hạn số dòng kết quả theo đúng yêu cầu.

Khi nắm vững các câu lệnh này, bạn có thể chủ động khai thác dữ liệu từ database và xử lý nhiều tình huống thực tế. Đây cũng là bước chuẩn bị để tiếp cận các nội dung nâng cao hơn như GROUP BY, HAVING, JOIN và tối ưu truy vấn.