Thao tác thêm, sửa, xóa bản ghi
Để quản lý dữ liệu trong bảng, các thao tác cơ bản bao gồm chèn (INSERT), cập nhật (UPDATE) và xóa (DELETE).
Chèn dữ liệu mới
Sử dụng lệnh INSERT để thêm một hoặc nhiều dòng vào bảng:
-- Tạo bảng nhân viên
CREATE TABLE employee_info (
id INT PRIMARY KEY AUTO_INCREMENT,
full_name VARCHAR(50) NOT NULL UNIQUE,
birth_date DATE,
monthly_salary DECIMAL(10,2)
);
-- Chèn từng bản ghi cụ thể
INSERT INTO employee_info (id, full_name, birth_date, monthly_salary)
VALUES (1, 'Nguyen Van A', '1990-05-15', 8500.00);
-- Chèn không chỉ định tên cột
INSERT INTO employee_info VALUES (2, 'Tran Thi B', '1988-12-10', 7200.00);
-- Chỉ chèn một số cột
INSERT INTO employee_info (full_name, monthly_salary)
VALUES ('Le Van C', 4500.00);
-- Chèn nhiều bản ghi cùng lúc
INSERT INTO employee_info VALUES
(4, 'Pham D', '1992-03-22', 6800.00),
(5, 'Hoang E', '1994-07-30', 9100.00);
-- Dùng cú pháp SET để chèn
INSERT INTO employee_info SET id = 6, full_name = 'Vu F', monthly_salary = 5300.00;
Cập nhật dữ liệu
Dùng UPDATE để thay đổi giá trị của các trường đã tồn tại:
-- Cập nhật ngày sinh cho nhân viên có id = 1
UPDATE employee_info SET birth_date = '1990-06-20' WHERE id = 1;
-- Tăng lương thêm 2000 cho nhân viên tên 'Nguyen Van A'
UPDATE employee_info SET monthly_salary = monthly_salary + 2000
WHERE full_name = 'Nguyen Van A';
Xóa bản ghi
Dùng DELETE để loại bỏ dữ liệu:
-- Xóa nhân viên theo tên
DELETE FROM employee_info WHERE full_name = 'Tran Thi B';
-- Xóa toàn bộ dữ liệu trong bảng
DELETE FROM employee_info;
-- Reset lại bảng hoàn toàn (không thể khôi phục qua transaction)
TRUNCATE TABLE employee_info;
Truy vấn dữ liệu từ bảng đơn
Sử dụng câu lệnh SELECT với nhiều tùy chọn để lấy dữ liệu.
Cú pháp tổng quát
SELECT [DISTINCT] cột | biểu_thức
FROM bảng
[WHERE điều_kiện]
[GROUP BY nhóm_cột]
[HAVING điều_kiện_nhóm]
[ORDER BY thứ_tự]
[LIMIT giới_hạn];
Ví dụ minh họa
-- Tạo bảng điểm thi
CREATE TABLE exam_scores (
student_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30),
math_score DECIMAL(5,2),
physics_score DECIMAL(5,2),
chemistry_score DECIMAL(5,2)
);
INSERT INTO exam_scores (name, math_score, physics_score, chemistry_score) VALUES
('Anh', 92.5, 88.0, 95.0),
('Binh', 76.0, 81.5, 73.0),
('Cuong', 95.0, 90.0, 89.0),
('Dung', NULL, 85.0, 80.0);
Truy vấn cơ bản
-- Lấy tất cả thông tin học sinh
SELECT * FROM exam_scores;
-- Lấy tên và điểm toán
SELECT name, math_score FROM exam_scores;
-- Loại bỏ trùng lặp
SELECT DISTINCT math_score FROM exam_scores;
Sử dụng biểu thức và biệt danh
-- Cộng điểm thưởng 5 cho mọi người
SELECT name, math_score + 5 AS bonus_math FROM exam_scores;
-- Tính tổng điểm (xử lý NULL bằng IFNULL)
SELECT name,
IFNULL(math_score, 0) + IFNULL(physics_score, 0) + IFNULL(chemistry_score, 0)
AS total_score
FROM exam_scores;
Lọc với WHERE
-- Điểm toán lớn hơn 80
SELECT * FROM exam_scores WHERE math_score > 80;
-- Tìm học sinh có điểm lý trong khoảng 80-90
SELECT name, physics_score FROM exam_scores
WHERE physics_score BETWEEN 80 AND 90;
-- Tìm học sinh tên bắt đầu bằng 'A'
SELECT * FROM exam_scores WHERE name LIKE 'A%';
-- Kết hợp điều kiện
SELECT name FROM exam_scores
WHERE math_score > 90 AND physics_score > 85;
Sắp xếp kết quả
-- Sắp xếp theo điểm toán tăng dần
SELECT * FROM exam_scores ORDER BY math_score ASC;
-- Sắp xếp tổng điểm giảm dần
SELECT name, (IFNULL(math_score,0)+IFNULL(physics_score,0)+IFNULL(chemistry_score,0)) AS sum_score
FROM exam_scores ORDER BY sum_score DESC;
Nhóm dữ liệu và hàm tổng hợp
-- Tạo bảng sản phẩm
CREATE TABLE products (
product_id INT AUTO_INCREMENT,
category VARCHAR(30),
price DECIMAL(8,2),
PRIMARY KEY (product_id)
);
INSERT INTO products (category, price) VALUES
('Điện thoại', 12000), ('Laptop', 25000), ('Điện thoại', 8500),
('Tai nghe', 1200), ('Laptop', 32000), ('Điện thoại', 15000);
-- Tổng giá theo nhóm
SELECT category, SUM(price) AS total_value FROM products GROUP BY category;
-- Nhóm có tổng giá lớn hơn 20000
SELECT category, SUM(price) AS total_value
FROM products GROUP BY category HAVING total_value > 20000;
Hàm thống kê
COUNT(): Đếm số bản ghiSUM(): Tổng giá trịAVG(): Giá trị trung bìnhMAX()/MIN(): Giá trị lớn nhất/nhỏ nhất
-- Đếm số học sinh có điểm
SELECT COUNT(*) FROM exam_scores WHERE math_score IS NOT NULL;
-- Điểm trung bình môn lý
SELECT AVG(IFNULL(physics_score, 0)) FROM exam_scores;
-- Tổng điểm cao nhất
SELECT MAX(IFNULL(math_score,0)+IFNULL(physics_score,0)+IFNULL(chemistry_score,0))
AS max_total FROM exam_scores;
Liên kết bảng (JOIN)
Kết nối dữ liệu từ nhiều bảng liên quan.
-- Tạo bảng phòng ban
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
CREATE TABLE staff (
staff_id INT AUTO_INCREMENT PRIMARY KEY,
staff_name VARCHAR(50),
age INT,
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
INSERT INTO departments VALUES (101, 'Kế toán'), (102, 'IT'), (103, 'Marketing');
INSERT INTO staff (staff_name, age, dept_id) VALUES
('Hoa', 28, 101), ('Duc', 32, 102), ('Mai', 25, 101), ('Tuan', 35, 104);
INNER JOIN - Chỉ lấy bản ghi khớp
SELECT s.staff_name, d.dept_name
FROM staff s INNER JOIN departments d ON s.dept_id = d.dept_id;
LEFT JOIN - Giữ toàn bộ bản ghi bên trái
SELECT s.staff_name, d.dept_name
FROM staff s LEFT JOIN departments d ON s.dept_id = d.dept_id;
RIGHT JOIN - Giữ toàn bộ bản ghi bên phải
SELECT s.staff_name, d.dept_name
FROM staff s RIGHT JOIN departments d ON s.dept_id = d.dept_id;
UNION - Kết hợp kết quả (tương đương FULL OUTER JOIN)
SELECT staff_name, dept_name FROM staff LEFT JOIN departments USING(dept_id)
UNION
SELECT staff_name, dept_name FROM staff RIGHT JOIN departments USING(dept_id);
Truy vấn lồng (Subquery)
Dùng kết quả của một truy vấn làm điều kiện cho truy vấn khác.
-- Tìm nhân viên thuộc phòng ban tồn tại
SELECT * FROM staff WHERE dept_id IN (SELECT dept_id FROM departments);
-- Tìm phòng ban có nhân viên trên 30 tuổi
SELECT dept_name FROM departments
WHERE dept_id IN (SELECT DISTINCT dept_id FROM staff WHERE age > 30);
-- Dùng EXISTS kiểm tra sự tồn tại
SELECT * FROM staff WHERE EXISTS (
SELECT 1 FROM departments WHERE dept_id = 102
);
Khóa ngoại và ràng buộc toàn vẹn
Thiết lập mối quan hệ giữa các bảng.
-- Thêm khóa ngoại với hành động CASCADE
ALTER TABLE staff ADD CONSTRAINT fk_dept
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
ON DELETE CASCADE ON UPDATE CASCADE;
-- Xóa khóa ngoại
ALTER TABLE staff DROP FOREIGN KEY fk_dept;
Các tùy chọn ON DELETE
- CASCADE: Xóa/xóa bản ghi con khi xóa bản ghi cha
- SET NULL: Đặt giá trị NULL cho cột khóa ngoại (cột không được NOT NULL)
- RESTRICT: Không cho phép xóa nếu còn bản ghi con