SQL là gì? Tìm hiểu ngôn ngữ truy vấn cơ sở dữ liệu SQL

  • Home
  • Là Gì
  • SQL là gì? Tìm hiểu ngôn ngữ truy vấn cơ sở dữ liệu SQL
Tháng 2 22, 2025

Đối với bất kỳ ai làm việc trong lĩnh vực công nghệ thông tin (CNTT), việc trang bị kiến thức, kỹ năng và kinh nghiệm về các chuyên môn kỹ thuật và ngôn ngữ lập trình là vô cùng quan trọng. Nếu bạn đang muốn phát triển sự nghiệp trong các lĩnh vực như kỹ thuật dữ liệu, phân tích dữ liệu, hoặc các công việc liên quan đến cơ sở dữ liệu, việc nắm vững SQL là một lợi thế lớn. SQL (Structured Query Language) là một trong những ngôn ngữ lập trình quan trọng nhất mà bạn cần học.

Bài viết này, được biên soạn bởi Datapot, sẽ giới thiệu đến bạn những khái niệm cơ bản và quan trọng nhất về SQL, giúp người mới bắt đầu có cái nhìn tổng quan và nắm vững nền tảng để tự học SQL hiệu quả.

Giới thiệu chung về SQL

Ngôn ngữ 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. Đây là một ngôn ngữ mạnh mẽ được thiết kế để quản lý và thao tác dữ liệu trong các hệ thống quản trị cơ sở dữ liệu quan hệ (Relational Database Management Systems – RDBMS).

Cách đọc SQL: Bạn có thể đọc là “SQL” hoặc “sequel”.

SQL cho phép bạn thực hiện nhiều thao tác trên cơ sở dữ liệu, bao gồm:

  • Truy vấn dữ liệu: Lấy dữ liệu cụ thể từ cơ sở dữ liệu dựa trên các tiêu chí tìm kiếm phức tạp.
  • Thêm dữ liệu: Chèn bản ghi mới vào bảng trong cơ sở dữ liệu.
  • Sửa đổi dữ liệu: Cập nhật thông tin hiện có trong cơ sở dữ liệu.
  • Xóa dữ liệu: Loại bỏ bản ghi không cần thiết khỏi cơ sở dữ liệu.
  • Tạo và quản lý cấu trúc cơ sở dữ liệu: Định nghĩa bảng, cột, mối quan hệ giữa các bảng và các đối tượng cơ sở dữ liệu khác.
  • Kiểm soát truy cập dữ liệu: Phân quyền và quản lý quyền truy cập vào cơ sở dữ liệu.

Lược sử hình thành SQL

SQL được tạo ra vào năm 1970 bởi Donald D. Chamberlin và Raymond F. Boyce tại IBM. Ban đầu, SQL có tên là “SEQUEL” (Structured English Query Language), được thiết kế để truy vấn dữ liệu lưu trữ trong cơ sở dữ liệu quan hệ của IBM. Tuy nhiên, do vấn đề về bản quyền thương hiệu, tên “SEQUEL” đã được đổi thành “SQL”.

SQL nhanh chóng trở thành ngôn ngữ tiêu chuẩn cho việc quản lý cơ sở dữ liệu quan hệ. Năm 1987, chuẩn ANSI (American National Standards Institute) và ISO (International Organization for Standardization) đầu tiên cho SQL đã được ban hành, củng cố vị thế của SQL như một ngôn ngữ truy vấn dữ liệu tiêu chuẩn quốc tế.

Giới thiệu chung về Hệ quản trị cơ sở dữ liệu (DBMS)

Các hệ thống quản trị cơ sở dữ liệu (DBMS)

Hệ quản trị cơ sở dữ liệu (DBMS – Database Management System) là một hệ thống phần mềm được thiết kế để cho phép người dùng xác định, tạo, duy trì và kiểm soát truy cập vào cơ sở dữ liệu. DBMS đóng vai trò trung gian giữa người dùng và cơ sở dữ liệu, giúp đơn giản hóa quá trình quản lý dữ liệu phức tạp.

Các hệ thống quản trị cơ sở dữ liệu quan hệ phổ biến (Relational DBMS)

Cơ sở dữ liệu quan hệ (Relational Database) là loại cơ sở dữ liệu phổ biến nhất hiện nay, tổ chức dữ liệu dưới dạng các bảng có liên quan đến nhau. Các hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) là phần mềm được sử dụng để quản lý loại cơ sở dữ liệu này.

Dưới đây là một vài hệ quản trị CSDL quan hệ phổ biến trên thị trường:

  • MySQL: Một hệ quản trị CSDL mã nguồn mở phổ biến, thường được sử dụng cho các ứng dụng web và doanh nghiệp vừa và nhỏ.
  • SQL Server: Sản phẩm của Microsoft, mạnh mẽ và được sử dụng rộng rãi trong các doanh nghiệp lớn, đặc biệt là trong môi trường Windows.
  • Oracle Database: Một trong những hệ quản trị CSDL thương mại hàng đầu, nổi tiếng với khả năng mở rộng và hiệu suất cao, thường được sử dụng cho các ứng dụng doanh nghiệp lớn và phức tạp.
  • PostgreSQL: Một hệ quản trị CSDL mã nguồn mở mạnh mẽ khác, nổi bật với khả năng tuân thủ chuẩn SQL và nhiều tính năng nâng cao.

Chuẩn ISO

Chuẩn ISO (International Organization for Standardization) cho SQL được ban hành lần đầu tiên vào năm 1987. Việc chuẩn hóa SQL đảm bảo tính nhất quán và khả năng tương thích giữa các hệ quản trị CSDL khác nhau.

Hầu hết các ngôn ngữ truy vấn có cấu trúc đều được xây dựng dựa trên tiêu chuẩn ISO. Điều này có nghĩa là khi bạn làm việc với một biến thể SQL (ví dụ: T-SQL của SQL Server), bạn có thể dễ dàng chuyển đổi và làm việc với các biến thể khác mà không gặp nhiều khó khăn. Sự tương đồng này giúp cho việc học và sử dụng SQL trở nên linh hoạt và hiệu quả hơn.

Một số khái niệm trong cơ sở dữ liệu

Có nhiều dạng cơ sở dữ liệu khác nhau, phù hợp với các loại dữ liệu và mục đích sử dụng khác nhau, ví dụ như cơ sở dữ liệu quan hệ (Relational Databases), cơ sở dữ liệu phi quan hệ NoSQL, dữ liệu theo thời gian (Time Series), dữ liệu NewSQL, ….

Tuy nhiên, chúng ta sẽ tập trung tìm hiểu 2 nhóm hệ quản trị cơ sở dữ liệu thường được sử dụng phổ biến trên thị trường hiện nay:

  • Cơ sở dữ liệu quan hệ (Relational Databases).
  • Cơ sở dữ liệu phi quan hệ NoSQL.

Cơ sở dữ liệu quan hệ (Relational Database)

Cơ sở dữ liệu quan hệ (Relational Database) được xây dựng dựa trên mô hình dữ liệu quan hệ. Dữ liệu trong cơ sở dữ liệu quan hệ được tổ chức thành các bảng, mỗi bảng bao gồm các hàng (bản ghi) và cột (thuộc tính). Các bảng có thể liên kết với nhau thông qua các mối quan hệ, giúp đảm bảo tính toàn vẹn và nhất quán của dữ liệu.

Thuộc tính của cơ sở dữ liệu quan hệ:

  • Tổ chức dữ liệu có cấu trúc: Dữ liệu được lưu trữ trong các bảng, và các bảng được tổ chức trong một lược đồ (Schema) thống nhất. Cấu trúc này giúp quản lý và duy trì dữ liệu dễ dàng hơn, đặc biệt khi xử lý dữ liệu lớn và phức tạp.
  • Mối quan hệ tham chiếu: Mối quan hệ giữa các bảng được liên kết với nhau bằng khóa chính (Primary Key) và khóa ngoại (Foreign Key). Khóa chính xác định duy nhất mỗi hàng trong bảng, trong khi khóa ngoại tạo liên kết đến khóa chính của bảng khác, thiết lập mối quan hệ giữa các bảng.
  • Hỗ trợ SQL: Cơ sở dữ liệu quan hệ sử dụng ngôn ngữ truy vấn có cấu trúc SQL để truy vấn, thao tác và quản lý dữ liệu. SQL là ngôn ngữ tiêu chuẩn để tương tác với cơ sở dữ liệu quan hệ, cung cấp một cách thống nhất và hiệu quả để làm việc với dữ liệu. Một số hệ thống lưu trữ cơ sở dữ liệu quan hệ (Database Management System) phổ biến bao gồm MySQL, SQL Server, Oracle,…
a) Máy chủ cơ sở dữ liệu (Database Server)

Máy chủ cơ sở dữ liệu là một chương trình phần mềm hoặc nền tảng chuyên dụng được sử dụng để cung cấp các dịch vụ cơ sở dữ liệu, bao gồm lưu trữ, tạo cơ sở dữ liệu và bảo mật dữ liệu. Máy chủ CSDL có thể là một máy tính vật lý hoặc một máy chủ ảo, được tối ưu hóa để xử lý các yêu cầu truy cập và quản lý dữ liệu.

b) Cơ sở dữ liệu (Database)

Cơ sở dữ liệu là tập hợp các dữ liệu được tổ chức một cách bài bản và thường được truy cập từ hệ thống máy tính hoặc tồn tại dưới dạng tập tin trong hệ quản trị cơ sở dữ liệu. Dữ liệu trong cơ sở dữ liệu có thể thuộc nhiều loại khác nhau, từ văn bản, số, ngày tháng đến hình ảnh, âm thanh và video.

Cơ sở dữ liệu được lưu trữ trên các thiết bị lưu trữ khác nhau, bao gồm thẻ nhớ, ổ cứng, nền tảng điện toán đám mây, … Việc lựa chọn nơi lưu trữ phụ thuộc vào quy mô, yêu cầu hiệu suất và tính sẵn sàng của dữ liệu.

c) Lược đồ (Schema)
  • Cơ sở dữ liệu thường được lưu trữ và quản lý trong các lược đồ (Schema).
  • Lược đồ (Schema) là một cách tổ chức cơ sở dữ liệu thành các nhóm logic, giúp quản lý và bảo mật dữ liệu hiệu quả hơn.

Lợi ích khi sử dụng lược đồ (Schema):

  • Cơ sở dữ liệu được lưu trữ một cách logic và có tổ chức, giúp dễ dàng quản lý và tìm kiếm dữ liệu.
  • Cải thiện bảo mật dữ liệu do cho phép phân quyền truy cập đến từng phần riêng biệt của cơ sở dữ liệu. Mỗi lược đồ có thể được gán quyền truy cập khác nhau cho người dùng hoặc nhóm người dùng, tăng cường khả năng kiểm soát và bảo vệ dữ liệu.

d) Bảng (Tables)

Hầu hết chúng ta đều quan sát dữ liệu ở trong bảng (Tables). Cơ sở dữ liệu thì bao gồm nhiều bảng và bảng bao gồm các thành tố sau:

  • Hàng (Row/Record/Tuple/Entity): Đại diện cho một bản ghi dữ liệu duy nhất.
  • Cột (Attribute/Column): Đại diện cho một thuộc tính của dữ liệu.
  • Giá trị (Cell/Attribute Value/Field Value): Giá trị dữ liệu cụ thể tại giao điểm của hàng và cột.
  • Tập hợp các thực thể (Set of entities): Tập hợp tất cả các hàng trong bảng.

Cơ sở dữ liệu phi quan hệ NoSQL

  • Cơ sở dữ liệu phi quan hệ NoSQL được xây dựng dành riêng cho mô hình dữ liệu linh hoạt, không yêu cầu cấu trúc bảng cố định như cơ sở dữ liệu quan hệ.
  • Cơ sở dữ liệu phi quan hệ NoSQL được tối ưu hóa cho việc xử lý dữ liệu lớn và khả năng mở rộng cao, phù hợp với các ứng dụng web hiện đại và dữ liệu phi cấu trúc.

Thuộc tính của cơ sở dữ liệu phi quan hệ NoSQL:

  • Được thiết kế cho phân tích các dữ liệu có cấu trúc chưa được xác định hoặc thay đổi thường xuyên.
  • Khả năng lưu trữ gần như không giới hạn cho dữ liệu và số lượng người dùng hệ thống.
  • Định dạng dữ liệu lưu trữ đa dạng, có thể lưu trữ nhiều loại dữ liệu khác nhau như văn bản, hình ảnh, video, âm thanh, …
  • Phù hợp cho các ứng dụng với dữ liệu đa dạng và thay đổi thường xuyên, ví dụ như mạng xã hội, ứng dụng di động, Internet of Things (IoT).
  • Hạn chế khi thực hiện các câu lệnh truy vấn phức tạp, đặc biệt là các truy vấn JOIN giữa nhiều tập dữ liệu.
  • Do không có tiêu chuẩn chung như SQL, việc học và sử dụng NoSQL có thể phức tạp hơn và phụ thuộc vào từng loại cơ sở dữ liệu cụ thể.

Các nhóm câu lệnh SQL

Có nhiều cách để tương tác với dữ liệu khi sử dụng SQL. Các câu lệnh SQL được phân loại thành nhiều nhóm khác nhau, mỗi nhóm phục vụ một mục đích cụ thể trong việc quản lý và thao tác dữ liệu.

Các nhóm câu lệnh SQL chính bao gồm:

  • Data Query Language (DQL): Ngôn ngữ truy vấn dữ liệu, được sử dụng để truy vấn và lấy dữ liệu từ cơ sở dữ liệu. Câu lệnh quan trọng nhất trong DQL là SELECT.
  • Data Manipulation Language (DML): Ngôn ngữ thao tác dữ liệu, được sử dụng để thêm, sửa, xóa dữ liệu trong cơ sở dữ liệu. Các câu lệnh DML phổ biến bao gồm INSERT, UPDATE, DELETE.
  • Data Definition Language (DDL): Ngôn ngữ định nghĩa dữ liệu, được sử dụng để định nghĩa cấu trúc cơ sở dữ liệu, bao gồm tạo, sửa đổi và xóa các đối tượng cơ sở dữ liệu như bảng, lược đồ, chỉ mục. Các câu lệnh DDL phổ biến bao gồm CREATE, ALTER, DROP.
  • Data Control Language (DCL): Ngôn ngữ kiểm soát dữ liệu, được sử dụng để quản lý quyền truy cập và bảo mật dữ liệu trong cơ sở dữ liệu. Các câu lệnh DCL phổ biến bao gồm GRANT, REVOKE.
  • Transaction Control Language (TCL): Ngôn ngữ kiểm soát giao dịch, được sử dụng để quản lý các giao dịch trong cơ sở dữ liệu, đảm bảo tính toàn vẹn dữ liệu. Các câu lệnh TCL phổ biến bao gồm COMMIT, ROLLBACK.

Cấu trúc câu lệnh SQL cơ bản

Mỗi câu lệnh SQL thường bắt đầu bằng một mệnh đề (clause) xác định loại thao tác bạn muốn thực hiện. Dưới đây là cấu trúc và ví dụ về một số mệnh đề SQL cơ bản:

Mệnh đề SELECT và FROM

  • Mệnh đề SELECT dùng để chỉ định tên của các cột dữ liệu mà bạn muốn truy vấn và hiển thị trong kết quả.
  • Mệnh đề FROM được dùng để chỉ định bảng mà bạn muốn truy vấn dữ liệu. Khi bạn muốn lấy dữ liệu từ một bảng, bạn cần chỉ rõ tên bảng trong mệnh đề FROM. Kết quả truy vấn sẽ là tất cả các hàng trong bảng được chỉ định nếu không có mệnh đề lọc nào khác.

Để hiểu rõ hơn vai trò của 2 mệnh đề trên, chúng ta cùng xem những ví dụ sau:

Ví dụ 1: Từ bảng dbo.DimEmployee thuộc bộ dữ liệu AdventureWorksDW2019, truy vấn tất cả các dữ liệu có trong bảng.

Kết quả truy vấn gồm 25 cột và 296 hàng.

Giải thích câu lệnh truy vấn:

  • FROM dbo.DimEmployee: Chỉ định dữ liệu được lấy từ bảng dbo.DimEmployee.
  • SELECT *: Câu lệnh truy vấn tất cả các cột dữ liệu trong bảng. Dấu * là ký tự đại diện cho tất cả các cột.

Ví dụ 2: Từ bảng dbo.DimEmployee thuộc bộ dữ liệu AdventureWorksDW2019, truy vấn các cột FirstName (đặt tên là “Tên”), LastName (đặt tên là “Họ”), tổ hợp FirstName + LastName (đặt tên là “Họ và tên”), Title (đặt tên là “Chức vụ”), và tổng của VacationHours + SickLeaveHours (đặt tên là “Tổng giờ nghỉ”).

Giải thích câu lệnh truy vấn:

  • SELECT: Câu lệnh truy vấn các cột được chọn.
  • FirstName AS 'Tên': Truy vấn cột FirstName và đặt tên cột hiển thị là “Tên” bằng cách sử dụng từ khóa AS để tạo bí danh (alias).
  • LastName AS 'Họ': Tương tự, truy vấn cột LastName và đặt bí danh là “Họ”.
  • FirstName + ' ' + LastName AS 'Họ và tên': Tạo một cột phát sinh bằng cách kết hợp cột FirstNameLastName với một khoảng trắng ở giữa, sau đó đặt bí danh là “Họ và tên”.
  • Title AS 'Chức vụ': Truy vấn cột Title và đặt bí danh là “Chức vụ”.
  • VacationHours + SickLeaveHours AS 'Tổng giờ nghỉ': Tạo một cột phát sinh bằng cách tính tổng giá trị của cột VacationHoursSickLeaveHours, sau đó đặt bí danh là “Tổng giờ nghỉ”.
  • FROM dbo.DimEmployee: Chỉ định dữ liệu được lấy từ bảng dbo.DimEmployee.
  • Thay vì sử dụng SELECT * để truy vấn toàn bộ bảng dữ liệu, ta dùng SELECT và chọn những cột cần truy vấn, giúp truy vấn hiệu quả hơn và giảm tải cho hệ thống.

–> Trên thực tế khi làm việc, nên hạn chế và kiểm soát số lượng cột cần lấy ra bằng cách liệt kê tên cột cụ thể thay vì sử dụng SELECT *.

Từ đây, ta rút ra được vai trò của SELECT:

  • Hiển thị các cột được chọn từ bảng trong cơ sở dữ liệu.
  • Kết hợp với AS (Alias) để gán tên tạm thời cho cột hiển thị.
  • Thực hiện tính toán trên các cột đã có sẵn và gán tên cho cột mới.

Chỉ định điều kiện hàng dữ liệu được truy vấn bằng mệnh đề WHERE

Với mệnh đề WHERE, chỉ những hàng thỏa mãn điều kiện logic (Predicate) được chỉ định mới được trả về trong kết quả truy vấn. Mệnh đề WHERE giúp lọc dữ liệu dựa trên các tiêu chí cụ thể, giúp bạn chỉ lấy được thông tin cần thiết.

Ví dụ: Từ bảng dữ liệu SalesLT.Product thuộc bộ dữ liệu adventureworks, truy vấn các cột Name, ProductNumber, StandardCost, SellStartDate với điều kiện: Name bắt đầu bằng 2 ký tự “HL”, StandardCost lớn hơn 300 và SellStartDate nằm trong khoảng thời gian từ 01/07/2005 đến 01/07/2006.

Giải thích câu lệnh truy vấn:

  • FROM SalesLT.Product: Chỉ định dữ liệu truy vấn được lấy từ bảng SalesLT.Product.
  • WHERE Name LIKE 'HL%' AND StandardCost > 300 AND SellStartDate BETWEEN '20050701' AND '20060701': Lọc các bản ghi thỏa mãn điều kiện:
    • Name LIKE 'HL%': Tên sản phẩm bắt đầu bằng “HL” (sử dụng toán tử LIKE và ký tự % đại diện cho chuỗi ký tự bất kỳ).
    • StandardCost > 300: Chi phí tiêu chuẩn lớn hơn 300.
    • SellStartDate BETWEEN '20050701' AND '20060701': Ngày bắt đầu bán nằm trong khoảng từ 01/07/2005 đến 01/07/2006 (sử dụng toán tử BETWEEN).
  • SELECT Name, ProductNumber, StandardCost, SellStartDate: Chọn các cột Name, ProductNumber, StandardCost, SellStartDate để hiển thị trong kết quả.

Lưu ý: Với trường hợp cột được chọn được lưu dưới dạng tên thay thế (Alias), mệnh đề WHERE sẽ không thể truy vấn theo điều kiện của tên thay thế (Alias). Do mệnh đề WHERE được thực thi trước mệnh đề SELECT. Điều này có nghĩa là bạn không thể sử dụng bí danh cột trong mệnh đề WHERE.

Nhóm các hàng bằng mệnh đề GROUP BY

Mệnh đề GROUP BY dùng để nhóm các hàng có cùng giá trị trong một hoặc nhiều cột thành các nhóm riêng biệt dựa trên giá trị của các cột đó. GROUP BY thường được sử dụng kết hợp với các hàm tổng hợp (aggregate functions) như COUNT(), SUM(), AVG(), MAX(), MIN() để thực hiện các phép tính trên mỗi nhóm.

Để hiểu rõ hơn, ta cùng xem ví dụ dưới đây: Truy vấn tổng số lượng địa chỉ trong bảng Address được nhóm lại theo từng khu vực quốc gia (CountryRegion).

Ví dụ 1: Truy vấn 10 dòng đầu tiên của bảng SalesLT.Address để xem cấu trúc dữ liệu.

Giải thích câu lệnh truy vấn:

  • FROM SalesLT.Address: Chỉ định dữ liệu truy vấn được lấy từ bảng SalesLT.Address.
  • SELECT TOP 10 *: Truy vấn 10 hàng đầu tiên của bảng dữ liệu SalesLT.Address để xem trước dữ liệu. TOP 10 giới hạn số lượng hàng trả về là 10.

Ví dụ 2: Truy vấn số lượng địa chỉ theo từng quốc gia.

Giải thích câu lệnh truy vấn:

  • FROM SalesLT.Address: Chỉ định dữ liệu truy vấn được lấy từ bảng SalesLT.Address.
  • GROUP BY CountryRegion: Nhóm các hàng có cùng giá trị trong cột CountryRegion lại với nhau.
  • SELECT CountryRegion, COUNT(*) AS Count_CountryRegion: Chỉ định các cột cần truy vấn:
    • CountryRegion: Cột được nhóm, hiển thị tên quốc gia.
    • COUNT(*) AS Count_CountryRegion: Sử dụng hàm COUNT(*) để đếm số lượng hàng trong mỗi nhóm (mỗi quốc gia) và đặt bí danh là Count_CountryRegion. Hàm COUNT(*) đếm tất cả các hàng trong mỗi nhóm, không phân biệt giá trị cột.

Chỉ định điều kiện cho các nhóm bằng mệnh đề HAVING

Mệnh đề HAVING dùng để chỉ định điều kiện lọc cho dữ liệu đã được nhóm bằng mệnh đề GROUP BY. HAVING hoạt động tương tự như WHERE, nhưng WHERE lọc các hàng trước khi nhóm, trong khi HAVING lọc các nhóm sau khi đã được tạo bởi GROUP BY. HAVING thường được sử dụng để lọc các nhóm dựa trên kết quả của các hàm tổng hợp.

Để hiểu rõ hơn, ta cùng xem ví dụ sau:

Vẫn với bộ dữ liệu ở ví dụ trên, truy vấn ra CountryRegion có tổng số lượng địa chỉ lớn hơn 40.

Giải thích câu lệnh truy vấn:

  • GROUP BY CountryRegion: Nhóm các hàng có cùng giá trị trong cột CountryRegion lại với nhau.
  • COUNT(*) AS Count_CountryRegion: Sử dụng hàm COUNT(*) để đếm số lượng hàng trong mỗi nhóm CountryRegion.
  • HAVING COUNT(*) > 40: Chỉ định điều kiện lọc cho các nhóm đã được tạo. Chỉ những nhóm có số lượng hàng (địa chỉ) lớn hơn 40 mới được hiển thị trong kết quả.

Do đó, chúng ta cần phân biệt rõ ràng giữa mệnh đề WHERE và mệnh đề HAVING:

  • WHERE sử dụng để lọc điều kiện với những hàng dữ liệu gốc (dữ liệu chưa nhóm).
  • HAVING sử dụng để lọc với điều kiện gắn với hàm tính toán (Aggregate function) trên các nhóm đã được tạo bởi GROUP BY.

Sắp xếp thứ tự dữ liệu bằng mệnh đề ORDER BY

Mệnh đề ORDER BY dùng để sắp xếp thứ tự dữ liệu trong kết quả truy vấn theo một hoặc nhiều cột được chỉ định. ORDER BY giúp hiển thị dữ liệu một cách có trật tự, dễ đọc và dễ phân tích.

ORDER BY sắp xếp thứ tự theo 2 cách:

  • ASC (Ascending): Thứ tự tăng dần (từ A-Z, từ nhỏ đến lớn). Đây là thứ tự sắp xếp mặc định nếu không chỉ định ASC hoặc DESC.

Giải thích câu lệnh truy vấn:

  • ORDER BY Color ASC: Sắp xếp thứ tự tăng dần theo cột Color.

  • DESC (Descending): Thứ tự giảm dần (từ Z-A, từ lớn đến nhỏ).

Giải thích câu lệnh truy vấn:

  • ORDER BY Color DESC: Sắp xếp thứ tự giảm dần theo cột Color.

Lưu ý: ORDER BY sẽ mặc định sắp xếp thứ tự tăng dần (ASC) khi không có ASC hoặc DESC đi kèm.

Giải thích câu lệnh truy vấn:

  • FROM SalesLT.Product: Chỉ định dữ liệu truy vấn được lấy từ bảng SalesLT.Product.
  • ORDER BY Color: Sắp xếp thứ tự tăng dần theo cột Color (mặc định là ASC).
  • SELECT Name, ProductNumber, Color: Chọn các cột Name, ProductNumber, Color để hiển thị.
  • Thuộc tính của ORDER BY là có thể sử dụng được với 2 hay nhiều cột. Khi sắp xếp theo nhiều cột, thứ tự sắp xếp sẽ ưu tiên cột đầu tiên, sau đó đến cột thứ hai nếu giá trị cột đầu tiên trùng nhau, và tiếp tục như vậy.

Ví dụ 3: Sử dụng ORDER BY kết hợp với TOP để lấy ra một số lượng bản ghi nhất định sau khi sắp xếp.

Giải thích câu lệnh truy vấn:

  • FROM SalesLT.Product: Chỉ định dữ liệu truy vấn được lấy từ bảng SalesLT.Product.
  • SELECT TOP 10 *: Chỉ định truy vấn 10 hàng đầu tiên của tất cả các cột trong bảng dữ liệu sau khi sắp xếp.
  • ORDER BY StandardCost DESC: Sắp xếp thứ tự giảm dần theo cột StandardCost.

Ví dụ 4: Sử dụng ORDER BY kết hợp với TOPWITH TIES để lấy ra các bản ghi có giá trị bằng với giá trị cuối cùng trong top.

Giải thích câu lệnh truy vấn:

  • FROM SalesLT.Product: Chỉ định dữ liệu truy vấn được lấy từ bảng SalesLT.Product.
  • SELECT TOP 10 WITH TIES *: Chỉ định truy vấn những hàng nằm trong TOP 10 và thêm vào đó sẽ lấy luôn cả những hàng có cùng giá trị tại dòng thứ 10. WITH TIES đảm bảo rằng nếu có các hàng có cùng giá trị với hàng cuối cùng trong top N, các hàng này cũng sẽ được bao gồm trong kết quả.
  • Ở ví dụ này, những giá trị [2171,2942; 1912,1544; 1898,0944] là 3 trong 10 StandardCost cao nhất.
  • SELECT TOP 10 WITH TIES *: Truy vấn top 10 StandardCost từ cao đến thấp. Tại vị trí thứ 10, sẽ tiếp tục truy vấn các giá trị bằng giá trị StandardCost 1898,0944 tại dòng thứ 10.
  • ORDER BY StandardCost DESC: Sắp xếp thứ tự giảm dần theo cột StandardCost.

Logic thực thi câu lệnh (Logical query processing)

Thứ tự thực hiện câu lệnh truy vấn được thực hiện như sau:

  • FROM: Xác định nguồn dữ liệu, tức là bảng hoặc các bảng sẽ được truy vấn.
  • WHERE: Lọc các hàng dữ liệu dựa trên điều kiện được chỉ định. Chỉ những hàng thỏa mãn điều kiện mới được tiếp tục xử lý.
  • GROUP BY: Nhóm các hàng có cùng giá trị trong các cột được chỉ định.
  • HAVING: Lọc các nhóm dữ liệu dựa trên điều kiện được chỉ định cho các nhóm.
  • SELECT: Chọn các cột dữ liệu sẽ được hiển thị trong kết quả truy vấn. Tại bước này, các cột được chọn có thể được đặt bí danh hoặc thực hiện các phép tính.
  • ORDER BY: Sắp xếp thứ tự các hàng trong kết quả truy vấn theo cột hoặc các cột được chỉ định.

Lưu ý: Trên đây chỉ là một số câu lệnh cơ bản của SQL, vì vậy thứ tự viết cũng như thứ tự thực thi câu lệnh sẽ giới hạn trong một số câu lệnh đã đề cập ở trên. Tuy chỉ là một số câu lệnh cơ bản, nhưng những câu lệnh này sẽ là nền tảng giúp bạn phát triển tư duy logic tự học SQL.

Một số lưu ý để viết một câu lệnh truy vấn SQL tốt hơn

Một số lưu ý khi viết câu lệnh SQL

Khi tự học SQL, có một số điều cần lưu ý để tối ưu hóa lệnh truy vấn tốt hơn, giúp code dễ đọc, dễ bảo trì và hiệu suất cao hơn.

**Lưu ý 1: “Khoảng trống” không ảnh hưởng đến kết quả của một câu truy vấn.**

Tuy nhiên, chúng ta nên sắp xếp và giãn cách code cho phù hợp để câu lệnh có thể dễ dàng quan sát, không bị rối mắt và dễ gây nhầm lẫn.

**Lưu ý 2: Câu lệnh được kết thúc với dấu “;”. Tuy nhiên vào thời điểm hiện tại không nhiều DBMS yêu cầu “;” để kết thúc câu lệnh nữa.**

Có hay không có dấu “;” không làm ảnh hưởng đến kết quả của câu lệnh trong nhiều hệ quản trị CSDL hiện đại. Tuy nhiên, việc sử dụng dấu “;” vẫn được khuyến khích để tạo thói quen tốt và đảm bảo tính tương thích khi làm việc với nhiều hệ thống khác nhau.

**Lưu ý 3: Câu lệnh phải bắt đầu với một mệnh đề (Statement)**

Câu lệnh không có mệnh đề (Statement) đứng đầu sẽ bị lỗi khi thực thi câu lệnh truy vấn. Mỗi câu lệnh SQL phải bắt đầu bằng một mệnh đề xác định loại thao tác, ví dụ như SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP.

**Lưu ý 4: Các cột phải được ngăn cách bởi dấu “,”.**

Các cột được chọn trong các mệnh đề luôn được ngăn cách bởi dấu “,” và thường khi thực hiện câu lệnh truy vấn dấu “,” rất dễ bị lãng quên. Vì vậy, bạn cần chú ý đến việc đánh dấu “,” mỗi khi chọn thêm cột mới.

Vị trí của dấu “,” có thể được đặt ở trước hoặc sau các cột, vì vậy bạn có thể tham khảo 2 cách viết sau:

  • Dấu “,” được đặt đằng sau các cột.

  • Dấu “,” được đặt đằng trước các cột.

**Lưu ý 5: Thay vì viết các câu lệnh theo chiều ngang, hãy viết theo chiều dọc xuống.**
  • Không nên viết câu lệnh theo chiều ngang làm cho câu lệnh trở nên khó theo dõi và khó đọc, đặc biệt với các câu lệnh phức tạp.

  • Nên viết câu lệnh theo chiều dọc giúp cho câu lệnh truy vấn dễ đọc hơn, dễ quản lý và bảo trì hơn.

**Lưu ý 6: Có thể bôi đen để chọn phần câu lệnh cần chạy hoặc có thể không cần bôi đen để truy vấn cả câu lệnh.**
  • Bôi đen phần câu lệnh cần chạy nếu bạn chỉ muốn thực thi một phần của script SQL, hữu ích khi kiểm thử hoặc gỡ lỗi.

  • Chạy cả câu lệnh truy vấn khi bạn muốn thực thi toàn bộ script SQL.

Những ngầm định khi viết câu lệnh SQL

Mặc dù những ngầm định này không phải quy tắc bắt buộc, nhưng chúng thường được dùng như một tiêu chuẩn thống nhất trong cộng đồng SQL. Tuân theo những quy ước này giúp code SQL của bạn trở nên chuyên nghiệp và dễ đọc hơn.

**Thứ 1: Nhất quán về mặt chữ viết hoa/viết thường.**

Do SQL không quá quan trọng về mặt hình thức (case-insensitive), nhưng khuyến khích viết nhất quán để code nhìn gọn gàng và thống nhất hơn.

  • Viết hoa: Ký tự (KEYWORD) và hàm (FUNCTION) như SELECT, FROM, WHERE, GROUP BY, ORDER BY, COUNT, SUM, AVG.
  • Viết thường: Cột (Column) và bảng (Table) như firstName, lastName, employees, products.
**Thứ 2: Sử dụng “Khoảng trống” một cách phù hợp.**

Một trong những lý do khiến SQL dễ đọc vì các câu lệnh được trình bày với format như một đoạn văn. Sử dụng khoảng trắng hợp lý giúp cấu trúc code rõ ràng và dễ theo dõi.

  • Xuống dòng khi chọn mỗi cột trong câu lệnh SELECT.
  • Xuống dòng khi có ký tự (Keyword) mới như FROM, WHERE, GROUP BY, ORDER BY.
  • Nếu mệnh đề ký tự quá phức tạp, tạo dòng mới và thụt lề cho tới khi viết ký tự tiếp theo (Keyword) để làm nổi bật cấu trúc logic của câu lệnh.

**Thứ 3: Đặt tên có chủ đích.**

Đặt tên cho cột và bảng nên được đặt ngắn gọn, dễ hiểu và phản ánh đúng nội dung dữ liệu mà chúng chứa. Tên có chủ đích không chỉ giúp code dễ đọc mà còn giúp mọi người trong team có thể hiểu rõ được trong bảng hoặc cột đó chứa dữ liệu gì.

**Thứ 4: Nên viết thêm comment chi tiết nếu bảng dữ liệu được lưu trữ theo cách của bạn.**

Bạn có thể thêm comments vào những câu lệnh để giải thích thêm về chúng. Comment giúp người khác (hoặc chính bạn trong tương lai) hiểu rõ mục đích và logic của câu lệnh SQL.

  • Sử dụng -- để thêm 1 dòng comment.

  • /* ... */ để thêm nhiều dòng comment.

Lưu ý: Không nên thực hiện truy vấn trên cơ sở dữ liệu mà bạn không hiểu rõ cấu trúc và dữ liệu bên trong. Việc truy vấn trên CSDL lạ có thể dẫn đến những kết quả không mong muốn hoặc gây ra lỗi hệ thống.

Comments thường được dùng để:

  • Giải thích mục đích câu truy vấn này (Những người tiếp nhận bộ dữ liệu trong tương lai có thể hiểu được tại sao cần phải truy vấn như vậy).
  • Bỏ đi một số đoạn code mà đã được thử truy vấn ở các phiên bản khác nhau để tham khảo hoặc so sánh.

Tạm kết

Tổng kết lại ở phần 1, chúng ta đã tìm hiểu về lịch sử hình thành của SQL, các khái niệm về cơ sở dữ liệu, cấu trúc của một câu query và một vài lưu ý khi viết câu query. Để việc tự học SQL hiệu quả, bạn hãy bookmark lại bài viết này và note những kiến thức quan trọng lại nhé. Ngoài ra các bạn có thể tham khảo thêm SQL cheat sheet để tự học thêm về các câu lệnh nhé.

Nếu bạn thấy nội dung này hữu ích, đừng quên để lại bình luận và hãy theo dõi blog của Datapot để đón chờ phần tiếp theo ở các bài viết sắp tới nhé!

Lưu Trọng Hưng

Data Analyst

Leave A Comment

Create your account