Bài 1. Giới thiệu SQL, CSDL quan hệ và phpMyAdmin

SQL là ngôn ngữ chuẩn để làm việc với cơ sở dữ liệu quan hệ như MySQL, PostgreSQL, SQL Server. Bài này giải thích CSDL quan hệ là gì, các nhóm lệnh SQL, cách viết câu lệnh và thực hành trên phpMyAdmin của XAMPP với CSDL mẫu quản lý sinh viên dùng xuyên suốt loạt bài.

40 phútCơ bản
Bạn sẽ học được
  • Hiểu bảng, hàng, cột, khóa và quan hệ
  • Phân biệt DDL, DML, DQL, DCL
  • Viết câu lệnh SQL đúng cú pháp, chú thích
  • Tạo CSDL mẫu qlsv trong phpMyAdmin
Thuật ngữ cần biết
CSDL quan hệ
Dữ liệu lưu trong các bảng liên kết nhau bằng khóa.
Bản ghi (row)
Một dòng trong bảng, ví dụ một sinh viên.
Trường (column)
Một cột: ma_sv, ho_ten...
Hệ quản trị CSDL
Phần mềm quản lý CSDL: MySQL, MariaDB, PostgreSQL, SQL Server.

Khái niệm và lý thuyết

Một CSDL quan hệ gồm nhiều bảng, mỗi bảng như một trang tính Excel có cột đặt tên và kiểu rõ ràng. Mỗi dòng được định danh duy nhất bằng khóa chính; bảng này tham chiếu bảng kia qua khóa ngoại (sinh viên thuộc lớp nào). SQL (Structured Query Language) mô tả bạn muốn gì, hệ quản trị tự tìm cách lấy.

NhómLệnhViệc
DDL (định nghĩa)CREATE, ALTER, DROPTạo, sửa, xóa CSDL/bảng
DML (thao tác)INSERT, UPDATE, DELETEThêm, sửa, xóa dữ liệu
DQL (truy vấn)SELECTLấy dữ liệu
DCL/TCLGRANT, COMMIT, ROLLBACKQuyền, giao dịch

Quy ước viết: từ khóa VIẾT HOA, tên bảng/cột chữ thường có gạch dưới, mỗi lệnh kết thúc bằng ;, chú thích bằng -- hoặc /* */. SQL không phân biệt hoa thường với từ khóa, nhưng tên bảng trên Linux thì có.

phpMyAdmin

  • Khởi động Apache và MySQL trong XAMPP, mở http://localhost/phpmyadmin.
  • Tab Databases → nhập qlsv, chọn utf8mb4_unicode_ci → Create.
  • Chọn CSDL qlsv → tab SQL: dán câu lệnh bên dưới → Go.
  • Tab Structure xem bảng, Browse xem dữ liệu, Export sao lưu ra tệp .sql.

XAMPP hiện cài MariaDB, một nhánh tương thích gần như hoàn toàn với MySQL; mọi lệnh trong loạt bài chạy được trên cả hai.

CSDL mẫu của loạt bài

CREATE DATABASE IF NOT EXISTS qlsv CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE qlsv;

CREATE TABLE lop (
  id INT AUTO_INCREMENT PRIMARY KEY,
  ma_lop VARCHAR(20) NOT NULL UNIQUE,
  ten_lop VARCHAR(100) NOT NULL,
  khoa VARCHAR(100)
);
CREATE TABLE sinhvien (
  id INT AUTO_INCREMENT PRIMARY KEY,
  ma_sv VARCHAR(10) NOT NULL UNIQUE,
  ho_ten VARCHAR(100) NOT NULL,
  ngay_sinh DATE,
  gioi_tinh ENUM('Nam','Nữ') DEFAULT 'Nam',
  que_quan VARCHAR(100),
  email VARCHAR(100),
  lop_id INT,
  FOREIGN KEY (lop_id) REFERENCES lop(id)
);
CREATE TABLE monhoc (
  id INT AUTO_INCREMENT PRIMARY KEY,
  ma_mon VARCHAR(10) NOT NULL UNIQUE,
  ten_mon VARCHAR(100) NOT NULL,
  so_tin_chi TINYINT NOT NULL DEFAULT 3
);
CREATE TABLE diem (
  id INT AUTO_INCREMENT PRIMARY KEY,
  sinhvien_id INT NOT NULL,
  monhoc_id INT NOT NULL,
  diem DECIMAL(4,2),
  hoc_ky VARCHAR(10),
  FOREIGN KEY (sinhvien_id) REFERENCES sinhvien(id) ON DELETE CASCADE,
  FOREIGN KEY (monhoc_id) REFERENCES monhoc(id)
);

INSERT INTO lop (ma_lop, ten_lop, khoa) VALUES
('K65TIN','K65 ĐHSP Tin học','KHTN&CN'), ('K66TIN','K66 ĐHSP Tin học','KHTN&CN'), ('K66CNTT','K66 Công nghệ thông tin','KHTN&CN');
INSERT INTO sinhvien (ma_sv, ho_ten, ngay_sinh, gioi_tinh, que_quan, email, lop_id) VALUES
('SV001','Lò Văn An','2006-03-15','Nam','Sơn La',Địa chỉ email này đang được bảo vệ từ spam bots, bạn cần kích hoạt Javascript để xem nó. Bạn cần kích hoạt Javascript để xem nó.',2),
('SV002','Cầm Thị Bình','2006-07-22','Nữ','Sơn La',Địa chỉ email này đang được bảo vệ từ spam bots, bạn cần kích hoạt Javascript để xem nó. Bạn cần kích hoạt Javascript để xem nó.',2),
('SV003','Vì Văn Chi','2005-11-02','Nam','Điện Biên',Địa chỉ email này đang được bảo vệ từ spam bots, bạn cần kích hoạt Javascript để xem nó. Bạn cần kích hoạt Javascript để xem nó.',1),
('SV004','Lường Thị Dung','2006-01-30','Nữ','Lai Châu',NULL,3),
('SV005','Quàng Văn Em','2005-09-09','Nam','Sơn La',Địa chỉ email này đang được bảo vệ từ spam bots, bạn cần kích hoạt Javascript để xem nó. Bạn cần kích hoạt Javascript để xem nó.',1),
('SV006','Hà Thị Phương','2006-12-12','Nữ','Hòa Bình',Địa chỉ email này đang được bảo vệ từ spam bots, bạn cần kích hoạt Javascript để xem nó. Bạn cần kích hoạt Javascript để xem nó.',3);
INSERT INTO monhoc (ma_mon, ten_mon, so_tin_chi) VALUES
('ICT0023','Thiết kế Web',3), ('ICT0031','Lập trình ứng dụng Web',3), ('ICT0012','Cơ sở dữ liệu',3);
INSERT INTO diem (sinhvien_id, monhoc_id, diem, hoc_ky) VALUES
(1,1,8.5,'HK1'),(1,2,9.0,'HK2'),(2,1,7.0,'HK1'),(2,3,6.5,'HK1'),(3,1,9.2,'HK1'),(3,2,8.0,'HK2'),
(4,3,4.5,'HK1'),(5,1,5.5,'HK1'),(5,3,7.5,'HK1'),(6,2,8.8,'HK2'),(6,3,NULL,'HK1');

Bốn bảng: lớp, sinh viên, môn học, điểm. Mọi ví dụ trong loạt SQL và loạt PHP và MySQL đều dùng CSDL này.

Dòng lệnh MySQL

C:\xampp\mysql\bin\mysql -u root
MariaDB> SHOW DATABASES;
MariaDB> USE qlsv;
MariaDB> SHOW TABLES;
MariaDB> DESCRIBE sinhvien;
MariaDB> SELECT * FROM sinhvien;

Dòng lệnh hữu ích khi chạy tệp .sql lớn hoặc trên máy chủ không có phpMyAdmin.

Mẹo hay

Lưu các câu lệnh đã viết vào tệp .sql trong dự án (ví dụ database/qlsv.sql) để tái tạo CSDL ở máy khác bằng một lần Import.

Lưu ý

Chọn bộ mã utf8mb4_unicode_ci ngay khi tạo CSDL; chọn sai sẽ lỗi tiếng Việt và sắp xếp theo tên không đúng.

Thực hành
  1. Tạo CSDL qlsv và chạy script mẫu, xem 4 bảng trong tab Structure.
  2. Dùng Browse xem bảng sinhvien, thử sửa một dòng bằng giao diện.
  3. Xuất CSDL ra tệp qlsv.sql, xóa CSDL rồi Import lại.
  4. Chạy DESCRIBE từng bảng và ghi lại kiểu dữ liệu các cột.
Tóm tắt bài học
  • CSDL quan hệ: bảng, hàng, cột, khóa chính, khóa ngoại.
  • SQL gồm DDL, DML, DQL; từ khóa viết hoa, kết thúc bằng ;.
  • phpMyAdmin tab SQL để chạy lệnh; Export/Import để sao lưu.
  • CSDL mẫu qlsv dùng cho toàn bộ loạt bài.