Chuyển đến nội dung chính

Các ví dụ truy vấn SQL và hướng dẫn

Nếu bạn đang muốn bắt đầu với SQL, chúng tôi có sẵn mọi thứ bạn cần. Trong hướng dẫn SQL này, chúng tôi sẽ giới thiệu với bạn về các truy vấn SQL - một công cụ mạnh mẽ cho phép chúng ta làm việc với dữ liệu được lưu trữ trong cơ sở dữ liệu.
Đã cập nhật 5 thg 10, 2026  · 15 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Truy vấn SQL là gì?

SQL là viết tắt của Structured Query Language (Ngôn ngữ Truy vấn Có cấu trúc). Mọi người thường phát âm là “S-Q-L” hoặc “sequel”. SQL được dùng trong lập trình và được thiết kế để quản lý dữ liệu lưu trữ trong cơ sở dữ liệu bằng các truy vấn SQL. 

Hệ quản trị cơ sở dữ liệu (DBMS) phổ biến nhất là hệ quản trị cơ sở dữ liệu quan hệ (RDBMS), nơi chúng ta lưu trữ dữ liệu có cấu trúc, tức là dữ liệu bao hàm các quan hệ giữa thực thể và biến. Các thực thể và biến này được tổ chức thành tập các bảng với cột và hàng. Một số RDBMS phổ biến nhất là MYSQL, Oracle, IBM DB2 và Microsoft SQL Server.

Dữ liệu trong RDBMS được lưu trong một đối tượng cơ sở dữ liệu gọi là table (bảng). Một cơ sở dữ liệu thường chứa nhiều bảng. Mỗi bảng được nhận diện bằng một tên duy nhất và chứa một tập các bản ghi liên quan được cấu trúc theo hàng và cột. 

Một cột là một thực thể theo chiều dọc; chúng được gọi là field (trường) và chứa toàn bộ thông tin gắn với một trường cụ thể trong bảng. Mỗi hàng trong bảng được gọi là một record (bản ghi); đó là thực thể theo chiều ngang trong bảng.

Cấu trúc của cơ sở dữ liệu có thể khiến bạn liên tưởng đến Excel. Tuy nhiên, nhìn chung cơ sở dữ liệu mạnh mẽ hơn nhiều so với bảng tính Excel. Dưới đây là ba lý do bạn có thể nói như vậy: 

  1. Cơ sở dữ liệu có thể tương tác với nhiều ngôn ngữ lập trình khác - giúp lập trình viên có nhiều quyền năng hơn để quản lý và truy xuất thông tin từ dữ liệu.
  2. Cơ sở dữ liệu có thể xử lý nhiều dữ liệu hơn bảng tính Excel. Excel xử lý tối đa khoảng 1 triệu hàng dữ liệu, trong khi cơ sở dữ liệu có thể xử lý hơn một tỷ hàng.
  3. Cơ sở dữ liệu dễ dàng kết nối với internet hơn, cho phép hàng trăm người dùng và ứng dụng truy cập đồng thời.

Háo hức bắt đầu với SQL? DataCamp có rất nhiều tài liệu tuyệt vời để bạn khởi động; học SQL nêu bật các lộ trình bạn có thể theo để rèn luyện kỹ năng SQL!

Giờ hãy đi sâu hơn vào Truy vấn SQL… 

Một truy vấn SQL là một câu lệnh được tạo bằng cách kết hợp nhiều lệnh SQL. Các lệnh SQL này phối hợp để thực hiện một tác vụ cụ thể nhằm truy cập, quản lý, chỉnh sửa, cập nhật, kiểm soát và tổ chức dữ liệu của bạn được lưu trong cơ sở dữ liệu và do DBMS quản lý. 

Tại sao dùng SQL?

SQL cực kỳ linh hoạt và được sử dụng bởi mọi đối tượng từ nhà khoa học dữ liệu, kỹ sư dữ liệu đến chuyên viên marketing và nhân sự - nói chung, bất kỳ ai muốn nâng cao hiểu biết về dữ liệu!

Nó không chỉ dùng trong ngành công nghệ hay giới hạn ở các công ty lớn. Nhiều ngành ở mọi quy mô sử dụng trực tiếp hoặc gián tiếp. Ví dụ, các chuyên gia làm việc trong tài chính và chăm sóc sức khỏe thường dùng SQL vì lượng dữ liệu họ tạo ra rất lớn. 

Dữ liệu là loại hàng hóa mới, và SQL là công cụ rất mạnh khi xử lý và làm việc với dữ liệu lớn. Tò mò cách khai thác SQL tối đa? Hãy xem hướng dẫn Bạn có thể làm gì với SQL của DataCamp để có câu trả lời.

Cách viết truy vấn SQL

Trước khi đi vào việc xây dựng truy vấn, hãy xem xét câu hỏi: “Tôi viết và thực thi truy vấn SQL ở đâu?” 

Trung tâm Học SQL của DataCamp có thể là điểm khởi đầu tốt để bạn làm việc với SQL trên máy Mac hoặc Windows và bắt đầu ngay.

Nhưng nếu bạn chỉ đơn giản muốn bắt đầu học ngôn ngữ bản địa của cơ sở dữ liệu - SQL, bạn có thể bắt đầu với khóa học Introduction to SQL của DataCamp. Khóa học này dạy cú pháp SQL được chia sẻ bởi nhiều loại cơ sở dữ liệu như PostgreSQL, MySQL, SQL Server và Oracle. Bạn sẽ làm việc với giao diện SQL tích hợp sẵn của DataCamp và không phải lo lắng về công đoạn thiết lập RDBMS ban đầu. 

DataCamp cũng có một công cụ notebook tuyệt vời để bạn tạo sổ tay của riêng mình: DataLab. DataLab là notebook cộng tác trên nền tảng đám mây cho phép bạn phân tích dữ liệu, cộng tác với nhóm và chia sẻ thông tin chi tiết. DataLab được thiết kế để đưa bạn từ học khoa học dữ liệu đến thực hành khoa học dữ liệu. Với các tập dữ liệu dựng sẵn, bạn có thể bắt đầu phân tích chỉ trong vài phút.

Giờ hãy xem tập dữ liệu chúng ta sẽ dùng trong hướng dẫn này. 

Chúng ta sẽ bắt đầu với ‘films’ -  một bảng SQL lưu dữ liệu của 10 bộ phim. Đây chỉ là một phần nhỏ của tập dữ liệu IMDb Film được dùng trong khóa học Introduction to SQL của DataCamp mà chúng tôi đã đề cập ở trên.

 

title

release_year

budget

gross

imdb_score

1

The Godfather

1972

6000000

134821952

9.2

2

The Dark Knight

2008

185000000

533316061

9

3

The Godfather: Part II

1974

13000000

57300000

9

4

Schindler's List

1993

22000000

96067179

8.9

5

Pulp Fiction

1994

8000000

107930000

8.9

6

The Lord of the Rings: The Return of the King

2003

94000000

377019252

8.9

7

Fight Club

1999

63000000

37023395

8.8

8

Inception

2010

160000000

292568851

8.8

9

Star Wars: Episode V - The Empire Strikes Back

1980

18000000

290158751

8.8

10

The Shawshank Redemption

1994

25000000

28341469

9.3

Bảng ‘films’ có mười bản ghi - tên phim được lưu trên 10 hàng. Các trường là năm cột trong bảng, chứa thông tin liên quan đến bộ phim. 

  • ‘title’ là tên bộ phim
  • ‘release_year’ là năm phim được phát hành
  • ‘budget’ là chi phí sản xuất phim tính bằng đô la Mỹ
  • ‘gross’ là doanh thu của phim tính bằng đô la Mỹ. 
  • ‘imdb_score’  là điểm do người dùng IMDb bình chọn, không phải nhà phê bình. 

Hãy bắt đầu luyện tập với một số lệnh SQL cơ bản, dùng chúng để khám phá bảng ‘films’ ở trên. Chúng tôi không mong bạn thực thi ngay các truy vấn lời giải… mà hãy dùng chúng làm nền để học một số khái niệm chính. Vì vậy đừng lo nếu bạn chưa quyết định nền tảng để chạy truy vấn.

Các truy vấn SQL cơ bản

Lưu ý rằng các từ khóa hay lệnh SQL không phân biệt chữ hoa chữ thường; viết ‘select’ cũng như viết ‘SELECT’. 

Chúng ta sẽ dùng dấu chấm phẩy ở cuối mỗi câu lệnh SQL. Đây là chuẩn với một số hệ cơ sở dữ liệu, và được dùng để tách từng câu lệnh để có thể thực thi trong cùng một lần gọi tới máy chủ. 

Bắt đầu với một câu hỏi. C1: Những bộ phim nào được lưu trong bảng?

SELECT - FROM

Câu lệnh SELECT dùng để chọn các trường bạn muốn xem từ bảng trong cơ sở dữ liệu. Với C1, bạn cần trường ‘title’.

Từ khóa/điều lệnh FROM chỉ định bảng cụ thể trong cơ sở dữ liệu mà bạn muốn lấy dữ liệu. Hãy nhớ rằng một cơ sở dữ liệu có thể gồm nhiều bảng.

Cú pháp: SELECT column1, column2, … FROM table_name;

Truy vấn SQL: SELECT title FROM films;

Kết quả: 

 

title

1

The Godfather

2

The Dark Knight

3

The Godfather: Part II

4

Schindler's List

5

Pulp Fiction

6

The Lord of the Rings: The Return of the King

7

Fight Club

8

Inception

9

Star Wars: Episode V - The Empire Strikes Back

10

The Shawshank Redemption

Bạn có thể thắc mắc, nếu bạn chưa từng xem bảng trên nên không biết tên cột để chỉ định trong câu lệnh SELECT thì sao. Câu hỏi hay! Chúng ta sẽ học về dấu ‘*’ kỳ diệu sau trong hướng dẫn. 

WHERE

C2: Những bộ phim nào phát hành năm 2010?

Với câu hỏi này, bạn muốn “lọc” các bộ phim sao cho có tên phim thỏa điều kiện: ‘release_year’ là 2010. 

Bạn có thể dùng mệnh đề ‘WHERE’ để chỉ lấy các bản ghi thỏa điều kiện cho trước.

Cú pháp: SELECT column1, column2, … FROM table_name WHERE condition; 

Truy vấn SQL: SELECT title, release_year FROM films WHERE release_year = 2010;

Kết quả: 

 

title

release_year

1

Inception

2010

Các toán tử trong mệnh đề WHERE

Các toán tử sau có thể dùng trong mệnh đề WHERE:

Operator

Description

=

Bằng

>

Lớn hơn

<

Nhỏ hơn

>=

Lớn hơn hoặc bằng

<=

Nhỏ hơn hoặc bằng

<> or !=

Không bằng. 

BETWEEN

Nằm trong một khoảng cho trước

LIKE

Tìm kiếm mẫu khớp với mẫu cho trước

IN

Chỉ định nhiều giá trị có thể có 

Tính toán số học trong SQL

Bạn có thể thực hiện phép toán số học đơn giản trong SQL bằng các ký hiệu: +, -, *, /. Tuy nhiên, bạn chỉ có thể thực hiện phép toán giữa các cột bằng các ký hiệu này. Bạn cũng có thể dùng ngoặc để kiểm soát thứ tự thực hiện.

Nhưng đừng lo, với các phép tính phức tạp hơn - SQL có các hàm tổng hợp cho phép bạn thực hiện phép toán trong cùng một hàng. Chúng ta sẽ bàn chủ đề này sau trong hướng dẫn.

C3: Tính lợi nhuận của mỗi bộ phim trong bảng ‘films’. 

Gợi ý: Tính Gross - Budget và lưu kết quả vào cột ‘movie_profit’ bằng AS

Truy vấn SQL: SELECT title, (gross - budget) AS movie_profit FROM films

Kết quả: 

 

title

movie_profit

1

The Godfather

128821952

2

The Dark Knight

348316061

3

The Godfather: Part II

44300000

4

Schindler's List

74067179

5

Pulp Fiction

99930000

6

The Lord of the Rings: The Return of the King

283019252

7

Fight Club

-25976605

8

Inception

132568851

9

Star Wars: Episode V - The Empire Strikes Back

272158751

10

The Shawshank Redemption

3341469

Lưu ý: Những người mê phim có thể khó chịu vì lợi nhuận âm của Fight Club. Công thức dùng ((gross - budget) AS movie_profit) là công thức rất đơn giản và thực sự, với công thức và dữ liệu đó, kết quả là đúng. 

Nhưng ví dụ trên nhằm nhắc bạn chú ý đến quy trình thu thập dữ liệu! Ngay cả khám phá dữ liệu đơn giản cũng có thể bộc lộ lỗi dữ liệu do sai sót trong quá trình thu thập hoặc lưu trữ (thay đổi kiểu dữ liệu, v.v.) - có thể là trường hợp khi tạo tập dữ liệu đang dùng. 

Luôn chú ý đến dữ liệu bạn đang làm việc!

AND, OR, NOT

Mệnh đề WHERE có thể kết hợp với các mệnh đề điều kiện khác bằng toán tử AND, OR và NOT. Toán tử AND và OR dùng để lọc bản ghi dựa trên nhiều điều kiện, còn NOT dùng để phủ định một điều kiện. 

Hãy xem ví dụ:

C4: Những bộ phim nào phát hành năm 2010 và có điểm đánh giá cao hơn 9?

Cú pháp: SELECT column1, column2, … FROM table_name WHERE condition1 AND condition2 AND condition3 AND condition4…..;

Truy vấn SQL: SELECT title, release_year, imdb_score FROM films WHERE release_year = 2010 AND imdb_score >= 9;

Toán tử AND chỉ hiển thị bản ghi nếu tất cả điều kiện được ngăn cách bằng AND đều đúng.

Trong bảng ‘films’, chúng ta có phim ‘Inception’. Đây là giá trị duy nhất đúng với release_year = 2010, nhưng sai với imdb_score >= 9 nên không thỏa cả hai điều kiện AND. Vì vậy truy vấn trả về tập kết quả rỗng.

C5: Những bộ phim nào phát hành năm 2010 hoặc có điểm đánh giá cao hơn 9?

Cú pháp: SELECT column1, column2, … FROM table_name WHERE condition1 OR condition2 OR condition3 OR condition4…..;

Truy vấn SQL: SELECT title, release_year, imdb_score FROM films WHERE release_year = 2010 OR imdb_score >= 9;

Kết quả: 

 

title

release_year

imdb_score

1

The Godfather

1972

9.2

2

The Dark Knight

2008

9

3

The Godfather: Part II

1974

9

4

Inception

2010

8.8

5

The Shawshank Redemption

1994

9.3

Toán tử OR hiển thị bản ghi nếu bất kỳ điều kiện nào được ngăn cách bằng OR là ĐÚNG.

Các phim: The Godfather, The Dark Knight, The Godfather: Part II, The Shawshank Redemption đúng với imdb_score >= 9, trong khi Inception đúng với release_year = 2010, do đó chúng thỏa điều kiện OR.

C6: Những bộ phim nào có năm phát hành khác 2010?

Cú pháp: SELECT column1, column2, … FROM table_name WHERE NOT condition1;

Truy vấn SQL: SELECT title, release_year FROM films WHERE NOT release_year = 2010;

Kết quả: 

 

title

release_year

1

The Godfather

1972

2

The Dark Knight

2008

3

The Godfather: Part II

1974

4

Schindler's List

1993

5

Pulp Fiction

1994

6

The Lord of the Rings: The Return of the King

2003

7

Fight Club

1999

8

Star Wars: Episode V - The Empire Strikes Back

1980

9

The Shawshank Redemption

1994

Bạn cũng có thể viết: SELECT title, release_year FROM films WHERE release_year != 2010;

Điều này cũng cho cùng kết quả như trên.Có thể có nhiều cách để đạt cùng một kết quả trong SQL. Tuy nhiên, một số truy vấn có thể hiệu quả hơn số khác. Hiệu năng có thể phụ thuộc vào nhiều yếu tố - lượng dữ liệu, các lệnh dùng trong truy vấn, cách cấu trúc cơ sở dữ liệu, kiểu dữ liệu, v.v. Đây là chủ đề phức tạp và nâng cao hơn mà chúng ta sẽ không trình bày trong hướng dẫn truy vấn SQL này. 

Nhưng nếu bạn quan tâm, khóa học Database Design của DataCamp đi sâu vào các chủ đề này.

ORDER BY

Từ khóa ORDER BY được dùng để sắp xếp kết quả theo thứ tự tăng dần (dùng từ khóa ASC) hoặc giảm dần (dùng từ khóa DESC). Mặc định là tăng dần.

C7: Những bộ phim nào được lưu trong bảng? Sắp xếp theo release_year giảm dần.

Cú pháp: SELECT column1, column2, … FROM table_name ORDER BY column1, column2, ... ASC|DESC;

Truy vấn SQL: SELECT title, release_year FROM films ORDER BY release_year DESC;

Kết quả: 

 

title

release_year

1

Inception

2010

2

The Dark Knight

2008

3

The Lord of the Rings: The Return of the King

2003

4

Fight Club

1999

5

Pulp Fiction

1994

6

The Shawshank Redemption

1994

7

Schindler's List

1993

8

Star Wars: Episode V - The Empire Strikes Back

1980

9

The Godfather: Part II

1974

10

The Godfather

1972

LIMIT

Đôi khi cơ sở dữ liệu chạy truy vấn của bạn rất lâu; đặc biệt nếu lượng dữ liệu lưu trữ rất lớn. 

Một cách nhanh gọn để thử truy vấn hoặc lấy mẫu kết quả trả về là dùng LIMIT. LIMIT cho phép bạn giới hạn số lượng kết quả nhận được.

C8: 5 bộ phim mới nhất trong bảng là gì? 

Gợi ý: Sắp xếp kết quả theo release_year giảm dần rồi dùng LIMIT.

Cú pháp: SELECT column1, column2, … FROM table_name LIMIT x;

Truy vấn SQL: SELECT title, release_year FROM films ORDER BY release_year DESC LIMIT 5;

Kết quả: 

 

title

release_year

1

Inception

2010

2

The Dark Knight

2008

3

The Lord of the Rings: The Return of the King

2003

4

Fight Club

1999

5

Pulp Fiction

1994

INSERT INTO

INSERT INTO dùng để thêm bản ghi mới vào bảng cơ sở dữ liệu. Bạn có thể viết câu lệnh INSERT INTO theo hai cách: 

  • Chỉ định cả tên cột cùng với các giá trị tương ứng

Cú pháp: INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);

  • Nếu bạn thêm giá trị cho TẤT CẢ các cột của bảng, bạn không cần chỉ định tên cột trong truy vấn. Hãy cẩn thận khi dùng cách này và đảm bảo thứ tự các giá trị trùng với thứ tự cột trong bảng. 

Cú pháp: INSERT INTO table_name VALUES (value1, value2, value3, ...);

C9: Thêm một bản ghi cho ‘The Godfather: Part III’ vào bảng với thông tin: (‘The Godfather: Part III’, 1990, 54000000, 136900000, 7.6)

Cú pháp: SELECT column1, column2, … FROM table_name ORDER BY column1, column2,... ASC|DESC;

Truy vấn SQL: INSERT INTO films (title, release_year, budget, gross, imdb_score)

VALUES (‘The Godfather: Part III’, 1970, 54000000, 136900000, 7.6);

Bảng sau khi chèn: 

 

title

release_year

budget

gross

imdb_score

1

The Godfather

1972

6000000

134821952

9.2

2

The Dark Knight

2008

185000000

533316061

9

3

The Godfather: Part II

1974

13000000

57300000

9

4

Schindler's List

1993

22000000

96067179

8.9

5

Pulp Fiction

1994

8000000

107930000

8.9

6

The Lord of the Rings: The Return of the King

2003

94000000

377019252

8.9

7

Fight Club

1999

63000000

37023395

8.8

8

Inception

2010

160000000

292568851

8.8

9

Star Wars: Episode V - The Empire Strikes Back

1980

18000000

290158751

8.8

10

The Shawshank Redemption

1994

25000000

28341469

9.3

11

The Godfather: Part III

1970

54000000

136900000

7.6

UPDATE

Chúng ta dùng câu lệnh UPDATE để sửa các bản ghi hiện có trong bảng. 

C10: Sửa ‘release_year’ cho ‘The Godfather: Part III’ thành 1990 thay vì 1970

Cú pháp: UPDATE table_name SET column1 = value1, column2 = value2, ...WHERE condition;

Truy vấn SQL: UPDATE films SET release_year = 1990 WHERE title = ‘The Godfather: Part III’;

Bảng sau khi cập nhật: 

 

title

release_year

budget

gross

imdb_score

1

The Godfather

1972

6000000

134821952

9.2

2

The Dark Knight

2008

185000000

533316061

9

3

The Godfather: Part II

1974

13000000

57300000

9

4

Schindler's List

1993

22000000

96067179

8.9

5

Pulp Fiction

1994

8000000

107930000

8.9

6

The Lord of the Rings: The Return of the King

2003

94000000

377019252

8.9

7

Fight Club

1999

63000000

37023395

8.8

8

Inception

2010

160000000

292568851

8.8

9

Star Wars: Episode V - The Empire Strikes Back

1980

18000000

290158751

8.8

10

The Shawshank Redemption

1994

25000000

28341469

9.3

11

The Godfather: Part III

1990

54000000

136900000

7.6

DELETE

Câu lệnh DELETE dùng để xóa một bản ghi hiện có trong bảng. 

C11: Xóa bản ghi ‘The Godfather: Part III’ khỏi bảng ‘films’.

Cú pháp: DELETE FROM table_name WHERE condition;

Truy vấn SQL: DELETE FROM films WHERE title = ‘The Godfather: Part III’;

Bảng sau khi xóa: Giống bảng gốc ban đầu với tổng cộng 10 bản ghi.

Các truy vấn SQL nâng cao

Nhớ dấu ‘*’ “kỳ diệu” mà ta để dành ở cuối C1 chứ? * là một dấu sao. Nó là ký tự tổng quát mà ta có thể hiểu là ‘tất cả’. 

Quay lại C1: Những bộ phim nào được lưu trong bảng?

Chúng ta đã dùng SELECT - FROM với Cú pháp: SELECT column1, column2, … FROM table_name;

Chúng ta đã dùng truy vấn: SELECT title FROM films;

Nhưng nếu bạn không biết ‘title’ là một trường trong bảng ‘films’ thì sao? Hoặc không biết tên bất kỳ trường nào trong bảng? Hoặc bạn chỉ muốn tất cả các trường trong bảng để cảm nhận dữ liệu? Khi đó * rất hữu ích.

Ta có thể viết lại truy vấn: SELECT * FROM films; 

Điều này sẽ lấy tất cả các trường có trong bảng.

Ký tự đại diện (Wildcard) trong SQL

LIKE

Toán tử LIKE được dùng trong mệnh đề WHERE để tìm một mẫu cụ thể trong cột. 

C12: Truy xuất tất cả tên phim bắt đầu bằng ‘The’

Cú pháp: SELECT column1, column2, … FROM table_name WHERE column1 LIKE patternToMatch;

Truy vấn SQL: Select * FROM films WHERE title LIKE ‘The%’;

Bảng kết quả:

 

title

release_year

budget

gross

imdb_score

1

The Godfather

1972

6000000

134821952

9.2

2

The Dark Knight

2008

185000000

533316061

9

3

The Godfather: Part II

1974

13000000

57300000

9

4

The Lord of the Rings: The Return of the King

2003

94000000

377019252

8.9

5

The Shawshank Redemption

1994

25000000

28341469

9.3

Wildcard Character

Description

Usage: Example

% (Phần trăm)

Đại diện cho không hoặc nhiều ký tự

The%: The, The Godfather, Theodore

_ (Gạch dưới)

Đại diện cho một ký tự đơn

T_e: The, Tie

[ ] (Ngoặc vuông)

Đại diện cho bất kỳ ký tự đơn nào nằm trong ngoặc

C[ao]t: Cat, Cot nhưng không phải Coat

^ (Mũ)

Đại diện cho bất kỳ ký tự nào không nằm trong ngoặc

Ca[^r]: Cat, Cab, Can nhưng không phải Car

- (Gạch ngang)

Đại diện cho bất kỳ ký tự đơn nào trong khoảng được chỉ định

C[a-o]: Can, Cab nhưng không phải Car, Cat

Tuyệt ở chỗ là ta có thể kết hợp các ký tự đại diện! Vì vậy bạn có thể tạo các mẫu khớp khá phức tạp dùng wildcard cùng với LIKE.

Các hàm tổng hợp (Aggregate)

SQL rất giỏi tổng hợp dữ liệu như khi bạn dùng pivot table trong Excel. Các hàm tổng hợp có thể thực hiện phép tính không phải giữa hai cột mà trong một cột, tức là làm việc với toàn bộ hoặc một phần số hàng trong cùng một cột. 

Đây là các hàm tổng hợp trong SQL: 

Function

Description

COUNT

Đếm số lượng bản ghi trong một cột cụ thể

SUM

Cộng tất cả các giá trị trong một cột cụ thể

MIN

Trả về giá trị nhỏ nhất trong một cột cụ thể

MAX

Trả về giá trị lớn nhất trong một cột cụ thể

AVG

Trả về giá trị trung bình cho một nhóm đã chọn 

C13: Bộ phim mới nhất được lưu trong bảng là gì?

Truy vấn SQL: SELECT title AS latest_movie, MAX(release_year) AS released_in FROM films;

Kết quả: 

 

latest_movie

released_in

1

Inception

2010

GROUP BY

Các hàm tổng hợp SQL tổng hợp trên toàn bộ một cột. Nhưng nếu bạn muốn tổng hợp chỉ một phần cột thì sao? Ví dụ, bạn có thể muốn đếm số phim phát hành trong một năm.

Đây là lúc bạn cần mệnh đề GROUP BY. GROUP BY cho phép bạn chia dữ liệu thành các nhóm, sau đó có thể tổng hợp độc lập với nhau.

C13: Đếm số phim phát hành trong một năm.

Truy vấn SQL: SELECT release_year, COUNT(*) AS number_of_movies FROM films GROUP BY release_year;

Kết quả: 

 

release_year

number_of_movies

1

1972

1

2

2008

1

3

1974

1

4

1993

1

5

1994

2

6

2003

1

7

1999

1

8

2010

1

9

1980

1

Các ví dụ truy vấn SQL từ nhiều bảng

Đến giờ, chúng ta mới làm việc với một bảng tại một thời điểm. Nhưng sức mạnh thực sự của cơ sở dữ liệu và SQL đến từ khả năng làm việc với dữ liệu từ nhiều bảng. 

Thuật ngữ "cơ sở dữ liệu quan hệ" trong RDBMS xuất phát từ việc các bảng trong cơ sở dữ liệu có quan hệ với nhau. Chúng có các bộ nhận diện chung cho phép dễ dàng kết hợp dữ liệu từ nhiều bảng. Đây là lúc chúng ta dùng JOIN bảng SQL.

Hãy xem một ví dụ đơn giản để làm quen với cú pháp JOIN và tìm hiểu đôi chút về các loại JOIN khác nhau.

Xét một bảng khác gọi là ‘movieDirectors’ lưu tên đạo diễn cho một số phim có trong bảng ‘films’. 

 

title

director

1

The Godfather

Francis Ford Coppola

2

The Godfather: Part II

Francis Ford Coppola

3

The Godfather: Part III

Francis Ford Coppola

4

Schindler's List

Steven Spielberg

5

The Dark Knight Rises

Christopher Nolan

Chúng ta có thể kết hợp dữ liệu ở hai bảng này bằng một bộ nhận diện chung: ‘title’.

C14: Thêm một cột vào bảng ‘films’, điền tên đạo diễn từ bảng ‘movieDirectors’.

Cú pháp: SELECT leftTable.column1, rightTable.column1, leftTable.column2…. FROM leftTable INNER JOIN rightTable ON leftTable.commonIdentifier = rightTable.commonIdentifier;

Truy vấn SQL: Select films.title, films.release_year, movieDirectors.director FROM films INNER JOIN movieDirectors ON films.title = movieDirectors.title

Kết quả: 

 

title

release_year

director

1

The Godfather

1972

Francis Ford Coppola

2

The Godfather: Part II

1974

Francis Ford Coppola

3

Schindler's List

1993

Steven Spielberg

Các loại JOIN trong SQL

JOIN

Description

Diagram

Inner Join

Chỉ trả về những bản ghi có giá trị khớp ở cả hai bảng

Inner Join

Left (Outer) Join

Trả về tất cả bản ghi từ bảng trái, và các bản ghi khớp từ bảng phải

Left (outer) join

Right (Outer) Join

Trả về tất cả bản ghi từ bảng phải, và các bản ghi khớp từ bảng trái

Right (outer) join

Full (Outer) Join

Trả về tất cả bản ghi khi có khớp ở bảng trái hoặc phải

Full (outer) join

Trong truy vấn ví dụ trên, ‘films’ là bảng trái và ‘movieDirectors’ là bảng phải. Với INNER JOIN chúng ta thực hiện, ta chỉ nhận lại những phim tồn tại ở cả hai bảng. Tập kết quả là phần giao nhau của hai bảng.

SQL UNION

JOIN cho phép bạn kết hợp hai tập dữ liệu theo chiều ngang. Nhưng với SQL UNION bạn có thể chồng một tập dữ liệu lên trên tập còn lại theo chiều dọc. Toán tử UNION được dùng để kết hợp tập kết quả của hai hoặc nhiều câu lệnh SELECT khi đáp ứng các “quy tắc” sau: 

  1. Mỗi câu lệnh SELECT phải có số cột như nhau.
  2. Các cột cũng phải có kiểu dữ liệu tương tự.
  3. Các cột dùng trong các câu lệnh SELECT phải theo cùng thứ tự.

Cú pháp: SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2;

Hãy xét bảng ‘movies_2000s’:

 

title

release_year

budget

gross

imdb_score

1

Inception

2010

160000000

292568851

8.8

2

The Trial of the Chicago 7 

2020

35000000

 

7.7

Bây giờ nếu chúng ta kết hợp hai bảng…

Truy vấn SQL: SELECT title FROM films UNION SELECT title FROM movies_2000s;

Kết quả: 

 

title

1

The Godfather

2

The Dark Knight

3

The Godfather: Part II

4

Schindler's List

5

Pulp Fiction

6

The Lord of the Rings: The Return of the King

7

Fight Club

8

Inception

9

Star Wars: Episode V - The Empire Strikes Back

10

The Shawshank Redemption

12

The Trial of the Chicago 7 

Bạn có thể nhận thấy ‘Inception’ chỉ xuất hiện một lần trong tập kết quả. Đó là vì UNION chỉ chọn các giá trị phân biệt; nếu bạn muốn tất cả giá trị, hãy dùng UNION ALL.

Truy vấn SQL lồng nhau (Nested)

SQL có thể làm nên điều kỳ diệu với dữ liệu. Truy vấn lồng là một công cụ nữa khiến SQL trở thành ngôn ngữ đáng học. Truy vấn lồng đơn giản là truy vấn bên trong truy vấn (giống những giấc mơ trong Inception!).

Với truy vấn lồng, bạn có thể thực hiện các thao tác rất phức tạp theo nhiều bước mà vẫn giữ được tính dễ đọc và dễ hiểu của mã.

C15: Xác định lợi nhuận trung bình của các bộ phim trong bảng ‘films’.

Gợi ý: Bạn đã tính lợi nhuận ở C3. Giờ bạn cần lấy kết quả đó và áp dụng hàm AVG.

Truy vấn SQL lồng: 

SELECT AVG(*) AS average_profit FROM 

(SELECT title, (gross - budget) AS movie_profit FROM films where gross > budget);

Chúng tôi loại bỏ giá trị âm của ‘Fight Club’ trong phép tính ở truy vấn SQL bên trong bằng cách thêm gross > budget. 

Trong truy vấn lồng trên, truy vấn bên trong được thực thi trước rồi tập kết quả này được dùng như một bảng tạm để truy vấn bên ngoài truy xuất dữ liệu. 

Chúng tôi sẽ không đi quá sâu vào chủ đề truy vấn SQL lồng. Nhưng chúng tôi rất khuyến nghị bạn theo học khóa Intermediate SQL của DataCamp để thành thạo truy vấn SQL. Bạn sẽ làm việc với European Soccer Database trong khi học thêm về truy vấn lồng. Bạn cũng sẽ học về câu lệnh CASE và window functions - những chủ đề chúng tôi chưa thể đề cập trong hướng dẫn này. 

Những suy nghĩ cuối

Bạn đã học được rất nhiều về truy vấn SQL và đang ở vị thế tuyệt vời để bắt đầu hành trình giải quyết vấn đề thực tế bằng SQL. Trong hướng dẫn truy vấn SQL này, bạn đã biết truy vấn SQL là gì và cách viết truy vấn SQL. 

Bạn đã thấy cú pháp truy vấn và trả lời một số câu hỏi trên đường đi. Chúng ta bắt đầu với các ví dụ đơn giản dùng SELECT - FROM - WHERE và tiến lên các truy vấn phức tạp hơn dùng join, union và truy vấn lồng. 

Chúng ta đã bao quát nhiều nội dung trong hướng dẫn, tuy nhiên đây KHÔNG phải là danh sách đầy đủ mọi truy vấn SQL đơn giản và nâng cao - còn nhiều nữa. Và chúng tôi rất khuyến nghị theo lộ trình SQL Fundamentals của DataCamp để có hiểu biết sâu và toàn diện hơn về SQL. 

Hãy nhớ, thực hành là chìa khóa để làm chủ bất kỳ kỹ năng nào và SQL cũng không ngoại lệ! Luyện tập sẽ đưa kỹ năng SQL của bạn từ mới bắt đầu lên nâng cao.

Vậy hãy bắt đầu và chúc bạn truy vấn vui vẻ!

Chủ đề
SQL
Khoa học Dữ liệu

Khóa học về SQL

{count, plural, one {Khóa học} other {Khóa học}}

Phân tích dữ liệu kinh doanh bằng SQL

{hours} giờ
48.5K
Học cách viết truy vấn SQL để tính các chỉ số chính mà doanh nghiệp dùng để đo lường hiệu suất.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

{count, plural, one {blog} other {blog}}

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm