Lọc dữ liệu với các tính từ
Các câu lệnh SELECT đơn giản nhất chỉ với mệnh đề SELECT và FROM sẽ đánh giá mọi hàng trong một bảng. Bằng cách sử dụng mệnh đề WHERE, bạn xác định các điều kiện xác định hàng nào sẽ được xử lý và có khả năng làm giảm tập kết quả.
Cấu trúc của mệnh đề WHERE
Mệnh đề WHERE bao gồm một hoặc nhiều điều kiện tìm kiếm, mỗi điều kiện phải đánh giá là TRUE, FALSE hoặc 'unknown' cho mỗi hàng của bảng. Các hàng sẽ chỉ được trả về khi mệnh đề WHERE định trị là TRUE. Các điều kiện riêng lẻ đóng vai trò là bộ lọc trên dữ liệu và được gọi là 'xác lập'. Mỗi vị từ bao gồm một điều kiện đang được kiểm tra, thường sử dụng các toán tử so sánh cơ bản:
- = (bằng)
- <> (không bằng)
- > (lớn hơn)
- >= (lớn hơn hoặc bằng)
- < (nhỏ hơn)
- <= (nhỏ hơn hoặc bằng)
Ví dụ: truy vấn sau đây trả về tất cả các sản phẩm có giá trị PRODUCTCategoryID là 2:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;
Tương tự, truy vấn sau đây trả về tất cả các sản phẩm có ListPrice nhỏ hơn 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;
LÀ NULL / KHÔNG PHẢI LÀ NULL
Bạn cũng có thể dễ dàng lọc để cho phép hoặc loại trừ các giá trị 'không xác định' hoặc NULL bằng IS NULLhoặc IS NOT NULL.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;
Nhiều điều kiện
Có thể kết hợp nhiều vị từ với toán tử AND và OR và với dấu ngoặc đơn. Tuy nhiên, SQL Server sẽ chỉ xử lý hai điều kiện mỗi lần. Tất cả các điều kiện phải là TRUE khi kết nối nhiều điều kiện với toán tử AND. Khi sử dụng toán tử OR để kết nối hai điều kiện, một hoặc cả hai có thể là TRUE cho tập kết quả.
Ví dụ: truy vấn sau trả về sản phẩm ở thể loại 2 có chi phí nhỏ hơn 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
AND ListPrice < 10.00;
Toán tử AND được xử lý trước toán tử OR, trừ khi sử dụng dấu ngoặc đơn. Để thực hành tốt nhất, hãy sử dụng dấu ngoặc đơn khi sử dụng nhiều hơn hai dấu ngoặc đơn. Truy vấn sau trả về các sản phẩm trong danh mục 2 OR 3 AND có chi phí nhỏ hơn 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
AND (ListPrice < 10.00);
Toán tử so sánh
Transact-SQL gồm các toán tử so sánh có thể giúp đơn giản hóa mệnh đề WHERE.
IN
Toán tử IN là một lối tắt cho nhiều điều kiện bình đẳng cho cùng một cột được kết nối với OR. Không có gì sai khi sử dụng nhiều điều kiện OR trong một truy vấn, như trong ví dụ sau đây:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
OR ProductCategoryID = 3
OR ProductCategoryID = 4;
Tuy nhiên, việc sử dụng IN rõ ràng và ngắn gọn và hiệu suất của truy vấn sẽ không bị ảnh hưởng.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);
GIỮA
BETWEEN là một lối tắt khác có thể được sử dụng khi lọc giới hạn trên và cận dưới cho giá trị thay vì sử dụng hai điều kiện với toán tử AND. Hai truy vấn sau tương đương nhau:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice >= 1.00
AND ListPrice <= 10.00;
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice BETWEEN 1.00 AND 10.00;
Toán tử BETWEEN sử dụng các giá trị ranh giới bao hàm. Các sản phẩm có giá 1,00 hoặc 10,00 sẽ được bao gồm trong kết quả. BETWEEN cũng hữu ích khi truy vấn trường ngày. Ví dụ: truy vấn sau đây sẽ bao gồm tất cả các tên sản phẩm được sửa đổi từ ngày 1 tháng 1 năm 2012 đến ngày 31 tháng 12 năm 2012:
SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';
Tên Sản phẩm
Ngày sửa đổi
Vớ xe đạp leo núi, M
2012-01-01 00:00:00.000
Khung Núi HL - Bạc, 42
2012-03-05 00:00:00.000
Khung Núi HL - Bạc, 38
2012-08-29 00:00:00.000
Núi-100 Bạc, 38
2012-12-31 00:00:00.000
Tuy nhiên vì chúng tôi không xác định khoảng thời gian, không có kết quả nào được trả về sau 2012-12-31 00:00:00.000. Để bao gồm chính xác ngày và giờ, chúng ta cần đưa thời gian vào vị từ:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01 00:00:00.000' AND '2012-12-31 23:59:59.999';
Toán tử so sánh cơ bản như Lớn Hơn (>) và Bằng (=) cũng chính xác khi chỉ lọc theo ngày:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01'
AND ModifiedDate < '2013-01-01';
NHƯ
Toán tử so sánh cuối cùng chỉ có thể được sử dụng cho dữ liệu ký tự và cho phép chúng ta sử dụng các ký tự đại diện và các mẫu biểu thức thông thường. Ký tự đại diện cho phép chúng tôi chỉ định một phần chuỗi. Ví dụ: bạn có thể sử dụng truy vấn sau đây để trả về tất cả các sản phẩm có tên chứa từ "mountain":
SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';
Ký % tự đại diện đại diện đại diện cho bất kỳ chuỗi nào có từ 0 ký tự trở lên, vì vậy kết quả sẽ bao gồm các sản phẩm có từ "mountain" ở bất kỳ đâu trong tên của chúng, như thế này:
Tên
Giá Danh sách
Vớ xe đạp leo núi, M
9.50
Vớ xe đạp leo núi, L
9.50
Khung Núi HL - Bạc, 42
1364.0
Khung Núi HL - Đen, 42
1349.60
Khung Núi HL - Bạc, 38
1364.50
Núi-100 Bạc, 38
3399.99
Bạn có thể sử dụng ký tự đại diện _ (dấu gạch dưới) để đại diện cho một ký tự đơn, như sau:
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';
Kết quả sau đây chỉ bao gồm các sản phẩm bắt đầu bằng "Mountain Bike Socks" và một ký tự duy nhất sau:
Tên Sản phẩm
Giá Danh sách
Vớ xe đạp leo núi, M
9.50
Vớ xe đạp leo núi, L
9.50
Bạn cũng có thể xác định các mẫu phức tạp cho chuỗi mà bạn muốn tìm. Ví dụ: truy vấn sau đây đã tìm kiếm các sản phẩm có tên bắt đầu bằng "Mountain-", sau đó là:
- ba ký tự từ 0 đến 9
- một khoảng trắng
- chuỗi bất kỳ
- dấu phẩy
- một khoảng trắng
- hai ký tự từ 0 đến 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';
Kết quả từ truy vấn này có thể trông giống như thế này:
Tên Sản phẩm
Giá Danh sách
Núi-100 Bạc, 38
3399.99
Núi-100 Bạc, 42
3399.99
Núi-100 Đen, 38
3399.99
Mountain-100 Đen, 42
3399.99
Mountain-200 Bạc, 38
2319.99
Núi-200 Bạc, 42
2319.99
Mountain-200 Đen, 38
2319.99
Mountain-200 Đen, 42
2319.99