Khóa học
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:
codelà khóa chính của bảng và biểu thị mã quốc gia dùng chung cho một quốc gianametức là tên quốc giacontinentmà quốc gia đó thuộc vềregionvị trí địa lý nơi quốc gia tọa lạcsurface_areadiện tích bề mặt của quốc giaindep_yeartức là năm quốc gia giành được độc lậplocal_nametên bản địa của quốc giagov_formtức là hình thức chính thể đang áp dụng tại quốc giacapitalthủ đô của quốc giacap_longtức là kinh độ của thủ đô quốc giacap_lattứ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 đề
WHEREluôn đứng sauFROM.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 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.