Độ ưu tiên trong SQLServer

Độ ưu tiên trong câu truy vấn
Độ ưu tiên trong câu truy vấn

Khi sử dụng T-SQL. Để có thể truy vấn, rút trích chính xác dữ liệu. Chúng ta cần hiểu rõ một số nguyên lý cơ bản. Hôm nay, chúng ta sẽ bàn về độ ưu tiên của các mệnh đề và toán tử trơng câu truy vấn.

Độ ưu tiên của các toán tử

Như chúng ta đã biết, trong một biểu thức các toán tử sẽ có độ ưu tiên khác nhau. Ví dụ nhân chia sẽ được ưu tiên hơn cộng trừ. Trong biểu thức có phép toán nhân, chia, cộng và trừ, các phép toán nhân chia sẽ được thực hiện trước. Và nếu trong biểu thức chỉ có các toán tử cùng độ ưu tiên, thì chúng ta sẽ thực hiện các phép tính từ trái qua phải.

Trong T-SQL các toán tử được gán cho một cấp bậc như bảng bên dưới. Cấp càng nhỏ thì độ ưu tiên trong biểu thức càng lớn.

Level Các toán tử
1
  • ~ (bitwise NOT)
2
  • * (phép nhân)
  • / (phép chia)
  • % (phép chia lấy dư)
3
  • + (dấu dương)
  • – (âm)
  • + (phép cộng)
  • – (phép trừ)
  • & (bitwise AND)
  • ^ (bitwise XOR)
  • | (bitwise OR)
4
  • =, >, <, >=, <=, <>, !=, !>, !< (toán tử so sánh)
5 NOT
6 AND
7 ALL, ANY, BETWEEN, IN, LIKE, OR, SOME
8
  • = (phép gán)

Độ ưu tiên của các mệnh đề

Với những câu truy vấn đơn giản chỉ gồm 3 mệnh đề SELECT-FROM-WHERE. Chúng ta rất dễ dàng hình dung cách mà Database Engine truy vấn và trả dữ liệu. Tuy nhiên, trong thực tế những câu truy vấn của chúng ta lại phức tạp hơn nhiều. Đôi lúc, chúng ta cũng rất khó nắm bắt được cách thức câu truy vấn hoạt động.

Để có thể dễ dàng nắm bắt ý nghĩa của một câu truy vấn. Chúng ta cần hiểu được cách thức các mệnh đề trong câu truy vấn hoạt động.

Thứ tự thực thi trong câu truy vấn không phụ thuộc vào thứ tự sắp xếp của các mệnh đề. Nhưng phụ thuộc vào độ ưu tiên của mệnh đề. Và thông số này được quy ước trước bởi nhà phát hành ngôn ngữ SQ (Trong trường hợp của chúng ta là Microsoft sẽ quy ước cho T-SQL).

Dưới đây là thứ tự ưu tiên của các mệnh đề tương ứng với thứ tự thực hiện:

  1. FROM (và JOIN)
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. DISTINCT
  7. LIMIT / OFFSET