Chuyển đến nội dung chính

Giới thiệu về mệnh đề WHERE trong SQL

Trong hướng dẫn này, bạn sẽ được giới thiệu cách lọc các hàng trong SQL bằng mệnh đề WHERE.
Đã cập nhật 5 thg 10, 2026  · 7 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Việc lọc các hàng từ một bảng theo một điều kiện hoặc tập hợp điều kiện là thao tác rất phổ biến trong phân tích dữ liệu. Trong SQL, bạn có thể thực hiện điều này bằng mệnh đề where. Trong hướng dẫn này, bạn sẽ dùng nó cho nhiều tình huống khác nhau.

Bạn sẽ sử dụng PostgreSQL làm hệ quản trị cơ sở dữ liệu quan hệ (RDBMS), nhưng cú pháp khi dùng với các hệ thống cơ sở dữ liệu khác nhìn chung không khác biệt nhiều. Bạn sẽ bắt đầu bằng cách thiết lập cơ sở dữ liệu PostgreSQL và tự tạo một bảng chứa dữ liệu về các quốc gia. Sau khi thiết lập xong, bạn sẽ chạy một số truy vấn lọc có sử dụng mệnh đề WHERE.

Lưu ý: Để theo sát hướng dẫn, bạn cần quen với những kiến thức cơ bản về SQL và PostgreSQL. Các tài nguyên sau có thể hữu ích nếu bạn chưa quen thuộc.

Tạo bảng trong PostgreSQL

Để theo dõi hướng dẫn này, bạn sẽ cần tạo một bảng trong PostgreSQL chứa thông tin về các quốc gia trên khắp thế giới. Bảng này sẽ được dùng để minh họa cách mệnh đề WHERE hoạt động trong các tình huống khác nhau.

Bước 1: Tạo cơ sở dữ liệu mới

Mở pgAdmin (hoặc giao diện SQL bạn ưa thích) và tạo một cơ sở dữ liệu PostgreSQL mới. Bạn có thể đặt tên như world_data hoặc tên khác tùy ý.

Bước 2: Tạo và nạp dữ liệu cho bảng

Khi cơ sở dữ liệu đã sẵn sàng, mở cửa sổ soạn thảo truy vấn SQL mới và chạy đoạn mã SQL sau. Nó sẽ tạo một bảng tên là countries và chèn một tập bản ghi bao trùm nhiều châu lục, năm độc lập và khu vực:

-- Create the countries tableCREATE TABLE countries (    code VARCHAR(3) PRIMARY KEY,    name VARCHAR(100),    continent VARCHAR(50),    region VARCHAR(100),    surface_area NUMERIC,    indep_year INTEGER,    local_name VARCHAR(100),    gov_form VARCHAR(100),    capital VARCHAR(100),    cap_long NUMERIC,    cap_lat NUMERIC);-- Insert sample data into the countries tableINSERT INTO countries (code, name, continent, region, surface_area, indep_year, local_name, gov_form, capital, cap_long, cap_lat)VALUES('IND', 'India', 'Asia', 'Southern Asia', 3287263, 1947, 'Bharat', 'Federal Republic', 'New Delhi', 77.2090, 28.6139),('PAK', 'Pakistan', 'Asia', 'Southern Asia', 881912, 1947, 'Pakistan', 'Federal Republic', 'Islamabad', 73.0551, 33.6844),('CHN', 'China', 'Asia', 'Eastern Asia', 9596961, NULL, 'Zhongguo', 'People''s Republic', 'Beijing', 116.4074, 39.9042),('VNM', 'Vietnam', 'Asia', 'South-Eastern Asia', 331212, 1945, 'Việt Nam', 'Socialist Republic', 'Hanoi', 105.8544, 21.0285),('JPN', 'Japan', 'Asia', 'Eastern Asia', 377975, NULL, 'Nippon', 'Constitutional Monarchy', 'Tokyo', 139.6917, 35.6895),('DEU', 'Germany', 'Europe', 'Western Europe', 357386, 1955, 'Deutschland', 'Federal Republic', 'Berlin', 13.4050, 52.5200),('FRA', 'France', 'Europe', 'Western Europe', 551695, 843, 'France', 'Republic', 'Paris', 2.3522, 48.8566),('RUS', 'Russia', 'Europe', 'Eastern Europe', 17098242, 1991, 'Rossiya', 'Federation', 'Moscow', 37.6173, 55.7558),('UKR', 'Ukraine', 'Europe', 'Eastern Europe', 603500, 1991, 'Ukrayina', 'Republic', 'Kyiv', 30.5234, 50.4501),('EGY', 'Egypt', 'Africa', 'Northern Africa', 1002450, 1922, 'Misr', 'Republic', 'Cairo', 31.2357, 30.0444),('NGA', 'Nigeria', 'Africa', 'Western Africa', 923768, 1960, 'Nigeria', 'Federal Republic', 'Abuja', 7.4951, 9.0578),('AUS', 'Australia', 'Oceania', 'Australia and New Zealand', 7682300, 1901, 'Australia', 'Federal Parliamentary Democracy', 'Canberra', 149.1245, -35.3075),('USA', 'United States', 'North America', 'North America', 9833517, 1776, 'United States', 'Federal Republic', 'Washington, D.C.', -77.0369, 38.9072),('CAN', 'Canada', 'North America', 'North America', 9984670, 1867, 'Canada', 'Constitutional Monarchy', 'Ottawa', -75.6972, 45.4215),('BRA', 'Brazil', 'South America', 'South America', 8515767, 1822, 'Brasil', 'Federal Republic', 'Brasília', -47.9292, -15.7801),('ARG', 'Argentina', 'South America', 'South America', 2780400, 1816, 'Argentina', 'Federal Republic', 'Buenos Aires', -58.3816, -34.6037);

Bảng chứa các thông tin khác nhau về tổng cộng khoảng 16 quốc gia trên toàn cầu. Bảng có các cột sau:

  • code là khóa chính của bảng và biểu thị mã quốc gia dùng chung cho một quốc gia

  • name tức là tên quốc gia

  • continent mà quốc gia đó thuộc về

  • region vị trí địa lý nơi quốc gia tọa lạc

  • surface_area diện tích bề mặt của quốc gia

  • indep_year tức là năm quốc gia giành được độc lập

  • local_name tên bản địa của quốc gia

  • gov_form tức là hình thức chính thể đang áp dụng tại quốc gia

  • capital thủ đô của quốc gia

  • cap_long tức là kinh độ của thủ đô quốc gia

  • cap_lat tức là vĩ độ của thủ đô quốc gia

Giờ hãy bắt đầu lọc một số bản ghi với mệnh đề WHERE.

Sử dụng mệnh đề WHERE trong SQL

Trong SQL, mệnh đề WHERE cho phép bạn lọc bản ghi dựa trên cả giá trị văn bản và số. Bạn có thể so sánh các giá trị này, và các phép so sánh sau được hỗ trợ -

  • = bằng

  • <> và != không bằng

  • < nhỏ hơn

  • > lớn hơn

  • <= nhỏ hơn hoặc bằng

  • >= lớn hơn hoặc bằng

Khuyến nghị dùng <> thay vì != theo tiêu chuẩn SQL.

Giờ hãy lấy bản ghi của quốc gia có code là AUS. Cột bạn cần so sánh ở đây là cột code và giá trị cần so sánh là AUS. Truy vấn sẽ là:

SELECT * FROM countries WHERE code = 'AUS';

Và bạn nhận được:

Lưu ý một vài điểm sau -

  • Mệnh đề WHERE luôn đứng sau FROM.

  • Trong SQL, chuỗi được đặt trong dấu nháy đơn.

Giờ hãy xem một phép so sánh số. Hãy lấy các bản ghi của những quốc gia giành được độc lập (indep_year) sau 1901:

SELECT * FROM countries WHERE indep_year > 1901;

Bạn nhận được tổng cộng 3 quốc gia giành độc lập sau 1901. Lưu ý toán tử so sánh được dùng ở đây. Cột indep_year có kiểu số nguyên. Do đó, không có dấu nháy trong phép so sánh.

Bạn có thể nối nhiều điều kiện trong một mệnh đề WHERE bằng các toán tử nối AND và OR. Truy vấn sau sẽ lấy các bản ghi của những quốc gia where continent = 'Asia' and indep_year > 1900 -

SELECT * FROM countries WHERE continent = 'Asia' AND indep_year > 1901;

Bạn nhận được thông tin về tổng cộng ba quốc gia nằm ở châu lục Asia và giành độc lập sau 1901. Lưu ý rằng trong truy vấn trên, bạn đã so sánh cả giá trị văn bản và số. Như một bài tập, bạn có thể thử các tổ hợp khác nhau của AND và OR trong mệnh đề WHERE.

Lưu ý: Khi kết hợp AND và OR, đừng quên đặt từng điều kiện trong dấu ngoặc đơn. Nếu không, SQL sẽ khó xác định thứ tự ưu tiên khi đánh giá các điều kiện.

Với truy vấn sau, bạn nhận được tổng cộng sáu quốc gia.

SELECT * FROM countries WHERE(continent = 'Europe' AND indep_year > 1900)or(continent = 'Asia' AND indep_year > 1900);

Bạn thậm chí có thể nối nhiều hơn hai điều kiện trong một mệnh đề WHERE:

SELECT * FROM countries WHERE continent = 'Asia' OR indep_year > 1900 OR surface_area > 652090;

Tại đây, bạn nhận được tổng cộng 15 quốc gia hoặc nằm ở Asia hoặc giành độc lập sau 1901 hoặc có diện tích bề mặt lớn hơn 652090.

Giờ hãy chuyển truy vấn sang biến thể dùng AND, mang tính ràng buộc hơn:

SELECT * FROM countries WHERE continent = 'Asia' AND indep_year > 1901 AND surface_area > 652090;

Trong trường hợp này bạn sẽ nhận được tổng cộng hai quốc gia.

Bạn cũng có thể ghép các truy vấn con trong mệnh đề WHERE. Giả sử bạn muốn lấy bản ghi của quốc gia có diện tích bề mặt lớn nhất, nhưng bạn không biết giá trị diện tích tối đa là bao nhiêu. Truy vấn sau có thể hữu ích trong những tình huống như vậy:

SELECT * FROM countries WHERE surface_area in (SELECT MAX(surface_area) FROM countries);

Bạn sẽ nhận được bản ghi của Russia.

Kết luận

Chúc mừng, bạn đã hoàn thành hướng dẫn này. Lọc kết quả truy vấn theo điều kiện chắc chắn là một kỹ năng quan trọng, và hướng dẫn này đã đóng vai trò giới thiệu cho bạn. Nếu muốn rèn giũa kỹ năng SQL hơn nữa, bạn có thể xem các khóa học của chúng tôi (liên kết bên dưới).


Sayak Paul's photo
Author
Sayak Paul

Sayak làm việc tại Hugging Face, nơi anh ấy lập trình, viết và thuyết trình. Phần lớn thời gian của anh xoay quanh mọi thứ liên quan đến thư viện Diffusers. Anh cũng là giảng viên dự án tại DataCamp và là tác giả của nhiều hướng dẫn trên DataCamp. Ngoài công việc, bạn sẽ thấy anh ấy cày Suits trên Netflix lần thứ n. 

Câu hỏi thường gặp về mệnh đề SQL WHERE

Tôi có thể dùng cả cột văn bản và số trong mệnh đề WHERE không?

Có, bạn có thể lọc theo cả giá trị văn bản (ví dụ, 'Asia') và số (ví dụ, > 1901). Chỉ cần nhớ rằng giá trị văn bản phải được đặt trong dấu nháy đơn.

Có khác biệt giữa <> và != trong SQL không?

Cả hai đều có nghĩa là "không bằng", nhưng <> là toán tử chuẩn của SQL. Một số cơ sở dữ liệu cũng hỗ trợ !=, nhưng tốt nhất nên dùng <> để đảm bảo khả năng tương thích.

Làm thế nào để lọc các bản ghi có giá trị NULL?

Hãy dùng IS NULL hoặc IS NOT NULL. Ví dụ:

SELECT * FROM countries WHERE indep_year IS NULL;

Tôi có thể dùng truy vấn con trong mệnh đề WHERE không?

Có, bạn có thể dùng truy vấn con để so sánh một cột với kết quả của truy vấn khác. Ví dụ:

SELECT * FROM countries WHERE surface_area = (SELECT MAX(surface_area) FROM countries);

Mệnh đề WHERE đứng trước hay sau mệnh đề FROM?

Mệnh đề WHERE luôn đứng sau mệnh đề FROM và trước các mệnh đề như GROUP BY hoặc ORDER BY.

Tôi có thể dùng WHERE với JOIN không?

Chắc chắn rồi. Bạn có thể áp dụng mệnh đề WHERE sau khi thực hiện JOIN để lọc tập kết quả đã kết hợp.

Chủ đề
Phân tích dữ liệu
Khoa học Dữ liệu
SQL

Các khóa học SQL

Khóa học

Cải thiện hiệu năng truy vấn trong PostgreSQL

4 giờ
14.2K
Học cách cấu trúc truy vấn PostgreSQL để chạy nhanh hơn nhiều lần.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm