Truy vấn dữ liệu - Phần 2¶
Tóm lược nội dung
Bài này trình bày câu lệnh truy vấn SELECT để:
- truy vấn dữ liệu thoả điều kiện cho trước từ một bảng.
- sắp xếp dữ liệu trả về.
Yêu cầu về cơ sở dữ liệu¶
Tiếp tục sử dụng cơ sở dữ liệu school_db
đã tạo ở bài trước.
Nếu gặp trục trặc về cơ sở dữ liệu, hãy xoá school_db
(1) và tạo lại từ đầu (2).
-
1. Trong pgAdmin, click chuột phải vào school_db và chọn Delete.
2. Trong hộp thoại hiện ra, chọn Yes để xác nhận xoá.
-
Chạy tập tin school_db_script.sql bằng pdAdmin của PostgreSQL.
Truy vấn có điều kiện¶
Không phải lúc nào ta cũng muốn trích xuất tất cả mẫu tin, mà chỉ cần lọc ra những mẫu tin thỏa điều kiện nào đó.
Để lọc mẫu tin theo điều kiện, ta viết biểu thức điều kiện trong mệnh đề WHERE
.
Cú pháp truy vấn có điều kiện
Biểu thức điều kiện gồm các toán tử như sau:
Toán tử | Ý nghĩa |
---|---|
= |
Bằng |
<> |
Khác |
> |
Lớn hơn |
>= |
Lớn hơn hoặc bằng |
< |
Nhỏ hơn |
<= |
Nhỏ hơn hoặc bằng |
LIKE |
Tương tự |
BETWEEN ... AND ... |
Nằm trong khoảng |
IN |
Nằm trong tập hợp |
and , or , not |
Kết hợp |
So sánh dữ liệu kiểu số¶
Để so sánh dữ liệu kiểu số, ta dùng các toán tử =
, <>
, >
, >=
, <
, <=
.
Ví dụ:
Yêu cầu: Lập danh sách các học sinh nữ.
Phân tích:
Giới tính nữ được thể hiện ở thuộc tính gender
với giá trị bằng 1
.
Như vậy, biểu thức điều kiện là gender = 1
.
Mã lệnh SQL:
Output:
So sánh dữ liệu kiểu chuỗi¶
Khi so sánh chuỗi, ta cần đặt chuỗi vào dấu nháy đơn 'chuỗi'
.
Ví dụ:
Yêu cầu: Lập danh sách các học sinh sinh tại thành phố Osaka, Nhật Bản.
Phân tích:
Nơi sinh được thể hiện ở thuộc tính birth_place
.
Thành phố Osaka, Nhật Bản được lưu trong cơ sở dữ liệu với giá trị là 'Osaka, Japan'
.
Như vậy, biểu thức điều kiện là birth_place = 'Osaka, Japan'
.
Mã lệnh SQL:
Output:
Lưu ý
Đối với chuỗi, chỉ một khoảng trắng dư thừa cũng dẫn đến sai lệch trong kết quả.
Toán tử bằng =
dùng để so sánh chuỗi chính xác. Trong trường hợp muốn so sánh chuỗi một cách gần đúng hoặc tương đối, ta dùng toán tử LIKE
.
Toán tử LIKE
dùng để so sánh chuỗi theo một mẫu nào đó.
Hai ký tự đại diện được dùng kết hợp với toán tử LIKE
là:
Ký tự đại diện | Đại diện cho |
---|---|
% |
0 hoặc 1 hoặc nhiều ký tự |
_ |
một kí tự duy nhất |
Ví dụ:
Yêu cầu: Lập danh sách các học sinh sinh tại Nhật Bản.
Phân tích:
Vì thuộc tính birth_place
chứa cả thành phố và quốc gia, trong khi yêu cầu chỉ đề cập quốc gia, nên ta không thể dùng toán tử =
, mà phải dùng toán tử LIKE
để so sánh chuỗi.
Trước chuỗi 'Japan'
, ta không biết thành phố nào, gồm những ký tự gì, nên ta dùng ký tự đại diện %
.
Như vậy, biểu thức điều kiện là birth_place LIKE '%Japan'
.
Mã lệnh SQL:
%Japan
nghĩa là chuỗi kết thúc bằng 'Japan', các ký tự trước 'Japan' là bất kỳ.
Output:
Kết hợp nhiều điều kiện¶
Để kết hợp nhiều điều kiện, ta dùng toán tử logic AND
, OR
, NOT
.
Ví dụ:
Yêu cầu: Lập danh sách các học sinh sinh trong tháng 11 và tháng 12.
Phân tích:
Mặc dù theo văn nói, "sinh trong tháng 11 và tháng 12", (nhưng) theo toán học, ta cần diễn đạt rằng: "sinh trong tháng 11 hoặc trong tháng 12". Bởi vì không có ai vừa sinh trong tháng 11 (lại) vừa sinh trong tháng 12.
Tháng sinh được trích xuất từ thuộc tính birth_date
bằng hàm extract(month from birth_date)
.
Như vậy, biểu thức điều kiện là extract(month from birth_date) = 11 or extract(month from birth_date) = 12
.
Mã lệnh SQL:
-
Trong PostgreSQL, hàm
extract
dùng để trích xuất một phần của ngày tháng.extract(month from birth_date)
sẽ trích xuất tháng từbirth_date
.
Output:
Sắp xếp dữ liệu trả về¶
Để sắp xếp dữ liệu trả về theo một hoặc nhiều thuộc tính, ta sử dụng từ khóa ORDER BY
.
Cú pháp sắp xếp dữ liệu trả về
Trong đó, từ khóa chỉ định thứ tự sắp xếp là:
Từ khóa | Thứ tự sắp xếp |
---|---|
ASC |
tăng dần |
DESC |
giảm dần |
Nếu không chỉ định từ khóa, thứ tự mặc định là tăng dần.
ORDER BY
chỉ sắp xếp dữ liệu trả về, không ảnh hưởng đến dữ liệu thực trong cơ sở dữ liệu.
Ví dụ:
Yêu cầu: Lập danh sách các học sinh mang họ Tào và họ Tư Mã. Danh sách phải được sắp xếp theo thứ tự: họ từ Z về A và và tên từ A đến Z.
Phân tích:
Họ Tào và họ Tư Mã được lưu trong thuộc tính last_name
. Để lọc ra học sinh mang họ Tào và họ Tư Mã, ta dùng biểu thức điều kiện last_name = 'Tào' or last_name = 'Tư Mã'
.
Để sắp xếp họ theo thứ tự Z-A, ta ghi last_name DESC
, tức giảm dần. Để sắp xếp tên theo thứ tự A-Z, đồng nghĩa tăngg dần, ta không cần ghi rõ ASC
.
Như vậy, mệnh đề sắp xếp là order by last_name DESC, first_name
.
Với cách sắp xếp này, các mẫu tin có họ Tư Mã sẽ nằm trước các mẫu tin có họ Tào. Nếu cùng họ thì mới bắt đầu sắp xếp theo tên, tăng dần theo thứ tự bảng chữ cái.
Mã lệnh SQL:
Output:
Sơ đồ tóm tắt nội dung¶
Sơ đồ tóm tắt về truy vấn có điều kiện và sắp xếp dữ liệu
Some English words¶
Vietnamese | Tiếng Anh |
---|---|
điều kiện | criteria |
giảm dần | descending |
ký tự đại diện | wildcard character |
tăng dần | ascending |
Mã nguồn¶
Các đoạn mã trong bài được đặt tại GitHub.