Bài trước: DBMS (3) - Thao tác với Database Engine bằng dòng lệnh
-----
1.1
Tạo cơ sở dữ liệu quan hệ bằng dòng lệnh
Như các bạn đã biết, cơ sở dữ liệu là một tập hợp thông tin
có tổ chức, các thông tin này được lưu trữ trong các hệ quản trị cơ sở dữ liệu.
Cơ sở dữ liệu mô tả một phần thế giới thật.
Có nhiều loại cơ sở dữ liệu như: dạng tập tin, quan hệ, hướng
đối tượng, bán cấu trúc. Phần này sẽ làm quen với cơ sở dữ liệu quan hệ.
1.1.1
Cơ sở dữ liệu quan hệ
Hiểu một cách đơn giản, cơ sở dữ liệu quan hệ bao gồm các
bảng dữ liệu và mối quan hệ giữa các bảng.
Ví dụ, để làm một ứng dụng quản lý nhà hàng, bạn sẽ tạo một
cơ sở dữ liệu có tên là quan_ly_nha_hang.
Cơ sở dữ liệu quan_ly_nha_hang
gồm các bảng dữ liệu sau:
– loai_mon_an (Loại
món ăn)
– mon_an (Món ăn)
– khach_hang (Khách hàng)
– hoa_don (Hóa đơn)
– chi_tiet_hoa_don (Chi tiết hóa đơn)
Bạn có thể dễ hình dung ra bảng các loại món ăn (loai_mon_an) sẽ có các thông tin như
sau:
Số thứ tự |
Tên loại |
Mô tả |
Hình ảnh |
1 |
Cơm |
Các món cơm Việt |
com.jpg |
2 |
Lẩu |
Các món lẩu |
lau.jpg |
3 |
Canh |
Các món canh Việt |
canh.jpg |
… |
|
|
|
Để xác định tính duy nhất và dễ dàng phân biệt giữa các loại
món ăn, người ta sẽ thay cột Số thứ tự thành Mã_loại. Khi đó bảng dữ liệu loai_mon_an sẽ có dạng:
Mã loại |
Tên loại |
Mô tả |
Hình ảnh |
1 |
Cơm |
Các món cơm Việt |
com.jpg |
2 |
Lẩu |
Các món lẩu |
lau.jpg |
3 |
Canh |
Các món canh Việt |
canh.jpg |
… |
|
|
|
Trong hệ quản trị cơ sở dữ liệu quan_ly_nha_hang, để tạo bảng dữ liệu loai_mon_an như trên, bạn cần thực hiện 2 việc: một là mô tả cấu
trúc của bảng; hai là chèn dữ liệu vào bảng.
Mô tả cấu trúc của bảng
Để mô tả cấu trúc của một bảng, cần có một số thông tin sau:
– Tên của bảng (ví dụ loai_mon_an)
– Phần chú thích (ví dụ Loại món ăn)
– Tên các thuộc tính (tiêu đề các cột của bảng), ví dụ:
ma_loai, ten_loai, mo_ta, hinh
– Loại dữ liệu của thuộc tính, ví dụ: int(11), varchar(200)
– Các thông tin bổ sung khác của mỗi thuộc tính, ví dụ:
Collation (bảng mã), Attributes (ràng buộc), Null, Default, Extra
Ví dụ, đây là mô
tả của bảng loai_mon_an
# |
Name |
Type |
Collation |
Attributes |
Null |
Default |
Extra |
1 |
ma_loai |
int(11) |
|
|
No |
None |
AUTO_INCREMENT |
2 |
ten_loai |
varchar(200) |
utf8_unicode_ci |
|
No |
None |
|
3 |
mo_ta |
varchar(500) |
utf8_unicode_ci |
|
No |
None |
|
4 |
Hinh |
varchar(100) |
utf8_unicode_ci |
|
No |
None |
|
Chèn dữ liệu vào bảng
Khi đã tạo và định
nghĩa cấu trúc của bảng, hiểu nôm na là bạn đã tạo ra được một cái bảng với hàng
đầu tiên là tiêu đề các cột. Bây giờ, bạn đã có thể chèn dữ liệu vào cho bảng;
mỗi hàng dữ liệu của bảng chính là dữ liệu của một đối tượng cụ thể. Ví
dụ: [1 - Cơm - Các món cơm Việt - com.jpg]
1.1.2
Ngôn ngữ SQL
Các thao tác bạn thường thực hiện với cơ sở dữ liệu gồm:
– Tạo cơ sở dữ liệu
– Tạo bảng
– Tạo quan hệ
– Nhập dữ liệu cho các bảng
– Xuất (Export) cơ sở dữ liệu ra một tập tin
– Nhập (import) cơ sở dữ liệu từ một tập tin
– Truy vấn thông tin từ CSDL
Để thực hiện các thao tác trên, bạn cần sử dụng tới các câu
lệnh của ngôn ngữ SQL.
Ngôn ngữ SQL (Structured Query Language) là ngôn ngữ truy vấn
có cấu trúc, dùng để tạo, thay đổi cấu trúc, thông tin; thao tác với dữ liệu
trong cơ sở dữ liệu.
Phần tiếp theo, bạn sẽ sử dụng các lệnh của SQL để định
nghĩa và thao tác với cơ sở dữ liệu, với bảng và với dữ liệu.
1.1.3
Tạo cơ sở dữ liệu
Để tạo cơ sở dữ liệu, bạn cần phải đảm bảo:
– Máy database server (hay thành phần database engine đang
chạy)
– Dùng chương trình dòng lệnh (CMD, Command Prompt) kết nối
vào database server
Để xem trên server hiện đang có các cơ sở dữ liệu nào? sử dụng
lệnh show databases.
// kết thúc lệnh nhớ có dấu chấm phẩy (;).
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
Theo thông tin hiển thị, hiện tại server đang có 4 cơ sở dữ
liệu của hệ thống.
Lệnh tạo cơ sở dữ liệu mới:
create database if not exists ten_database
mysql> create database if not exists quan_ly_nha_hang;
Query OK, 1 row affected (0.12 sec)
Kiểm tra xem việc tạo cơ sở dữ liệu được chưa?
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| quan_ly_nha_hang |
| sys |
+--------------------+
5 rows in set (0.00 sec)
Nếu tạo một cơ sở dữ liệu đã có rồi thì sao?
mysql> create database quan_ly_nha_hang;
ERROR 1007 (HY000): Can't create database 'quan_ly_nha_hang'; database
exists
Hệ thống sẽ báo lỗi là không tạo được, do đã có rồi. Do vậy
trong lệnh tạo cơ sở dữ liệu mới sẽ có tham số đi kèm là IF NOT EXISTS, để đảm
bảo chỉ tạo cơ sở dữ liệu mới nếu nó chưa tồn tại.
Một máy database server cho phép bạn tạo nhiều cơ sở dữ liệu.
Ví dụ, bạn có thể tạo thêm cơ sở dữ liệu có tên là
quan_ly_sinh_vien.
mysql> create database if not exists quan_ly_sinh_vien;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| quan_ly_nha_hang |
| quan_ly_sinh_vien |
| sys |
+--------------------+
6 rows in set (0.00 sec)
Nếu bạn cố tạo một cơ sở dữ liệu đã có rồi, với tham số IF
NOT EXISTS thì sẽ nhận được lời cảnh báo của hệ thống.
mysql> create database if not exists quan_ly_sinh_vien;
Query OK, 1 row affected, 1 warning (0.07 sec)
Để xem nội dung của cảnh báo, bạn sử dụng lệnh SHOW
WARNINGS.
mysql> show warnings;
+-------+------+------------------------------------------------------------+
| Level | Code | Message
|
+-------+------+------------------------------------------------------------+
| Note | 1007 | Can't create database 'quan_ly_sinh_vien';
database exists |
+-------+------+------------------------------------------------------------+
1 row in set (0.00 sec)
Cơ sở dữ liệu sau khi được tạo sẽ có trong thư mục:
\mysql\data, bạn có thể mở thư mục này để kiểm tra.
Để xóa cơ sở dữ liệu, bạn sử dụng lệnh DROP DATABASE
mysql> drop database if exists quan_ly_sinh_vien;
Query OK, 0 rows affected (0.17 sec)
1.1.4
Tạo bảng
Sau khi đã có cơ sở dữ liệu rồi, công việc tiếp theo của bạn
là tạo (định nghĩa) các bảng dữ liệu.
Trong SQL, các lệnh thường được chia thành hai loại:
– Các lệnh định nghĩa dữ liệu (DDL: data definition
language), ví dụ lệnh tạo cơ sở dữ liệu (CREATE DATABASE), lệnh tạo bảng
(CREATE TABLE)
– Các lệnh thao tác với dữ liệu (DML: data manipulation
language), ví dụ các lệnh truy vấn cơ sở dữ liệu
Khi thực hiện các thao tác với cơ sở dữ liệu, bạn nên đăng
nhập bằng tài khoản thông thường thay vì tài khoản quản trị hệ thống.
Xem các tài khoản đang có trên hệ thống MySQL server (lệnh
này chỉ thực thi được khi bạn đăng nhập bằng tài khoản quản trị hệ thống, ví dụ
root):
mysql> select user from mysql.user;
+------------------+
| user |
+------------------+
| mysql.infoschema |
| mysql.session |
| mysql.sys |
| nvteo |
| root |
+------------------+
5 rows in set (0.00 sec)
Xem phiên làm việc hiện tại đang đăng nhập bằng tài khoản
nào?
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.02 sec)
Bạn đang đăng nhập bằng tài khoản root, vì vậy bạn nên thoát
ra và đăng nhập vào bằng tải khoản thông thường (ví dụ user1). Nếu trong hệ thống
chưa có tài khoản user1, thì bạn cần tạo thêm tài khoản này.
mysql> create user 'user1'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.17 sec)
Kiểm tra lại xem đã tạo được user1 chưa?
mysql> select user from mysql.user;
+------------------+
| user |
+------------------+
| mysql.infoschema |
| mysql.session |
| mysql.sys |
| nvteo |
| root |
| user1 |
+------------------+
6 rows in set (0.00 sec)
Thoát khỏi tài khoản root, và đăng nhập vào tài khoản user1
để thực hiện các thao tác liên quan đến dữ liệu.
mysql> quit;
Bye
C:\Program Files\mysql\bin>mysql -u user1 -h localhost -p
Enter password: ******
Đầu tiên cần chắc chắn là bạn đang làm việc với cơ sở dữ liệu
nào, bằng lệnh USE.
mysql> use quan_ly_nha_hang;
ERROR 1044 (42000): Access denied for user 'user1'@'localhost' to
database 'quan_ly_nha_hang'
Tuy nhiên, user1 chưa có quyền sử dụng cơ sở dữ liệu quan_ly_nha_hang,
nên bạn cần thực hiện gán quyền truy cập. Nhớ đăng nhập bằng root thì mới gán
quyền được.
mysql> grant all on *.* to 'user1'@'localhost';
Query OK, 0 rows affected (0.11 sec)
Sau khi gán quyền cho user1, bạn đăng nhập lại vào tài khoản
user1, khai báo sử dụng cơ sở dữ liệu quan_ly_nha_hang, để tạo bảng có tên là
loai_mon_an.
mysql> use quan_ly_nha_hang;
Database changed
mysql> create table if not exists loai_mon_an(ma_loai int,ten_loai
varchar(200), mo_ta varchar(500), hinh varchar(100));
Query OK, 0 rows affected (0.12 sec)
Tương tự như khi tạo cơ sở dữ liệu, bạn chỉ có thể tạo bảng
nếu nó chưa có, vì vậy bạn cần có thêm tham số IF NOT EXISTS. Sau tên bảng (loai_mon_an),
bạn cần cung cấp thông tin mô tả cho các cột của bảng.
Xem các bảng đang có trong cơ sở dữ liệu.
mysql> show tables;
+----------------------------+
| Tables_in_quan_ly_nha_hang |
+----------------------------+
| loai_mon_an |
+----------------------------+
1 row in set (0.15 sec)
Bạn cũng có thể vào thư mục mysql\data\ten_co_so_du_lieu, để
kiểm tra xem có bảng vừa tạo hay chưa?
Xóa một bảng.
mysql> drop table if exists loai_mon_an;
Query OK, 0 rows affected (0.04 sec)
mysql> show tables;
Empty set (0.00 sec)
1.1.5
Xem và đọc thêm
– Dùng các từ khóa sau để tìm kiếm trên mạng và đọc thêm: tạo
cơ sở dữ liệu bằng dòng lệnh, tạo cơ sở dữ liệu trong mysql, create a mysql
database using CLI, SHOW WARNINGS Statement
– How to work with MySQL: https://www3.ntu.edu.sg/home/ehchua/programming/sql/MySQL_HowTo.html
– Chu Thị Hường, Bài giảng Hệ quản trị CSDL, [chương 2: các
câu lệnh SQL cơ bản] [ebook]
– Nguyễn Anh Tuấn, https://www.youtube.com/watch?v=jk8s9zb4myU
1.1.6
Bài tập và thực hành
Bài 1. Làm lại các câu lệnh ở phần lý thuyết.
Bài 2. Tạo các bảng dữ liệu sau cho cơ sở dữ liệu quan_ly_nha_hang
loai_mon_an
(Loại món ăn)
# |
Name |
Type |
Collation |
Attributes |
Null |
Default |
Extra |
1 |
ma_loai |
int(11) |
No |
None |
AUTO_INCREMENT |
||
2 |
ten_loai |
varchar(200) |
utf8_unicode_ci |
No |
None |
||
3 |
mo_ta |
varchar(500) |
utf8_unicode_ci |
No |
None |
||
4 |
hinh |
varchar(100) |
utf8_unicode_ci |
No |
None |
mon_an (Món ăn)
# |
Name |
Type |
Collation |
Attributes |
Null |
Default |
Extra |
1 |
ma_mon |
int(11) |
No |
None |
AUTO_INCREMENT |
||
2 |
ma_loai |
int(11) |
No |
None |
|||
3 |
ten_mon |
varchar(100) |
utf8_unicode_ci |
No |
None |
||
4 |
noi_dung_tom_tat |
varchar(200) |
utf8_unicode_ci |
No |
None |
||
5 |
noi_dung_chi_tiet |
varchar(500) |
utf8_unicode_ci |
No |
None |
||
6 |
don_gia |
double |
No |
None |
|||
7 |
don_gia_khuyen_mai |
double |
No |
None |
|||
8 |
khuyen_mai |
varchar(200) |
utf8_unicode_ci |
No |
nước ngọt, khăn
lạnh |
||
9 |
hinh |
varchar(100) |
utf8_unicode_ci |
No |
None |
||
10 |
ngay_cap_nhat |
date |
No |
None |
|||
11 |
dvt |
varchar(50) |
utf8_unicode_ci |
No |
đĩa |
||
12 |
trong_ngay |
boolean |
No |
0 |
khach_hang (Khách
hàng)
# |
Name |
Type |
Collation |
Attributes |
Null |
Default |
Extra |
1 |
ma_khach_hang |
int(11) |
No |
None |
AUTO_INCREMENT |
||
2 |
ten_khach_hang |
varchar(100) |
utf8_unicode_ci |
No |
None |
||
3 |
email |
varchar(50) |
utf8_unicode_ci |
No |
None |
||
4 |
dia_chi |
varchar(100) |
utf8_unicode_ci |
No |
None |
||
5 |
dien_thoai |
varchar(20) |
utf8_unicode_ci |
No |
None |
||
6 |
ghi_chu |
varchar(200) |
utf8_unicode_ci |
No |
None |
hoa_don (Hóa đơn)
# |
Name |
Type |
Collation |
Attributes |
Null |
Default |
Extra |
1 |
ma_hoa_don |
int(11) |
No |
None |
AUTO_INCREMENT |
||
2 |
ma_khach_hang |
int(11) |
No |
None |
|||
3 |
ngay_dat |
date |
No |
None |
|||
4 |
tong_tien |
double |
No |
None |
|||
5 |
tien_dat_coc |
double |
No |
None |
|||
6 |
con_lai |
double |
No |
None |
|||
7 |
hinh_thuc_thanh_toan |
varchar(100) |
utf8_unicode_ci |
No |
None |
||
8 |
ghi_chu |
varchar(200) |
utf8_unicode_ci |
No |
None |
chi_tiet_hoa_don
(Chi tiết hóa đơn)
# |
Name |
Type |
Collation |
Attributes |
Null |
Default |
Extra |
1 |
ma_hoa_don |
int(11) |
No |
None |
|||
2 |
ma_mon |
int(11) |
No |
None |
|||
3 |
so_luong |
int(11) |
No |
None |
|||
4 |
don_gia |
double |
No |
None |
|||
5 |
mon_thuc_don |
boolean |
No |
1 |
1.1.7
Câu hỏi ôn tập
Câu 1. Trong lệnh CREATE DATABASE, tham số IF NOT EXISTS
mang ý nghĩa gì?
A. Để tạo xong cơ sở dữ liệu rồi thoát khỏi chương trình
B. Để xóa một cơ sở dữ liệu có sẵn
C. Để chỉ tạo cơ sở dữ liệu nếu nó chưa có
D. Để không thực thi lệnh
Câu 2. Trong mysql, lệnh SHOW WARNINGS dùng để làm gì?
A. Khởi chạy MySQL server
B. Dùng để xóa sạch màn hình nhập lệnh
C. Dùng để hiển thị trạng thái của MySQL server
D. Hiển thị các lỗi, cảnh báo, chú ý của các lệnh vừa được
thực thi trong phiên làm việc hiện thời
Câu 3. Trong lệnh DROP DATABASE, tham số IF EXISTS mang ý
nghĩa gì?
A. Chỉ xóa cơ sở dữ liệu nếu nó có tồn tại
B. Thoát khỏi phiên làm việc
C. Tắt MySQL server
D. Kiểm tra MySQL server có chạy hay không
Câu 4. Trong SQL, các lệnh định nghĩa dữ liệu được gọi là
DDL, nó là viết tắt của cụm từ nào?
A. Database Definition Language
B. Data Definition Language
C. Defining Data Language
D. Do Database Local
Câu 5. Trong SQL, các lệnh thao tác với dữ liệu được gọi là
DML, nó là viết tắt của cụm từ nào?
A. Data
Manipulation Language
B. Database
Manipulation Language
C. Doing Make Language
D. Drop MySQL Local
---
Đáp án 1 (C), 2 (D), 3 (A), 4 (B), 5 (A)
//////
4
-----