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 đề EXIST
Trang 1Bà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.
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:
Trang 2Hì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 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
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, SQL Server sẽ báo lỗi
Trang 32Nhiề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
từ khoá NOT EXISTS để lấy về kết quả mong muốn
Trang 4Câ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
Trang 5HÌ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
Trang 6Hì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
Trang 7HÌ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
Trang 8Hì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
Trang 9Hì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)
Trang 107.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)