Nội dung chính
- SELECT trong SQL là gì?
- Cú pháp SELECT trong SQL cơ bản (truy xuất dữ liệu từ một bảng)
- SELECT trong SQL với điều kiện WHERE
- SELECT trong SQL với các hàm tổng hợp
- SELECT trong SQL với ORDER BY
- SELECT trong SQL với GROUP BY
- SELECT trong SQL với mệnh đề HAVING
- Giới hạn số lượng kết quả với LIMIT
- Kết hợp dữ liệu từ nhiều bảng với SELECT và JOIN
- Câu hỏi thường gặp về SELECT trong SQL
- Tổng kết SELECT trong SQL
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:
- FROM / JOIN: Truy xuất và kết nối dữ liệu từ bảng.
- WHERE: Lọc các bản ghi (record) theo điều kiện cụ thể.
- GROUP BY: Nhóm các bản ghi theo một hoặc nhiều cột.
- HAVING: Lọc các nhóm dữ liệu sau khi nhóm.
- SELECT: Chọn các cột cần để hiển thị trong kết quả.
- ORDER BY: Sắp xếp dữ liệu theo thứ tự cụ thể.
- 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_name và customer_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, MAX và MIN.
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, MAX và MIN.
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 customers và orders 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 BY và HAVING, 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.