Lệnh SELECT trong SQL là một câu lệnh quan trọng và được sử dụng phổ biến nhất để truy xuất dữ liệu từ cơ sở dữ liệu. Từ những truy vấn đơn giản để lấy dữ liệu cho đến những truy vấn phức tạp kết hợp dữ liệu từ nhiều bảng, SELECT cho phép người dùng linh hoạt trong việc lọc, sắp xếp và tính toán dữ liệu.

Đọc bài viết này để hiểu rõ hơn về:

  • SELECT trong SQL
  • Một số cú pháp của SELECT

SELECT trong SQL là gì?

Lệnh SELECT trong SQL là một trong những lệnh cơ bản và quan trọng nhất được sử dụng để truy xuất dữ liệu từ một hoặc nhiều bảng trong cơ sở dữ liệu. Chúng ta có thể lấy toàn bộ dữ liệu từ bảng hoặc chỉ những dữ liệu thỏa mãn các điều kiện cụ thể. Kết quả của lệnh SELECT là một tập hợp dữ liệu (result-set) được trả về sau khi thực hiện truy vấn.

Mặc dù mệnh đề SELECT thường được viết đầu tiên trong câu lệnh, nhưng nó không phải là phần đầu tiên mà hệ thống cơ sở dữ liệu thực sự xử lý. Khi bạn viết truy vấn, nó sẽ được xử lý theo các bước sau: 

  1. FROM / JOIN: Truy xuất và kết nối dữ liệu từ bảng.
  2. WHERE: Lọc các bản ghi (record) theo điều kiện cụ thể.
  3. GROUP BY: Nhóm các bản ghi theo một hoặc nhiều cột.
  4. HAVING: Lọc các nhóm dữ liệu sau khi nhóm.
  5. SELECT: Chọn các cột cần để hiển thị trong kết quả.
  6. ORDER BY: Sắp xếp dữ liệu theo thứ tự cụ thể.
  7. LIMIT: Giới hạn số lượng bản ghi trả về.

Tiếp theo đây, ta sẽ cùng tìm hiểu chi tiết về các cú pháp phổ biến của SELECT trong SQL qua các ví dụ cụ thể với hai bảng dữ liệu sau:

  • Bảng customer:
customer_id name city age
1 John Doe New York 30
2 Jane Roe Los Angeles 25
3 Mike Lee Chicago 35
4 Sarah Kim New York 28
  • Bảng order:
order_id customer_id amount order_date
101 1 250 2024-10-01
102 2 300 2024-10-02
103 3 450 2024-10-03
104 1 150 2024-10-04

Cú pháp SELECT trong SQL cơ bản (truy xuất dữ liệu từ một bảng)

Là cú pháp được sử dụng để truy vấn các cột từ một bảng cụ thể. Có thể chọn các cột cụ thể hoặc tất cả các cột từ bảng bằng cách liệt kê tên cột trong mệnh đề SELECT.

Cú pháp 1

SELECT column1, column2, ... 

FROM table_name;

Ví dụ để truy xuất tất cả thông tin về khách hàng, ta dùng cú pháp như sau:

SELECT customer_id, name, age 

FROM customers;

Với cú pháp trên ta thu được kết quả như sau:

customer_id name age
1 John Doe 30
2 Jane Roe 25
3 Mike Lee 35
4 Sarah Kim 28

Cú pháp 2: Truy xuất tất cả các cột từ một bảng

SELECT * 

FROM table_name;

Ví dụ để truy xuất toàn bộ dữ liệu từ bảng customer ta sử dụng cú pháp sau:

SELECT * FROM customers;

Lệnh trên sẽ trả về toàn bộ dữ liệu từ bảng customer.

Cú pháp 3: Alias

Nếu muốn gán tên cột hoặc trong kết quả trả về, ta có thể sử dụng Alias với cú pháp như sau:

SELECT column_name AS alias_name 

FROM table_name;

Ví dụ để lấy tên và tuổi của khách hàng từ bảng customers và đổi tên các cột này thành customer_namecustomer_age, ta có thể sử dụng cú pháp như sau:

SELECT name AS customer_name, age AS customer_age 

FROM customers;

Với cú pháp trên ta thu được kết quả như sau:

customer_name customer_age
John Doe 30
Jane Doe 25
Mike Lee 35
Sarah Kim 28

Cú pháp 4: SELECT DISTINCT trong SQL

Nếu muốn kết quả trả về (các bản ghi) không bị trùng lặp, ta có thể sử dụng DISTINCT.

Ví dụ: để lấy danh sách các thành phố khách hàng cư trú và loại bỏ các giá trị trùng lặp, ta sử dụng cú pháp sau:

SELECT DISTINCT city AS unique_city 

FROM customers;

Với cú pháp trên ta thu được kết quả như sau:

unique_city
New York
Los Angeles
Chicago

SELECT trong SQL với điều kiện WHERE

Mệnh đề WHERE khi kết hợp với SELECT sẽ có chức năng lọc dữ liệu dựa trên các điều kiện cụ thể.

Cú pháp:

SELECT column1, column2, ... 

FROM table_name 

WHERE condition;

Ví dụ 1: Để truy xuất tất cả các khách hàng ở thành phố New York, ta dùng cú pháp như sau:

SELECT name, city 

FROM customers 

WHERE city = 'New York';

Với cú pháp trên ta thu được kết quả như sau:

name city
Jane Roe New York
Sarah Kim New York

Ví dụ 2: Để tìm kiếm các giá trị trong một cột có chứa một chuỗi ký tự cụ thể, ta sử dụng từ khóa LIKE cùng với mệnh đề WHERE. Ví dụ để tìm khách hàng có tên bắt đầu bằng chữ “J”, ta có thể sử dụng cú pháp sau:

SELECT name 

FROM customers 

WHERE name LIKE 'J%';

Ví dụ 3: Để lọc kết quả dựa trên một danh sách các giá trị cụ thể, ta có thể sử dụng từ khóa IN cùng với mệnh đề WHERE. Ví dụ, để tìm những khách hàng ở các thành phố “New York” hoặc “Chicago”, ta sử dụng cú pháp sau:

SELECT name, city 

FROM customers 

WHERE city IN ('New York', 'Chicago');

Ngoài ra, WHERE còn có thể kết hợp nhiều toán tử khác giúp đa dạng hóa điều kiện lọc, như:

  • Toán tử so sánh: =, !=, <, >, <=, >=
  • Toán tử logic: AND, OR, NOT
  • Toán tử giữa các phạm vi: BETWEEN

Ví dụ 4: Để lọc kết quả theo một giá trị lớn hơn, ta có thể sử dụng toán tử > với mệnh đề WHERE. Ví dụ, để tìm những khách hàng có độ tuổi lớn hơn 30, ta sử dụng cú pháp sau:

SELECT name, age 

FROM customers 

WHERE age > 30;

SELECT trong SQL với các hàm tổng hợp

Hàm tổng hợp là các hàm cho phép tính toán dữ liệu trên các nhóm bản ghi, một số hàm tổng hợp là COUNT, SUM, AVG, MAXMIN.

Cú pháp:

SELECT aggregate_function(column) 

FROM table_name;

Ví dụ 1: Để tính tổng số tiền từ các đơn hàng, ta dùng cú pháp như sau:

SELECT SUM(amount) 

FROM orders;

Với cú pháp trên ta thu được kết quả như sau:

SUM (AMOUNT)
1150

Ví dụ 2: Để tính tổng số tiền của các đơn hàng có giá trị trên 200 ta sẽ kết hợp với điều kiện WHERE với cú pháp như sau:

SELECT SUM(amount) 

FROM orders 

WHERE amount > 200;

SELECT trong SQL với ORDER BY

Mệnh đề ORDER BY được sử dụng để sắp xếp kết quả theo một hoặc nhiều cột, có thể sắp xếp tăng dần (ASC) hoặc giảm dần (DESC).

Cú pháp:

SELECT column1, column2, ... 

FROM table_name 

ORDER BY column [ASC|DESC];

Ví dụ để truy xuất danh sách khách hàng và sắp xếp theo tuổi giảm dần, ta dùng cú pháp như sau:

SELECT name, age 

FROM customers 

ORDER BY age DESC;

Với cú pháp trên ta thu được kết quả như sau:

name age
Mike Lee 35
John Doe 30
Sarah Kim 28
Jane Roe 25

SELECT trong SQL với GROUP BY

Mệnh đề GROUP BY thường được sử dụng để nhóm các bản ghi dựa trên giá trị của một hoặc nhiều cột, thường kết hợp với các hàm tổng hợp để tính toán trên từng nhóm.

Cú pháp:

SELECT column1, aggregate_function(column2) 

FROM table_name 

GROUP BY column1;

Ví dụ để tính tổng số tiền đơn hàng của mỗi khách hàng, ta dùng cú pháp như sau:

SELECT customer_id, SUM(amount) 

FROM orders 

GROUP BY customer_id;

Với cú pháp trên ta thu được kết quả như sau:

customer_id SUM(amount)
1 400
2 300
3 450

SELECT trong SQL với mệnh đề HAVING

Mệnh đề HAVING được sử dụng để lọc các nhóm kết quả sau khi đã nhóm bằng mệnh đề GROUP BY. Nó tương tự như mệnh đề WHERE, nhưng HAVING áp dụng cho các nhóm dữ liệu thay vì các bản ghi riêng lẻ. Having chỉ hoạt động khi có Group By và thường được kết hợp với các hàm tổng hợp như COUNT, SUM, AVG, MAXMIN.

Cú pháp:

SELECT column1, aggregate_function(column2) 

FROM table_name 

GROUP BY column1 

HAVING aggregate_function(column2) condition;

Ví dụ để tìm những thành phố có tuổi trung bình của khách hàng lớn hơn 28, ta dùng cú pháp sau:

SELECT city, AVG(age) AS average_age 

FROM customers 

GROUP BY city 

HAVING AVG(age) > 28;

Với cú pháp trên ta thu được kết quả như sau:

city average_age
New York 29
Chicago 35

Giới hạn số lượng kết quả với LIMIT

Mệnh đề LIMIT được sử dụng để giới hạn số lượng bản ghi trả về từ truy vấn.

Cú pháp:

SELECT column1, column2, ... 

FROM table_name 

LIMIT number_of_rows;

Ví dụ để lấy 2 khách hàng đầu tiên trong bảng, ta dùng cú pháp như sau:

SELECT name, city 

FROM customers 

LIMIT 2;

Với cú pháp trên ta thu được kết quả như sau:

name city
John Doe New York
Jane Doe Los Angeles

Ngoài ra, ta có thể kết hợp LIMIT với OFFSET để thực hiện phân trang trong truy vấn. Trong đó, LIMIT dùng để giới hạn số lượng bản ghi được trả về, còn OFFSET xác định điểm bắt đầu của các bản ghi được lấy từ kết quả với cú pháp như sau:

SELECT column1, column2, ... 

FROM table_name 

LIMIT number_of_rows 

OFFSET number_of_rows_to_skip;

Ví dụ để lấy 2 khách hàng tiếp theo (bỏ qua 2 khách hàng đầu tiên) từ bảng customers, bạn có thể dùng truy vấn sau:

SELECT name, city 

FROM customers 

LIMIT 2 OFFSET 2;

Ví dụ phân trang: nếu bạn có 100 bản ghi và muốn hiển thị 10 bản ghi mỗi trang, bạn có thể tạo truy vấn như sau:

  • Trang 1: LIMIT 10 OFFSET 0
  • Trang 2: LIMIT 10 OFFSET 10
  • Trang 3: LIMIT 10 OFFSET 20

Kết hợp dữ liệu từ nhiều bảng với SELECT và JOIN

Lệnh JOIN cho phép kết hợp dữ liệu từ nhiều bảng dựa trên mối quan hệ giữa các bảng, thường là thông qua các khóa ngoại.

Cú pháp 1:

SELECT column1, column2, ... 

FROM table1 

JOIN table2 

ON table1.common_column = table2.common_column;

Lưu ý: Khi kết hợp nhiều bảng, nếu có cột bị trùng tên giữa các bảng thì cần phải chỉ rõ cột đó thuộc bảng nào bằng cú pháp SELECT table_name.column_name.

Ví dụ 1: để kết hợp thông tin khách hàng và đơn hàng của họ, ta dùng cú pháp như sau:

SELECT order_id, customers.name, orders.amount 

FROM customers JOIN orders 

ON customers.customer_id = orders.customer_id;

Với cú pháp trên ta thu được kết quả như sau:

order_id name amount
101 John Doe 250
104 John Doe 150
102 Jane Roe 300
103 Mike Lee 450

Ví dụ 2: để lấy các đơn hàng của khách hàng ở New York ta sử dụng cú pháp sau:

SELECT order_id, customers.name, orders.amount 

FROM customers 

JOIN orders 

ON customers.customer_id = orders.customer_id 

WHERE customers.city = 'New York';

Ngoài việc sử dụng mệnh đề JOIN, ta cũng có thể thực hiện kết hợp hai bảng bằng cách sử dụng phép liệt kê các bảng trong mệnh đề FROM và thêm điều kiện liên kết trong mệnh đề WHERE với cú pháp sau:

SELECT column1, column2, ... 

FROM table1, table2 

WHERE table1.common_column = table2.common_column;

Ví dụ để lấy tên khách hàng và số tiền đơn hàng từ hai bảng customersorders mà không dùng JOIN, ta có thể sử dụng cú pháp sau:

SELECT customers.name, orders.amount 

FROM customers, orders 

WHERE customers.customer_id =orders.customer_id;

Ngoài ra bạn có thể tìm hiểu thêm về JOIN trong SQL.

Câu hỏi thường gặp về SELECT trong SQL

Sự khác biệt giữa WHERE và HAVING là gì?

Mệnh đề WHERE được sử dụng để lọc các bản ghi riêng lẻ. Nếu trong câu truy vấn có lệnh GROUP BY thì WHERE sẽ được thực thi trước GROUP BY, trong khi mệnh đề HAVING lọc các nhóm sau khi hàm tổng hợp được áp dụng. Ngoài ra, HAVING cần phải đi kèm với GROUP BY để lọc các nhóm dữ liệu, trong khi WHERE có thể thực thi độc lập mà không cần GROUP BY.

Khi nào nên sử dụng mệnh đề HAVING?

Mệnh đề HAVING nên được sử dụng khi bạn cần lọc các nhóm sau khi đã áp dụng các hàm tổng hợp, chẳng hạn như chỉ hiển thị những nhóm có tổng giá trị lớn hơn một mức nhất định.

Có thể sử dụng nhiều toán tử trong một câu lệnh SELECT không?

Bạn có thể kết hợp nhiều toán tử trong mệnh đề WHERE để một truy vấn SELECT bằng cách sử dụng các toán tử logic như AND, OR để tạo các điều kiện lọc phức tạp.

Tổng kết SELECT trong SQL

Lệnh SELECT đóng vai trò thiết yếu trong SQL, cho phép người dùng truy vấn và xử lý dữ liệu một cách hiệu quả. Từ việc truy xuất dữ liệu đơn giản đến các truy vấn phức tạp với các mệnh đề như WHERE, GROUP BYHAVING, SELECT mang lại sự linh hoạt trong việc quản lý và phân tích dữ liệu.

ITviec hy vọng bài viết trên đã giúp bạn hiểu rõ các cú pháp và cách áp dụng các mệnh đề khác nhau để có thể tối ưu hóa truy vấn và xử lý dữ liệu hiệu quả hơn.