You are on page 1of 10

Bài 4 Truy vấn nâng cao (Thực hành)

Mục tiêu bài học:

Kết thúc chương này,bạn có thể:

 Viết các câu lệnh T-SQL để thực thi các sub-queries


 Viết các câu lệnh T-SQL sử dụng mệnh đề EXISTS
 Thực thi truy vấn dữ liệu trên các tập kết quả
 Sử dụng từ khoá DISTINCT để lọc queries
 Sử dụng mệnh đề COMPUTE và COMPUTE BY để thực thi các query tổng kết
 Sử dụng cấu trúc SELECT INTO đẻ chuyển dữ liệu giữa hai bảng

Các bước nêu trong bài này khá chi tiết, toàn diện và xuyên suốt toàn bài. Bài này đã
đựoc biên soạn để thực hiệnc các mục tiêu đề ra và để nắm vững bộ công cụ. Hãy bám sát
các bước sau.

Phần I: Làm theo hướng dẫn Thời gian: 30 phút

Mục tiêu của bài thực hành này là để học viên làm quen với cách viết các subquery, sử dụng
mệnh đề EXIST và mệnh đề DISTINCT, lọc query sử dụng COMPUTE và COMPUTE BY. Học
viên cũng sẽ biết cách lưu kết quả truy vấn dùng cấu trúc SELECT INTO. Về tổng thể học viên sẽ
thu nhận được nhiều kiến thức phong phú để thực thi các truy vấn nâng cao với SQL Server và T-
SQL.

Như chúng ta đã học có ba cách để kết hợp dữ liệu từ nhiều bảng:

1Subqueries - Là một query được gói bên trong một query khác.
2Unions - Kết hợp các dòng từ nhiều bảng.
3Joins - Kết hợp các cột từ nhiều bảng.

Sử dụng subquery

Chúng ta có thể sử dụng một câu lệnh SELECT để trả về các bản ghi mà sẽ được sử dụng bởi câu
lệnh SELECT khác. Câu lệnh bao ở bên ngoài gọi là parent query và câu lệnh bên trong gọi là
subquery.

Select <Column Name> from <table> WHERE


Ví dụ, giả sử chúng ta muốn biết tên các sản phẩm mà đã đựoc đặt hàng, chúng ta có thể sử dụng
câu lệnh sau:

Truy vấn nâng cao 49


Hình 4.1: Sử dụng subqueries

Như chúng ta đã biêt trong bài trước, những điểm sau cần nhớ khi sử dụng các subqueries:

1Chúng ta có thể sử dụng một subquery để thay thế cho một giá trị trong mệnh đề SELECT, như
là một phần của mệnh đề WHERE. Điều này sẽ được chỉ ra ở ví dụ dưới đây.

2Khi sử dụng các toán tử so sánh với sub-query, có một số giới hạn với việc trả lại số lượng dòng
và cột của sub-query. Các giới hạn được tổng kết trong bảng 3.1.

Một cột Nhiều cột


Một dòng Sử dụng =, >, < và các toán Sử dụng EXISTS
tử so sánh khác
Nhiều dòng Sử dụng ANY, ALL, IN và Sử dụng EXISTS
EXISTS

Table 4.1
Ví dụ, subquery ở dưới đây sẽ trả về nhiều dòng và một cột. Trong trường hợp này có thể sử dụng
ANY hoặc ALL hoặc IN hoặc EXISTS.

1Nếu sử dụng một toán tử so sánh cùng với subquery và subquery này trả về nhiều hơn một dòng,

50 Thiết kế CSDL và thực thi với SQL Server


SQL Server sẽ báo lỗi.

2Nhiều subquery có thể viết lại bằng lệnh joins.

Sử dụng từ khoá EXISTS và NOT EXISTS

Khi một subquery có từ EXISTS, nó có chức năng kiểm tra sự tồn tại. Từ khoá EXISTS đựoc sử
dùng để kiểm tra sự tồn tại của các dòng trả về bởi subquery. Subquery lúc này không thực sự trả
lại dữ liệu, mà nó trả về một giá trị TRUE hoặc FALSE.

Một subquery bao gồm từ EXISTS có cú pháp như sau:

WHERE [NOT] EXISTS (Subquery)

Ví dụ, giả sử chúng ta muốn biết chỉ những sản phẩm loại 1 đã được đặt hàng. Chúng ta có thể sử
dụng từ khoá EXISTS để kiểm tra nếu thông tin về sản phẩm tồn tại trong bảng order details .

Câu lệnh và kêt quả của nó được chỉ ra trong hình 4.2.

Hình 4.2: Sử dụng mệnh đề EXISTS

Ví dụ, chúng ta muốn chỉ ra những sản phẩm loại 1 mà chưa được đặt hàng. Chúng ta sẽ sử dụng

Truy vấn nâng cao 51


từ khoá NOT EXISTS để lấy về kết quả mong muốn.

Câu lệnh và kết quả của nó được chỉ ra trong hình 4.3

HÌnh 4.3: Sử dụng mệnh đề NOT EXISTS

Có hai kiểu subquery: Nested queries và Correlated queries

Nested Subqueries

Có thể mở rộng khái niệm subquery đã học để có một subquery có thể gọi một subquery khác, khi
đó nó sẽ được gọi là nested subqueries.

Theo như trên một subquery có thể lồng đến 32 mức nhưng khi đó nó sẽ không có được hiệu suât
thi hành như mong muốn.

Ví dụ, giả sử rằng chúng ta muốn tìm chi tiết của những hoá đơn mà bao gồm những sản phẩm
đựoc cung cấp từ thành phố London.

Câu lệnh và kết quả được hiển thị trong hình 4.4.

52 Thiết kế CSDL và thực thi với SQL Server


HÌnh 4.4: Sử dụng nested subqueries

Từ khoá DISTINCT

Chúng ta đã học về cách sử dụng của các từ khoá trong lệnh SELECT.

Ví dụ, chúng ta muốn hiển thị các prod_id không trùng nhau từ bảng order details với giảm giá là
0. Câu lệnh và kết quả như trong hình 4.5.

Truy vấn nâng cao 53


Hình 4.5: Sử dụng mệnh đề DISTINCT

Mệnh đề GROUP BY

Mệnh đề GROUP BY chia bảng thành một hoặc nhiều nhóm con trong đó mỗi nhóm con có cùng
một giá trị và biểu thức chung. Nếu một hàm tập hợp (aggregate) được sử dụng trong một câu
lệnh SELECT, mệnh đề GROUP BY sẽ đưa ra một giá trị cho mỗi một tập hợp.

Cú pháp: GROUP BY <Column name>

Ví dụ, giả sử rằng bạn muốn tìm số của các ghế đã đặt trước cho mỗi một máy bay.

Trong query ở dưới đây, mệnh đề GROUP BY sẽ nhóm các dòng theo ProductId và cộng tổng số
lượng cho mỗi sản phẩm. Câu lệnh và kết quả như trong hình 4.6.

54 Thiết kế CSDL và thực thi với SQL Server


HÌnh 4.6: Mệnh đề GROUP BY

Từ khóa GROUP BY rồi đến các tên cột, được hiểu là nhóm theo các cột đó. Nó hạn chế bớt các
dòng của tập kết quả. Giống như chúng ta nhóm những dòng lại, sao cho mỗi một nhóm sẽ chỉ
còn lại một dòng. Mỗi một tập kết quả được nhóm thành dòng sẽ chứa dữ liệu tổng kết của tập
đó.

Có một số giới hạn trong những tên cột được chỉ ra trong danh sách sau từ khóa SELECT. Chỉ
những tên cột sau được phép xuât hiện trong danh sách:

1Các tên cột dùng để nhóm (những cột đứng sau GROUP BY)

2Những biểu thức mà chỉ trả về một giá trị cho mỗi giá trị trong cột để nhóm như các hàm
aggregate mà có một tên cột như một tham số.

Mệnh đề COMPUTE và COMPUTE BY

Ví dụ, nếu một người muốn xem số lượng đơn đặt hàng lớn nhất, cùng với số lượng của các đơn
đặt hàng, câu lệnh SELECT sẽ như sau:

SELECT productid, quantity


from [order Details] compute max(quantity)

Kết quả của câu lệnh như trong hình 4.7

Truy vấn nâng cao 55


Hình 4.7: Sử dụng mệnh đề COMPUTE
COMPUTE trả về tổng kết của những hàm aggregate nguợc lại COMPUTE BY trả về tổng kết
của tùng nhóm con trong tập kết quả. COMPUTE BY phải bao gồm mệnh đề ORDER BY. Ví dụ
như trong hình 4.8.

56 Thiết kế CSDL và thực thi với SQL Server


Hình 4.8: Sử dụng mệnh đề COMPUTE BY
SELECT INTO

Câu lệnh SELECT INTO có thể tạo bảng và thêm dữ liệu lấy từ các bảng khác vào. Cấu trúc của
bảng mới sẽ phụ thuộc vào danh sách cột được sử dụng trong câu lệnh SELECT.

Hình 4.9: Câu lệnh SELECT INTO

Phần II Bài tập 1 giờ 30 phút

Chú ý: Những bảng để làm việc ở dưới đây được lấy từ CSDL Pubs. Các cấu trúc giống với
phần bài tập ở Sem I.

Trong Query Analyzer, viết các câu lệnh Transact SQL để giải các bài dưới đây.

1.Viết một query để hiển thị thông tin về các bảng Titles, TitleAuthor và Authors. Sử dụng toán tử
UNION.
2.Viết một query để hiển thị những tiêu đề thuộc loại business.

3.Hiển thị tất cả các loại của sách, mỗi thứ chỉ một dòng.

4.Hiển thị tổng nhuận bút của mỗi tác giả. (Dùng mệnh đề GROUP BY)

5.Hiển thị tất cả các tác giả.

6.Hiển thị những tác giả đã viết sách business (Sử dụng mệnh đề EXISTS)

Truy vấn nâng cao 57


7.Hiển thị số lượng sách được viết bởi mỗi tác giả.

8.Hiển thị số lượng trung bình của mỗi title trong bảng sales. (Gợi ý: sử dụng GROUP BY)

Phần III Bài tập về nhà

1.Viết một query để hiển thị title id, tổng số các order, và tổng số của mỗi title trong bảng sales.

2.Viết một query để hiển thị những author id mà có ít nhất 1 order (Sử dụng mệnh đề EXISTS
và having trong subquery)

3.Viết một query để hiển thị author ids mà không có “single order” (Sử dụng mệnh đề NOT
EXISTS và having trong subquery)

58 Thiết kế CSDL và thực thi với SQL Server

You might also like