[Tài liệu học SQL] Phần 3 -Truy vấn có điều kiện và lệnh WHERE trong SQL

Ngày đăng: 26/12/2023
Nếu bạn đang làm việc với các bộ dữ liệu lớn trong SQL, chắc hẳn bạn sẽ biết tầm quan trọng của việc có thể lọc được kết quả của mình. Đó là nơi hàm WHERE xuất hiện. Bằng cách sử dụng chức năng này để thực hiện truy vấn có điều kiện trong SQL, bạn có thể dễ dàng chỉ chọn các hàng đáp ứng các tiêu chí cụ thể, giúp phân tích dữ liệu của bạn dễ dàng hơn và rút ra kết luận có ý nghĩa.

Giới thiệu về mệnh đề WHERE

Để tạo điều kiện lọc trong một câu lệnh truy vấn, bạn có thể sử dụng mệnh đề WHERE đi kèm với điều kiện:

      SELECT
          Col_name,
          Col_name
      FROM table_name
      WHERE predicate
      {AND|OR predicate}

Ví dụ: Từ bảng Product thuộc bộ dữ liệu adventureworks, truy vấn các cột Name, ProductNumber, Color, StandardCost. Với điều kiện, StandardCost lớn hơn 1000.

truy vấn có điều kiện trong sql

Giải thích câu lệnh truy vấn:

  • FROM: Dữ liệu được truy vấn từ bảng SalesLT.Product.
  • WHERE: Lọc bản ghi thoả mãn StandardCost >1000.
  • SELECT: Truy vấn các cột Name, ProductNumber, Color, StandardCost.

Lọc khi có nhiều hơn một điều kiện

Với lọc khi có nhiều hơn một điều kiện, ta có thể sử dụng toán tử AND và toán tử OR.

  • Toán tử AND.

Toán tử AND nhằm kết hợp các điều kiện với nhau.

Cú pháp của AND:

WHERE Condition 1 AND Condition 2,…
  • Condition 1, Condition 2: Điều kiện kết hợp.

Ví dụ: Từ bảng SalesLT.Product thuộc bộ dữ liệu adventureworks. Truy vấn các cột Name, Color, StandardCost, Weight. Với điều kiện cột StandardCost >= 1000 và cột Weight > 300.

  • Toán tử OR.

Toán tử OR nhằm chọn hoặc thoả mãn điều kiện 1 hoặc điều kiện 2.

Cú pháp của AND:

WHERE Condition 1 OR Condition 2,…
  • Condition 1, Condition 2: Điều kiện 1 hoặc điều kiện 2.

Ví dụ: Từ bảng SalesLT.Product thuộc bộ dữ liệu adventureworks. Truy vấn các cột Name, Color, StandardCost, Weight. Với điều kiện cột StandardCost >= 1000 hoặc cột Weight > 300.

  • Trong SQL, mặc định cụm điều kiện AND sẽ được thực hiện trước OR.

Ví dụ: Từ bảng SalesLT.Product thuộc bộ dữ liệu adventureworks. Truy vấn các cột Name, Color, StandardCost, Weight. Với điều kiện cột StandardCost > 1000 hoặc cột Weight > 300 và StandardCost > 2000.

Giải thích câu lệnh truy vấn:

  • FROM: Dữ liệu được lấy từ bảng SalesLT.Product.
  • WHERE: Lọc bản ghi thoả mãn hoặc StandardCost >1000 hoặc cột Weight > 300 và StandardCost > 2000.

Trên thực tế, SQL sẽ chạy truy vấn điều kiện cột Weight > 300 và StandardCost > 2000, sau đó mới truy vấn điều kiện cột StandardCost >1000.

Các toán tử phổ biến

Bạn có thể sử dụng câu lệnh logic có điểu kiện (Predicates) ở câu lệnh SQL

Một số các điều kiện toán tử phổ biến (Predicate operator)

Toán tử so sánh

A table with text and symbolsDescription automatically generated

Ví dụ: Từ bảng SalesLT.Product thuộc bộ dữ liệu adventureworks. Truy vấn các cột Name, Color, StandardCost, ListPrice. Với 3 điều kiện đồng thời xảy ra: ListPrice > 1000, StandardCost < 9000, màu sắc của sản phẩm khác màu đen.


Toán tử logic

a) Toán tử so sánh giá trị tương đối (LIKE)

‘LIKE’ được sử dụng để lọc ký tự thoả mãn một mẫu tìm kiếm (Pattern) đã được chỉ định sẵn.

Cú pháp của LIKE:

WHERE col_name LIKE pattern
  • col_name: Cột mà bạn muốn thực hiện so sánh mẫu.
  • pattern: Mẫu tìm kiếm bạn muốn sử dụng, có thể chứa các ký tự đại diện như ‘%’ (thay thế bất kỳ chuỗi ký tự) và ‘_’ (thay thế một ký tự).
A white and black textDescription automatically generated
  • Với ký tự đại diện %

Ví dụ: Từ bảng Product thuộc bộ dữ liệu adventureworks, truy vấn ProductID, Name, ProductNumber. Với điều kiện sản phẩm có chứa có tên ‘AWC Logo Cap’.

  • Với ký tự đại diện _

Ví dụ: Từ bảng Product thuộc bộ dữ liệu adventureworks, truy vấn ProductID, Name, ProductNumber. Với điều kiện, sản phẩm có tổng số ký tự trong tên là 7 ký tự, và tên kết thúc bằng Fork.

  • Với ký tự đại diện [ ]

Ví dụ: Từ bảng DimProduct thuộc bộ dữ liệu AdventureWorksDW2019, truy vấn ProductAlternateKey, EnglishProductName, ReorderPoint. Với điều kiện, EnglishProductName có ký tự đầu tiên nằm trong khoảng từ A đến L và có các ký tự còn lại lần lượt là ‘L Crankarm’.

  • Với ký tự đại diện [^ ]

Ví dụ: Từ bảng Customer thuộc bộ dữ liệu adventureworks, truy vấn FirstName, CompanyName, SalesPerson. Với điều kiện, FirstName có tên bắt đầu với chuỗi ký tự ‘Andre’ và kết thúc khác với ký tự ‘a’.

Wildcard character ngoài được sử dụng với mệnh đề WHERE và toán tử LIKE, để so sánh tương đối với mẫu ký tự và lọc dòng thoả mãn thì còn được sử dụng trong hàm xử lý string là hàm PATINDEX

HÀM PATINDEX

Tương tự như CHARINDEX nhưng PATINDEX cho phép sử dụng mẫu ký tự như ‘%’ và ‘_’.

Cú pháp của hàm PATINDEX:

PATINDEX(‘%pattern%’, expression)
  • %pattern%: Là một chuỗi ký tự mẫu (pattern) bạn muốn tìm kiếm, % đại diện cho ký tự.
  • expression: Là biểu thức hoặc cột chứa dữ liệu mà bạn muốn kiểm tra.

Ví dụ: Vị trí của chuỗi ký tự ‘sleeve’ trong tên sản phẩm là vị trí thứ mấy?

A screenshot of a computerDescription automatically generated

Giải thích câu lệnh truy vấn:

  • FROM: Dữ liệu được truy vấn từ bảng SalesLT.Product.
  • SELECT: Truy vấn các cột Name, vị trí của chuỗi ký tự ‘Logo’ bằng hàm CHARINDEX, vị trí của ký tự gồm 4 chữ cái bắt đầu bằng ‘Lo’ bằng hàm PATINDEX.
  • Hàm CHARINDEX: Xác định vị trí chính xác của chữ ‘Logo’ là vị trí 13.
  • Hàm PATINDEX: Xác định vị trí của ký tự thoả mãn mẫu: Có ít nhất 4 ký tự trong chuỗi và 2 ký tự đầu là ‘Lo’.

Vậy nên chữ ‘Long’ thoả mãn ký tự yêu cầu nên trả về vị trí thứ 1.

CHARINDEX sẽ tìm vị trí bắt đầu của ký tự chính xác.

PATINDEX có thể sử dụng được với các wildcard character để xác định vị trí xuất hiện mẫu ký tự mà không cần định nghĩa ký tự chính xác của nó.

b) Toán tử lọc trong tập giá trị (IN)

Toán tử IN được sử dụng nhằm lọc xem một giá trị có thuộc tập giá trị đã xác định.

Cú pháp của IN:

WHERE col_name IN(val_1, val_2, val_3 …)
  • col_name: Cột mà bạn muốn thực hiện so sánh mẫu.
  • val_1, val_2, val_3: Danh sách giá trị mà bạn muốn so sánh với cột.

Ví dụ: Từ bảng Product thuộc bộ dữ liệu adventureworks, truy vấn cột ProductID, Name, ProductNumber, Color với điều kiện những sản phẩm được chọn là sản phẩm có màu đen hoặc trắng hoặc đỏ.

-> Bản chất của IN tương đương với việc sử dụng phép OR để viết điều kiện với cùng 1 cột. Người ta sẽ sử dụng IN để ngắn gọn hơn.

c) Toán tử truy vấn giá trị trong khoảng (BETWEEN)

Toán tử BETWEEN sử dụng để lọc các giá trị thoả mãn trong khoảng xác định.

Cú pháp của BETWEEN:

WHERE col_name BETWEEN val_1 AND val_2
  • col_name: Cột mà bạn muốn thực hiện so sánh.
  • val_1, val_2: Giới hạn của khoảng xác định.
  • Đối với dữ liệu dạng string

Ví dụ: Từ bảng Customer thuộc bộ dữ liệu adventureworks, truy vấn các cột FirstName, CompanyName, SalesPerson. Với điều kiện, CompanyName nằm trong khoảng từ ‘A Bike Store’ đến ‘Big Cycle Mall’. Kết quả được sắp xếp từ A đến Z theo cột CompanyName.

Bảng dữ liệu gốc gồm 847 hàng.

Giải thích câu lệnh truy vấn:

  • ORDER BY: Sắp xếp từ A đến Z theo cột CompanyName.

Kết quả truy vấn gồm 58 hàng.

  • Đối với dữ liệu dạng datetime

Ví dụ: Từ bảng Customer thuộc bộ dữ liệu adventureworks, truy vấn các cột FirstName, CompanyName, SalesPerson, ModifiedDate. Với điều kiện, ModifiedDate nằm trong khoảng từ ‘2005-08-01’ đến ‘2006-07-01’.

  • Đối với dữ liệu dạng số

Ví dụ: Từ bảng Product thuộc bộ dữ liệu adventureworks, truy vấn ProductID, Name, ProductNumber, Color, StandardCost với điều kiện StandardCost trong khoảng giá từ 1000-3000.

Lưu ý: Về bản chất, BETWEEN 1000 AND 3000 sẽ tương ứng với việc thực hiện phép lọc >= 1000 và <= 3000.

d) Toán tử xử lý NULL

Toán tử IS NULL sử dụng để lọc các giá trị thoả mãn điều kiện là NULL.

Cú pháp của IS NULL:

WHERE col_name IS NULL.
  • col_name: Cột mà bạn muốn thực hiện so sánh.

Ví dụ: Từ bảng Product thuộc bộ dữ liệu adventureworks, truy vấn ProductID, Name, ProductNumber, Color với điều kiện những sản phẩm được chọn là sản phẩm không tồn tại màu sắc.

e) Toán tử phủ định điều kiện (NOT)

Toán tử NOT được sử dụng để xác định các hàng hoặc giá trị không thỏa mãn một điều kiện cụ thể.

NOT không đi một mình, mà đi kèm cùng với các toán tử khác như là: IN, BETWEEN, LIKE, IS NOT NULL.

Lưu ý: Toán tử NOT không trả về các giá trị không tồn tại (NULL).

Ví dụ: Từ bảng Product thuộc bộ dữ liệu adventureworks, truy vấn ProductID, Name, ProductNumber, Color truy vấn những sản phẩm tồn tại giá trị màu sắc.

Giải thích câu lệnh truy vấn:

  • FROM: Dữ liệu được lấy từ bảng SalesLT.Product.
  • WHERE: Lọc bản ghi thoả mãn sản phẩm tồn tại màu sắc.
  • SELECT: Truy vấn các cột ProductID, Name, ProductNumber, Color.
Bây giờ bạn đã biết cách sử dụng các khái niệm này để có thể áp dụng chúng cho các dự án và truy vấn của riêng mình. Một số cách bạn sử dụng hàm WHERE và điều kiện lọc trong SQL là gì? Chia sẻ suy nghĩ và kinh nghiệm của bạn trong phần bình luận bên dưới để DATAPOT biết với nhé. 
Chia sẻ bài viết này

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

This site uses Akismet to reduce spam. Learn how your comment data is processed.