Chủ
đề: SQL – Ngôn ngữ kiểm soát cơ sở dữ liệu
Chào các bạn, ở các
bài trước chúng ta đã biết Cơ sở dữ liệu (CSDL) giống như một nhà kho thông tin
khổng lồ. Vậy làm thế nào để chúng ta có thể "giao tiếp" với người quản
lý kho (Hệ quản trị CSDL) để yêu cầu lấy đồ, cất đồ, hay sắp xếp lại đồ đạc? Đó
chính là lúc chúng ta cần đến SQL!
SQL (Structured
Query Language) dịch nôm na là
"Ngôn ngữ truy vấn có cấu trúc". Nghe thì "nguy hiểm" vậy
thôi, nhưng thực chất nó là một bộ các câu lệnh tiếng Anh rất đơn giản mà chúng
ta dùng để "ra lệnh" cho CSDL.
Tại sao phải dùng
SQL?
Hãy tưởng tượng bạn muốn tìm danh sách các bản nhạc của nhạc sĩ "Jack"
trong một thư viện nhạc số. Có hai cách:
Cách 1 (Dùng ngôn ngữ lập trình như Python): Bạn phải tự viết một chương trình: Mở file dữ
liệu à Đọc từng dòng một à Tách thông tin của dòng đó ra à Kiểm tra xem tên nhạc sĩ có phải "Jack"
không à Nếu đúng thì lấy ra tên bản nhạc à In ra màn hình. Cách này rất dài dòng, phức tạp
và nếu lần sau muốn tìm nhạc của "Trịnh Công Sơn", bạn lại phải sửa chương trình.
Cách 2 (Dùng SQL): Bạn
chỉ cần viết một câu lệnh duy nhất và gửi cho "người quản kho":
SELECT
TenBN FROM BanNhac WHERE TenNhacSi = 'Jack';
Bạn thấy không? Với SQL, bạn chỉ cần nói ra điều mình muốn, chứ
không cần chỉ cho "người quản kho" phải làm như thế nào. Mọi
việc phức tạp còn lại, hệ thống sẽ tự lo. Đó chính là sức mạnh của SQL!
SQL (Structured Query Language) là Ngôn ngữ truy vấn có cấu trúc, một tiêu chuẩn quốc tế để quản lý và
tương tác với cơ sở dữ liệu.
PHẦN 1: NHÓM
LỆNH DDL
Trước khi cất đồ đạc, chúng ta cần xây nhà đã! Nhóm lệnh DDL (Data
Definition Language - Ngôn ngữ định nghĩa dữ liệu) giúp chúng ta làm việc này:
tạo ra CSDL, tạo ra các "căn phòng" (bảng) để chứa dữ liệu.
1. Tạo Cơ
sở dữ liệu
Lệnh CREATE DATABASE dùng để tạo
ra một CSDL mới hoàn toàn. Giống như bạn mua một mảnh đất để chuẩn bị xây nhà vậy.
Lưu ý: Nếu bạn đang thực
hành trên hệ thống TTKT SQL Editor thì bạn sẽ
không thể sử dụng lệnh này!
Cú pháp: CREATE DATABASE
ten_co_so_du_lieu;
Ví dụ: Chúng ta muốn quản
lý thông tin học sinh của trường. Hãy tạo một CSDL tên là QuanLyHocSinh.
CREATE
DATABASE QuanLyHocSinh;
2. Tạo Bảng
Khi đã có "mảnh đất" QuanLyHocSinh, chúng ta cần xây các "căn phòng" (bảng) để chứa thông tin cụ
thể. Ví dụ: phòng HocSinh để lưu thông tin học
sinh, phòng LopHoc để lưu thông tin các
lớp.
Lệnh CREATE TABLE sẽ giúp chúng
ta. Khi tạo bảng, ta phải định nghĩa các "cột" (trường) và "kiểu
dữ liệu" cho mỗi cột.
Kiểu dữ liệu là gì? Nó
quy định loại thông tin mà cột đó sẽ chứa. Ví dụ:
|
INT INTEGER |
Chứa số nguyên (tuổi, sĩ số lớp...) |
|
VARCHAR(n) |
Chứa một đoạn văn bản (text) có độ dài
thay đổi, nhưng không quá n ký tự (họ tên, địa chỉ...) |
|
CHAR(n) CHARACTER(n) |
Chứa một đoạn văn bản có độ dài cố định
n ký tự (mã học sinh, mã lớp...) |
|
DATE |
Chứa ngày tháng năm (ngày sinh) |
|
TIME |
Chứa thời gian theo định dạng HH:MM:SS (giờ vào lớp) |
|
BOOLEAN |
Chỉ chứa 1 trong 2 giá trị: Đúng (True/1)
hoặc Sai (False/0) |
|
REAL |
Chứa số thực có dấu phẩy động gần giống
với FLOAT |
|
FLOAT |
Chứa số thực có độ chính xác cao hơn
và có thể lưu trữ các giá trị lớn hơn so với REAL |
Cú pháp:
CREATE TABLE ten_bang (
ten_cot_1
KIEU_DU_LIEU,
ten_cot_2
KIEU_DU_LIEU,
...
PRIMARY KEY
(ten_cot_lam_khoa_chinh)
);
Ví dụ: Tạo bảng HocSinh
trong CSDL QuanLyHocSinh.
CREATE TABLE HocSinh (
MaHS
CHAR(5), -- Mã học sinh, ví dụ
'HS001', có 5 ký tự
HoTen
VARCHAR(50), -- Họ tên, tối đa 50 ký
tự
NgaySinh
DATE, -- Ngày sinh theo dạng
'NĂM-THÁNG-NGÀY'
DiemToan
REAL, -- Điểm toán, là số thực
PRIMARY KEY
(MaHS) -- Khai báo MaHS là khóa chính
);
3. Các lệnh khác
|
Câu lệnh SQL |
Ý nghĩa |
|
ALTER TABLE |
Thay đổi định nghĩa bảng |
|
PRIMARY KEY |
Khai báo khóa chính |
|
FOREIGN KEY ... REFERENCES ... |
Khai báo khóa ngoại |
|
RENAME TO |
Đổi tên bảng |
|
ADD COLUMN |
Thêm cột mới |
|
RENAME COLUMN ... TO ... |
Đổi tên cột |
Lưu ý: Hệ thống TTKT SQL Editor không hỗ trợ thay đổi PRIMARY
KEY và FOREIGN KEY bảng đã có sẵn
Vi dụ: Khởi tạo CSDL âm nhạc, đặt tên là music và khởi
tạo các bảng Nhạc sĩ, Bản nhạc có tên tương ứng là nhacsi và bannhac.
PHẦN 2: LỆNH DML
Nhà đã xây xong, giờ là lúc "dọn đồ vào ở": thêm, xem, sửa,
xóa dữ liệu. Nhóm lệnh DML (Data Manipulation Language - Ngôn ngữ thao tác dữ
liệu) sẽ giúp chúng ta.
1. Thêm dữ liệu - INSERT INTO
Dùng để thêm một hàng dữ liệu mới vào bảng.
Cú pháp: INSERT INTO ten_bang
(cot1, cot2, ...) VALUES (giatri1, giatri2, ...);
Ví dụ: Thêm 2 bạn học
sinh mới vào bảng HocSinh.
-- Thêm bạn An
INSERT INTO HocSinh (MaHS, HoTen, NgaySinh, DiemToan)
VALUES ('HS001', 'Nguyễn Văn An', '2007-05-20', 8.5);
-- Thêm bạn Bình
INSERT INTO HocSinh (MaHS, HoTen, NgaySinh, DiemToan)
VALUES ('HS002', 'Trần Thị Bình', '2007-09-12', 9.0);
2. Lấy dữ liệu - SELECT
Đây là lệnh quan trọng và được dùng nhiều nhất! Nó giúp chúng ta xem và
lấy dữ liệu ra khỏi bảng.
Cú pháp cơ bản: SELECT ten_cot FROM ten_bang;
|
Câu truy xuất dữ liệu |
Ý nghĩa |
|
SELECT <dữ liệu cần lấy> |
<dữ liệu
cần lấy> có thể là danh sách các
trường hoặc hàm với biến là trường |
|
FROM
<tên bảng> |
Chỉ định bảng cần truy vấn dữ liệu |
|
WHERE
<điều kiện chọn> |
Chỉ định chọn các dòng thỏa mãn điều kiện xác định |
|
ORDER BY
<tên trường> |
Sắp xếp các dòng kết quả theo thứ tự được chỉ định |
Ví dụ 1: Xem toàn bộ thông tin của tất cả học sinh trong cơ sở dữ liệu
đã được lưu trữ sẵn
Dấu * đại diện cho "tất cả các cột".
SELECT *
FROM HocSinh;
Kết quả:
Ví dụ 2: Chỉ xem Họ tên và Điểm toán
SELECT
HoTen, DiemToan FROM HocSinh;
Kết quả:
Thêm điều kiện lọc kết
quả dữ liệu trả về với câu lệnh WHERE
WHERE giống như một cái rây, giúp ta lọc ra những dòng thỏa mãn điều kiện.
Ví dụ 3: Tìm những học sinh có điểm Toán trên 8.5 và tìm học sinh có điểm
Toán giảm dần
SELECT *
FROM HocSinh WHERE DiemToan > 8.5;
Kết quả:
SELECT
HoTen, DiemToan FROM HocSinh ORDER BY DiemToan DESC;
- ASC: Tăng dần (mặc định)
- DESC: Giảm dần
Kết quả:
3. Sửa dữ liệu - UPDATE
Dùng để cập nhật, thay đổi dữ liệu của các hàng đã có sẵn.
Chú ý: Luôn luôn dùng WHERE khi UPDATE.
Nếu không, bạn sẽ sửa tất cả các dòng trong bảng!
Cú pháp: UPDATE ten_bang SET
ten_cot = gia_tri_moi WHERE dieu_kien;
Ví dụ: Bạn "Nguyễn
Văn An" kiểm tra lại bài và được cộng thêm 0.5 điểm. Ta cần cập nhật điểm
của bạn ấy.
UPDATE HocSinh
SET DiemToan = 9.0
WHERE MaHS = 'HS001';
4. Xóa dữ liệu - DELETE
Dùng để xóa một hoặc nhiều hàng ra khỏi bảng.
Chú ý CỰC KỲ QUAN TRỌNG:
Giống như UPDATE, luôn luôn dùng WHERE khi DELETE trừ khi bạn thật sự muốn xóa
sạch cả bảng.
Cú pháp: DELETE FROM ten_bang
WHERE dieu_kien;
Ví dụ: Xóa học sinh có
mã 'HS002' ra khỏi CSDL.
DELETE
FROM HocSinh WHERE MaHS = 'HS002';
PHẦN 3: LỆNH JOIN
Thông tin thường không nằm ở một nơi. Ví dụ, bảng HocSinh lưu điểm, còn bảng LopHoc lưu tên giáo viên chủ nhiệm. Làm sao để xem
"Học sinh A do cô giáo nào chủ nhiệm?"
Đó là lúc ta cần JOIN để
kết nối các bảng lại với nhau thông qua các cột chung (khóa chính - khóa ngoại).
Ví dụ: Giả sử ta có
thêm bảng
LopHoc:
CREATE TABLE LopHoc (
MaLop
CHAR(4),
TenLop
VARCHAR(10),
GVCN
VARCHAR(50),
PRIMARY KEY
(MaLop)
);
Và ta thêm cột MaLop vào bảng HocSinh để biết học sinh đó thuộc lớp nào.
Bây giờ, để xem tên học sinh và tên giáo viên chủ nhiệm của họ, ta dùng INNER JOIN.
SELECT HocSinh.HoTen, LopHoc.GVCN
FROM HocSinh
INNER JOIN LopHoc ON HocSinh.MaLop = LopHoc.MaLop;
Lệnh này có nghĩa là: "Hãy lấy cột HoTen từ bảng HocSinh và cột
GVCN từ bảng LopHoc, bằng cách ghép 2 bảng này lại với nhau tại những dòng nào
có MaLop bằng nhau."
PHẦN 4: BẢO MẬT VÀ PHÂN QUYỀN
Phần này nâng cao hơn,
giúp bảo mật CSDL. "Bảo vệ" sẽ quyết định ai được làm gì.
Lưu ý: Nếu bạn đang thực
hành trên hệ thống TTKT SQL Editor thì bạn sẽ
không thể sử dụng lệnh này!
- GRANT: Cấp quyền (ví dụ: cấp quyền chỉ được xem, không được sửa, xóa).
- REVOKE: Thu hồi quyền.
Ví dụ: Cấp cho người dùng tên tuan quyền được dùng lệnh
xem (SELECT) bảng HocSinh.
GRANT SELECT
ON HocSinh
TO tuan;
Ví dụ: Cấp cho người dùng tên tuan quyền được dùng lệnh
xem (SELECT) tất cả các bảng trong CSDL MyDb.
GRANT SELECT
ON MyDb.*
TO tuan;
Ví dụ: Thu hồi quyền được dùng lệnh xem (SELECT) bảng
HocSinh của người dùng tuan.
REVOKE SELECT
ON HocSinh
TO tuan;
PHẦN 5: LUYỆN TẬP
Giờ hãy thử sức với một bài toán nhỏ nhé! Chúng ta sẽ quản lý một thư viện
sách.
Tạo bảng: Hãy viết lệnh
SQL để tạo bảng Sach với các cột sau:
MaSach (CHAR(5))
TenSach (VARCHAR(100))
TacGia (VARCHAR(50))
NamXuatBan (INT)
Thêm dữ liệu: Viết lệnh
để thêm 2 cuốn sách sau vào bảng:
('S0001', 'Dế Mèn Phiêu Lưu Ký', 'Tô Hoài',
1941)
('S0002', 'Lão Hạc', 'Nam Cao', 1943)
Truy vấn: Viết lệnh để:
a. Lấy ra tất cả thông tin các cuốn sách.
b. Lấy ra Tên sách và Tác giả của những cuốn
sách được xuất bản sau năm 1942.
c. Tìm thông tin của cuốn sách có tên 'Dế Mèn
Phiêu Lưu Ký'.
|
CLICK VÀO ĐÂY ĐỂ TRUY
CẬP TRANG THỰC HÀNH, HOẶC SCAN QR CODE BÊN DƯỚI: |