Bài 10 Truy vấn dữ liệu
lượt xem 29
download
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ụ.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài 10 Truy vấn dữ liệu
- 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 FROM ; 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. (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. 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 ; 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 FROM WHERE 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 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. 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
- 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 FROM 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 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. WHERE GROUP BY HAVING 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ự Select * from CourseMaterial where quy định bởi ngoặc vuông YearSem Like 'Sem[1-2]' [^] Bất kỳ ký tự nào không nằm trong Select * from CourseMaterial where khoảng ký tự quy định bởi ngoạc YearSem Like 'Sem[^1-2]' vuông. 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
- 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 FROM Table_A AS Table_Alias_A JOIN Table_B AS Table_Alias_B ON Table_Alias_A. = Table_Alias_B. 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 FROM Table_A AS Table_Alias_A INNER JOIN Table_B AS Table_Alias_B ON Table_Alias_A. = Table_Alias_B. 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
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Giáo trình Tin học B - Trường ĐH Cửu Long
96 p | 965 | 426
-
Giáo trình Lập trình viên mã nguồn mở PHP (Module 3) - Trung tâm tin học ĐH KHTN
134 p | 266 | 86
-
MS Access - Bài 10&11: Trường tính toán-Truy vấn cơ sở dữ liệu
11 p | 136 | 32
-
10 công cụ miễn phí dành cho Laptop
12 p | 146 | 23
-
Những nguyên lý vận hành của hệ thống quản trị cơ sở dữ liệu
5 p | 184 | 14
-
Giáo trình tin học 12 - Tiết 21 Truy vấn dữ liệu - (Tiết 1/4 tiết)
9 p | 139 | 11
-
Bài giảng Lập trình căn bản: Chương 10 - Võ Duy Tín
28 p | 110 | 9
-
Bài 10: Thiết kế cơ sở dữ liệu
7 p | 98 | 9
-
Giáo trình mô đun Lập trình ứng dụng WPF (Nghề Công nghệ thông tin - Trình độ cao đẳng) – CĐ Kỹ thuật Công nghệ BR–VT
168 p | 59 | 8
-
Giáo trình tin học 12 - Tiết 24 Truy vấn dữ liệu - (Tiết 4/4 tiết)
11 p | 82 | 7
-
Giáo trình tin học 12 - Tiết 2 Truy vấn dữ liệu - (Tiết 2/4 tiết)
9 p | 98 | 6
-
Bài giảng Lập trình web nâng cao: Chương 10 - Trường ĐH Văn Hiến
13 p | 23 | 6
-
Kiểm tra SQL Server bằng Windows PowerShell – P7
7 p | 86 | 3
-
Một phương pháp tra cứu ảnh biểu diễn nhu cầu thông tin người dùng hiệu quả
9 p | 17 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn