Bài trước: CSDL_Thực hành (3) - Làm việc với RDBMS
-----
4. Tạo CSDL, bảng
4.1 Tạo CSDL rỗng
Như đã đề cập, khi làm việc với CSDL, chúng ta quan tâm tới 3 thứ:
- Dữ liệu
- Cách thức tổ chức dữ liệu
- Phần mềm quản lý CSDL
Chúng ta đã cài đặt SQL Server, và SSMS, đây là 2 phần mềm dùng để quản lý dữ liệu. Cụ thể, chúng ta sẽ dùng phần mềm SSMS để ra lệnh cho SQL Server thực thi.
Để tổ chức dữ liệu một cách hợp lý, nhằm lưu trữ, quản lý và truy xuất được dễ dàng, chúng ta đã chọn Mô hình quan hệ.
Trong mô hình quan hệ, dữ liệu được tổ chức dưới dạng các bảng.
Tập hợp các bảng này lại với nhau, kèm theo một số ràng buộc sẽ tạo thành một CSDL.
Chúng ta sẽ tạo một CSDL rỗng (chưa có bảng, chưa có dữ liệu)
- Trong SSMS, để tạo CSDL rỗng có 2 cách:
[1] Trong cửa sổ Object Explorer > chuột phải vào mục Databases > New Database > Nhập tên cho CSDL > bấm OK để tạo.
[2] Hoặc nhập lệnh vào cửa sổ SQLQuery.
Hướng dẫn cách dùng SQLQuery để tạo CSDL:
- Bấm vào nút New Query để mở cửa sổ SQLQuery, đây là cửa sổ soạn thảo, cho phép bạn viết và thực thi các truy vấn, viết bằng ngôn ngữ SQL.
- Nhập dòng mã sau vào SQLQuery
Create database Lab01_QLNV --Lệnh tạo CSDL Lab01_QLNV trống
go
- Bấm nút Execute trên thành công cụ, để tạo ra CSDL có tên Lab01_QLNV
- Nếu tạo thành công, CSDL có tên Lab01_QLNV sẽ xuất hiện trong khung Object Explorer \ mục Databases. Nếu không có, bạn bấm chuột phải vào mục Databases > chọn Refresh để cập nhật lại Databases.
Giải thích đoạn lệnh:
- Create database: lệnh để tạo mới một CSDL.
- Lab01_QLNV là tên của CSDL sẽ tạo.
- Nội dung sau dấu --, ví dụ “--Lệnh tạo CSDL Lab01_QLNV trống“ là chú thích, Database engine sẽ bỏ qua và không thực thi các dòng này.
- go là lệnh của SSMS (không phải lệnh của SQL) để chạy các lệnh ở phía trên, tính từ đầu tập tin SQLQuery, hoặc sau lệnh go phía trên, gần nhất. Bạn có thể tô đen các dòng lệnh cần chạy > bấm vào nút Execute trên thanh công cụ để thực thi vùng lệnh được tô đen mà không cần dùng tới lệnh go.
- Khi thực thi lệnh SQL, nếu có lỗi, hệ thống sẽ thông báo ở cửa sổ Message.
Xem hình minh họa.
- Các bạn nên có
thói quen đọc thông báo lỗi, nó sẽ chỉ ra dòng nào gây ra lỗi, đang bị lỗi gì.
Từ đó sẽ biết cách để sửa lỗi hoặc điều chỉnh lại lệnh SQL cho đúng. Đây là
cách học hay, vừa nâng cao trình độ tiếng Anh, vừa rèn tư duy “giải quyết vấn
đề”.
- Để hiển thị chỉ số dòng trong cửa sổ SQLQuery: vào menu Tools > Options > Text Editor > Transact-SQL > đánh dấu chọn vào mục Line Numbers.
Ví dụ, ở hình trên, lỗi xảy ra ở hàng 1, lý do CSDL Lab01_QLNV đã có rồi (nhìn ở khung Object Explorer). Đã có rồi, mà chúng ta lại tạo thêm, nó không cho tạo chồng một CSDL có sẵn, nên báo lỗi. Cách sửa lỗi là đừng chạy dòng lệnh tạo CSDL mới nữa (có thể xóa hoặc che đi dòng mã này).
4.2 Tạo bảng cho CSDL
Để tạo các bảng cho CSDL, sử dụng lệnh SQL sau:
CREATE TABLE tên_bảng (
tên_cột1 kiểu_dữ_liệu ràng_buộc,
tên_cột2 kiểu_dữ_liệu ràng_buộc,
tên_cột3 kiểu_dữ_liệu ràng_buộc,
...
CONSTRAINT tên_ràng_buộc ràng_buộc_bảng
);
Dưới đây là giải thích chi tiết:
- CREATE TABLE tên_bảng
+ CREATE TABLE: lệnh tạo bảng.
+ tên_bảng: tên của bảng sẽ tạo. Tên bảng phải tuân theo các quy tắc đặt tên của SQL Server.
- (tên_cột1 kiểu_dữ_liệu ràng_buộc,...)
+ Phần định nghĩa các cột trong bảng.
+ tên_cột: tên của cột.
+ kiểu_dữ_liệu: kiểu dữ liệu của cột (ví dụ: INT, VARCHAR, DATE).
+ ràng_buộc: các ràng buộc áp dụng cho cột (ví dụ: NOT NULL, PRIMARY KEY,
FOREIGN KEY).
- CONSTRAINT tên_ràng_buộc ràng_buộc_bảng
+ Đây là phần định nghĩa các ràng buộc áp dụng cho toàn bộ bảng.
+ tên_ràng_buộc: tên bạn muốn đặt cho ràng buộc.
+ ràng_buộc_bảng: các ràng buộc áp dụng cho bảng (ví dụ: PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK).
Một số kiểu dữ liệu phổ biến
- INT: số nguyên.
- VARCHAR(n): chuỗi ký tự có độ dài tối đa là n.
- CHAR(n): chuỗi ký tự có độ dài cố định là n.
- DATE: ngày tháng năm.
- DATETIME: ngày giờ.
- DECIMAL(p, s): Số thập phân với p chữ số và s chữ số sau dấu phẩy.
Một số ràng buộc phổ biến
- NOT NULL: cột không được phép có giá trị NULL.
- PRIMARY KEY: cột là khóa chính của bảng, giá trị của cột phải là duy nhất và không được NULL.
- FOREIGN KEY: cột là khóa ngoại của bảng, liên kết đến khóa chính của một bảng khác.
- UNIQUE: giá trị của cột phải là duy nhất.
- CHECK: giá trị của cột phải thỏa mãn một điều kiện nhất định.
- DEFAULT: giá trị mặc định của cột.
Chỉ định CSDL bạn sẽ làm việc
Trước khi làm việc với một CSDL, bạn phải thông báo cho Database engine một cách tường minh. Sử dụng lệnh USE của SQL để chỉ định cơ sở dữ liệu mà bạn muốn làm việc.
Ví dụ;
Use Lab01_QLNV
4.3 Thực hành tạo bảng
Để tạo bảng, chúng ta phải đọc và hiểu được tài liệu thiết kế cơ sở dữ liệu.
Ví dụ (tham khảo bài thực hành của giáo viên Tạ Thị Thu Phượng - Khoa Toán Tin - Đại học Đà Lạt):
Cho cơ sở dữ liệu gồm các quan hệ sau:
1. NhanVien(MANV, Ho, Ten, NgaySinh, NgayVaoLam, MSCN)
Tân từ: mỗi nhân viên có một mã số (MANV) duy nhất, họ và tên lót (Ho), tên nhân viên (Ten), ngày sinh (NgaySinh), ngày vào làm (NgayVaoLam), mã số chi nhánh mà nhân viên đang làm việc (MSCN)
2. ChiNhanh(MSCN, TenCN)
Tân từ: mỗi chi nhánh có một mã số duy nhất (MSCN) và tên chi nhánh (TenCN)
3. KyNang(MSKN, TenKN)
Tân từ: mỗi kỹ năng tin học có mã số kỹ năng (MSKN) để phân biệt và tên kỹ năng (TenKN)
4. NhanVienKyNang(MANV, MSKN, MucDo)
Tân từ: thông tin về sử dụng kỹ năng tin học của nhân viên bao gồm mã số nhân viên (MANV), mã số kỹ năng (MSKN), và mức độ (MucDo) thành thạo kỹ năng đó. Mức độ thành thạo được đánh số từ 1 đến 9, số càng lớn mức độ thành thạo càng cao. Một nhân viên có thể biết nhiều kỹ năng.
Từ thông tin mô tả về CSDL ở trên, chúng ta cùng phân tích một số ý:
- Bảng là đại diện cho một quan hệ, nên có thể gọi bảng là quan hệ.
- Bảng không đơn thuần chỉ chứa dữ liệu, mà nó còn chứa các mối liên kết và sự phụ thuộc giữa các dữ liệu bên trong bảng đó.
- Nhắc lại: dữ liệu chỉ là các con số, ký tự. Bản thân nó không có ngữ nghĩa. Ngữ nghĩa của dữ liệu được diễn dịch thông qua mô tả, mối liên hệ, ràng buộc giữa các cột, các hàng, và các bảng. Đây là lý do tại sao lại gọi bảng là quan hệ.
Như vậy, việc tạo bảng không chỉ là việc đặt tên bảng, đặt tên các cột, mà còn là việc chỉ ra các mối liên hệ, ràng buộc của mỗi dữ liệu, của mỗi cột, của các hàng với nhau và giữa các bảng.
Các mối liên hệ, các ràng buộc chính là nội dung của Tân từ. Do vậy, bạn phải có khả năng đọc và hiểu Tân từ một cách chính xác. CSDL thể hiện một phần thế giới thật, vì vậy cố gắng liên hệ nội dung của Tân từ với thế giới thật. Phần mềm phải dùng được trong cuộc sống.
Chúng ta đã biết cú pháp tạo bảng, tên bảng đã có, tên các cột của bảng đã có, mối liên hệ ràng buộc giữa các thành phần đã có. Vậy, hãy bắt tay vào việc viết lệnh, để tạo bảng trên cửa sổ SQLQuery, gửi lệnh cho Database engine thực thi và quan sát kết quả trong cửa sổ Object Explorer.
Tạo bảng nhân viên
1. NhanVien(MANV, Ho, Ten, NgaySinh, NgayVaoLam, MSCN)
Tân từ: mỗi nhân viên có một mã số (MANV) duy nhất, họ và tên lót (Ho), tên nhân viên (Ten), ngày sinh (NgaySinh), ngày vào làm (NgayVaoLam), mã số chi nhánh mà nhân viên đang làm việc (MSCN)
Trong bảng NhanVien, cột MSCN sẽ là khóa ngoại, tham chiếu tới cột MSCN trong bảng ChiNhanh. Như vậy, bạn có thể tạo bảng ChiNhanh trước để có sẵn cột MSCN, sau đó tạo bảng NhanVien.
Tuy nhiên, bạn vẫn có thể tạo bảng NhanVien trước, sau đó tạo bảng ChiNhanh, rồi thiết lập ràng buộc khóa ngoại. Cách này linh hoạt hơn.
Viết đoạn mã SQL sau vào SQLQuery:
---Tạo
bảng NhanVien
Create
table NhanVien
(MaNV char(4) primary key,
Ho nvarchar(20) not null,
Ten nvarchar(10) not null,
NgaySinh DateTime not null,
NgayVaoLam DateTime not null,
MSCN char(2)--chưa có ràng buộc khóa ngoại
)
Tô đen đoạn mã trên > bấm Execute > nếu lệnh trên không có lỗi > quan sát cửa sổ Object Explorer (mục Databases\Lab01_QLNV\Tables) sẽ thấy xuất hiện bảng NhanVien (nhớ
refresh lại mục Tables).
Như vậy chúng ta đã tạo được bảng NhanVien với rất nhiều mối liên hệ, ràng buộc bên trong. Ví dụ:
- mỗi nhân viên sẽ có 6 thông tin đi kèm (6 cột: MaNV, Ho, Ten, NgaySinh, NgayVaoLam, MSCN)
- mỗi nhân viên có một MaNV duy nhất (primary key), có độ dài đúng 4 ký tự (char(4)). Họ và tên lót không được để trống, dài không quá 20 ký tự. Tên không được để trống, dài không quá 10 ký tự. Ngày sinh và ngày vào làm cũng không được để trống. MSCN có độ dài đúng 2 ký tự, và có thể để trống.
Tương tự, bạn tạo các bảng còn lại. Bạn đừng cóp dán (copy/paste) các đoạn mã SQL, mà nên tự gõ lại, nó giúp bạn tư duy, hiểu và nhớ lệnh nhanh hơn. Muốn (hiểu) nhanh thì phải (học) từ từ là vậy. Cứ vừa gõ lệnh, vừa tưởng tượng máy tính nó sẽ làm gì với cái lệnh mình đang gõ, gõ tới đâu, hiểu và kiểm soát tới đó là ổn. Sẽ không còn khái niệm “phải học bài để đi thi”. Học chỉ để thi là cách học không hay. Thi chỉ là cái cớ để mình học, phải học để làm ra sản phẩm, học để làm cho các tổ chức, tập đoàn, công ty.
2. ChiNhanh(MSCN, TenCN)
Tân từ: mỗi chi nhánh có một mã số duy nhất (MSCN) và tên chi nhánh (TenCN)
---Tạo bảng ChiNhanh
create table ChiNhanh
(MSCN char(2) primary key, ---khai báo khóa chính
TenCN nvarchar(30) not null unique
)
3. KyNang(MSKN, TenKN)
Tân từ: mỗi kỹ năng tin học có mã số kỹ năng (MSKN) để phân biệt và tên kỹ năng (TenKN)
---Tạo bảng KyNang
create table KyNang
(MSKN char(2) primary key, ---khai báo khóa chính
TenKN nvarchar(30) not null unique
)
4. NhanVienKyNang(MANV, MSKN, MucDo)
Tân từ: thông tin về sử dụng kỹ năng tin học của nhân viên bao gồm mã số nhân viên (MANV), mã số kỹ năng (MSKN), và mức độ (MucDo) thành thạo kỹ năng đó. Mức độ thành thạo được đánh số từ 1 đến 9, số càng lớn mức độ thành thạo càng cao. Một nhân viên có thể biết nhiều kỹ năng.
---Tạo bảng NhanVienKyNang
create table NhanVienKyNang
(MANV char(4), ---chưa có ràng buộc khóa ngoại
MSKN char(2), ---chưa có ràng buộc khóa ngoại
MucDo tinyint check (MucDo >= 1 and MucDo <= 9), ---kiểm tra MucDo phải thuộc khoảng 1 > 9
primary key(MaNV, MSKN) ---khai báo khóa chính gồm 2 thuộc tính
)
4.4 Bài tập
Câu 4.1 Khi tạo bảng trong cơ sở dữ liệu, một số ràng buộc thường được sử dụng. Phát biểu nào sau đây không đúng?
A. NOT NULL đảm bảo cột không được phép có giá trị NULL.
B. FOREIGN KEY chỉ định cột là khóa chính của bảng khác.
C. PRIMARY KEY chỉ định cột là khóa chính, giá trị phải duy nhất và không được NULL.
D. UNIQUE đảm bảo giá trị của cột là duy nhất.
Câu 4.2 Khi tạo bảng trong cơ sở dữ liệu, một số kiểu dữ liệu thường được sử dụng. Phát biểu nào sau đây không đúng?
A. CHAR(n) dùng để lưu trữ chuỗi ký tự có độ dài thay đổi.
B. INT dùng để lưu trữ số nguyên.
C. VARCHAR(n) dùng để lưu trữ chuỗi ký tự có độ dài tối đa là n.
D. DATE dùng để lưu trữ ngày tháng năm.
Bài tập 4.3 Tạo CSDL và các bảng trong bài học.
-----
Cập nhật: 17/3/2025
-----
Bài sau: CSDL_Thực hành (5) - Tạo khóa ngoại, nhập liệu