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 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. 50 Thiết kế CSDL và thực thi với SQL Server 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 từ khoá NOT EXISTS để lấy về kết quả mong muốn. Truy vấn nâng cao 51 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 . 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. 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. 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ư