| Thí sinh cần có thể: | Ghi chú và hướng dẫn |
|---|---|
| Thể hiện sự hiểu biết về những hạn chế khi sử dụng phương pháp dựa trên tập tin để lưu trữ và truy xuất dữ liệu | |
| Mô tả các đặc điểm của cơ sở dữ liệu quan hệ giúp khắc phục những hạn chế của phương pháp dựa trên tập tin | |
| Thể hiện sự hiểu biết và sử dụng đúng thuật ngữ liên quan đến mô hình cơ sở dữ liệu quan hệ | Bao gồm: thực thể, bảng, dòng ghi, trường, tuple, thuộc tính, khóa chính, khóa ứng viên, khóa phụ, khóa ngoại, mối quan hệ (một-nhiều, một-một, nhiều-nhiều), toàn vẹn tham chiếu, lập chỉ mục |
| Sử dụng sơ đồ thực thể - mối quan hệ (E-R) để tài liệu hóa thiết kế cơ sở dữ liệu | |
| Thể hiện sự hiểu biết về quá trình chuẩn hóa | Dạng chuẩn hóa thứ nhất (1NF), Dạng chuẩn hóa thứ hai (2NF) và Dạng chuẩn hóa thứ ba (3NF) |
| Giải thích tại sao một bộ bảng dữ liệu đã cho đang ở hoặc không ở dạng 3NF | |
| Xây dựng thiết kế cơ sở dữ liệu đã chuẩn hóa dựa trên mô tả cơ sở dữ liệu, một bộ dữ liệu đã cho hoặc một bộ bảng đã cho |
Cơ sở dữ liệu
Khoa học máy tính A-Level · Chủ đề 8
17:18
Cơ sở dữ liệu & Mô hình Quan hệ
Trước khi có cơ sở dữ liệu, mỗi chương trình đều tự quản lý các tập tin phẳng riêng — một tập tin cho mỗi chương trình. Hãy tưởng tượng một cửa hàng. Chương trình bán hàng, chương trình tính hóa đơn, và chương trình vận chuyển…
Giọng đọc tiếng Anh · phụ đề tiếng Anh + 中文 được ghi trực tiếp
8.1
Lưu trữ dựa trên tập tin và những hạn chế của nó
Chương trình
Nguồn: Chương trình Cambridge International
Trước khi có cơ sở dữ liệu, các chương trình lưu trữ dữ liệu trong tập tin phẳng — thường mỗi chương trình một tập tin. Điều này ổn cho dữ liệu nhỏ nhưng thất bại khi mở rộng quy mô.

Những hạn chế
- sự dư thừa dữ liệu — cùng một dữ liệu (địa chỉ khách hàng) được lưu trong nhiều tập tin, mỗi tập tin cho một chương trình, nên dung lượng lưu trữ bị lãng phí và mọi bản sao phải được cập nhật.
- sự bất nhất dữ liệu — khi một bản sao được cập nhật và bản sao khác thì không, các tập tin mâu thuẫn nhau và không ai biết bản nào đúng.
- sự phụ thuộc dữ liệu — mỗi chương trình được viết theo đúng bố cục của tập tin của nó; thay đổi độ dài trường hoặc thêm trường và mọi chương trình đọc tập tin đó phải được viết lại.
- không truy cập chung — một tập tin bị khóa trong khi một chương trình đang sử dụng, nên người dùng không thể làm việc với dữ liệu cùng lúc.
- toàn vẹn yếu — không có quy tắc trung tâm ngăn chặn giá trị không hợp lệ hoặc liên kết đến một khách hàng không tồn tại; bảo mật yếu — quyền truy cập theo từng tập tin, không theo từng trường; và truy vấn xuyên qua các tập tin cần một chương trình mới mỗi lần.

Một cơ sở dữ liệu quan hệ khắc phục những vấn đề này bằng cách lưu trữ dữ liệu trong bảng do một phần mềm quản lý (DBMS) điều khiển, mà tất cả các chương trình đều sử dụng.

Tại sao cơ sở dữ liệu quan hệ tốt hơn — câu trả lời ba điểm. Mỗi mục dữ liệu được lưu trữ một lần, trong một bảng, và các bảng được liên kết bằng khóa, nên không có sự dư thừa và không có sự bất nhất; dữ liệu độc lập với các chương trình, những chương trình yêu cầu DBMS lấy những gì chúng cần và không bị ảnh hưởng khi cấu trúc thay đổi; và DBMS áp đặt các quy tắc toàn vẹn, kiểm soát quyền truy cập theo từng người dùng và từng trường, cho phép nhiều người dùng cùng lúc, và trả lời mọi truy vấn mà không cần viết một chương trình mới.
Ví dụ đã giải. Một tiệm sửa chữa lưu trữ khách hàng, thiết bị và công việc sửa chữa của mình bằng phương pháp dựa trên tập tin, mỗi chương trình một tập tin. Hãy đưa ra ba vấn đề gây ra bởi điều này, và mô tả cách một cơ sở dữ liệu quan hệ sẽ loại bỏ chúng.
Tên và số điện thoại của khách hàng được lưu trong tập tin sửa chữa và tập tin hóa đơn (dư thừa); khi khách hàng thay đổi số điện thoại, một tập tin được cập nhật và tập tin kia thì không (bất nhất); và khi tiệm muốn có báo cáo mới — sửa chữa theo kỹ thuật viên — một chương trình mới phải được viết để đọc các tập tin (không có truy vấn tự phát). Trong cơ sở dữ liệu quan hệ, khách hàng được lưu một lần trong bảng KHÁCH HÀNG và được tham chiếu bằng CustomerID từ bảng SỬA CHỮA, nên một thay đổi được thực hiện một lần và được thấy ở mọi nơi; báo cáo là một truy vấn SQL duy nhất.
| English | Tiếng Việt |
|---|---|
| DBMS/ˌdiː biː em ˈes/ | Hệ quản trị cơ sở dữ liệu |
| SQL/ˌes kjuː ˈel/ | SQL |
8.1
Mô hình quan hệ — các thuật ngữ
- bảng (mối quan hệ) — một lưới gồm các hàng và cột; một bảng cho mỗi loại thực thể (ví dụ
CUSTOMER). - bản ghi (hàng, còn gọi là bộ tuple) — một hàng; một ví dụ của thực thể.
- trường (cột, còn gọi là thuộc tính) — một cột; một mẩu thông tin về mỗi bản ghi.
- khóa chính — một trường (hoặc các trường) xác định duy nhất mỗi bản ghi; không bao giờ null hoặc trùng lặp.
- khóa ngoại — một trường có giá trị khớp với khóa chính của bảng khác, liên kết hai bảng.
- khóa tổng hợp — một khóa chính bao gồm hai hoặc nhiều trường kết hợp với nhau.
- khóa ứng viên — bất kỳ trường nào (hoặc các trường) có thể trở thành khóa chính.
- khóa thứ cấp — một trường không phải khóa chính được tạo chỉ mục để tìm kiếm nhanh.
- tạo chỉ mục — xây dựng chỉ mục trên một trường để tra cứu và ghép nối chạy nhanh hơn.
- toàn vẹn tham chiếu — mọi giá trị khóa ngoại phải khớp với một khóa chính đang tồn tại (không có bản ghi orphan).
Một bảng được viết tắt với khóa chính được gạch dưới và các khóa ngoại được ghi chú:
CUSTOMER(CustomerID, Name, Phone)
ORDER(OrderID, CustomerID, OrderDate) -- CustomerID is FK → CUSTOMER

Ví dụ đã giải. Nêu ý nghĩa của thực thể, khóa chính và toàn vẹn tham chiếu trong cơ sở dữ liệu quan hệ, và hoàn thành bảng tương ứng thuật ngữ ↔ mô tả cho tuple và thuộc tính.
Một thực thể là một đối tượng về đó dữ liệu được lưu trữ — một người, vật thể hoặc sự kiện — trở thành một bảng. Một khóa chính là thuộc tính (hoặc tổ hợp các thuộc tính) xác định duy nhất mỗi bản ghi trong bảng. Toàn vẹn tham chiếu có nghĩa là mọi giá trị khóa ngoại phải khớp với giá trị của khóa chính trong bảng mà nó tham chiếu, nên một bản ghi không thể tham chiếu đến một bản ghi không tồn tại. Một tuple là một hàng của bảng (một bản ghi); một thuộc tính là một cột (một trường). Học các cặp: bảng/mối quan hệ, bản ghi/tuple, trường/thuộc tính.
Đọc bảng quan hệ với lệnh SELECT
Bảng quan hệ chỉ có các hàng (bản ghi) và cột (trường). WHERE giữ lại các hàng khớp với điều kiện; SELECT sau đó chỉ giữ lại các cột bạn đã yêu cầu.
| English | Tiếng Việt |
|---|---|
| table/ˈteɪbl/ | bảng |
| tuple/ˈtuːpl/ | hàng (tuple) |
8.1
Sơ đồ thực thể - mối quan hệ (E-R)
Một sơ đồ thực thể - mối quan hệ hiển thị cấu trúc: mỗi thực thể là một hình chữ nhật, mỗi mối quan hệ là một đường kẻ, với số lượng được đánh dấu ở mỗi đầu:
- một-đến-một (1:1).
- một-nhiều (1:M) — mỗi Khách hàng có nhiều Đơn đặt hàng; mỗi Đơn đặt hàng có một Khách hàng.
- nhiều-nhiều (M:N) — Học sinh tham gia nhiều Khóa học, và Khóa học có nhiều Học sinh.


Một mối quan hệ nhiều-nhiều không thể lưu trữ trực tiếp. Chia nó thành hai mối quan hệ một-nhiều thông qua một bảng liên kết chứa hai khóa ngoại:
ENROLMENT(StudentID, CourseID, EnrolmentDate)

Vẽ sơ đồ E-R cho một tập hợp các bảng cho trước. Mỗi bảng trở thành một thực thể. Một mối quan hệ tồn tại khi một bảng chứa khóa ngoại trỏ đến bảng khác; nó chạy từ bảng chứa khóa ngoại (đầu nhiều) đến bảng chứa khóa chính của nó (đầu một). Một bảng có hai khóa ngoại và không có danh tính nào khác thường là một bảng liên kết giải quyết mối quan hệ nhiều-nhiều. Gán nhãn cho mỗi đường theo loại quan hệ.

Ví dụ minh họa. Một cửa hàng sửa chữa có các bảng CUSTOMER(CustomerID, Name, Phone), DEVICE(DeviceID, CustomerID, Type, Model), TECHNICIAN(TechnicianID, Name) và REPAIR(RepairID, DeviceID, TechnicianID, RepairDate, Cost). Xác định các mối quan hệ và loại của chúng.
DEVICE chứa CustomerID, nên CUSTOMER–DEVICE là một-nhiều (một khách hàng, nhiều thiết bị). REPAIR chứa DeviceID, nên DEVICE–REPAIR là một-nhiều; nó cũng chứa TechnicianID, nên TECHNICIAN–REPAIR là một-nhiều. Không có đường nối trực tiếp CUSTOMER–REPAIR: đường liên kết đi qua DEVICE. Ba đường, ba chân chim, tất cả đều ở đầu REPAIR hoặc DEVICE.
| English | Tiếng Việt |
|---|---|
| cardinality/ˌkɑːdɪˈnælɪti/ | cardinality |
| one-to-many/wʌn tə ˈmeni/ | một-nhiều |
| link table/lɪŋk ˈteɪbl/ | bảng liên kết |
8.1
Chuẩn hóa
Chuẩn hóa tổ chức các bảng để giảm thiểu sự trùng lặp và bất nhất, đi qua các dạng chuẩn theo thứ tự.
- Dạng chuẩn thứ nhất (1NF) — mỗi trường chỉ chứa một giá trị đơn (nguyên tử), không có nhóm lặp lại, và có khóa chính.
- Dạng chuẩn thứ hai (2NF) — trong 1NF, và mọi trường không phải khóa phụ thuộc vào toàn bộ khóa chính (chỉ quan trọng đối với khóa tổng hợp).
- Dạng chuẩn thứ ba (3NF) — trong 2NF, và mọi trường không phải khóa chỉ phụ thuộc duy nhất vào khóa chính, không phụ thuộc vào trường không khóa khác (không có sự phụ thuộc truyền dẫn).
Thiết kế 3NF lưu trữ mỗi sự thật đúng một lần, do đó các lỗi bất thường chèn/cập nhật/xóa biến mất. Sự đánh đổi là có nhiều bảng hơn và nhiều phép nối (join) hơn. Hãy hướng tới 3NF.
Để tạo ra thiết kế 3NF: xác định các thực thể và thuộc tính của chúng; chọn khóa chính cho mỗi thực thể; tách các trường lặp lại/trước không nguyên tử (1NF); tách các trường phụ thuộc vào một phần của khóa tổng hợp (2NF); tách các trường phụ thuộc truyền dẫn vào khóa (3NF); thêm khóa ngoại cho các mối quan hệ.

Ví dụ minh họa. Bảng ORDER(OrderID, CustomerID, CustomerName, ProductID, Quantity) có khóa chính tổng hợp (OrderID, ProductID). Chuẩn hóa nó lên 3NF. Kiểm tra từng trường không khóa đối với khóa. Quantity phụ thuộc vào cả hai OrderID và ProductID, điều này ổn. Nhưng CustomerID phụ thuộc vào OrderID duy nhất - chỉ là một phần của khóa tổng hợp. Đó là phụ thuộc một phần, nên bảng chưa đạt 2NF. Tách nó thành ORDER_LINE(OrderID, ProductID, Quantity) và ORDER(OrderID, CustomerID, CustomerName). Bây giờ kiểm tra 3NF: trong bảng ORDER mới này, CustomerName phụ thuộc vào CustomerID, vốn không phải là khóa - đây là phụ thuộc truyền dẫn. Tách lại: ORDER(OrderID, CustomerID) và CUSTOMER(CustomerID, CustomerName). Đặt tên cho sự phụ thuộc làm vi phạm mỗi dạng (phụ thuộc một phần làm vi phạm 2NF, phụ thuộc truyền dẫn làm vi phạm 3NF); mô tả "nó có dữ liệu lặp lại" là triệu chứng và sẽ không nhận điểm.
Ba câu hỏi cần đặt ra cho bất kỳ bảng nào. Mỗi ô có phải là một giá trị đơn, không có nhóm lặp lại không? Nếu không, nó chưa đạt 1NF. Nếu khóa là tổng hợp, thì mọi trường không khóa có phụ thuộc vào toàn bộ khóa không? Nếu một số trường phụ thuộc vào một phần của nó, có phụ thuộc một phần và bảng chưa đạt 2NF. Mọi trường không khóa có phụ thuộc vào khóa duy nhất không? Nếu một trường phụ thuộc vào một trường không khóa khác, có phụ thuộc truyền dẫn và bảng chưa đạt 3NF. Câu trả lời "hãy giải thích tại sao bảng chưa đạt 3NF" cần nêu tên sự phụ thuộc và các trường liên quan.

Ví dụ minh họa. Một cửa hàng cho thuê xe ghi nhận mỗi lần thuê là RENTAL(RentalID, RentalDate, CustomerID, CustomerName, CustomerPhone, CarReg, CarModel, DailyRate, Days), trong đó một lần thuê có thể bao gồm nhiều xe. Giải thích tại sao bảng này chưa được chuẩn hóa và đưa ra thiết kế 3NF.
Không thuộc 1NF: các trường xe hơi CarReg, CarModel, DailyRate, Days tạo thành nhóm lặp lại — một hợp đồng thuê có nhiều xe. Di chuyển chúng sang RENTAL_CAR(RentalID, CarReg, CarModel, DailyRate, Days) với khóa tổng hợp (RentalID, CarReg). Không thuộc 2NF: trong RENTAL_CAR, CarModel và DailyRate phụ thuộc vào CarReg duy nhất — phụ thuộc một phần. Di chuyển chúng sang CAR(CarReg, CarModel, DailyRate), giữ lại RENTAL_CAR(RentalID, CarReg, Days). Không thuộc 3NF: trong RENTAL, CustomerName và CustomerPhone phụ thuộc vào CustomerID, một trường không phải khóa — phụ thuộc truyền dẫn. Di chuyển chúng sang CUSTOMER(CustomerID, CustomerName, CustomerPhone), giữ lại RENTAL(RentalID, RentalDate, CustomerID). Thiết kế 3NF gồm bốn bảng — CUSTOMER, RENTAL, RENTAL_CAR, CAR — với CustomerID, RentalID và CarReg là khóa ngoại; gạch dưới mọi khóa chính.
| English | Tiếng Việt |
|---|---|
| join/dʒɔɪn/ | join |
| normalisation/ˌnɔːməlaɪˈzeɪʃn/ | chuẩn hóa |
| normal forms/ˈnɔːml fɔːmz/ | các dạng chuẩn |
| atomic/əˈtɒmɪk/ | nguyên tử |
| transitive dependency/ˈtrænsɪtɪv dɪˈpendənsi/ | phụ thuộc vào tham số |
| partial dependency/ˈpɑːʃl dɪˈpendənsi/ | phụ thuộc một phần |
8.2
Hệ Quản Trị Cơ Dữ Liệu (DBMS)
Chương trình
| Thí sinh cần có thể: | Ghi chú và hướng dẫn |
|---|---|
| Thể hiện sự hiểu biết về các tính năng do Hệ quản trị Cơ sở dữ liệu (DBMS) cung cấp nhằm giải quyết các vấn đề của phương pháp dựa trên tập tin | Bao gồm: • quản lý dữ liệu, bao gồm duy trì từ điển dữ liệu • mô hình hóa dữ liệu • sơ đồ logic • toàn vẹn dữ liệu • an ninh dữ liệu, bao gồm thủ tục sao lưu và việc sử dụng quyền truy cập cho từng cá nhân / nhóm người dùng |
| Thể hiện sự hiểu biết về cách các công cụ phần mềm bên trong DBMS được sử dụng trong thực tế | Bao gồm việc sử dụng và mục đích của: • giao diện nhà phát triển • bộ xử lý truy vấn |
Nguồn: Chương trình Cambridge International
Một DBMS quản lý cơ dữ liệu tập trung. Các tính năng khắc phục giới hạn của phương pháp dựa trên tệp:
- từ điển dữ liệu — mô tả chi tiết từng bảng, trường, kiểu và khóa; chương trình truy vấn từ đó thay vì mã hóa cứng cấu trúc.
- kiểm soát trùng lặp/nhất quán — mỗi sự thật chỉ được lưu trữ một lần.
- kiểm soát truy cập đồng thời — khóa và giao dịch cho phép nhiều người dùng làm việc cùng lúc.
- sao lưu và khôi phục; bảo mật và quyền hạn theo từng người dùng.
- luật toàn vẹn — khóa, ràng buộc độc nhất và phạm vi, được áp dụng tập trung.
- giao dịch — một nhóm thao tác mà tất cả đều thành công hoặc tất cả đều thất bại.
- bảng xem — các bảng ảo hiển thị "phần" dữ liệu của riêng mỗi người dùng.
- quản lý dữ liệu và mô hình hóa dữ liệu — kiểm soát cách dữ liệu được lưu trữ và xác định cấu trúc của nó dưới dạng bản đồ logic (thiết kế logic, độc lập với lưu trữ vật lý).
- toàn vẹn dữ liệu và bảo mật dữ liệu — đảm bảo tính chính xác và kiểm soát truy cập tập trung.
- bộ xử lý truy vấn chạy các câu hỏi; giao diện nhà phát triển cung cấp công cụ và API để xây dựng ứng dụng.
Các công cụ của nó bao gồm trình soạn thảo từ điển dữ liệu, bộ tạo truy vấn, bộ tạo biểu mẫu, máy sinh báo cáo, quản lý người dùng và trình soạn thảo SQL.
Những gì từ điển dữ liệu chứa (câu hỏi "liệt kê ba mục"): tên các bảng; tên các trường trong mỗi bảng; kiểu dữ liệu và độ dài của mỗi trường; khóa chính, khóa ngoại và mối quan hệ giữa các bảng; quy tắc xác thực; chỉ mục; và ai có quyền truy cập mỗi bảng. Đây là metadata — dữ liệu về dữ liệu — và DBMS sử dụng nó để kiểm tra mọi truy vấn và mọi thay đổi.
Cách DBMS giữ dữ liệu an toàn (câu hỏi "mô tả hai phương pháp"): xác thực — tên đăng nhập và mật khẩu, hoặc sinh trắc học, trước bất kỳ truy cập nào; quyền truy cập — mỗi người dùng hoặc nhóm chỉ được phép đọc, ghi hoặc xóa một số bảng hoặc trường nhất định, thường thông qua một bảng xem; mã hóa dữ liệu được lưu trữ và dữ liệu gửi đi, khiến tệp sao chép trở nên vô nghĩa; sao lưu được thực hiện thường xuyên, giúp khôi phục dữ liệu sau khi mất; và nhật ký giao dịch ghi lại ai đã thay đổi cái gì.
Hai công cụ phần mềm. Giao diện nhà phát triển là những gì lập trình viên sử dụng để xây dựng cơ dữ liệu và các ứng dụng trên đó: tạo bảng và thiết lập khóa, ràng buộc xác thực, viết truy vấn và SQL, thiết kế biểu mẫu và báo cáo, mà không cần biết dữ liệu được lưu trữ vật lý như thế nào. Bộ xử lý truy vấn nhận một truy vấn (SQL từ chương trình hoặc truy vấn được tạo trong giao diện), kiểm tra nó đối với từ điển dữ liệu, tìm ra cách hiệu quả nhất để chạy nó, lấy dữ liệu và trả về kết quả.
Bản đồ logic. DBMS tách biệt thiết kế logic (có những bảng và trường nào và chúng liên quan với nhau như thế nào) khỏi lưu trữ vật lý (tệp, chỉ mục, khối đĩa). Chương trình làm việc với bản đồ logic, do đó lưu trữ vật lý có thể được tổ chức lại mà không cần thay đổi bất kỳ chương trình nào — đây là sự độc lập dữ liệu mà phương pháp dựa trên tệp thiếu hụt.

Phòng thí nghiệm dịch vụ cơ sở dữ liệu
Xem cách DBMS chuyển đổi câu truy vấn thành quyền truy cập dữ liệu chia sẻ an toàn.
Phòng thí nghiệm dịch vụ cơ sở dữ liệu
Xem cách DBMS chuyển đổi câu truy vấn thành quyền truy cập dữ liệu chia sẻ an toàn.
8.3
DDL và DML
Chương trình
| Thí sinh cần có thể: | Ghi chú và hướng dẫn |
|---|---|
| Thể hiện sự hiểu biết rằng DBMS thực hiện toàn bộ việc tạo/sửa đổi cấu trúc cơ sở dữ liệu thông qua Ngôn ngữ Định nghĩa Dữ liệu (DDL) của nó | |
| Thể hiện sự hiểu biết rằng DBMS thực hiện tất cả các truy vấn và bảo trì dữ liệu thông qua Ngôn ngữ Thao tác Dữ liệu (DML) của nó | |
| Thể hiện sự hiểu biết rằng tiêu chuẩn ngành cho cả DDL và DML là Ngôn ngữ Truy vấn Có cấu trúc (SQL) | Hiểu một câu lệnh SQL đã cho |
| Hiểu các câu lệnh SQL (DDL) đã cho và có khả năng viết các câu lệnh SQL (DDL) đơn giản bằng cách sử dụng một tập con các câu lệnh | Tạo cơ sở dữ liệu (CREATE DATABASE) Tạo định nghĩa bảng (CREATE TABLE), bao gồm tạo các thuộc tính với kiểu dữ liệu phù hợp: • CHARACTER • VARCHAR(n) • BOOLEAN • INTEGER • REAL • DATE • TIME Sửa đổi định nghĩa bảng (ALTER TABLE) Thêm khóa chính vào bảng (PRIMARY KEY (field)) Thêm khóa ngoại vào bảng (FOREIGN KEY (field) REFERENCES Table (Field)) |
| Viết một script SQL để truy vấn hoặc sửa đổi dữ liệu (DML) được lưu trữ trong (tối đa hai) bảng cơ sở dữ liệu | Các truy vấn bao gồm SELECT... FROM, WHERE, ORDER BY, GROUP BY, INNER JOIN, SUM, COUNT, AVG |
| Bảo trì dữ liệu bao gồm INSERT INTO, DELETE FROM, UPDATE |
Nguồn: Chương trình Cambridge International
SQL (Ngôn ngữ Truy vấn Có Cấu trúc) có hai phần:

- Ngôn ngữ Định nghĩa Dữ liệu (DDL) — tạo hoặc thay đổi cấu trúc (bảng, khóa, ràng buộc).
- Ngôn ngữ Thao tác Dữ liệu (DML) — làm việc với dữ liệu (chèn, cập nhật, xóa, truy vấn).
Nguyên tắc DDL
CREATE TABLE CUSTOMER (
CustomerID INTEGER PRIMARY KEY,
Name VARCHAR(50) NOT NULL,
Phone VARCHAR(20)
);
Thêm khóa ngoại:
CREATE TABLE ORDER (
OrderID INTEGER PRIMARY KEY,
CustomerID INTEGER,
OrderDate DATE,
FOREIGN KEY (CustomerID) REFERENCES CUSTOMER(CustomerID)
);
Sửa và xóa bỏ:
ALTER TABLE CUSTOMER ADD Email VARCHAR(100);
DROP TABLE CUSTOMER;
Các loại phổ biến: INTEGER, REAL, VARCHAR(n), CHAR(n) (cũng CHARACTER(n)), DATE, TIME, BOOLEAN, DECIMAL(p, s).
Nguyên tắc DML
Truy vấn với SELECT:

SELECT Name, Phone
FROM CUSTOMER
WHERE City = 'London'
ORDER BY Name ASC;
SELECT liệt kê các trường, FROM đặt tên bảng, WHERE lọc hàng, ORDER BY sắp xếp.
Một join kết hợp hai bảng bằng mối quan hệ khóa-ngoại:
SELECT C.Name, O.OrderDate
FROM CUSTOMER C INNER JOIN ORDER O
ON C.CustomerID = O.CustomerID
WHERE O.OrderDate >= '2024-01-01';

Hàm tổng hợp (COUNT, SUM, AVG, MIN, MAX) thường được sử dụng với GROUP BY:
SELECT CustomerID, COUNT(*) AS NumOrders
FROM ORDER
GROUP BY CustomerID;
Chèn, cập nhật, xóa:
INSERT INTO CUSTOMER (CustomerID, Name, Phone)
VALUES (101, 'Ada Lovelace', '020-1234-5678');
UPDATE CUSTOMER SET Phone = '020-9999-0000' WHERE CustomerID = 101;
DELETE FROM CUSTOMER WHERE CustomerID = 101;
Luôn đặt clause WHERE trên UPDATE và DELETE, nếu không thay đổi sẽ ảnh hưởng đến mọi hàng.
Mẹo cho bài thi SQL
- sử dụng đúng tên bảng và trường từ đề bài.
- đặt chuỗi trong dấu nháy đơn (
'Smith'); không đặt số trong dấu nháy. - so sánh:
=,<,>,<=,>=,<>. LIKE 'A%'khớp với mọi chuỗi bắt đầu bằng A (%= bất kỳ chuỗi nào,_= một ký tự);IN (1,2,3);BETWEEN 10 AND 20.- Kết hợp các điều kiện bằng
AND/OR/NOT, và kết thúc mỗi câu lệnh bằng dấu chấm phẩy.
Mẫu DDL mà đề thi yêu cầu. Mọi CREATE TABLE đều đặt tên cho từng trường cùng kiểu dữ liệu của nó, đánh dấu khóa chính, và khai báo từng khóa ngoại kèm bảng tham chiếu; khóa tổng hợp được khai báo trên một dòng riêng:
CREATE TABLE RENTAL_CAR (
RentalID INTEGER,
CarReg VARCHAR(8),
Days INTEGER,
PRIMARY KEY (RentalID, CarReg),
FOREIGN KEY (RentalID) REFERENCES RENTAL(RentalID),
FOREIGN KEY (CarReg) REFERENCES CAR(CarReg)
);
Ví dụ có lời giải. Sử dụng CUSTOMER(CustomerID, Name, Phone) và DEVICE(DeviceID, CustomerID, Type, Model), viết script SQL để: (a) liệt kê tên và số điện thoại của tất cả khách hàng sở hữu thiết bị loại 'tablet', sắp xếp theo thứ tự tên alphabet; (b) đếm số lượng thiết bị theo từng loại; (c) cập nhật rằng khách hàng 17 hiện có số điện thoại là '0771 234 5678'; (d) thêm một thiết bị mới, ID 305, là một 'laptop' model 'X1' thuộc về khách hàng 17.
(a)
SELECT CUSTOMER.Name, CUSTOMER.Phone
FROM CUSTOMER INNER JOIN DEVICE
ON CUSTOMER.CustomerID = DEVICE.CustomerID
WHERE DEVICE.Type = 'tablet'
ORDER BY CUSTOMER.Name ASC;
(b)
SELECT Type, COUNT(DeviceID) AS NumberOfDevices
FROM DEVICE
GROUP BY Type;
(c) UPDATE CUSTOMER SET Phone = '0771 234 5678' WHERE CustomerID = 17;
(d) INSERT INTO DEVICE (DeviceID, CustomerID, Type, Model) VALUES (305, 17, 'laptop', 'X1');
Điểm sẽ được tính cho từng clause — các trường, các bảng, điều kiện join, WHERE, ORDER BY — nên ngay cả khi một script sai một clause thì vẫn nhận điểm cho các phần còn lại. Viết Table.Field whenever hai bảng được liên kết.
Ví dụ có lời giải. Giải thích script này làm gì: SELECT T.Name, SUM(R.Cost) AS Total FROM TECHNICIAN T INNER JOIN REPAIR R ON T.TechnicianID = R.TechnicianID GROUP BY T.Name;
Nó xuất ra tên của mỗi kỹ thuật viên kèm tổng chi phí sửa chữa mà kỹ thuật viên đó đã thực hiện, một dòng cho mỗi kỹ thuật viên: hai bảng được join dựa trên TechnicianID, các dòng được nhóm theo tên, và các chi phí trong mỗi nhóm được cộng lại. Khi được hỏi một script làm gì, hãy mô tả kết quả thay vì cú pháp.
Nối hai bảng với INNER JOIN
Phép nối khớp các dòng mà khóa ngoại bằng khóa chính — ở đây Orders.CustomerID = Customer.CustomerID — và gộp mỗi cặp khớp thành một dòng rộng hơn.
SELECT … WHERE
Từng bước một truy vấn: WHERE giữ lại các hàng khớp, sau đó SELECT chọn các cột bạn yêu cầu.
| English | Tiếng Việt |
|---|---|
| flat files/flæt faɪlz/ | tệp phẳng |
| data redundancy/ˈdeɪtə rɪˈdʌndənsi/ | sự dư thừa dữ liệu |
| data inconsistency/ˈdeɪtə ˌɪnkənˈsɪstənsi/ | sự không nhất quán dữ liệu |
| field/fiːld/ | trường |
| query/ˈkwɪərɪ/ | truy vấn |
| primary key/ˈpraɪməri kiː/ | khóa chính |
| foreign key/ˈfɒrən kiː/ | khóa ngoại |
8.3
Các định nghĩa mà giám khảo chấp nhận
Câu hỏi định nghĩa được chấm dựa trên văn phong cố định. Hãy học thuộc những định nghĩa này và chỉ đưa ra một đáp án duy nhất.
| Thuật ngữ | Định nghĩa |
|---|---|
| entity | một đối tượng mà dữ liệu về nó được lưu trữ — con người, vật thể hoặc sự kiện — trở thành một bảng trong cơ sở dữ liệu quan hệ |
| attribute | một mục dữ liệu về một entity (một cột của bảng) |
| tuple | một dòng của bảng: một实例 của entity |
| primary key | một thuộc tính, hoặc tổ hợp các thuộc tính, xác định duy nhất mỗi bản ghi trong bảng |
| foreign key | một thuộc tính trong một bảng có giá trị khớp với khóa chính trong bảng khác, dùng để liên kết hai bảng |
| candidate key | bất kỳ thuộc tính (hoặc tổ hợp) nào có thể được chọn làm khóa chính |
| secondary key | một thuộc tính không phải khóa chính được lập chỉ mục để bảng có thể tìm kiếm hoặc sắp xếp nhanh chóng trên đó |
| composite key | một khóa chính bao gồm hai hoặc nhiều thuộc tính kết hợp lại |
| referential integrity | mọi giá trị khóa ngoại phải khớp với một giá trị khóa chính đang tồn tại trong bảng mà nó tham chiếu đến |
| first normal form | một bảng trong đó mọi thuộc tính đều nguyên tử, không có nhóm lặp lại, và có khóa chính |
| second normal form | ở 1NF, và mọi thuộc tính không phải khóa phụ thuộc vào toàn bộ khóa chính (không có phụ thuộc một phần) |
| third normal form | ở 2NF, và không có thuộc tính nào phi khóa phụ thuộc vào một thuộc tính phi khóa khác (không có phụ thuộc truyền dẫn) |
| data dictionary | metadata mà DBMS lưu giữ về cấu trúc cơ sở dữ liệu: các bảng, trường, kiểu dữ liệu, khóa, mối quan hệ, xác thực |
| DDL / DML | ngôn ngữ dùng để định nghĩa hoặc thay đổi cấu trúc cơ sở dữ liệu / ngôn ngữ dùng để truy vấn và bảo trì dữ liệu trong đó |
| English | Tiếng Việt |
|---|---|
| integrity/ɪnˈteɡrɪti/ | tính toàn vẹn |
| relational database/rɪˈleɪʃənl ˈdeɪtəbeɪs/ | cơ sở dữ liệu quan hệ |
| entity/ˈentɪti/ | thực thể |
| record/ˈrekɔːd/ | bản ghi |
| attribute/ˈætrɪbjuːt/ | thuộc tính |
| composite key/ˈkɒmpəzɪt kiː/ | khóa tổng hợp |
| candidate key/ˈkændɪdeɪt kiː/ | khóa ứng viên |
| secondary key/ˈsekəndəri kiː/ | khóa phụ |
| indexing/ˈɪndeksɪŋ/ | lập chỉ mục |
| referential integrity/ˌrefəˈrenʃl ɪnˈteɡrɪti/ | toàn vẹn tham chiếu |
| entity-relationship diagram/ˈentɪti rɪˈleɪʃənʃɪp ˈdaɪəɡræm/ | biểu đồ thực thể - mối liên hệ |
| data dictionary/ˈdeɪtə ˈdɪkʃənəri/ | từ điển dữ liệu |
| concurrent access/kənˈkʌrənt ˈækses/ | truy cập đồng thời |
| transactions/trænˈsækʃnz/ | giao dịch |
| backup/ˈbækʌp/ | bản sao lưu |
| views/vjuːz/ | lượt xem |
| data management/ˈdeɪtə ˈmænɪdʒmənt/ | quản lý dữ liệu |
| data modelling/ˈdeɪtə ˈmɒdəlɪŋ/ | mô hình hóa dữ liệu |
| logical schema/ˈlɒdʒɪkl ˈskiːmə/ | sơ đồ logic |
| data integrity/ˈdeɪtə ɪnˈteɡrɪti/ | toàn vẹn dữ liệu |
| data security/ˈdeɪtə sɪˈkjʊərɪti/ | an ninh dữ liệu |
| query processor/ˈkwɪərɪ ˈprəʊsesə/ | bộ xử lý truy vấn |
| developer interface/dɪˈveləpə ˈɪntəfeɪs/ | giao diện nhà phát triển |
| authentication/ɔːˌθentɪˈkeɪʃn/ | xác thực |
| Data Definition Language/ˈdeɪtə ˌdefɪˈnɪʃn ˈlæŋɡwɪdʒ/ | Ngôn ngữ Định nghĩa Dữ liệu |
| Data Manipulation Language/ˈdeɪtə məˌnɪpjʊˈleɪʃn ˈlæŋɡwɪdʒ/ | Ngôn ngữ Thao tác Dữ liệu |
| aggregate functions/ˈæɡrɪɡeɪt ˈfʌŋkʃnz/ | hàm tổng hợp |
8.3
Mẹo làm bài thi
- Định nghĩa các thuật ngữ một cách chính xác: entity, attribute, primary key, foreign key, và các loại quan hệ (1:1, 1:nhiều, nhiều:nhiều).
- Đưa ra lý do cho mỗi dạng chuẩn hóa: 1NF (không có nhóm lặp lại), 2NF (không có phụ thuộc một phần), 3NF (không có phụ thuộc phi khóa) — và nêu tên các trường liên quan.
- Giải thích DBMS cung cấp những gì (tính độc lập dữ liệu, bảo mật, toàn vẹn, truy cập đồng thời, từ điển dữ liệu, giao diện nhà phát triển, bộ xử lý truy vấn).
- Phân biệt DDL (định nghĩa cấu trúc) khỏi DML (truy vấn và thay đổi dữ liệu), và viết clause SQL từng bước:
SELECT,FROM,INNER JOIN … ON,WHERE,GROUP BY,ORDER BY. - Để vẽ sơ đồ E-R từ các bảng, trước hết hãy tìm khóa ngoại: mỗi khóa ngoại đại diện cho một quan hệ một-nhiều, với "nhiều" nằm ở bảng chứa khóa ngoại đó.
Lỗi thường gặp
- Vẽ trực tiếp quan hệ nhiều-nhiều. Nó phải được tách thành hai quan hệ một-nhiều thông qua một bảng liên kết chứa cả hai khóa ngoại.
- Giải thích "không ở 3NF" bằng cách nói "dữ liệu bị lặp lại". Nêu tên phụ thuộc (một phần hoặc truyền dẫn) và các trường liên quan.
- Dấu ngoặc kép đôi bao quanh chuỗi trong SQL, hoặc dấu ngoặc đơn bao quanh số. Chuỗi cần
'single quotes'; số thì không cần. - Bỏ sót điều kiện
ONsauINNER JOIN. Không có nó thì hai bảng sẽ không được liên kết. - Đặt một trường thường bên cạnh
COUNThoặcSUMtrong mộtSELECTmà không cóGROUP BY. UPDATEhoặcDELETEmà không cóWHERE. Nó sẽ thay đổi hoặc xóa mọi dòng trong bảng.
Bài học tương tác về chủ đề này
Làm theo từng bước, kèm theo bài tập kiểm tra ngay lập tức.