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
Figure 10.4: Ordering data
Thứ tự sắp xếp có thể là tăng dần hay giảm dần. Dùng các tham số DESC or ASC ta có thể sắp
xếp các bản ghi theo thứ tự yêu cầu. Nếu không có tham số nào trong câu lệnh truy vấn, thứ tự
sắp xếp là tăng dần. Trong ví dụ dưới đây mệnh đề ORDER BY được dùng với trường
Category_Code.
Book_Code Category_Code
B0212 ADVENTURE
B0555 ADVENTURE
B0090 ASTRO
B0091 ASTRO
B0012 CLASSIC
B0656 ROMANCE
B0006 SCIENCE
B0452 SCIENCE
Ta cũng có thể sắp xếp dữ liệu dựa trên nhiều trường. Xem ví dụ sau:
160 Khái niệm Hệ quản trị CSDLQH và SQL Server 2000
Hình 10.5: Sắp xếp theo nhiều trường dữ liệu
Ta có thể kết hợp các trường dữ liệu với các hằng số kiểu chuỗi để có kết quả dễ đọc và định
dạng hợp lý. Thông thường các hằng số này không tồn tại như một trường dữ liệu trong kết quả
truy vấn mà được kết hợp với các trường khác để xây dựng kết quả hiển thị cho truy vấn.
Ví dụ, để thêm vào các ký tự ‘:’ và ‘->’ trong kết quả truy vấn dữ liệu từ bảng titles ta tạo truy
vấn như sau:
Select title_id +':'+ title + ' -> ' + type
From titles
Mệnh đề AS có thể được dùng để thay đổi tiêu đề của trường dữ liệu hay gán tiêu đề cho trường
phát sinh trong kết quả của câu truy vấn. Các trường hiển thị trong kết quả của câu truy vấn
thường có tiêu đề là tên trường trong bảng. Để có tiêu đề dễ hiểu hơn ta dùng mệnh đề AS để tùy
biến.
Ví dụ, để hiển thị tiêu đề “ROLL NUMBER” thay cho trường RollNo trong bảng Students ta
dùng câu lệnh SELECT sau:
Select RollNo as 'ROLL NUMBER' FROM Students
Các câu lệnh SELECT có thể được dùng với các ràng buộc. Ví dụ, ràng buộc IDENTITY có thể
được sử dụng trong truy vấn như sau:
Truy vấn dữ liệu 161
Chú ý: Khi dùng toán tử + trong danh sách truy vấn, ta cần chú ý đến kiểu dữ liệu của các
trường. Các trường là toán hạng của toán tử này phải có cùng kiểu dữ liệu, nếu không SQL
Server sẽ báo lỗi.
SELECT IDENTITY(datatype, seed, increment) AS ID_Number
INTO Table2
FROM Table1
Trong câu truy vấn trên Table1 là bảng có sẵn và Table2 là bảng mà ta muốn tạo ra và đưa các giá
trị tự tăng vào.
data_type là kiểu dữ liệu của trường tự tăng. Trường này chỉ nhận các kiểu dữ liệu integer
hay kiểu dữ liệu decimal.
seed là giá trị gán cho bản ghi đầu tiên của bảng. Các bản ghi tiếp theo được gán các giá trị
tăng dần, các giá trị này được tính bằng tổng của giá trị IDENTITY cuối cùng cộng với giá trị
tăng (increment).
Increment là giá trị tăng được cộng thêm cho các bản ghi tiếp theo của bảng dữ liệu.
Từ khóa DISTINCT loại bỏ các bản ghi trùng lặp từ truy vấn. Nếu không có từ khóa
DISTINCT, truy vấn sẽ trả về tất cả các bản ghi bao gồm cả các bản ghi trùng lặp.
Ví dụ, nếu chúng ta truy xuất trường MaterialType trong bảng Material không dùng từ khóa
DISTINCT ta sẽ nhận được một danh sách dài các giá trị MaterialTypes trùng lặp. Nêu dùng
DISTINCT trong truy vấn SQL Server sẽ chỉ trả về các giá trị MaterialType duy nhất. Câu truy
vấn này như sau:
SELECT DISTINCT MaterialType FROM Material
Mệnh đề TOP được dùng để hạn chế số bản ghi trả về trong kết quả truy vấn.
Câu lệnh SELECT này có cú pháp như sau:
Cú pháp: SELECT TOP n <tên trường> FROM <tên bảng>
Ví dụ: Để hiển thị 3 bản ghi đầu tiên trong bảng Students ta dùng:
SELECT TOP 3 * FROM Students
Ký tự * trong câu truy vấn truy xuất tất cả các trường.
Tương tự như vậy ta có thể truy xuất số bản ghi theo tỷ lệ phần trăm từ bảng dữ liệu. Ví dụ, truy
vấn:
SELECT TOP 40 PERCENT * FROM Students
sẽ truy xuất 40% bản ghi đầu tiên của bảng Students.
10.2 Các hàm tập hợp và truy vấn theo nhóm
Truy vấn theo nhóm (group query) có thể được dùng để hiển thị dữ liệu hiệu quả hơn. Truy vấn
này thường được dùng khi ta muốn nhóm dữ liệu từ bảng theo một hay nhiều tiêu chí trước khi
162 Khái niệm Hệ quản trị CSDLQH và SQL Server 2000
hiển thị kết quả. Truy vấn này có thể làm việc trên toàn bộ bản ghi của bảng hay trên một số bản
ghi thỏa mãn điều kiện được chỉ ra trong mệnh đề WHERE. Các hàm tập hợp (Aggregate
Function) được dùng để tạo ra các giá trị duy nhất cho từng nhóm bản ghi, đồng thời tạo giá trị
tổng.
10.2.1 Mục đích và ý nghĩa của truy vấn theo nhóm
Truy vấn theo nhóm trả về một tập hợp kết quả với mỗi một bản ghi cho từng nhóm dữ liệu, nó
chứa các các giá trị tổng hợp của từng nhóm. Truy vấn này thường được dùng khi ta muốn truy
xuất dữ liệu lớn, việc nhóm dữ liệu theo một tiêu chí nhất định sẽ hiển thị kết quả hiệu quả hơn.
10.2.3 Các hàm tập hợp
Các hàm tập hợp như SUM, AVG, COUNT, MAX, MIN tạo ra các giá trị tổng hợp trong kết quả
truy vấn.
SQL Server hỗ trợ các hàm tập hợp sau:
SUM
Hàm SUM trả về tổng số của tất cả các giá trị của trường dữ liệu trong biểu thức. Ta có thể dùng
DISTINCT với SUM để tính tổng cho các giá trị duy nhất của trường dữ liệu trong biểu thức. Các
giá trị NULL được bỏ qua. SUM chỉ có thể được dùng với các trường dữ liệu kiểu số (numeric).
Cú pháp: SUM(biểu thức)
Ví dụ, để tìm tổng số học viên đăng ký cho khóa học có CourseCode là 1 ta dùng hàm SUM trong
câu lệnh SELECT như trong hình dưới đây:
Hình 10.6: Hàm SUM
Các hàm tập hợp còn có ý nghĩa khác khi dùng với mệnh đề GROUP BY. Chúng ta sẽ bàn về
mệnh đề GROUP BY trong phần sau.
AVG
Hàm AVG trả về giá trị trung bình của tất cả các giá trị của trường dữ liệu được chỉ ra trong biểu
thức. AVG chỉ có thể được dùng với các trường số (numeric) và có thể tự loại bỏ các giá trị
NULL.
Truy vấn dữ liệu 163
Cú pháp: AVG([ALL|DISTINCT]biểu thức)
ALL: Là giá trị mặc định, có tác dụng với tất cả các giá trị.
DISTINCT: Chỉ ra rằng AVG chỉ làm việc với một giá trị duy nhất của trường được chi
ra, bất kể các giá trị này xuất hiện bao nhiêu lần.
Biểu thức :Có thể là bất kỳ biểu thức SQL Server nào, thường là tên trường dữ liệu.
Ví dụ, để tìm trung bình giá trị các hóa đơn trong bảng Invoice ta dùng truy vấn như
trong hình 10.7.
Hình 10.7: Hàm AVG
COUNT
Hàm COUNT đếm được các giá trị khác NULL trong biểu thức. Nếu dùng với từ khóa
DISTINCT, COUNT đếm được các giá trị duy nhất. Hàm COUNT có thể được dùng với các
trường số và ký tự. Các trường KHÓA CHÍNH và KHÓA NGOẠI dùng tốt nhất với hàm
COUNT vì các trường này không chứa giá trị NULL.
Ta cũng có thể dùng ký tự sao (*) thay cho biểu thức trong hàm COUNT. Với cách dùng này ta sẽ
đếm tất cả các bản ghi mà không quan tâm đến bất kỳ trường dữ liệu nào.
Cú pháp: COUNT(Biểu thức) hay
COUNT(*)
Ví dụ, để đếm số khóa học trong bảng Course ta dùng:
164 Khái niệm Hệ quản trị CSDLQH và SQL Server 2000
Hình 10.8: Hàm COUNT
MAX
Hàm MAX trả về giá trị lớn nhất trong biểu thức. Hàm MAX có thể được dùng với các kiểu dữ
liệu số, chuỗi và ngày tháng. MAX trả về giá trị lớn nhất trong toàn bộ giá trị sau khi đã đối
chiếu. MAX bỏ qua các giá trị NULL.
Cú pháp: MAX(Biểu thức)
Ví dụ, để tìm giá trị hóa đơn lớn nhất trong bảng Invoice ta dùng:
Hình 10.9: Hàm MAX
MIN
Hàm MIN trả về giá trị nhỏ nhất trong biểu thức. Hàm này có thể được dùng với các trường số,
chuỗi và ngày tháng. Khi MIN được dùng với các trường kiểu chuỗi, MIN trả về giá trị nhỏ nhất
trong danh sách so sánh. MIN bỏ qua các giá trị NULL.
Cú pháp: MIN(Biểu thức)
Ví dụ, để tìm giá trị hóa đơn nhỏ nhất trong bảng Invoice ta dùng truy vấn như trong hình 10.10:
Truy vấn dữ liệu 165
Hình 10.10: Hàm MIN
10.2.3 Mệnh đề GROUP BY
Mệnh đề GROUP BY nhóm các bản ghi dựa trên một hoặc nhiều trường dữ liệu. Mệnh đề này
trả về một bản ghi chứa giá trị tổng hợp của mỗi tập dữ liệu.
Mệnh đề GROUP BY chia bảng dữ liệu thanh một hay nhiều tập dữ liệu nhỏ có cùng chung giá
trị hay biểu thức. Nếu sử dụng cùng với các hàm tập hợp trong câu lệnh SELECT, GROUP BY sẽ
sinh ra một giá trị cho mỗi tập hợp.
Cú pháp:
GROUP BY <Tên trường>
Ví dụ, ta có thể hiển thị tổng giá trị hóa đơn thanh toán của mỗi học viên. Trong truy vấn sau,
mệnh đề GROUP BY nhóm các bản ghi theo trường RollNo và tính tổng giá trị hóa đơn (Amount)
cho mỗi học viên.
Hình 10.11: GROUP BY
166 Khái niệm Hệ quản trị CSDLQH và SQL Server 2000
Sau từ khóa GROUP BY là danh sách các trường, được gọi là trường dữ liệu nhóm. Các trường
dữ liệu này hạn chế các bản ghi trong kết quả truy vấn. Khi chúng ta nhóm các bản ghi, với mỗi
nhóm dữ liệu sẽ ứng với một bản ghi. Mỗi bản ghi theo nhóm chứa giá trị dữ liệu tổng hợp.
Khi dùng GROUP BY danh sách các trường truy vấn sau câu lệnh SELECT có một số ràng buộc
sau. Các trường cho phép theo sau SELECT phải là:
Các trường nhóm
Các biểu thức trả về một giá trị cho mỗi nhóm dữ liệu như các hàm tập hợp có chứa biểu thức
là một trường dữ liệu.
Mệnh đề GROUP BY có thể được dùng với các mệnh đề khác nhau như: WHERE, ALL,
HAVING.
Mệnh đề WHERE có thể được dùng với GROUP BY để hạn chế các bản ghi trước khi thực hiện
nhóm dữ liệu. Các bản ghi thỏa mãn điều kiện WHERE được dùng để nhóm dữ liệu. Các bản ghi
không thỏa mãn điều kiện bị loại bỏ trước khi thực hiện nhóm.
10.2.4 Truy vấn các bản ghi dùng mệnh đề HAVING
Mệnh đề HAVING được dùng để lọc các bản ghi sau khi nhóm dữ liệu dựa trên các trường nhóm
hay các hàm tập hợp.
Ví dụ, để tìm khóa học có hơn 20 học viên đăng ký ta sử dụng mệnh đề HAVING trong truy vấn
như sau:
Hình 10.12: GROUP BY với HAVING
Mệnh đề HAVING đưa các điều kiện vào mệnh đề GROUP BY cũng như ta dùng WHERE với
SELECT. Điều kiện tìm kiếm WHERE được áp dụng trước khi thao tác nhóm dữ liệu được thực
hiện; còn điều kiện trong HAVING được áp dụng sau khi thao tác nhóm dữ liệu thực hiện xong.
Cú pháp của mệnh đề HAVING cũng giống như mệnh đề WHERE ngoại trừ HAVING có thể
chứa các hàm tập hợp. Mệnh đề HAVING có thể chứa bất kỳ thành phần nào nằm trong dánh
sách truy vấn.
Truy vấn dữ liệu 167
Mệnh đề HAVING và WHERE có thể được dùng trong cùng một câu lệnh SELECT. Để có thể
tạo ra các truy vấn dữ liệu hiệu quả ta cần nắm vững thứ tự các mệnh đề WHERE, GROUP BY,
và HAVING trong câu lệnh SELECT:
Mệnh đề WHERE được dùng để lọc các bản ghi truy xuất từ bảng dữ liệu trong mệnh đề
FROM.
Mệnh đề GROUP BY được dùng để nhóm dữ liệu là kết quả của mệnh đề WHERE.
Mệnh đề HAVING được dùng để lọc các bản ghi trong kết quả nhóm được.
10.3 Các ký tự đại diện trong SQL Server và truy vấn indistinct
Trong phần này chúng ta sẽ tìm hiểu về các ký tự đại diện trong SQL Server và truy vấn
indistinct.
10.3.1 Mục đích và ý nghĩa của các truy vấn indistinct
Các truy vấn indistinct truy xuất các bản ghi theo một mẫu nào đó. Nếu trong truy vấn ta dùng
điều kiện tổng quát thay điều kiện chi tiết ta được truy vấn indistinct.
10.3.2 Các ký tự đại diện trong SQL Server
Ta có thể dùng các ký tự đại diện trong bảng 10.1 với từ khóa LIKE để tạo ra các truy vấn chính
xác và chi tiết hơn.
Ký tự đại diện Mô tả Ví dụ
‘_’ Một ký tự Select UDesc From UserTypes
Where UDesc Like ‘C_’
% Một chuỗi có độ dài bất kỳ Select UserName From Users
Where UserName Like ‘'AL%'’
[] Một ký tự trong khoảng các ký tự
quy định bởi ngoặc vuông
Select * from CourseMaterial where
YearSem Like 'Sem[1-2]'
[^] Bất kỳ ký tự nào không nằm trong
khoảng ký tự quy định bởi ngoạc
vuông.
Select * from CourseMaterial where
YearSem Like 'Sem[^1-2]'
Bảng 10.1: Các ký tự đại diện
Ví dụ,
Select * from Students where RollNo like '200[012]%'
Truy vấn trên trả về các bản ghi có trường RollNo chứa ba ký tự đầu tiên là ‘200’, ký tự thứ tư là
một trong ba ký tự ‘0’,‘1’ hay ‘2’, phần còn lại là một chuỗi bất kỳ.
168 Khái niệm Hệ quản trị CSDLQH và SQL Server 2000
WHERE GROUP BY HAVING
10.3.3 Truy vấn dữ liệu một cách không rõ ràng (indistinctly)
Các toán từ sau có thể được dùng để truy vấn dữ liệu một cách không rõ ràng:
Toán tử IN: Toán tử này được dùng để tạo ra một tập các giá trị cho phép. Ví dụ, truy
vấn sau chỉ trả về các bản ghi có giá trị trường ‘type’ là ‘CLASSIC’ hay ‘ASTRO’:
SELECT * FROM titles WHERE type IN (‘CLASSIC’, ‘ASTRO’);
Ngược lại toán tử NOT IN sẽ trả về các bản ghi không thỏa mãn điều kiện trên.
Toán tử BETWEEN: Toán tử này tương tự như toán tử IN nhưng ta có thể chỉ ra một
khoảng giá trị so sánh. Toán tử này có thể được dùng với các trường kiểu số hay ngày
tháng. Ví dụ:
SELECT * FROM authors WHERE zip BETWEEN 94025 AND 94050
Toán tử LIKE: Toán tử này được dùng để so sánh các chuỗi hay một phần chuỗi ký tự.
Toán tử này chỉ dùng được với kiểu chuỗi và có thể kết hợp với các kiểu dữ liệu Char
hoặc Varchar. Các toán tử ‘=’ hay IN có nhược điểm là chỉ dùng được khi so sánh tuyệt
đối các giá trị. Để hạn chế nhược điểm này SQL cho ta toán tử LIKE. Toán tử này dùng
các ký tự đại diện để tăng khả năng thao tác chuỗi. Các loại ký tự đại diện có thể được
dùng với LIKE là:
Ghạch dưới (_): đại diện cho một ký tự bất kỳ. Ví dụ, ‘_at’ sẽ tìm kiếm được các từ ‘rat’
hay ‘bat’ nhưng không tìm được từ ‘rate’.
Ký tự phần trăm (%): đại diện cho một chuỗi ký tự. Ví dụ, để tìm chi tiết các tác giả
(author) có tên bắt đầu bằng ‘P’, ta có truy vấn sau:
SELECT * FROM authors WHERE au_lname LIKE ‘P%’;
Toán tử IS NULL: Một số bản ghi có trường dữ liệu trống có thể do thông tin trong bản
ghi chưa được ghi đầy đủ. Để tránh việc mất các cấu trúc các thành phần thông tin, người
ta sử dụng giá trị NULL để ghi vào trường dữ liệu trống đó. Do một giá trị NULL được
coi là các giá trị thiếu hay chưa rõ nên nó không thể được dùng để so sánh với các giá trị
khác, nếu không kết quả so sánh sẽ là NULL. Do vậy để loại bỏ các giá trị NULL từ kết
quả truy vấn ta dùng cú pháp sau:
SELECT * FROM authors WHERE phone IS NOT NULL;
Truy vấn trên loại bỏ các bản ghi có giá trị trường phone là trống.
10.4 Truy vấn dữ liệu từ nhiều bảng
Đôi khi chúng ta có nhu cầu truy xuất dữ liệu từ nhiều bảng. SQL có khả năng liên kết dữ liệu từ
nhiều bảng khác nhau. SQL cho phép ta truy xuất dữ liệu từ hai hay nhiều bảng thông qua liên kết
giữa các bảng đó. Do dữ liệu được truy xuất từ nhiều bảng nên truy vấn được gọi là truy vấn
nhiều bảng.
Truy vấn dữ liệu 169
Các liên kết được dùng để truy xuất dữ liệu từ nhiều bảng dựa trên mối quan hệ logic giữa các
bảng đó. Liên kết thường chỉ ra mối quan hệ khóa phụ giữa các bảng. Nó quy định cách thức các
bảng có thể liên kết với nhau bằng cách:
Chỉ ra trường dữ liệu các bảng dùng để liên kết. Một liên kết thường chỉ ra khóa phụ từ một
bảng và khóa liên hệ trong bảng kia.
Chỉ ra toán tử logic như =, <> được dùng để so sánh dữ liệu của các trường liên kết.
Các liên kết có thể được nằm trong mệnh đề FROM hay WHERE. Các điều kiện liên kết kết hợp
với các điều kiện tìm kiếm trong WHERE và HAVING để quyết định số bản ghi truy xuất từ các
bảng trong mệnh đề FROM.
Chú ý: SQL Sever 2000 thực thi các liên kết nhanh hơn các truy vấn con.
Cú pháp:
SELECT <Tên thay thế.Tên trường …. Danh sách tên trường>
FROM Table_A AS Table_Alias_A
JOIN
Table_B AS Table_Alias_B
ON
Table_Alias_A.<Common_Field> = Table_Alias_B.<Common_Field>
trong đó:
Table_A – Là tên bảng phía bên trái từ khóa JOIN.
Table_B – Là tên bảng phía bên phải từ khóa JOIN.
AS Table_Alias : Là cách thay thế tên bảng. Tên thay thế trong truy vấn có thể được sử
dụng để chỉ bảng dữ liệu, lúc đó ta không cần dùng tên đầy đủ của bảng
dữ liệu.
Giả sử ta muốn liệt kê thông tin chi tiết học viên như StudentName, RollNo và CourseCode, hiển
thị cùng với the CourseName. Nếu ta xem trong bảng ta sẽ thấy dữ liệu cần truy xuất nằm ở hai
bảng khác nhau là Students và Course. Nói cách khác, nếu chúng ta muốn truy xuất dữ liệu từ hai
bảng khác nhau, ta cần phải liên kết chúng lại.
Có ba loại liên kết:
Inner Joins
Outer Joins
Self Joins
Inner Joins
170 Khái niệm Hệ quản trị CSDLQH và SQL Server 2000
Với Inner join, các bản ghi từ hai bảng được kết hợp lại trong kết quả truy vấn chỉ khi các bản ghi
từ hai bảng thỏa mãn điều kiện liên kết trên một trường dữ liệu chung.
Cú pháp:
SELECT <Tên thay thế.Tên trường….Dánh sách tên trường>
FROM Table_A AS Table_Alias_A
INNER JOIN
Table_B AS Table_Alias_B
ON
Table_Alias_A.<Trường chung> = Table_Alias_B.<Trường chung>
Ví dụ,
SELECT a.title_id, title, type, price FROM titles a INNER JOIN titleauthor b
on a.title_id=b.title_id where type=’business’
Trong ví dụ này ‘a’ và ‘b’ được dùng làm tên thay thế cho các bảng.
Kết quả như sau.
Hình 10.13: Dùng INNER JOIN trong truy vấn
Truy vấn dữ liệu 171
Tóm tắt bài học
Truy vấn là một câu hỏi được viết bằng Ngôn ngữ truy vấn có cấu trúc (SQL) dùng để truy
xuất dữ liệu từ một hay nhiều bảng.
Câu lệnh SELECT được dùng để viết các truy vấn truy xuất dữ liệu trong cơ sở dữ liệu.
SELECT và FROM là hai từ khóa bắt buộc trong câu lệnh SELECT.
Mệnh đề WHERE trong truy vấn đóng vai trò là bộ lọc hạn chế số bản ghi trả về dựa vào điều
kiện.
Mệnh đề ORDER BY sắp xếp kết quả truy vấn.
Ta có thể sắp xếp dữ liệu tăng dần hay giảm dần bằng tham số ASC hay DESC.
Mệnh đề AS có thể được dùng để thay đổi tên của trường kết quả hay gán tên cho trường phái
sinh.
Từ khóa DISTINCT loại bỏ các bản ghi trùng lặp trong kết quả truy vấn của câu lệnh
SELECT.
Mệnh đề TOP hạn chế số bản ghi trong kết quả truy vấn.
Truy vấn nhóm trả về một tập hợp là một bản ghi cho mỗi tập dữ liệu chứa tổng phụ cho
nhóm dữ liệu đó.
Các hàm tập hợp như SUM, AVG, COUNT, MAX, MIN trả về giá trị tập hợp cho một nhóm.
Mệnh đề GROUP BY nhóm các bản ghi dựa trên một hoặc nhiều trường dữ liệu. Mệnh đề
này trả về một bản ghi chứa giá trị tổng hợp của mỗi nhóm dữ liệu.
Mệnh đề HAVING được dùng để lọc các bản ghi sau khi nhóm dữ liệu hay hạn chế số bản
ghi dùng các hàm tập hợp trong cấu lệnh SELECT.
Các truy vấn không rõ ràng cho phép chúng ta xác định được những dữ liệu không rõ ràng.
SQL cho phép truy vấn dữ liệu từ hai hay nhiều bảng bằng cách liên kết (join) các bảng dữ
liệu. Do dữ liệu được truy xuất từ nhiều bảng nên truy vấn này được gọi là truy vấn nhiều
bảng.
Liên kết được dùng để truy xuất dữ liệu từ hai hay nhiều bảng dựa trên mối quan hệ logic
giữa các bảng.
172 Khái niệm Hệ quản trị CSDLQH và SQL Server 2000
Ôn tập
1. Từ khóa ______________ loại bỏ các bản ghi trùng lặp từ kết quả của câu lệnh SELECT.
2. Mệnh đề ________ hạn chế số bản ghi trả về trong kết quả truy vấn.
3. Ta có thể sắp xếp dữ liệu theo chiều tăng dần hay giảm dần dùng các tham số ______ hay
_____ .
4. Câu lệnh ________ được dùng để viết các truy vấn dữ liệu.
5. Các hàm tập hợp như _____, _________ ,________ và ________ trả về các giá trị tập hợp
cho kết quả truy vấn.
6. Hai loại ký tự đại diện được sử dụng với toán tử LIKE là _______ và ________
7. Mệnh đề ________ được dùng để lọc các bản ghi sau khi đã được nhóm hoặc dùng để hạn
chế các bản ghi bằng các hàm tập hợp trong câu lệnh SELECT.
8. _________ query là truy vấn trả về một tập hợp kết quả với mỗi một bản ghi cho từng nhóm
dữ liệu chứa các các giá trị tổng hợp của từng nhóm.
9. Mệnh đề __________ đặt điều kiện cho mệnh đề GROUP BY giống như mệnh đề WHERE
với SELECT.
10. __________ được dùng để truy xuất dữ liệu từ hai hay nhiều bảng dựa trên mối quan hệ giữa
các bảng.
Truy vấn dữ liệu 173
Trang này được chủ ý để trống
174 Khái niệm Hệ quản trị CSDLQH và SQL Server 2000