Sau khi cài đặt MySQL thành công trên cả hệ điều hành Windows và Linux, các câu lệnh SQL đều tuân theo cùng một cú pháp chuẩn. Mỗi câu lệnh bắt buộc phải kết thúc bằng dấu chấm phẩy (;). Lưu ý quan trọng về phân biệt chữ hoa/chữ thường: trên Windows tên bảng không phân biệt hoa thường, trong khi trên Linux thì có — ví dụ employees và EMPLOYEES được coi là hai bảng khác nhau. Để đảm bảo tính nhất quán và tránh lỗi khi di chuyển giữa môi trường, nên quy ước sử dụng toàn bộ ký tự viết thường cho tên cơ sở dữ liệu, bảng và cột.
Các cơ sở dữ liệu hệ thống mặc định sau khi cài đặt bao gồm:
mysql: Lưu trữ thông tin tài khoản người dùng, đặc quyền truy cập và cấu hình bảo mật.information_schema: Là kho dữ liệu siêu (meta-database), chứa mô tả về các đối tượng như bảng, cột, ràng buộc, tập ký tự, phân vùng, và quyền sử dụng.test: Cơ sở dữ liệu mẫu do hệ thống tạo sẵn, dành để thử nghiệm và không yêu cầu đặc quyền đặc biệt.
1. Chuyển đổi cơ sở dữ liệu làm việc
USE test;2. Liệt kê các bảng trong cơ sở dữ liệu hiện tại
SHOW TABLES;3. Xoá cơ sở dữ liệu
DROP DATABASE IF EXISTS demo_db;4. Tạo bảng mới
Cú pháp tổng quát: CREATE TABLE table_name (column_definition [, ...]);
CREATE TABLE staff (
full_name VARCHAR(50),
start_date DATE,
monthly_salary DECIMAL(12, 2),
unit_id TINYINT UNSIGNED
);5. Xoá bảng
DROP TABLE IF EXISTS staff;6. Điều chỉnh cấu trúc bảng
-- Thay đổi kiểu dữ liệu cột
ALTER TABLE staff MODIFY full_name VARCHAR(100);
-- Kiểm tra cấu trúc bảng
DESCRIBE staff;
-- Thêm cột mới
ALTER TABLE staff ADD COLUMN hire_year YEAR AFTER start_date;
-- Xoá cột
ALTER TABLE staff DROP COLUMN hire_year;
-- Đổi tên cột và kiểu dữ liệu đồng thời
ALTER TABLE staff CHANGE unit_id division_id SMALLINT UNSIGNED;
-- Thêm cột vào vị trí cụ thể (sau cột start_date)
ALTER TABLE staff ADD COLUMN birth_date DATE AFTER start_date;
-- Di chuyển cột monthly_salary lên đầu danh sách
ALTER TABLE staff MODIFY monthly_salary DECIMAL(12, 2) FIRST;7. Đổi tên bảng
ALTER TABLE staff RENAME TO team_members;8. Chèn dữ liệu
-- Chèn một bản ghi
INSERT INTO team_members (full_name, monthly_salary) VALUES ('Nguyen Van A', 15000000);
-- Chèn nhiều bản ghi cùng lúc
INSERT INTO team_members (full_name, start_date, monthly_salary)
VALUES
('Tran Thi B', '2022-03-15', 18500000),
('Le Van C', '2023-07-22', 22000000);9. Cập nhật dữ liệu
-- Cập nhật theo điều kiện đơn giản
UPDATE team_members SET monthly_salary = 20000000 WHERE full_name = 'Nguyen Van A';
-- Cập nhật đồng thời từ hai bảng (cần điều kiện liên kết rõ ràng)
UPDATE team_members t
JOIN departments d ON t.division_id = d.id
SET t.monthly_salary = t.monthly_salary * 1.1
WHERE d.name = 'Engineering';10. Xoá dữ liệu
-- Xoá bản ghi thoả mãn điều kiện
DELETE FROM team_members WHERE start_date < '2020-01-01';11. Truy vấn dữ liệu cơ bản
-- Loại bỏ trùng lặp
SELECT DISTINCT * FROM team_members;
-- Lọc theo biểu thức so sánh
SELECT * FROM team_members WHERE monthly_salary >= 18000000;
-- Sắp xếp tăng/giảm dần
SELECT * FROM team_members ORDER BY monthly_salary DESC;
-- Giới hạn số dòng trả về: lấy 1 bản ghi có lương cao nhất
SELECT * FROM team_members ORDER BY monthly_salary DESC LIMIT 1;
-- Lấy 3 bản ghi tiếp theo sau bản ghi đầu tiên (offset = 1, count = 3)
SELECT * FROM team_members ORDER BY monthly_salary ASC LIMIT 1, 3;12. Tổng hợp dữ liệu
-- Nhóm theo cột và đếm số lượng
SELECT division_id, COUNT(*) AS member_count
FROM team_members
GROUP BY division_id;
-- Thêm tổng cộng toàn bộ nhóm (ROLLUP)
SELECT division_id, COUNT(*)
FROM team_members
GROUP BY division_id WITH ROLLUP;
-- Lọc nhóm sau khi tổng hợp
SELECT full_name, AVG(monthly_salary) AS avg_pay
FROM team_members
GROUP BY full_name
HAVING COUNT(*) > 1;13. Kết nối bảng
-- INNER JOIN (chỉ giữ lại các bản ghi khớp ở cả hai bảng)
SELECT t.full_name, d.name AS dept_name
FROM team_members t
INNER JOIN departments d ON t.division_id = d.id;
-- LEFT JOIN (giữ tất cả bản ghi từ bảng trái, bổ sung dữ liệu từ bảng phải nếu có)
SELECT t.full_name, d.name
FROM departments d
LEFT JOIN team_members t ON d.id = t.division_id;
-- RIGHT JOIN (tương tự nhưng ưu tiên bảng phải)
SELECT t.full_name, d.name
FROM team_members t
RIGHT JOIN departments d ON t.division_id = d.id;14. Truy vấn con (subquery)
-- Kiểm tra tồn tại trong tập kết quả con
SELECT * FROM team_members
WHERE division_id IN (SELECT id FROM departments WHERE status = 'active');
-- So sánh với giá trị duy nhất từ truy vấn con
SELECT * FROM team_members
WHERE monthly_salary > (SELECT AVG(monthly_salary) FROM team_members);15. Gộp kết quả từ nhiều truy vấn
-- UNION ALL: ghép trực tiếp, không loại trùng
SELECT division_id FROM team_members
UNION ALL
SELECT id FROM departments;
-- UNION: tự động loại bỏ bản ghi trùng lặp sau khi ghép
SELECT division_id FROM team_members
UNION
SELECT id FROM departments;