DHDataHọc
TheoryLesson 1/306 min read+10 XP

SQL là gì?

Bạn sẽ học được

  • SQL là gì và vì sao gần như mọi công việc dữ liệu đều bắt đầu từ nó.
  • Một truy vấn SQL gồm những phần nào, đọc một câu lệnh đơn giản ra sao.
  • Chạy truy vấn đầu tiên trên bộ dữ liệu bán lẻ có sẵn trong mục Luyện tập.
  • Phân biệt cách SQL "khai báo" với cách lập trình "ra lệnh từng bước".
  • Ba lỗi người mới gặp nhiều nhất và cách sửa.

Khái niệm cốt lõi

SQL viết tắt của Structured Query Language — ngôn ngữ truy vấn có cấu trúc. Tên gọi hơi hàn lâm, nhưng công dụng rất đời thường: SQL là cách bạn đặt câu hỏi cho một cơ sở dữ liệu.

Hãy tưởng tượng bạn gọi món trong một quán quen. Bạn không đi vào bếp, không tự bật bếp, không tự xào nấu. Bạn nói "cho tôi một tô phở bò, ít hành" và nhà bếp lo phần còn lại. SQL hoạt động y như vậy. Bạn mô tả mình muốn thấy gì — những khách hàng ở Hà Nội, tổng doanh thu tháng 6, năm sản phẩm đắt nhất — còn hệ quản trị cơ sở dữ liệu (DBMS) tự quyết định đọc bảng nào trước, dùng chỉ mục nào, tính toán ra sao.

Điều này khiến SQL thuộc nhóm ngôn ngữ khai báo (declarative). Với Python hay JavaScript, bạn viết từng bước: tạo biến, lặp qua danh sách, cộng dồn, in kết quả. Với SQL, bạn chỉ nói kết quả mong muốn, không mô tả thuật toán. Chính vì thế một câu SQL 5 dòng có thể thay cho 50 dòng code, và cũng vì thế SQL dễ học hơn nhiều người tưởng.

Dữ liệu mà SQL làm việc cùng nằm trong cơ sở dữ liệu quan hệ: một tập các bảng có liên kết với nhau. Bảng customers lưu khách hàng, bảng orders lưu đơn hàng, cột customer_id trong orders trỏ về customers.id. Bạn sẽ học kỹ cấu trúc này ở bài sau; ở đây chỉ cần nhớ: SQL nói chuyện với bảng.

Một điểm dễ gây nhầm lẫn: SQL không phải ngôn ngữ lập trình đa dụng. Bạn không viết ứng dụng web bằng SQL, không làm giao diện bằng SQL. Nó là ngôn ngữ để hỏi và thay đổi dữ liệu. Trong thực tế, người ta chia các lệnh SQL thành vài nhóm:

NhómViết tắtDùng đểVí dụ
Truy vấn dữ liệuDQLĐọc dữ liệuSELECT
Thao tác dữ liệuDMLThêm, sửa, xoá dòngINSERT, UPDATE, DELETE
Định nghĩa dữ liệuDDLTạo, sửa cấu trúc bảngCREATE TABLE, ALTER TABLE
Phân quyềnDCLCấp và thu quyềnGRANT, REVOKE

Trong khóa học này bạn dùng gần như chỉ SELECT, vì đó là lệnh chiếm 90% công việc của một người phân tích dữ liệu. Các lệnh còn lại bạn sẽ gặp khi làm việc với kỹ sư dữ liệu hoặc tự xây pipeline.

Một câu SQL tốt đọc như một câu tiếng Anh: "Cho tôi tên và thành phố của khách hàng, sắp xếp theo tên." Nếu bạn đọc thành lời được, khả năng cao cú pháp cũng đúng.

Ví dụ chạy được

Truy vấn đơn giản nhất không cần bảng nào:

code
SELECT 1 AS hello;

Kết quả:

hello
1

Đọc từng phần:

  • SELECT — "hãy lấy cho tôi".
  • 1 — một giá trị hằng số; bạn có thể viết 2 + 2 và nhận về 4.
  • AS hello — đặt tên cho cột kết quả là hello, thay vì cái tên mặc định khó đọc như ?column?.
  • Dấu ; — kết thúc câu lệnh. Trình soạn SQL thường chấp nhận thiếu dấu này, nhưng công cụ dòng lệnh và nhiều hệ thống khác thì không. Tạo thói quen viết đủ.

Giờ đến một truy vấn thật trên bảng khách hàng của bộ dữ liệu bán lẻ:

code
SELECT name, city
FROM customers
LIMIT 5;

Kết quả (rút gọn):

namecity
An NguyễnHà Nội
Bình TrầnTP. Hồ Chí Minh
Chi LêĐà Nẵng
Dũng PhạmHà Nội
Em VõTP. Hồ Chí Minh

Ba mệnh đề, ba nhiệm vụ:

  1. SELECT name, city — chọn hai cột cần xem.
  2. FROM customers — lấy từ bảng customers. Tên bảng là số nhiều, một quy ước phổ biến.
  3. LIMIT 5 — chỉ lấy 5 dòng đầu. Khi mới làm quen, luôn thêm LIMIT để tránh kéo về hàng triệu dòng và làm chậm máy.

Bạn không cần viết hoa từ khoá. select name, city from customers limit 5; chạy y hệt. Tuy nhiên viết hoa SELECT, FROM, LIMIT giúp mắt tách phần "lệnh" khỏi phần "tên" — một thói quen đáng giữ khi truy vấn dài hàng trăm dòng. Ngược lại, tên bảng và tên cột trong PostgreSQL phân biệt hoa thường khi không có dấu nháy kép, nên hãy viết đúng như schema: customers, không phải Customers.

Thực hành

Làm ngay ba việc sau trong mục Luyện tập của DataHọc:

  1. Chạy SELECT 1 AS hello; rồi đổi thành SELECT 2 + 3 AS ket_qua;. Xác nhận kết quả là 5.
  2. Chạy SELECT * FROM customers LIMIT 3;. Đọc tên các cột hiện ra và đoán xem mỗi cột lưu gì. Cột nào có thể để trống?
  3. Mở bài luyện Lấy toàn bộ khách hàng (select-all-customers) và thử viết truy vấn trả về mọi khách hàng, sắp xếp theo id. Bạn chưa học ORDER BY, cứ đoán trước — bài sau sẽ giải thích.

Mẹo nhỏ khi thực hành: chạy từng phần của truy vấn thay vì viết cả khối rồi mới kiểm tra. Nếu SELECT * FROM customers LIMIT 3; chạy được nhưng truy vấn dài của bạn lỗi, lỗi nằm ở phần bạn vừa thêm, không phải ở bảng.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
syntax error at or near "customers"Thiếu dấu phẩy giữa hai cột, hoặc gõ sai FROMĐọc lại đúng vị trí con trỏ báo lỗi; kiểm tra dấu phẩy giữa các cột
column "ten" does not existSai tên cột hoặc dùng tên tiếng Việt không có trong bảngChạy SELECT * FROM customers LIMIT 1; để xem tên cột thật
relation "customer" does not existSai tên bảng (số ít/số nhiều)Dùng đúng customers
Kết quả mỗi lần chạy một thứ tự khácKhông có ORDER BY; SQL không hứa thứ tự mặc địnhThêm ORDER BY id khi cần thứ tự ổn định

Một lỗi nữa ít thấy trong thông báo nhưng hay gặp trong công việc: dùng SELECT * ở mọi nơi. Với người mới, * rất tiện để khám phá bảng. Nhưng trong truy vấn thật, nó kéo về cả cột bạn không dùng, làm chậm báo cáo và khiến truy vấn vỡ nếu ai đó thêm cột. Bài 4 sẽ nói kỹ hơn.

Tóm tắt

  • SQL là ngôn ngữ khai báo để hỏi cơ sở dữ liệu quan hệ; bạn mô tả kết quả, DBMS lo cách thực hiện.
  • Một truy vấn đọc cơ bản có dạng SELECT <cột> FROM <bảng> và thường kèm LIMIT.
  • Từ khoá không phân biệt hoa thường, nhưng tên bảng/cột phải viết đúng.
  • Luôn kết thúc bằng ;, luôn thêm LIMIT khi khám phá dữ liệu, luôn thêm ORDER BY khi cần thứ tự ổn định.
  • Bạn đã chạy được truy vấn đầu tiên — từ đây, mọi bài học chỉ là mở rộng ba mệnh đề này.

Use ← → to move between lessons