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:
1 Subqueries - Là một query được gói bên trong một query khác.
2 Unions - Kết hợp các dòng từ nhiều bảng.
3 Joins - 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:
1 Chú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.
2 Khi 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
tử so sánh khác
Sử dụng EXISTS
Nhiều dòng Sử dụng ANY, ALL, IN và
EXISTS
Sử dụng 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.
1 Nế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
50 Thiết kế CSDL và thực thi với SQL Server
dòng, SQL Server sẽ báo lỗi.
2 Nhiề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