Những kiến thức cơ bản nhất về SQL
Ngôn ngữ truy vấn có cấu trúc (SQL) là một ngôn cơ sở dữ liệu (CSDL) chuẩn công nghiệp được công cụ quản trị dữ liệu của Microsoft (Microsoft jet database engine) sử dụng. SQL được sử dụng để tạo những đối tượng truy vấn (QueryDef objects), như là đối số cho phương thức mở tập hợp bản ghi (OpenRecordset method), và là thuộc tính nguồn bản ghi (RecordSource property) của điều khiển dữ liệu (data control). Nó cũng có thể được dùng với những phương thức thi hành (Execute method) để trực tiếp tạo và thao tác . (jet databases), và tạo ra các SQL PassThrough truy vấn để thao tác trên các CSDL khách chủ từ xa (remote client/server databases).
Chương này sẽ bàn tới cấu trúc cơ bản của SQL, và cách thức sử dụng nó cho việc tạo, bảo trì và sửa đổi CSDL. Chúng ta cũng nói tới sự xây dựng và công dụng của truy vấn SQL để tạo các đối tượng tập hợp bản ghi (Recordset objects), và để chọn, sắp xếp, lọc và cập nhật dữ liệu trong những bảng cơ sở. Hơn nữa, chương này sẽ xem xét cách thức tối ưu hoá truy vấn SQL về mặt tốc độ và hiệu quả. Cuối cùng, chúng ta bàn tới sự khác nhau giữa Microsoft Jet SQL và ANSI SQL một cách cụ thể
rường [Date of Birth] trong bảng Employees: SELECT [Date of Birth] AS DOB FROM Employees; Bất cứ khi nào bạn dùng truy vấn trả lại tên trường nhập nhằng hoặc trùng tên trường, bạn phải dùng mệnh đề AS để cung cấp tên khác nhau cho các trường. Ví dụ sau dùng bó danh “Head Count” để gán kết quả đếm trong tập bản ghi:SELECT COUNT(EmployeeID) AS [Head Count] FROM Employees;Sử dụng biến Visual Basic trong câu lệnh SQL Trong một chương trình Visual Basic, bạn có thể tạo một câu lệnh SELECT trong ứng dụng của bạn bằng cách ghép các biến cục bộ vào trong một câu lệnh khi cần để chọn, sắp xếp, lọc dữ liệu được yêu cầu bởi ứng dụng của bạn. Ví dụ bạn có một điều khiển TextBox (TitleWanted) chứa tên của một tiêu đề và bạn muốn lấy tất cả các sách trong bảng Titles có nhan đề như nhan đề trong hộp TextBox, bạn có thể tạo một câu lệnh SQL bao gồm cả giá trị hiện thời của hộp TextBox. Nhưng nhớ rằng SQL đóng TitleWanted trong một dấu trích đơn (‘’):Set Rst = Db.OpenRecordset(“SELECT * FROM Titles “ _ & “WHERE Title = ‘” & TitleWanted.Text & “’”) 1.Lọc và sắp xếp kết quả của truy vấn:SQL cung cấp một số từ khóa xác nhận và mệnh đề tuỳ chọn giúp bạn thuận tiện hơn trong việc hạn chế và sắp xếp kết quả. Phần sau sẽ thảo luận về sự tiện dụng này. Chỉ dẫn DISTINCTĐể bỏ qua các bản ghi trùng nhau, dùng từ khoá DISTINCT. Nếu được dùng, giá trị trong trường hay một nhóm các trường được chọn trong câu lệnh SELECT sẽ là duy nhất. Ví dụ, Có một vài nhân viên liệt kê trong bảng Employees có cùng họ. Nếu hai bản ghi có cùng nội dung trường “Last Name” là Smith thì câu lệnh sau sẽ trả lại một bản ghi có nội dung là Smith:SELECT DISTINCT [Last Name] FROM Employees; Nếu bỏ từ khoá DISTINCT thì truy vấn sẽ trả lại nhiều hơn một giá trị Smith. Kết quả tập hợp bản ghi của truy vấn dùng DISTINCT không cho phép cập nhật và không phản ánh được những thay đổi sau đó của người dùng khác. Chỉ dẫn TOP Để trả lại một số bản ghi nhất định ở đầu hoặc ở cuối của phạm vi các bản ghi. Dùng chỉ dẫn TOP. Giả sử bạn muốn lấy tên của 25 sinh viên đầu của lớp tốt nghiệp năm 1994:SELECT TOP 25 [First Name], [Last Name] FROM Students _ WHERE [Graduation Year] = 1994 _ ORDER BY [Grade Point Average] DESC; Nếu bạn không dùng mệnh đề ORDER BY, truy vấn sẽ trả lại 25 bản ghi tuỳ ý trong bảng Students thoả mãn điều kiện trong mệnh đề WHERE. Bất cứ khi nào bạn dùng truy vấn trả lại tên trường nhập nhằng hoặc trùng tên trường, bạn phải dùng mệnh đề AS để cung cấp tên khác nhau cho các trường. Ví dụ sau dùng bó danh “Head Count” để gán kết quả đếm trong tập bản ghi:SELECT COUNT(EmployeeID) AS [Head Count] FROM Employees;Sử dụng biến Visual Basic trong câu lệnh SQL Trong một chương trình Visual Basic, bạn có thể tạo một câu lệnh SELECT trong ứng dụng của bạn bằng cách ghép các biến cục bộ vào trong một câu lệnh khi cần để chọn, sắp xếp, lọc dữ liệu được yêu cầu bởi ứng dụng của bạn. Ví dụ bạn có một điều khiển TextBox (TitleWanted) chứa tên của một tiêu đề và bạn muốn lấy tất cả các sách trong bảng Titles có nhan đề như nhan đề trong hộp TextBox, bạn có thể tạo một câu lệnh SQL bao gồm cả giá trị hiện thời của hộp TextBox. Nhưng nhớ rằng SQL đóng TitleWanted trong một dấu trích đơn (‘’):Set Rst = Db.OpenRecordset(“SELECT * FROM Titles “ _ & “WHERE Title = ‘” & TitleWanted.Text & “’”) 1.Lọc và sắp xếp kết quả của truy vấn:SQL cung cấp một số từ khóa xác nhận và mệnh đề tuỳ chọn giúp bạn thuận tiện hơn trong việc hạn chế và sắp xếp kết quả. Phần sau sẽ thảo luận về sự tiện dụng này. Chỉ dẫn DISTINCTĐể bỏ qua các bản ghi trùng nhau, dùng từ khoá DISTINCT. Nếu được dùng, giá trị trong trường hay một nhóm các trường được chọn trong câu lệnh SELECT sẽ là duy nhất. Ví dụ, Có một vài nhân viên liệt kê trong bảng Employees có cùng họ. Nếu hai bản ghi có cùng nội dung trường “Last Name” là Smith thì câu lệnh sau sẽ trả lại một bản ghi có nội dung là Smith:SELECT DISTINCT [Last Name] FROM Employees; Nếu bỏ từ khoá DISTINCT thì truy vấn sẽ trả lại nhiều hơn một giá trị Smith. Kết quả tập hợp bản ghi của truy vấn dùng DISTINCT không cho phép cập nhật và không phản ánh được những thay đổi sau đó của người dùng khác. Chỉ dẫn TOP Để trả lại một số bản ghi nhất định ở đầu hoặc ở cuối của phạm vi các bản ghi. Dùng chỉ dẫn TOP. Giả sử bạn muốn lấy tên của 25 sinh viên đầu của lớp tốt nghiệp năm 1994:SELECT TOP 25 [First Name], [Last Name] FROM Students _ WHERE [Graduation Year] = 1994 _ ORDER BY [Grade Point Average] DESC; Nếu bạn không dùng mệnh đề ORDER BY, truy vấn sẽ trả lại 25 bản ghi tuỳ ý trong bảng Students thoả mãn điều kiện trong mệnh đề WHERE. Chỉ dẫn TOP không chọn lựa giữa những bản ghi bằng nhau. Trong ví dụ, nếu bản ghi thứ 25 và thứ 26 có cùng hạng thì truy vấn sẽ trả lại 26 bản ghi. Bạn cũng có thể dùng từ khoá PERCENT để trả lại một số phần trăm bản ghi ở đầu hay cuối tuỳ thuộc vào mệnh đề ORDER BY. Giã sử rằng thay vì 25 sinh viên, bạn muốn 10 phần trăm sinh viên của lớp.SELECT TOP 10 PERCENT [First Name], [Last Name] _ FROM Students _ WHERE [Graduation Year] = 1994 _ ORDER BY [Grade Point Average] DESC; Mệnh đề WHERE Mệnh đề WHERE xác định những bản ghi từ các bảng được liệt kê trong mệnh đề FROM Microsoft Jet Database engine chọn các bản ghi thoả mãn điều kiện liệt kê trong mệnh đề WHERE. Nếu bạn không có mệnh đề WHERE, truy vấn sẽ trả lại tất cả các dòng từ các bảng được chọn. Nếu bạn chỉ ra hơn một bảng trong truy vấn và không có mệnh đề WHERE hoặc mệnh đề kết nối JOIN, truy vấn của bạn sẽ trả lại kết quả tích đề các của các bảng. Chú ý: Mặc dù mệnh đề WHERE có thể đảm nhận tác vụ kết nối các bảng, nhưng bạn phải dùng một mệnh đề JOIN để thực hiện các thao tác kết nối nhiều bảng với nhau nếu bạn muốn kết quả của truy vấn có thể cập nhật được. Mệnh đề WHERE tương tự như HAVING. WHERE xác định những bản ghi được chọn. Một cách tương tự, một khi các bản ghi đã được nhóm bởi GROUP BY, HAVING sẽ quyết định những bản ghi nào được hiển thị. Dùng mệnh đề WHERE để loại bỏ các bản ghi bạn không muốn nhóm bởi GROUP BY. Một mệnh đề WHERE có thể có tới 40 biểu thức được kết nối bởi các toán tử logic như AND, OR. Khi bạn dùng một trường tên có chứa dấu cách hoặc dấu câu, bạn phải bỏ tên trường đó trong dấu ngoặc vuông ([]): SELECT [Product ID], [Units In Stock] _ FROM Products _ WHERE [Units In Stock] 1000; Mặc định, không có hai bản ghi nào trùng nhau trong kết quả của một truy vấn hợp; tuy nhiên, bạn có thể bao gồm cả chỉ dẫn ALL để kết quả có cả các bản ghi trùng nhau. Nó cũng làm cho truy vấn thi hành nhanh hơn. Tất cả các truy vấn trong phep hợp UNION yêu cầu có cùng số trường, tuy nhiên các trường không cần thiết phải có cùng kích thước hoặc kiểu dữ liệu. Bạn có thể dùng mệnh đề GROUP BY và/hoặc HAVING trong mỗi truy vấn tham gia phép hợp để nhóm dữ liệu. Bạn có thể dùng một mệnh đề ORDER BY ở cuối truy vấn cuối cùng để kết quả trả về được sắp theo một thứ tự xác định.7.Tối ưu truy vấn:Tối ưu CSDL là một chủ đề lớn và bao hàm nhiều vấn đề. Nhiều yếu tố, bao gồm cả cấu hình phần cứng và phần mềm, cài đặt Windows, bộ đệm, không liên quan đến các truy vấn, nhưng chúng ảnh hưởng đến hiệu quả của CSDL.Một yếu tố quan trọng khác là dùng các bảng gắn với CSDL hơn là kết nối trực tiếp với CSDL từ xa. Vấn đề này được bàn kỹ ở trong cuốn “Accessing External Data”. Phần này sẽ trình bày ngắn gọn một số cách tối ưu liên quan đặc biệt tới sự xây dựng các truy vấn, và tận dụng khả năng tối ưu Jet database để xây dựng các truy vấn.Một số chiến lược tối ưu thường dùng:- Hạn chế dùng các trường sắp xếp, đặc biệt là các trường không được tạo chỉ mục.- Đảm bảo các bảng kết nối từ các nguồn khác nhau đều được tạo chỉ mục hoặc là được liên kết trên các khoá chính.- Nếu dữ liệu không thay đổi thường xuyên, dùng các truy vấn tạo bảng từ truy vấn Dynasets của bạn. Dùng các bảng để làm cơ sở cho các form, các báo cáo hơn là dùng các truy vấn.- Nếu bạn đang tạo một truy vấn Crosstab, hãy dùng tiêu đề cột cố định bất cứ khi nào có thể.- Dùng BETWEEN...AND, IN và các dấu “=” trên các cột được đánh chỉ mục.- Khi tạo một truy vấn, không nên thêm các trường không cần thiết.Tối ưu các truy vấn với công nghệ Rushmore:Rushmore là một công nghệ truy cập dữ liệu được dùng trong Jet database engine cho phép một tập hợp các bản ghi được truy cập một cách hết sức hiệu quả. Với Rushmore, khi bạn dùng một kiểu biểu thức nhất định trong điều kiện truy vấn, truy vấn của bạn sẽ thi hành nhanh hơn rất nhiều.Biểu thức tối ưu ở dạng đơn giản:Jet database engine có thể tối ưu hoá các biểu thức đơn giản trong mệnh đề WHERE trong câu lệnh SELECT. Dạng biểu thức đơn giản có thể thành lập nên toàn bộ hoặc một phần phần của biểu thức.Một biểu thức đơn giản có thể tối ưu hoá có một trong những dạng sau:indexedfield comparisonoperator expression - or -expression comparisonoperator indexedfield Trong dạng biểu thức đơn giản nhất có thể tối ưu:- indexedfield phải là một trường mà trên đó có tạo lập chỉ mục.- comparisonoperator phải là một trong những kiểu sau đây: , =, >=, , BETWEEN, LIKE, hoặc IN. - expression là một biểu thức hợp lệ bất kỳ, bao gồm các hằng, các hàm, các trường từ các bảng.Chú ý: Để kết quả là tốt nhất, giá trị so sánh trong biểu thức dùng LIKE phải bắt đầu bằng một ký tự chứ không được là ký tự đại diện (*, ?). Bạn có thể tối ưu LIKE “m*” chứ không thể tối ưu LIKE “*m*”.Biểu thức có thể tối ưu ở dạng phức hợp. Microsoft Jet dùng Rushmore để tối ưu hoá các biểu thức phức hợp được kết hợp từ các biểu thức (có thể tối ưu) đơn giản với các toán tử AND hoặc OR. Một biểu thức như thế nằm trong các dạng sau:- simpleexpression AND simpleexpression- simpleexpression OR simpleexpressionGhi nhớ những điều sau đây khi dùng biểu thức tối ưu hoá Rushmore:- Hàm COUNT(*) được tối ưu ở mức cao cho các truy vấn dùng Rushmore.- Nếu chỉ mục là giảm dần và toán tử so sánh khác dấu bằng, truy vấn không thể tối ưu được.- Rushmore sẽ làm việc với Microsoft Access tables, cũng như với Microsoft FoxPro
File đính kèm:
- Những kiến thức cơ bản nhất về SQL.doc