
Bài 10 Truy vấn dữ liệu
Mục đích bài học:
Cuối bài học viên có thể:
Nắm vững cách truy vấn dữ liệu bằng các truy vấn T-SQL đơn giản.
Dùng các truy vấn T-SQL để truy xuất dữ liệu theo điều kiện.
Dùng các truy vấn T-SQL để truy xuất dữ liệu theo nhóm.
Dùng các truy vấn T-SQL để truy xuất dữ liệu không trùng lặp.
Nắm vững cách dùng các hàm tập hợp trong SQL Server.
Nắm vững cách dùng INNER JOIN để truy xuất dữ liệu từ nhiều bảng.
Giới thiệu
Trong bài trước chúng ta đã học cách thêm, sửa và xoá dữ liệu trong bảng. Chúng ta đã nắm được
cách sử dụng các câu lệnh và các toán tử hỗ trợ bởi SQL Server. Chúng ta đã học cú pháp của các
câu lệnh INSERT, UPDATE và DELETE và sử dụng các câu lệnh này trong một số ví dụ. Chúng
ta cũng đã bàn về khái niệm liên kết các bảng và cuối cùng chúng ta đã bàn về việc nhập và xuất
dữ liệu vào ra SQL Server bằng công cụ hỗ trợ DTS (Data Transformation Services).
Trong bài này chúng ta sẽ xem xét kỹ các câu lệnh T-SQL dùng để truy xuất dữ liệu từ nhiều
bảng. Chúng ta sẽ tìm hiểu chi tiết các truy vấn giúp truy xuất dữ liệu hiệu quả nhất từ nhiều
bảng. Chúng ta cũng sẽ tóm lược cách dùng các hàm tập hợp và cách sử dụng INNER JOIN để
truy xuất dữ liệu từ nhiều bảng.
10.1 Dùng T-SQL để truy xuất dữ liệu
Mục đích chính của SQL là dùng để giao tiếp với cơ sở dữ liệu. Dữ liệu chỉ có ý nghĩa khi chúng
ta truy xuất và thao tác với chúng. Truy vấn là một dạng câu hỏi được viết bằng Ngôn ngữ truy
vấn có cấu trúc (SQL). Theo tên gọi thì SQL là ngôn ngữ tốt nhất để viết các câu truy vấn. Dùng
SQL ta có thể truy vấn bất kỳ thành phần dữ liệu nào trong các bảng của cơ sở dữ liệu quan hệ.
Chúng ta đã quen thuộc với các truy vấn dữ liệu từ một bảng. Câu lệnh dùng để viết truy vấn là
SELECT. Khi thực thi câu lệnh SELECT, thông tin lưu trữ trong bảng được hiển thị. Chúng ta
có thể mở rộng câu lệnh này để tạo ra các câu truy vấn rất phức tạp và nhiều thành phần.
SELECT là câu lệnh SQL quan trọng nhất. Dùng SELECT chúng ta có thể:
Hiển thị một số hay tất cả các trường trong bảng.
Hiển thị một số hay tất cả các bản ghi trong bảng.
Hiển thị các thông tin tính toán của dữ liệu trong bảng như giá trị trung bình hoặc tổng của
các giá trị trong trường.
Liên kết thông tin từ hai hoặc nhiều bảng.
Các câu truy vấn SQL khá đơn giản so với các ngôn ngữ lập trình khác.
10.1.1 Truy vấn và cú pháp của SELECT
Câu lệnh SELECT đơn giản được xây dựng từ năm thành phần cơ bản sau:
Truy vấn dữ liệu 155

SELECT
<tablename>
;
FROM
<columnname(s)>
1
2
3
4
5
Hình 10.1 – Câu lệnh SELECT
1. SELECT là từ khoá đầu tiên trong truy vấn, theo sau là một dấu cách phân tách với danh
sách các trường.
2. <columnname(s)> (tên các trường) phải là thành phần tiếp theo trong câu truy vấn. Tên các
trường phải được phân tách bằng dấu phảy (,) và phải tồn tại trong bảng đang truy vấn.
3. FROM phải là từ khoá tiếp theo trong câu truy vấn, được phân tách với danh sách các trường
bằng một dấu cách.
4. <tablename> phải là thành phần tiếp theo trong câu truy vấn, được phân tách với từ khoá
FROM bằng một dấu cách.
5. Thành phần cuối cùng trong câu truy vấn là một dấu chấm phảy (;). Ký tự này báo với SQL
rằng câu truy vấn đã kết thúc và cần được thực thi. Đây là một ký tự tuỳ chọn, nếu thiếu câu
truy vấn vẫn được thực thi.
Định dạng của câu lệnh SELECT như sau:
SELECT (nội dung gì?) Tên một hoặc nhiều trường. Tên các trường phải được
phân tách với nhau bằng dấu phảy (,). Chú ý tên trường cuối cùng không có dấu phảy.
FROM (từ đâu?) tên bảng
SELECT và FROM là hai từ khoá bắt buộc trong một câu lệnh SELECT.
SELECT * FROM <tablename>;
Câu lệnh này truy xuất tất cả dữ liệu trong bảng. Để truy xuất tất cả các trường trong bảng ta
dùng ký tự sao (*). Bằng cách này ta không phải nhập đầy đủ tên các trường.
Câu lệnh SELECT có rất nhiều lựa chọn và định dạng khác nhau. Chúng ta mới chỉ xem qua định
dạng đơn giản nhất, các lựa chọn khácnhư sau:
WHERE: Đây là phần tuỳ chọn của câu truy vấn. Nó chỉ ra điều kiện truy vấn. Nếu truy
vấn không có mệnh đề WHERE nó sẽ truy xuất tất cả các bản ghi của bảng. Mệnh đề này
có thể chứa các điều kiện so sánh. Ví dụ, để hiển thị tên các tác giả (authors) của bang
CA ta dùng câu lệnh truy vấn sau::
SELECT au_fname FROM authors WHERE state = ‘CA’;
GROUP BY: Đây cũng là phần tuỳ chọn của câu truy vấn. Nó đươc dùng chỉ khi ta
muốn nhóm kết quả truy vấn theo một tiêu chí nào đó. Ví dụ, khi ta muốn hiển thị các
tác giả (authors) từ các bang (state) khác nhau được nhóm theo bang (state) ta dùng câu
lệnh sau:
SELECT state FROM authors GROUP BY state
156 Khái niệm Hệ quản trị CSDLQH và SQL Server 2000

ORDER BY: Đây cũng là phần tuỳ chọn của câu truy vấn dùng để sắp xếp thứ tự các
bản ghi được hiển thị bởi câu truy vấn. Ví dụ, nếu chúng ta muốn hiển thị danh
sách các tác giả từ bang CA trong bảng authors sắp xếp theo tên (au_fname) chúng
ta dùng câu truy vấn sau:
SELECT * FROM authors WHERE state='CA' ORDER BY au_fname;
Chúng ta đã tìm hiểu các thành phần cơ bản của một câu lệnh SELECT và các thành phần tùy
chọn của nó, bây giờ chúng ta sẽ xem xét chi tiết hơn.
10.1.2 Câu lệnh SELECT đơn giản
Câu lệnh đơn giản nhất để truy xuất tất cả các trường trong bảng có định dạng như sau:
SELECT * FROM Stores;
Hình 10.1: Truy xuất tất cả dữ liệu trong bảng
Câu lệnh trên hiển thị tất cả các bản ghi và trường từ bảng Stores. Các trường được hiển thị
lần lượt theo thứ tự như khi ta tạo bảng.
Các bảng dữ liệu thường rất lớn và chứa nhiều bản ghi dữ liệu. Do đó việc hiển thị tất cả các bản
ghi của bảng trong câu truy vấn là không cần thiết và thiếu thực tế. Với mệnh đề WHERE ta có
thể truy xuất dữ liệu theo điều kiện. Mệnh đề WHERE trong truy vấn đóng vai trò là bộ lọc, hạn
chế số bản ghi theo điều kiện định sẵn. Chỉ những bản ghi thỏa mãn điều kiện mới được hiển thị
trong kết quả của câu truy vấn.
Điều kiện trong mệnh đề WHERE được gọi là mệnh đề điều kiện. Xem ví dụ sau:
SELECT * FROM titles WHERE type = ‘business’
Truy vấn dữ liệu 157

Hình 10.2: Truy vấn dữ liệu theo điều kiện
Trong câu truy vấn, mệnh đề WHERE được dùng để giới hạn kết quả của câu truy vấn, chỉ hiển
thị những bản ghi có trường type là ‘business’. Khi câu lệnh được thực thi, mỗi bản ghi trong
bảng sẽ được so sánh với giá trị trong điều kiện. Chỉ các bản ghi có giá trị thỏa mãn điều kiện mới
được hiển thị. Cần chú ý rằng trường dữ liệu được dùng trong mệnh đề điều kiện WHERE không
nhất thiết phải được hiển thị trong kết quả truy vấn.
Cú pháp: SELECT <Tên trường> FROM <Tên bảng>
WHERE <Điều kiện>
Mệnh đề điều kiện có thể chứa bất kỳ kiểu dữ liệu nào như ký tự, số hay ngày tháng. Các toán tử
logic như AND, OR và NOT có thể được dùng kết hợp trong mệnh đề điều kiện. Ví dụ, để truy
xuất chi tiết các tác giả (author) sống tại bang (state) CA và thành phố (city) Oakland chúng ta
dùng câu lệnh sau:
SELECT au_id, au_fname, au_lname FROM authors
WHERE state='CA' and city='Oakland'
Các toán tử quan hệ cũng có thể được dùng trong mệnh đề điều kiện để xây dựng điều kiện chi
tiết hơn. Một mệnh đề điều kiện có thể là sự kết hợp của các loại toán tử như logic và toán tử
quan hệ. Bây giờ chúng ta sẽ xem một ví dụ phức tạp hơn, trong ví dụ này ta muốn hiển thị chi
tiết các tác giả (author) sống ở bang (state) CA và thành phố (city) Oakland và có ít nhất một hợp
đồng (contract), chúng ta dùng câu lệnh sau:
SELECT au_id, au_fname, au_lname FROM authors
WHERE state='CA' and city='Oakland' and contract>0
158 Khái niệm Hệ quản trị CSDLQH và SQL Server 2000

Hình 10.3: Dùng các toán tử logic và quan hệ trong mệnh đề WHERE
Chúng ta thấy rằng các bản ghi trong bảng không được sắp xếp. Nếu chúng ta muốn các bản ghi
hiển thị theo thứ tự cụ thể, ta dùng mệnh đề ORDER BY. Mệnh đề ORDER BY sắp xếp kết quả
truy vấn. Nó có thể sắp xếp tăng dần (ASC) hay giảm dần (DESC). Mặc định các bản ghi được
sắp xếp tăng dần.
Câu lệnh SELECT sau sắp xếp dữ liệu trong bảng authors theo trường au_fname.
SELECT * from authors
ORDER BY au_fname
Trong ví dụ dưới đây, nếu ta muốn liệt kê danh sách các cuốn sách có giá lớn hơn 10.00 và sắp
xếp theo tiêu đề (title) từ bảng titles, ta dùng truy vấn sau:
SELECT title, price from titles WHERE price>10 ORDER BY title
Truy vấn dữ liệu 159

