Trước khi nói bất kỳ lý thuyết nào, chúng ta sẽ thử một câu hỏi rất thực tế, kiểu câu mà thầy cô hay hỏi vào cuối học kỳ. Bạn hãy bấm nút và xem hai cách trả lời chạy song song nhé.
Cùng một câu hỏi, cùng một bộ dữ liệu. Nhưng khác nhau ở chỗ là Excel bắt bạn tự làm từng bước, còn database thì bạn chỉ cần mô tả thứ mình muốn rồi nó tự lo phần còn lại.
Đoạn lệnh màu tím kia là SQL, thứ bạn sẽ tự viết được ở trong tương lai gần :D. Còn bài hôm nay trả lời câu hỏi đứng trước nó là dữ liệu đang được xếp thế nào mà hỏi một câu lại ra ngay được như vậy?
Đừng cố hiểu đoạn SQL vừa rồi, cũng đừng ghi nhớ nó. Mục tiêu hôm nay là hiểu vì sao mọi người cần database và nắm được “bản đồ tư duy” để đọc bất kỳ cơ sở dữ liệu quan hệ nào.
Ba chặng, một hành trình. Đây là con đường ta sẽ đi trong bài này:
Cơ sở dữ liệu (database) là một nơi lưu trữ dữ liệu có tổ chức, được trông coi bởi một phần mềm chuyên dụng gọi là DBMS (Database Management System), ví dụ PostgreSQL, MySQL hay SQL Server...
Hình dung thế này: nếu Excel là một cuốn vở bạn tự viết tự quản, thì database giống một thư viện có thủ thư. Ông thủ thư (DBMS) đặt ra quy tắc: mỗi cuốn sách xếp đúng kệ đúng mã, ai mượn ai trả gì đều được ghi sổ, và đông người cùng tới tra cứu vẫn trật tự. Bạn không tự bới kệ, mà bạn nhờ thủ thư bằng một ngôn ngữ riêng, và ngôn ngữ đó chính là SQL (thứ ta sẽ học suốt khoá này).
| Tiêu chí | Excel / Google Sheets | Cơ sở dữ liệu |
|---|---|---|
| Quy mô | Vài nghìn dòng là bắt đầu ì ạch | Hàng triệu đến hàng tỷ dòng vẫn nhanh |
| Nhiều người cùng lúc | Dễ ghi đè, kẹt file | Hàng nghìn người đọc/ghi an toàn |
| Tính nhất quán | Sửa một thông tin phải sửa nhiều nơi | Lưu một nơi, chỗ khác tham chiếu lại |
| Kiểm soát kiểu dữ liệu | Ô nào cũng gõ được bất cứ thứ gì | Chặn dữ liệu sai kiểu ngay từ đầu |
| Cách hỏi dữ liệu | Lọc và dùng hàm thủ công | Dùng ngôn ngữ SQL, hỏi câu phức tạp trong mili giây |
Database không phải “kẻ thù” của Excel. Mỗi công cụ có chỗ dùng riêng: cần tính toán nhanh, báo cáo cá nhân thì Excel vẫn vô địch. Nhưng khi bạn xây một phần mềm thật có nhiều người dùng và nhiều dữ liệu, database gần như luôn là lựa chọn mặc định.
Loại database phổ biến nhất hiện nay là cơ sở dữ liệu quan hệ (relational database). Ý tưởng cốt lõi đơn giản đến bất ngờ: dữ liệu được tổ chức thành các bảng, trông y hệt một trang tính Excel, nhưng có kỷ luật hơn nhiều.
Một bảng gồm ba khái niệm bạn cần thuộc nắm được:
Dưới đây là bảng sinh_vien, mỗi hàng là một sinh viên, mỗi cột là một thông tin về họ:
| ma_sv | ho_ten | ngay_sinh | gioi_tinh | lop |
|---|---|---|---|---|
| SV001 | Nguyễn Văn An | 2005-03-12 | Nam | CNTT01 |
| SV002 | Trần Thị Bình | 2005-07-25 | Nữ | CNTT01 |
| SV003 | Lê Hoàng Cường | 2004-11-02 | Nam | CNTT02 |
Đây là điểm khác biệt lớn so với Excel. Trong database, mỗi cột được quy định một kiểu dữ liệu (data type) cố định, và database sẽ từ chối mọi giá trị sai kiểu. Như khi gõ chữ “chín phẩy” vào một cột kiểu số sẽ bị chặn ngay. Nhờ vậy dữ liệu luôn sạch.
| Kiểu dữ liệu | Dùng cho | Ví dụ |
|---|---|---|
| TEXT / VARCHAR | Chuỗi ký tự | ho_ten = 'Nguyễn Văn An' |
| INTEGER | Số nguyên | so_tin_chi = 3 |
| REAL / NUMERIC | Số có phần thập phân | diem_so = 8.5 |
| DATE | Ngày tháng | ngay_sinh = 2005-03-12 |
| BOOLEAN | Đúng / Sai | da_tot_nghiep = false |
Nói thì dễ, chứ làm lại là một câu chuyện khác. Dưới đây là bảng sinh_vien đang thiếu một hàng, bạn hãy kéo từng giá trị vào đúng ô và xem database phản ứng thế nào nhé.
Để mọi ví dụ đều gần gũi, cả khoá học sẽ xoay quanh một hệ thống quản lý sinh viên gồm 4 bảng. Trước mắt cứ nhớ tên và vai trò của chúng đã; cuối bài ta sẽ vẽ cả bốn bảng nối với nhau thành một sơ đồ hoàn chỉnh:
Nhưng khoan, có chỗ chưa ổn. Nếu mọi thứ đều là bảng, sao không nhét tất cả vào một bảng cho gọn mà phải chia ra bốn? Và khi đã chia rồi, con điểm 8.5 nằm trong bảng diem là điểm của ai, môn nào?
Bảng = danh sách, hàng = một dòng trong danh sách, cột = một thuộc tính. Nắm chắc ba từ này thì mọi câu lệnh SQL sau này chỉ là cách nói “lấy cột nào, từ bảng nào, ở những hàng thoả điều kiện gì”.
Ta đã có bảng, có hàng, có cột và tên của bốn bảng. Nhưng hai câu hỏi vừa rồi vẫn treo đó, và cả hai đều là thứ mà một mình bảng - hàng - cột không trả lời nổi.
Câu thứ nhất: thử tưởng tượng bảng sinh_vien không có cột ma_sv, mà lớp lại có ba bạn cùng tên Nguyễn Văn An, cùng ngày sinh, cùng lớp:
| ho_ten | ngay_sinh | lop |
|---|---|---|
| Nguyễn Văn An | 2005-03-12 | CNTT01 |
| Nguyễn Văn An | 2005-03-12 | CNTT01 |
| Nguyễn Văn An | 2005-03-12 | CNTT01 |
Ba hàng giống hệt nhau, không hàng nào có nổi một thứ để phân biệt với hai hàng còn lại. Bạn bảo database “chuyển An sang lớp CNTT02” thì nó biết sửa hàng nào? Lời giải là khóa chính (primary key): một cột mà mỗi hàng giữ một giá trị riêng, không trùng và không được để trống. Có nó, ba bạn An thành SV001, SV002, SV003, và mọi câu lệnh về sau mới chỉ trúng đúng một hàng.
Câu thứ hai: bảng diem để riêng, bảng sinh_vien để riêng, vậy ghép chúng lại bằng gì? Bằng khóa ngoại (foreign key): một cột trong bảng này chứa khóa chính của bảng kia. Còn nhớ dòng “Tính nhất quán” ở bảng so sánh đầu bài chứ, “lưu một nơi, chỗ khác tham chiếu lại”? Cái “tham chiếu” ấy giờ đã có tên.
Ở phần trước bạn đã gặp tên của bốn bảng. Giờ thì chúng có thể được vẽ ra đúng như thật: mỗi đường nối dưới đây chính là một khóa ngoại đang trỏ về khóa chính của bảng bên kia.
Đây cũng là bộ dữ liệu bạn sẽ viết truy vấn lên trong toàn bộ các bài còn lại, nên đáng để bấm thử từng ô một lần cho quen mặt.
Bạn vừa đi qua “bản đồ tư duy” của cơ sở dữ liệu quan hệ: vì sao Excel đuối khi phần mềm lớn lên, dữ liệu được tổ chức thành bảng - hàng - cột, mỗi cột có một kiểu dữ liệu, và các bảng được nối với nhau qua khóa chính và khóa ngoại. Chưa cần một dòng code, bạn đã đủ nền để bắt đầu viết SQL ở các bài sau.
Nhấp vào từng thẻ để lật và tự kiểm tra trước khi làm quiz.
Cơ sở dữ liệu (database) là gì?
Nơi lưu trữ dữ liệu có tổ chức, được quản lý bởi một phần mềm gọi là DBMS (PostgreSQL, MySQL, SQL Server...). Ta giao tiếp với nó bằng ngôn ngữ SQL.