Về bản chất, select query là một câu lệnh có cấu trúc như sau: SELECT <Danh sách cột>
FROM <Danh sách bảng> WHERE <Điều kiện>
[GROUP BY <Danh sách cột>] [ORDER BY <Danh sách cột>] ;
Câu lệnh trên có thể hiểu như sau: Chọn ra các cột mong muốn từ các bảng dữ liệu với điều kiện thỏa mãn điều kiện chọn. Nếu từ khóa tùy chọn GROUP BY được đưa vào thì dữ liệu đầu ra sẽ được nhóm theo danh sách các cột đứng sau từ khóa GROUP BY. Nếu từ khóa tùy chọn ORDER BY được đưa vào thì dữ liệu trả về sẽ được sắp xếp theo các cột đứng sau từ khóa ORDER BY. Có hai kiểu sắp xếp là tăng dần (Ascending) và giảm dần (Descending).
Tiếp theo, chúng ta sẽ xem xét cụ thể các thành phần trong câu lệnh SQL:
- <Danh sách cột> là tất cả các cột dữ liệu trong một hay nhiều bảng mà ta muốn Access lấy ra. Mỗi cột được viết cách nhau bởi dấu phẩy “,”. Nếu hai bảng có trường dữ liệu cùng tên thì phải chỉ rõ tên cột của bảng nào bằng cách viết <tên bảng>.<tên cột>. - <Danh sách bảng> là tất cả các bảng mà ta muốn lấy dữ liệu ra. Mỗi bảng được viết cách
nhau bởi một dấu phẩy “,”. Ngoài ra, ta còn có thểđặt lại tên bảng trong câu lệnh để việc truy xuất đến các trường trong từng bảng được dễ hơn bằng cách viết <tên bảng> <tên mới> (Chú ý dấu cách ở giữa).
- <Điều kiện> thường là các phép toán so sánh (>,<,=>,<=, =, <>), các phép toán logic (và - AND, hoặc - OR) hay các phép toán tập hợp (thuộc - IN, nằm giữa - BETWEEN) v.v. Như vậy, đến đây chúng ta đã có thể hiểu được cấu trúc cũng như cách tạo ra một truy vấn dạng lựa chọn (select query). Để hiểu rõ hơn về truy vấn này, chúng ta sẽ xem xét ví dụ cụ thể sau:
Có một cơ sở dữ liệu quản lý nhân sự của một đơn vị gồm 2 bảng dữ liệu. Bảng thứ nhất là bảng “Phòng”, bao gồm các trường: Mã Phòng, Tên Phòng. Bảng thứ hai là bảng Nhân Viên, bao gồm các trường: Mã nhân viên, Tên nhân viên, Giới tính, Ngày sinh và Mã Phòng.
Yêu cầu của bài toán như sau:
- Lấy ra các thông tin về Tên nhân viên, tên phòng của tất cả các nhân viên trong công ty có giới tính là Nam.
- Lấy ra các thông tin về Tên nhân viên, tên phòng của tất cả các nhân viên trong phòng Tổng hợp có ngày sinh từ 1/1/1950 đến 31/12/1970.
Ta tiến hành tạo các truy vấn như sau:
Giả sửđã có cơ sở dữ liệu như trên và trong các bảng đã có dữ liệu. Khởi động Access và mở cơ sở dữ liệu đó ra.
Ở phía bên trái màn hình, trong hộp chọn đối tượng, chọn Query. Có 2 cách để có thể tạo mới một truy vấn. Cách thứ nhất, nhấp đúp chuột vào lựa chọn “Create query in Design view” và cách thứ 2 là bấm nút lệnh New. Khi đó, Access sẽ mở một cửa sổ cho phép bắt đầu tạo mới một truy vấn theo cách nào:
Chọn Design view và bấm OK. Khi đó, Access sẽ mở một cửa sổ “Show table” để lựa chọn các bảng muốn lấy dữ liệu ra (tùy thuộc vào từng bài toán). Trở lại với yêu cầu thứ nhất của bài toán, ta thấy yêu cầu là “Lấy ra tất cả thông tin về Tên nhân viên, tên phòng của các nhân viên trong công ty có giới tính là Nam”. Rõ ràng với yêu cầu như thế, chúng ta phải lấy dữ liệu từ cả hai bảng Nhân viên và Phòng (vì Tên phòng chỉ xuất hiện trong bảng Phòng chứ không có trong bảng Nhân viên). Vì vậy, trong hộp thoại “Show table”, chọn cả 2 bảng bằng cách giữ phím Shift và click chuột lên cả 2 bảng rồi bấm nút lệnh Add.
Khi đó, Access sẽ mở một cửa sổ cho phép thiết kế truy vấn:
Ở yêu cầu thứ nhất của ví dụ, chúng ta muốn lấy ra các trường: Tên nhân viên và tên phòng. Do đó, ở bảng Nhân viên, chọn trường TenNhanVien. Ở bảng Phòng, chọn TenPhong. Ngoài ra, bài toán còn có yêu cầu là chỉ lấy ra thông tin về tên nhân viên và tên phòng của nhân viên có giới tính là Nam. Do đó, ta cũng chọn thêm trường GioiTinh ở trong bảng NhanVien. Khi đó truy vấn của ta được Access làm giúp như sau:
Đến đây, nếu ta dừng lại và “chạy” truy vấn bằng cách click chuột vào nút lệnh “Run”
trên thanh công cụ thì ta sẽ nhận được kết quả như sau:
Rõ ràng, đây là một kết quảđúng về mặt tính toán nhưng lại không đúng theo yêu cầu đặt ra. Đó là ta không muốn hiển thị cột Giới tính và những nhân viên có giới tính là nữ. Vì vậy, để sửa lại truy vấn cho đúng với yêu cầu của bài toán, có thể làm như sau:
Từ menu hệ thống, chọn View Æ Design view. Khi đó Access sẽ mở lại cửa sổ thiết kế truy vấn nhưở trên:
Nhưđã phân tích, truy vấn hiện tại trả về kết quả thừa một cột là cột giới tính. Do đó, để bỏ cột này đi (không hiển thị ở kết quả đầu ra), ta cần bỏ dấu đánh dấu ở cột Giới tính trên dòng “Show” bằng cách nhấp chuột vào ô chọn đó. Ý nghĩa của dòng “Show” được hiểu như sau: Nếu được chọn thì cột tương ứng sẽđược hiển thịở kết quảđầu ra của truy vấn. Trong ví dụ này ta chỉ chọn 2 cột là Tên nhân viên và Tên phòng.
Điều thứ 2 mà truy vấn chưa đáp ứng được là chưa lọc được những nhân viên có giới tính là Nam. Do vậy, ta phải tiếp tục sửa lại truy vấn. Để ý hàng “Criteria” (tiêu chuẩn). Đây là điều kiện lọc mà Access cho phép người dùng đưa vào các điều kiện lọc dữ liệu. Ở ví dụ này ta muốn giới tính là “Nam”, do đó ở cột Giới tính, hàng Criteria ta thêm vào biểu thức = “Nam” để Access hiểu rằng chỉ chọn những bản ghi có giới tính là Nam. Khi đó, truy vấn của ta sẽ như sau:
Sau khi sửa lại và chạy truy vấn này, ta sẽđược kết quả mới như sau:
Rõ ràng kết quả này là tập con của kết quả trong câu truy vấn ban đầu. Nó chỉ chứa các bản ghi với giới tính của nhân viên là “Nam” và không hiển thị cột Giới tính. Như vậy kết quả là đúng với yêu cầu của bài toán.
Như đã trình bày ở phần đầu của mục này, truy vấn thực chất là một câu lệnh SQL có cấu trúc. Để xem truy vấn ta vừa tạo được viết dưới dạng câu lệnh SQL như thế nào, từ menu View, chọn SQL view. Khi đó, ta sẽ thấy câu lệnh SQL của truy vấn trên như sau:
SELECT NhanVien.TenNhanVien, Phong.TenPhong
FROM Phong INNER JOIN NhanVien ON Phong.MaPhong = NhanVien.MaPhong WHERE (((NhanVien.GioiTinh)="Nam"));
Để ghi lại truy vấn vừa tạo, bấm vào biểu tượng “Save” trên thanh công cụ hoặc chọn menu File > Save. Như vậy truy vấn đã được lưu trữ trong cơ sở dữ liệu và có thểđược tái sử dụng.
Với yêu cầu thứ 2 của bài toán là “Lấy ra tất cả các thông tin về Tên nhân viên, tên phòng của các nhân viên trong phòng Tổng hợp có ngày sinh từ 1/1/1950 đến 31/12/1970”, chúng ta sẽ có query như sau:
Trong ví dụ này, chúng ta sử dụng toán tử tập hợp “BETWEEN” để tìm những người có ngày sinh nằm giữa 1/1/1950 và 31/12/1970. Để ý rằng chúng ta sử dụng kiểu dữ liệu ngày tháng theo chuẩn tháng/ngày/năm.
Ngoài ra, nếu không biết chính xác tên phòng, chúng ta có thể sử dụng toán tử so sánh LIKE (gần giống) và các ký tự đại diện ?, *, % để so sánh tên phòng trong ví dụ này và so sánh xâu ký tự nói chung trong truy vấn.