Lọc dữ liệu trong SQL Server | Comdy

Lọc dữ liệu trong SQL Server

  • Trung Nguyen
  • 10/05/2020

  • 14 min read

Trong hướng dẫn này, bạn sẽ tìm hiểu cách sử dụng câu lệnh SELECT DISTINCT, mệnh đề WHERE và các toán tử AND, OR, IN, BETWEEN, LIKE trong SQL Server lọc dữ liệu trả về trong một truy vấn.

Lưu ý: Chúng tôi sẽ dụng cơ sở dữ liệu mẫu để làm ví dụ minh họa cho lọc dữ liệu trong SQL Server.

Câu lệnh SELECT DISTINCT trong SQL Server

Đôi khi, bạn có thể chỉ muốn nhận các giá trị riêng biệt trong một cột được chỉ định của bảng. Để làm điều này, bạn sử dụng mệnh đề SELECT DISTINCT như sau:

SELECT DISTINCT
    column_name
FROM
    table_name;

Truy vấn chỉ trả về các giá trị riêng biệt trong cột được chỉ định. Nói cách khác, nó loại bỏ các giá trị trùng lặp trong cột khỏi tập kết quả.

Nếu bạn sử dụng nhiều cột như sau:

SELECT DISTINCT
    column_name1,
    column_name2 ,
    ...
FROM
    table_name;

Truy vấn sử dụng kết hợp các giá trị trong tất cả các cột được chỉ định trong mệnh đề SELECT để đánh giá tính duy nhất.

Nếu bạn áp dụng mệnh đề DISTINCT cho một cột NULL, mệnh đề DISTINCT sẽ chỉ giữ một giá trị NULL và loại bỏ những giá trị NULL khác. Nói cách khác, mệnh đề DISTINCT coi tất cả các giá trị NULL là cùng một giá trị.

Câu lệnh sau trả về tất cả các thành phố của tất cả các khách hàng trong bảng customers:

SELECT
    city
FROM
    sales.customers
ORDER BY
    city;

Đây là kết quả:

SELECT DISTINCT một cột

Như bạn có thể thấy trong kết quả đầu ra, các thành phố bị trùng lặp.

Để có được các thành phố riêng biệt không bị trùng lặp, bạn thêm từ khóa DISTINCT như sau:

SELECT DISTINCT
    city
FROM
    sales.customers
ORDER BY
    city;

Đây là kết quả:

SELECT DISTINCT một cột

Bây giờ, truy vấn trả về một giá trị riêng cho từng thành phố. Nói cách khác, nó đã xóa tất cả các thành phố trùng lặp khỏi tập kết quả.

Câu lệnh sau trả về tất cả các thành phố và tiểu bang của tất cả các khách hàng:

SELECT
    city,
    state
FROM
    sales.customers
ORDER BY 
    city, 
    state;

Đây là kết quả:

SELECT DISTINCT nhiều cột

Câu lệnh sau đây trả về thành phố và tiểu bang riêng biệt không trùng lặp của tất cả các khách hàng.

SELECT DISTINCT
    city,
    state
FROM
    sales.customers

Đây là kết quả:

SELECT DISTINCT nhiều cột

Trong ví dụ này, câu lệnh đã sử dụng kết hợp các giá trị trong cả hai cột citystate để đánh giá trùng lặp.

Bạn có thể xem chi tiết về câu lệnh SELECT DISTINCT trong SQL Server ở bài viết sau:

Mệnh đề WHERE trong SQL Server

Khi bạn sử dụng câu lệnh SELECT để truy vấn dữ liệu trong một bảng, bạn sẽ nhận được tất cả các bản ghi của bảng đó, điều này là không cần thiết vì ứng dụng chỉ có thể xử lý một số lượng các bản ghi nhất định tại thời điểm đó.

Để lấy các bản ghi từ bảng thỏa mãn một hoặc nhiều điều kiện, bạn sử dụng mệnh đề WHERE như sau:

SELECT
    select_list
FROM
    table_name
WHERE
    search_condition;

Trong mệnh đề WHERE, bạn chỉ định một điều kiện tìm kiếm để lọc các bản ghi được trả về bởi mệnh đề FROM. Mệnh đề WHERE chỉ trả về các bản ghi thỏa mãn điều kiện tìm kiếm (điều kiện tìm kiếm được đánh giá là TRUE).

Điều kiện tìm kiếm là một biểu thức logic hoặc kết hợp nhiều biểu thức logic. Trong SQL, một biểu thức logic thường được gọi là một vị ngữ (predicate).

Lưu ý rằng SQL Server sử dụng logic ba giá trị khi đánh giá một biểu thức logic là TRUE, FALSE hoặc UNKNOWN. Mệnh đề WHERE sẽ không trả lại bất kỳ bản ghi nào có điều kiện tìm kiếm được đánh giá là FALSE hoặc UNKNOWN.

Câu lệnh sau lấy tất cả các sản phẩm có id loại sản phẩm là 1:

SELECT
    product_id,
    product_name,
    category_id,
    model_year,
    list_price
FROM
    production.products
WHERE
    category_id = 1
ORDER BY
    list_price DESC;

Đây là kết quả:

Tìm bản ghi bằng một biểu thức đơn giản

Ví dụ sau đây trả về các sản phẩm đáp ứng hai điều kiện: mã loại sản phẩm là 1 và năm kiểu mẫu là 2018. Nó sử dụng toán tử logic AND để kết hợp hai điều kiện.

SELECT
    product_id,
    product_name,
    category_id,
    model_year,
    list_price
FROM
    production.products
WHERE
    category_id = 1 AND model_year = 2018
ORDER BY
    list_price DESC;

Đây là kết quả:

WHERE trong SQL Server

Bạn có thể xem chi tiết về mệnh đề WHERE trong SQL Server ở bài viết này:

Toán tử AND trong SQL Server

Toán tử AND trong SQL Server là một toán tử logic cho phép bạn kết hợp hai biểu thức Boolean. Nó chỉ trả về TRUE khi cả hai biểu thức được đánh giá là TRUE.

Sau đây minh họa cú pháp của toán tử AND:

boolean_expression AND boolean_expression

boolean_expression là bất kỳ biểu thức Boolean hợp lệ nào được đánh giá là TRUE, FALSEUNKNOWN.

Bảng dưới đây cho thấy kết quả khi bạn kết hợp các giá trị TRUE, FALSEUNKNOWN bằng cách sử dụng toán tử AND:

TRUE
FALSE
UNKNOWN

TRUE
TRUE
FALSE
UNKNOWN

FALSE
FALSE
FALSE
FALSE

UNKNOWN
UNKNOWN
FALSE
UNKNOWN

Khi bạn sử dụng nhiều toán tử logic trong một biểu thức, SQL Server luôn đánh giá các toán tử AND trước. Tuy nhiên, bạn có thể thay đổi thứ tự đánh giá bằng cách sử dụng dấu ngoặc đơn.

Ví dụ sau đây tìm kiếm các sản phẩm có id loại sản phẩm là 1 và giá niêm yết lớn hơn 400:

SELECT
    *
FROM
    production.products
WHERE
    category_id = 1 AND 
    list_price > 400
ORDER BY
    list_price DESC;

Đây là kết quả:

Sử dụng một toán tử AND trong SQL Server

Câu lệnh sau đây tìm kiếm các sản phẩm đáp ứng tất cả các điều kiện sau: id loại sản phẩm là 1, giá niêm yết lớn hơn 400 và id thương hiệu là 1:

SELECT
    *
FROM
    production.products
WHERE
    category_id = 1 AND 
    list_price > 400 AND 
    brand_id = 1
ORDER BY
    list_price DESC;

Đây là kết quả:

Sử dụng nhiều toán tử AND trong SQL Server

Bạn có thể xem chi tiết về toán tử AND trong SQL Server ở bài viết sau:

Toán tử OR trong SQL Server

Toán tử OR trong SQL Server là một toán tử logic cho phép bạn kết hợp hai biểu thức Boolean. Nó trả về TRUE khi một trong các điều kiện được đánh giá là TRUE.

Dưới đây minh họa cú pháp của toán tử OR trong SQL Server:

boolean_expression OR boolean_expression

Trong cú pháp này, boolean_expression bất kỳ biểu thức Boolean hợp lệ nào được đánh giá là TRUE, FALSEUNKNOWN.

Bảng dưới đây cho thấy kết quả của toán tử OR khi bạn kết hợp TRUE, FALSEUNKNOWN:

TRUE
FALSE
UNKNOWN

TRUE
TRUE
TRUE
TRUE

FALSE
TRUE
FALSE
UNKNOWN

UNKNOWN
TRUE
UNKNOWN
UNKNOWN

Khi bạn sử dụng nhiều toán tử logic trong một câu lệnh, SQL Server sẽ đánh giá các toán tử OR sau toán tử AND. Tuy nhiên, bạn có thể sử dụng dấu ngoặc đơn để thay đổi thứ tự đánh giá.

Ví dụ sau đây tìm kiếm các sản phẩm có giá niêm yết dưới 200 hoặc lớn hơn 6.000:

SELECT
    product_name,
    list_price
FROM
    production.products
WHERE
    list_price < 200
OR list_price > 6000
ORDER BY
    list_price;

Đây là kết quả:

Sử dụng một toán tử OR trong SQL Server

Câu lệnh sau đây tìm kiếm các sản phẩm có id thương hiệu là 1, 2 hoặc 4:

SELECT
    product_name,
    brand_id
FROM
    production.products
WHERE
    brand_id = 1 OR 
    brand_id = 2 OR 
    brand_id = 4
ORDER BY
    brand_id DESC;

Đây là kết quả:

Sử dụng nhiều toán tử OR trong SQL Server

Bạn có thể xem chi tiết về toán tử OR trong SQL Server tại đây:

Toán tử IN trong SQL Server

Các toán tử IN trong SQL Server là một toán tử logic cho phép bạn kiểm tra xem một giá trị cụ thể phù hợp với bất kỳ giá trị trong danh sách.

Sau đây minh họa cú pháp của toán tử IN trong SQL Server:

column | expression IN ( v1, v2, v3, ...)

Trong cú pháp này:

  • Đầu tiên, chỉ định cột hoặc biểu thức để kiểm tra.
  • Thứ hai, chỉ định một danh sách các giá trị để kiểm tra. Tất cả các giá trị phải có cùng kiểu dữ liệu với kiểu dữ liệu của cột hoặc biểu thức.

Nếu một giá trị trong cột hoặc biểu thức bằng với bất kỳ giá trị nào trong danh sách, kết quả của toán tử INTRUE.

Các toán tử IN là tương đương với nhiều toán tử OR, do đó hai biểu thức sau là tương đương:

column IN (v1, v2, v3)

column = v1 OR column = v2 OR column = v3

Để phủ định toán tử IN, bạn sử dụng toán tử NOT IN như sau:

column | expression NOT IN ( v1, v2, v3, ...)

Kết quả toán tử NOT INTRUE nếu cột hoặc biểu thức không bằng bất kỳ giá trị nào trong danh sách.

Ngoài danh sách các giá trị, bạn có thể sử dụng subquery (truy vấn con) để trả về danh sách các giá trị với toán tử IN như dưới đây:

column | expression IN (subquery)

Trong cú pháp này, truy vấn con là một câu lệnh SELECT trả về một danh sách các giá trị của một cột.

Lưu ý rằng nếu một danh sách chứa NULL, kết quả của toán tử IN hoặc NOT IN sẽ là UNKNOWN.

Câu lệnh sau đây tìm kiếm các sản phẩm có giá niêm yết là một trong các giá trị sau: 89,99, 109,99 và 159,99:

SELECT
    product_name,
    list_price
FROM
    production.products
WHERE
    list_price IN (89.99, 109.99, 159.99)
ORDER BY
    list_price;

Đây là kết quả:

Sử dụng toán tử IN với một danh sách giá trị trong SQL Server

Bạn có thể sử dụng toán tử IN kết hợp subquery như được trình bày trong truy vấn sau:

SELECT
    product_id,
    product_name,
    list_price
FROM
    production.products
WHERE
    product_id IN (
        SELECT
            product_id
        FROM
            production.stocks
        WHERE
            store_id = 1 AND quantity >= 30
    )
ORDER BY
    product_name;

Đây là kết quả:

Sử dụng toán tử IN với truy vấn con trong SQL Server

Bạn có thể xem chi tiết về toán tử IN trong SQL Server ở bài viết sau:

Toán tử BETWEEN trong SQL Server

Toán tử BETWEEN trong SQL Server là một toán tử logic cho phép bạn chỉ định một phạm vi để kiểm tra.

Sau đây minh họa cú pháp của toán tử BETWEEN:


column | expression BETWEEN start_expression AND end_expression

Trong cú pháp này:

  • Đầu tiên, chỉ định cột hoặc biểu thức để kiểm tra.
  • Thứ hai, đặt các biểu thức start_expressionend_expression ở giữa các từ khóa BETWEENAND. Các biểu thức start_expression, end_expressionexpression để kiểm tra phải có cùng kiểu dữ liệu.

Toán tử BETWEEN trả về TRUE nếu biểu thức để đánh giá lớn hơn hoặc bằng giá trị của start_expression và nhỏ hơn hoặc bằng với giá trị của end_expression.

Bạn có thể sử dụng lớn hơn hoặc bằng (>=) và nhỏ hơn hoặc bằng (<=) kết hợp toán tử logic AND để thay thế toán tử BETWEEN như sau:


column | expression <= end_expression AND column | expression >= start_expression

Điều kiện sử dụng toán tử BETWEEN dễ đọc hơn nhiều so với điều kiện sử dụng toán tử so sánh >=, <= và toán tử logic AND.

Để phủ nhận kết quả của toán tử BETWEEN, bạn sử dụng toán tử NOT BETWEEN như sau:


column | expression NOT BETWEEN start_expression AND end_expresion

Toán tử NOT BETWEEN trả về TRUE nếu giá trị trong cột hoặc biểu thức nhỏ hơn giá trị của start_expression và lớn hơn giá trị của end_expression. Nó tương đương với điều kiện sau:


column | expression < start_expression AND column | expression > end_expression

Lưu ý rằng nếu bất kỳ đầu vào cho toán tử BETWEEN hoặc NOT BETWEENNULL, thì kết quả là UNKNOWN.

Truy vấn sau đây tìm kiếm các sản phẩm có giá niêm yết nằm trong khoảng từ 149,99 đến 199,99:

SELECT
    product_id,
    product_name,
    list_price
FROM
    production.products
WHERE
    list_price BETWEEN 149.99 AND 199.99
ORDER BY
    list_price;

Đây là kết quả:

Sử dụng toán tử BETWEEN với số trong SQL Server

Truy vấn sau đây tìm kiếm các đơn đặt hàng mà khách hàng đặt từ ngày 15/01/2017 đến ngày 17/01/2017:

SELECT
    order_id,
    customer_id,
    order_date,
    order_status
FROM
    sales.orders
WHERE
    order_date BETWEEN '20170115' AND '20170117'
ORDER BY
    order_date;

Đây là kết quả:

Sử dụng toán tử BETWEEN với ngày trong SQL Server

Bạn có thể xem chi tiết về toán tử BETWEEN trong SQL Server ở bài viết này:

Toán tử LIKE trong SQL Server

Toán tử LIKE trong SQL Server là một toán tử logic xác định xem một chuỗi ký tự có khớp với mẫu đã chỉ định hay không. Một mẫu có thể bao gồm các ký tự thông thường và ký tự đại diện.

Toán tử LIKE được sử dụng trong các mệnh đề WHERE của các câu lệnh SELECT, UPDATEDELETE để lọc các bảng ghi dựa trên biểu thức khởp mẫu.

Dưới đây minh họa cú pháp của toán tử LIKE trong SQL Server:


column | expression LIKE pattern [ESCAPE escape_character]

Pattern

Mẫu (pattern) là một chuỗi các ký tự để tìm kiếm trong cột hoặc biểu thức. Nó có thể bao gồm các ký tự đại diện hợp lệ sau:

  • Ký tự đại diện phần trăm (%): bất kỳ chuỗi nào có 0 hoặc nhiều ký tự.
  • Ký tự đại diện gạch dưới (_): bất kỳ ký tự đơn nào.
  • Ký tự đại diện [danh sách các ký tự]: bất kỳ ký tự đơn nào trong tập đã chỉ định.
  • [Ký tự-ký tự]: bất kỳ ký tự đơn nào trong phạm vi đã chỉ định.
  • [^]: Bất kỳ ký tự đơn nào không nằm trong danh sách hoặc phạm vi.

Các ký tự đại diện làm cho toán tử LIKE linh hoạt hơn các toán tử so sánh chuỗi bằng (=) và không bằng (!=).

ESCAPE

Ký tự thoát hướng dẫn toán tử LIKE xem các ký tự đại diện là các ký tự thông thường. Ký tự thoát không có giá trị mặc định và phải được ước lượng chỉ một ký tự.

Toán tử LIKE trả về TRUE nếu cột hoặc biểu thức khớp với mẫu được chỉ định.

Để phủ nhận kết quả của toán tử LIKE, bạn sử dụng toán tử NOT LIKE  như sau:


column | expression NOT LIKE pattern [ESCAPE escape_character]

Ví dụ sau đây tìm kiếm các khách hàng có họ bắt đầu bằng chữ cái Z:

SELECT
    customer_id,
    first_name,
    last_name
FROM
    sales.customers
WHERE
    last_name LIKE 'Z%'
ORDER BY
    first_name;

Đây là kết quả:

Sử dụng toán tử LIKE với ký tự đại diện % trong SQL Server

Ví dụ sau đây trả về các khách hàng có họ kết thúc bằng chuỗi er:

SELECT
    customer_id,
    first_name,
    last_name
FROM
    sales.customers
WHERE
    last_name LIKE '%er'
ORDER BY
    first_name;

Đây là kết quả:

Sử dụng toán tử LIKE với ký tự đại diện % trong SQL Server

Bạn có thể xem chi tiết về toán tử LIKE trong SQL Server ở bài viết sau:

Nếu

Comdy

hữu ích và giúp bạn tiết kiệm thời gian

Bạn có thể vui lòng tắt trình chặn quảng cáo ❤️ để hỗ trợ chúng tôi duy trì hoạt động của trang web.