Truy vấn dữ liệu – Sắp xếp

Sắp sếp kết quả trong câu truy vấn
Sắp sếp kết quả trong câu truy vấn

Trong thực tế, sau khi đã truy vấn dữ liệu cần thiết. Chúng ta cần sắp xếp dữ liệu trả về với nhiều mục đích. Có thể đơn giản chỉ là để cho dễ theo dõi. Hay phức tạp hơn là để phân vùng dữ liệu.

Cú pháp

T-SQL cung cấp cho chúng ta mệnh đề ORDER BY để sắp xếp dữ liệu. Cú pháp của mệnh đề này như sau:

Thông thường, chúng ta sẽ đặt mệnh đề này phía sau mệnh đề WHERE. Mệnh đề được bắt đầu với từ khóa ORDER BY, kế đến là thuộc tính hoặc biểu thức sắp xếp và cuối cùng là chiều của dữ liệu. Chiều sắp xếp có 2 giá trị:

  • ASC (ascending): tăng dần. Giá trị mặc định của mệnh đề ORDER BY
  • DESC (descending): giảm dần

Ví dụ

Chúng ta sẽ thực hành một vài ví dụ về sắp xếp dữ liệu để hiểu rõ hơn ứng dụng của nó nhé.

Cơ bản

Ở mức độ cơ bản nhất, đôi lúc chúng ta chỉ cần sắp xếp các dữ liệu theo thứ tự để tiện cho việc đọc chúng thôi. Ở ví dụ cơ bản, chúng ta hãy cùng nhau liệt kê tất cả các nghệ sĩ và sắp xếp tên họ theo thứ thự nhé. Bây giờ, câu truy vấn của mình sẽ là:

Do trong câu truy vấn này, mình muốn liệt kê tất cả thông tin trong bảng nghệ sĩ nên mình sẽ sử dụng kí tự * và bỏ qua mệnh đề WHERE.Và lúc này, kết quả của mình rất dài, nhưng tên các nghệ sĩ đã được sắp xếp theo thứ tự. Nhờ đó, mà chúng ta rất đễ theo dõi và tìm kiếm các thông tin.

Kết quả truy vấn
Kết quả truy vấn

Ngoài ra, chúng ta cũng có thể sắp xếp dữ liệu dựa trên nhiều tiêu chí đồng thời. Trong ví dụ kế tiếp, mình sẽ liệt kê tất cả bài hát. Sắp xếp theo thứ tự tăng dần của tên bài hát và theo thứ tự giảm dần tên của tác giả. Bạn có thể hình dung, dữ liệu sẽ được sắp xếp dựa trên tiêu chí ‘tên bài hát’. Khi 2 dòng có tên bài hát trùng nhau, hệ thống sẽ tiếp tục dựa trên tên tác giả để sắp xếp tiếp. Và lúc này, mình có câu truy vấn:

Các bạn hay thực thi thử câu truy vấn trên và kiểm tra kết quả để hiểu rõ hơn nhé.

Kết hợp với phương thức TOP

Một cách sử dụng thường gặp khác là kết hợp giữa mệnh đề ORDER và phương thức TOP. Lúc này, chúng ta có thể thu về những dòng (hoặc 1 phần) dữ liệu có giá trị lớn nhất hoặc nhỏ nhất.

Ví dụ: mình muốn truy vấn 10 hóa đơn có giá trị lớn nhất. Lúc này, mình sẽ liệt kê tất cả hóa đơn. Sắp xếp chúng theo giá trị giảm dần. Và cuối cùng là chọn ra 10 giá trị trên cùng. Chúng ta có câu truy vấn:

Thật là tiện đúng không nào? Bạn cũng có thể  tìm kiếm những hóa đơn nhỏ nhất hay những bài nhạc có thời lượng ít nhất. Bằng cách sắp xếp dữ liệu theo hướng tăng dần và lấy n phần đầu tiên của chúng.

Kết hợp với OFFSET

Tìm hiểu về OFFSET – FETCH

Với các ví dụ trên, chúng ta có thể sử dụng mệnh đề ORDER BY trong rất nhiều trường hợp. Tuy nhiên, trong thực tế chúng ta sẽ còn gặp nhiều yêu cầu phức tạp hơn. Ví dụ: Trong một cuộc thi, chúng ta ngoài việc lấy 3 bạn sinh viên có điểm trung bình cao nhất để trao giải nhất, nhì và ba. Chúng ta còn phải truy vấn thêm 7 bạn kế tiếp nữa để trao giải khuyến khích.

Tất nhiên, ở ví dụ trên, chúng ta có thể sử dụng phương thức TOP(10) sau đó làm thủ công lọc 3 bạn đầu và 7 bạn sau. Nhưng khi con số này không chỉ dừng lại là 3 và 7 mà là hàng trăm, thậm chí hàng nghìn thì phương thức TOP không còn hữu dụng nữa.

Rất may, T-SQL hỗ trợ cho chúng ta một phương thức khác. Đơn giản và hiệu quả hơn trong những trường hợp chúng ta cần lấy dữ liệu ở 1 đoạn lưng lửng. Nhưng trước hết, chúng ta sẽ tìm hiểu qua những khái niệm cơ bản. OFFSET và FETCH

OFFSET và FETCH
OFFSET và FETCH

Cú pháp

Với ảnh minh họa phía trên, các bạn có thể hình dung. OFFSET là giá trị bỏ qua, FETCH đặc tả số lượng dữ liệu chúng ta muốn lấy. Cú pháp để làm việc với OFFSET và FETCH:

Nhìn qua cú pháp hơi lằng ngoằng. Nhưng thật ra nó khá đơn giản. Chỉ là do nó cho phép sử dụng từ đồng nghĩa. Bạn có thể sử dụng cách nào cũng được.

  • ROW | ROWS: có thể thay thế trực tiếp cho nhau, bạn có thể sử dụng ROWS để mô tả số nhiều. Tăng ý nghĩa cho câu truy vấn.
  • FIRST | NEXT: cũng có thể sử dụng thay thế trực tiếp cho nhau. Tùy theo sở thích của bạn.

Ví dụ

Mình muốn truy vấn hóa đơn có giá trị cao, nhưng chỉ từ vị trí thứ 6 đến 10 thôi. Vậy mình sẽ cần bỏ qua 5 hóa đơn có giá trị cao nhất và lấy 5 dòng giá trị kế tiếp. Lúc này câu truy vấn của mình sẽ là:

Các bạn hãy thực thi thử câu truy vấn trên. Sau đó thử truy vấn 10 hóa đơn có giá trị cao nhất và so sánh với kết quả của 2 câu truy vấn với nhau nha.