Truy vấn dữ liệu (query) là tìm kiếm thông tin trong cơ sở dữ liệu và thể hiện kết quả ra những phương tiện xuất như màn hình hay máy in. Đây là thao tác phổ biến nhất trong các thao tác của các hệ cơ sở dữ liệu và cũng liên quan đến số lượng người dùng đông đảo hơn cả.
Trong một phát biểu truy vấn, ta thường gặp 5 từ khóa sau: SELECT, FROM, WHERE, ORDER BY, GROUP BY; trong đó SELECT và FROM là hai từ khóa bắt buộc, WHERE cũng rất thường gặp trong các phát biểu truy vấn.
Phát biểu tìm kiếm đơn giản có cú pháp như sau :
SELECT <cụm từ chứa tên các thuộc tính> FROM <tên các bảng>
Thí dụ ta muốn truy vấn họ tên của các sinh viên (thuộc tính HoTen) và tên của Khoa mà họ theo học (thuộc tính Khoa) trong bảng Sinh_Vien thì sử dụng cú pháp như sau:
SELECT HoTen, Khoa FROM Sinh_Vien
Nếu không có lỗi, kết quả của truy vấn này là một bảng, được thể hiện trong các phương tiện xuất. Thứ tự các cột trong bảng kết quả này là thứ tự trong mệnh đề SELECT.
Nếu ta muốn truy vấn đến tất cả các thuộc tính trong bảng Sinh_Vien thì ta dùng ký tự * (đại diện cho tất cả) như sau:
SELECT * FROM Sinh_Vien
Kết quả của truy vấn dùng SELECT là một bảng. Tuy nhiên đó có thể không phải là một quan hệ vì có thể giá trị của hai dòng nào đó giống hệt nhau. Nếu ta muốn trong kết quả không có hai dòng nào giống hệt nhau, ta dùng SELECT DISTINCT thay vì SELECT. Tuy nhiên ta cũng nên cân nhắc thêm liệu điều đó có cần thiết không, vì khi ấy hệ quản trị cơ sở dữ liệu sẽ phải thực hiện thêm thao tác so sánh, thời gian thực hiện sẽ dài hơn.
Ghi chú : Phát biểu SELECT . . . FROM . . . tương đương với phép chiếu trong đại số quan hệ.
Trong cụm từ chứa tên các thuộc tính của mệnh đề SELECT, ta có thể sử dụng thêm các chuỗi ký tự hay thực hiện các phép tính toán.
Thí dụ ta muốn kết quả hiển thị dưới dạng “Sinh viên . . . theo học tại khoa . . .” thì câu truy vấn có dạng như sau:
SELECT 'Sinh viên ' || HoTen || ' theo học tại khoa ' || Khoa FROM Sinh_Vien
Trong thí dụ trên, || là toán tử dùng để nối hai chuỗi ký tự. Tuy nhiên ta cần lưu ý là trong MySQL, || là toán tử luận lý OR. MySQL và một số hệ quản trị cơ sở dữ liệu sử dụng hàm CONCAT() hay toán tử cộng bình thường (+) để nối chuỗi ký tự.
Thí dụ ta muốn kết quả hiển thị tiền thưởng của các nhân viên trong một xí nghiệp (bằng 30% lương tháng) dưới dạng “Tiền thưởng của ... là ... ” thì phát biểu truy vấn có dạng như sau:
SELECT 'Tiền thưởng của ' || HoTen || ' là ' 0.3*LuongThang FROM Nhan_Vien
Ta cũng có thể dùng phát biểu truy vấn để có một cái nhìn khái quát về thực thể khảo sát bằng cách sử dụng các hàm có sẵn trong SQL. Thí dụ sau cho ta xác định lương tháng tối thiểu, tối đa và trung bình của tất cả các nhân viên.
SELECT MIN( LuongThang ), MAX( LuongThang ), AVG( LuongThang ) FROM Nhan_Vien
Danh sách các hàm có sẵn trong SQL được trình bày ở Phụ lục 3.3.
Ta cũng có thể tạo mới một thuộc tính (tạm thời) từ các thuộc tính có sẵn với từ khóa AS theo cú pháp:
<bộ kết hợp các thuộc tính có sẵn> AS <thuộc tính mới>
Thí dụ ta có bảng Dat_Hang thể hiện các thực thể đặt hàng. Tương ứng với mỗi sản phẩm ta có đơn giá của sản phẩm (thuộc tính DonGia) và số lượng sản phẩm đặt mua (thuộc tính SoLuong). Ta có thể lập bảng để liệt kê số tiền tương ứng với từng sản phẩm theo phát biếu sau:
SELECT SanPham, DonGia*SoLuong AS ThanhTien FROM Dat_Hang ;
Nếu ta chỉ muốn truy vấn những cá thể thỏa mãn một số điều kiện nào đó thì ta đưa mệnh đề WHERE vào phát biểu truy vấn theo cú pháp sau:
SELECT <cụm từ chứa tên các thuộc tính> FROM <tên các bảng> WHERE <các điều kiện> ;
Thí dụ ta muốn thu được danh sách của các nam sinh viên thì ta sử dụng phát biểu sau:
SELECT HoTen, NgaySinh, Khoa FROM Sinh_Vien WHERE GioiTinh = 'Nam' ;
Tham gia vào điều kiện có thể không chỉ là một thuộc tính mà là một cụm chứa thuộc tính. Thí dụ ta muốn có danh sách các nhân viên có tiền thưởng (bằng 30% lương tháng) ít hơn 1 triệu đồng thì ta sử dụng phát biểu như sau.
SELECT HoTen FROM Nhan_Vien WHERE 0.3*LuongThang < 1000000 ;
Khi ấy, ta gọi thuộc tính tham gia vào điều kiện là “thuộc tính điều kiện”, cụm từ đi sau từ khóa WHERE trong mệnh đề ấy được gọi là “biểu thức điều kiện” (predicate). Như vậy về mặt luận lý, trong một trường hợp cụ thể nào đó, biểu thức điều kiện chỉ có thể có một trong hai giá trị là ĐÚNG (TRUE) hay SAI (FALSE).
Ghi chú : Chúng ta có thể nhận thấy phát biểu SELECT trong SQL không hoàn toàn giống phép chọn (select) của đại số quan hệ. Phép chọn của đại số quan hệ chỉ tương đương với hai mệnh đề FROM . . . WHERE . . . của phát biểu SELECT.
Trong mệnh đề WHERE ta có thể sử dụng các toán tử luận lý để mở rộng thêm khả năng truy vấn. Các toán tử luận lý thường dùng nhất là AND (và), OR (hay), và NOT (không).
Thí dụ ta muốn có danh sách các nữ sinh viên theo học khoa Cơ Khí thì ta sử dụng phát biểu sau:
SELECT HoTen, NgaySinh FROM Sinh_Vien WHERE GioiTinh = 'Nữ' AND Khoa = 'Cơ Khí' ;
Hay nếu ta muốn có danh sách sinh viên không bắt đầu học vào năm 2016 thì ta dùng phát biểu:
SELECT HoTen, NgaySinh, Khoa FROM Sinh_Vien WHERE NOT ( NamBatDau = 2016) ;
Ta cũng có thể mở rộng điều kiện trong mệnh đề WHERE bằng cách so sánh. Ngoài 6 toán tử so sánh mà ta đã biết ( bằng = , không bằng <> , lớn hơn > , bé hơn < , lớn hơn hay bằng >= , và bé hơn hay bằng <= ), SQL cũng cung cấp cho ta một số từ khóa để thực hiện các kiểu so sánh khác.
BETWEEN . . . AND . . .
Để tìm các cá thể có giá trị của cụm thuộc tính điều kiện nằm trong khoảng a và b ta sử dụng mệnh đề WHERE với các từ khóa BETWEEN . . . AND theo cú pháp sau:
WHERE <cụm thuộc tính điều kiện> BETWEEN a AND b
Thí dụ để tìm những sinh viên bắt đầu học từ năm 2013 đến 2015, ta sử dụng phát biểu sau :
SELECT HoTen, NgaySinh, NamBatDau FROM Sinh_Vien WHERE NamBatDau BETWEEN 2013 AND 2015 ;
Khi khai báo điều kiện ở dạng này, ta có các lưu ý sau :
IN
Để xác định các cá thể có giá trị của cụm thuộc tính điều kiện nằm trong một tập hợp những giá trị cụ thể nào đó, ta sử dụng mệnh đề WHERE với từ khóa IN theo cú pháp sau:
WHERE <cụm thuộc tính điều kiện> IN ( <tập hợp các giá trị> )
Thí dụ để tìm những nhân viên có quê quán ở các tỉnh Long An, Cần Thơ, Phú Yên, ta dùng phát biểu truy vấn sau:
SELECT HoTen, DonVi, QueQuan FROM Nhan_Vien WHERE QueQuan IN ('Long An', 'Cần Thơ', 'Phú Yên') ;
LIKE
Từ khóa LIKE được dùng để so sánh các chuỗi có một phần nào đó giống nhau. Khi dùng từ khóa này, ta phải dùng thêm các ký tự đại diện sau:
Thí dụ để tìm những nhân viên có chữ lót là Văn trong họ tên, ta sử dụng phát biểu sau:
SELECT HoTen, DonVi FROM Nhan_Vien WHERE HoTen LIKE '% Văn %' ;
(Lưu ý là có ký tự trống bên trái và bên phải chữ Văn.)
Lưu ý
Khi ta sử dụng trên cùng một biểu thức điều kiện một số toán tử luận lý cũng như từ khóa thì thứ tự ưu tiên thực hiện của chúng như sau:
Thông thường kết quả sẽ hiển thị theo thứ tự của bảng dữ liệu. Trong một số trường hợp ta muốn xắp xếp theo một tiêu chí nào đó thì ta đặt vào cuối phát biểu SELECT một mệnh đề bắt đầu bằng từ khóa ORDER BY như cú pháp sau:
ORDER BY <thuộc tính sắp xếp> [phương thức sắp xếp]
Nếu ta sắp xếp theo thứ tự tăng dần thì phương thức sắp xếp là ASC, hoặc ta không cần ghi gì thêm vì đó là phương thức mặc định. Nếu sắp xếp theo thứ tự giảm dần thì phương thức sắp xếp là DESC.
Ta cũng lưu ý rằng có thể sắp xếp theo một số thuộc tính. Mức độ ưu tiên khi sắp xếp theo thứ tự trong mệnh đề ORDER BY.
Thí dụ ta muốn xác định các nhân viên thuộc Phân Xưởng A có lương tháng lớn hơn 5 triệu đồng và kết quả được sắp xếp theo thứ tự lương tháng giảm dần (ưu tiên 1), và họ tên (ưu tiên 2) thì ta sử dụng phát biểu sau:
SELECT HoTen, LuongThang, FROM Nhan_Vien WHERE DonVi = 'Phân Xưởng A' AND LuongThang > 5000000 ORDER BY LuongThang, HoTen DESC ;
Mệnh đề GROUP BY thường được sử dụng khi ta muốn chia cá thể thành một số nhóm, sau đó tiến hành một số thao tác trên các nhóm này. Thí dụ trong một công ty, ta muốn tính lương tháng trung bình của các nhân viên trong các đơn vị. Như vậy trước hết ta phải tách nhân viên thành các nhóm dựa vào đơn vị, sau đó ta mới đi tính trung bình của lương tháng trong từng nhóm.
Khi đó, ta phải đưa vào phát biểu SELECT mệnh đề dùng để phân nhóm bắt đầu bằng từ khóa GROUP BY theo cú pháp:
GROUP BY <cụm thuộc tính dùng để phân nhóm>
Để thực hiện thí dụ trên, ta sử dụng phát biểu sau:
SELECT AVG( LuongThang ) FROM Nhan_Vien GROUP BY DonVi ;
Trong mệnh đề GROUP BY ta có thể sử dụng điều kiện để loại bỏ một số nhóm nào đó bằng từ khóa HAVING. Ta sử dụng lại thí dụ trên nhưng đặt thêm điều kiện là chỉ đưa vào xem xét những đơn vị nào có trên 3 người. Khi ấy ta sử dụng phát biểu:
SELECT AVG( LuongThang ) FROM Nhan_Vien GROUP BY DonVi HAVING COUNT( HoTen ) > 3 ;
Trong nhiều ứng dụng thực tế, ta phải đồng thời tìm kiếm trên nhiều bảng. Lấy thí dụ ta phải lập một danh sách gồm tên họ tên sinh viên, và vị trí đặt văn phòng của khoa mà sinh viên đang theo học. Họ tên sinh viên trong bảng Sinh_Vien (thuộc tính HoTen) còn vị trí đặt văn phòng khoa lại đặt trong bảng Khoa (thuộc tính VanPhong). Tuy nhiên giữa hai bảng này có mối liên kết nên khóa chính của bảng Khoa là TenKhoa được dùng làm khóa ngoại của bảng Sinh_Vien. Mối liên kết này được đưa vào làm điều kiện trùng khớp trong mệnh đề điều kiện WHERE như phát biểu sau:
SELECT HoTen, VanPhong FROM Sinh_Vien, Khoa WHERE Sinh_Vien.TenKhoa = Khoa.TenKhoa ;
Trong trường hợp này, mối liên hệ giữa hai bảng được gọi là mối liên hệ tự nhiên (natural joint).
Trang web này được cập nhật lần cuối ngày 25/11/2018
Cơ sở dữ liệu
Các chuyên đề
Xử lý dữ liệu
Ma trận
R