[Java Backend Zero to Hello] BÀI 4.2: SQL CƠ BẢN
📚 Bài viết thuộc series Java Backend Zero to Hello 📌 Phần: Phase 4: Database & SQL | Bài 37/86
BÀI 4.2: SQL CƠ BẢN
Mục tiêu
- Sử dụng SELECT, INSERT, UPDATE, DELETE
- Áp dụng WHERE, ORDER BY, LIMIT
- Sử dụng JOIN để kết hợp bảng
- Thực hành với MySQL/PostgreSQL
1. KIỂU DỮ LIỆU
1.1 Kiểu số
| Kiểu | Mô tả |
|---|---|
INT |
Số nguyên 4 bytes |
BIGINT |
Số nguyên 8 bytes |
DECIMAL(p,s) |
Số thập phân chính xác |
FLOAT, DOUBLE |
Số thập phân |
1.2 Kiểu chuỗi
| Kiểu | Mô tả |
|---|---|
CHAR(n) |
Chuỗi cố định n ký tự |
VARCHAR(n) |
Chuỗi tối đa n ký tự |
TEXT |
Chuỗi dài |
1.3 Kiểu ngày
| Kiểu | Mô tả |
|---|---|
DATE |
Ngày (YYYY-MM-DD) |
TIME |
Giờ (HH:MM:SS) |
DATETIME |
Ngày + giờ |
TIMESTAMP |
Ngày giờ có timezone |
1.4 Khác
| Kiểu | Mô tả |
|---|---|
BOOLEAN |
True/False |
BLOB |
Dữ liệu nhị phân |
JSON |
Dữ liệu JSON (MySQL 5.7+) |
2. TẠO BẢNG
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
age INT CHECK (age >= 0),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Constraints
PRIMARY KEY- Khóa chínhNOT NULL- Không được nullUNIQUE- Giá trị duy nhấtCHECK- Ràng buộc giá trịDEFAULT- Giá trị mặc địnhFOREIGN KEY- Khóa ngoại
3. INSERT - THÊM DỮ LIỆU
-- Thêm 1 dòng
INSERT INTO users (name, email, age)
VALUES ('An', 'an@example.com', 25);
-- Thêm nhiều dòng
INSERT INTO users (name, email, age) VALUES
('Bình', 'binh@example.com', 30),
('Châu', 'chau@example.com', 28);
-- Thêm từ bảng khác
INSERT INTO archived_users (id, name, email)
SELECT id, name, email FROM users WHERE created_at < '2023-01-01';
4. SELECT - TRUY VẤN
4.1 Cú pháp cơ bản
SELECT column1, column2, ...
FROM table_name
WHERE condition
GROUP BY column
HAVING condition
ORDER BY column [ASC|DESC]
LIMIT n OFFSET m;
4.2 SELECT cơ bản
-- Tất cả cột
SELECT * FROM users;
-- Cột cụ thể
SELECT id, name, email FROM users;
-- Với alias
SELECT name AS 'Tên', email AS 'Email' FROM users;
-- DISTINCT - loại bỏ trùng
SELECT DISTINCT age FROM users;
4.3 WHERE - Điều kiện
-- So sánh
SELECT * FROM users WHERE age >= 18;
SELECT * FROM users WHERE name = 'An';
-- AND, OR, NOT
SELECT * FROM users WHERE age >= 18 AND name LIKE 'A%';
SELECT * FROM users WHERE age < 18 OR age > 60;
-- IN, BETWEEN
SELECT * FROM users WHERE age IN (20, 25, 30);
SELECT * FROM users WHERE age BETWEEN 18 AND 30;
-- LIKE - tìm kiếm mẫu
SELECT * FROM users WHERE name LIKE 'A%'; -- Bắt đầu bằng A
SELECT * FROM users WHERE name LIKE '%n'; -- Kết thúc bằng n
SELECT * FROM users WHERE name LIKE '%an%'; -- Chứa "an"
SELECT * FROM users WHERE name LIKE 'A_'; -- A + 1 ký tự
-- IS NULL, IS NOT NULL
SELECT * FROM users WHERE email IS NULL;
4.4 ORDER BY - Sắp xếp
SELECT * FROM users ORDER BY age ASC; -- Tăng dần
SELECT * FROM users ORDER BY age DESC; -- Giảm dần
SELECT * FROM users ORDER BY age DESC, name ASC; -- Nhiều cột
4.5 LIMIT - Giới hạn
SELECT * FROM users LIMIT 10; -- 10 dòng đầu
SELECT * FROM users LIMIT 10 OFFSET 20; -- Bỏ 20, lấy 10 tiếp
SELECT * FROM users LIMIT 20, 10; -- Tương tự trên
5. UPDATE - CẬP NHẬT
UPDATE users
SET name = 'An Nguyễn', age = 26
WHERE id = 1;
-- Cập nhật nhiều dòng
UPDATE users
SET age = age + 1
WHERE created_at < '2024-01-01';
⚠️ Luôn có WHERE khi UPDATE, nếu không sẽ update tất cả.
6. DELETE - XÓA
-- Xóa theo điều kiện
DELETE FROM users WHERE id = 1;
-- Xóa tất cả (cẩn thận!)
DELETE FROM users;
-- Xóa với LIMIT
DELETE FROM users WHERE age < 18 LIMIT 10;
TRUNCATE
TRUNCATE TABLE users; -- Xóa tất cả, nhanh hơn DELETE, reset AUTO_INCREMENT
7. JOIN - KẾT HỢP BẢNG
7.1 INNER JOIN
Chỉ lấy dòng có match ở cả 2 bảng.
SELECT u.name, o.order_id, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
7.2 LEFT JOIN
Lấy tất cả bảng trái, kể cả không match.
SELECT u.name, o.order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- Users không có order vẫn hiển thị (order_id = NULL)
7.3 RIGHT JOIN
Ngược lại của LEFT JOIN.
7.4 FULL OUTER JOIN
Lấy tất cả từ cả 2 bảng (MySQL không hỗ trợ trực tiếp).
7.5 SELF JOIN
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
7.6 CROSS JOIN
Tích Descartes.
SELECT * FROM colors CROSS JOIN sizes;
8. AGGREGATE FUNCTIONS
SELECT
COUNT(*) AS total, -- Đếm số dòng
COUNT(DISTINCT age) AS unique_ages,
SUM(amount) AS total_amount,
AVG(amount) AS avg_amount,
MIN(amount) AS min_amount,
MAX(amount) AS max_amount
FROM orders;
9. GROUP BY VÀ HAVING
-- Đếm user theo tuổi
SELECT age, COUNT(*) AS count
FROM users
GROUP BY age;
-- Lọc nhóm
SELECT age, COUNT(*) AS count
FROM users
GROUP BY age
HAVING count > 1;
WHERE lọc dòng trước khi group, HAVING lọc nhóm sau khi group.
10. BÀI TẬP THỰC HÀNH
Bài 1: Tạo database quản lý sinh viên
CREATE DATABASE school;
USE school;
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
age INT,
gpa DECIMAL(3,2)
);
CREATE TABLE courses (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
credits INT
);
CREATE TABLE enrollments (
id INT PRIMARY KEY AUTO_INCREMENT,
student_id INT,
course_id INT,
grade DECIMAL(3,2),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
Bài 2: Các truy vấn
-- 1. Sinh viên có GPA > 3.0
SELECT * FROM students WHERE gpa > 3.0;
-- 2. Sinh viên sắp xếp theo GPA giảm dần
SELECT * FROM students ORDER BY gpa DESC LIMIT 10;
-- 3. Đếm số sinh viên theo độ tuổi
SELECT age, COUNT(*) FROM students GROUP BY age;
-- 4. Sinh viên và khóa học đã đăng ký
SELECT s.name, c.name AS course, e.grade
FROM students s
JOIN enrollments e ON s.id = e.student_id
JOIN courses c ON c.id = e.course_id;
Bài 3: E-commerce database
Tạo database với: users, products, categories, orders, order_items. Viết các truy vấn:
- Top 10 sản phẩm bán chạy
- Doanh thu theo tháng
- Khách hàng chi tiêu nhiều nhất
11. TÓM TẮT
| Lệnh | Mô tả |
|---|---|
SELECT |
Truy vấn |
INSERT |
Thêm |
UPDATE |
Cập nhật |
DELETE |
Xóa |
WHERE |
Điều kiện |
ORDER BY |
Sắp xếp |
LIMIT |
Giới hạn |
JOIN |
Kết hợp bảng |
GROUP BY |
Nhóm |
HAVING |
Lọc nhóm |
Bài tiếp theo: 4.3 SQL nâng cao
🧭 Điều Hướng Series
⬅️ Bài trước: BÀI 4.1: CƠ SỞ DỮ LIỆU QUAN HỆ
📋 Lộ trình tổng quan: Xem Toàn Bộ Series
➡️ Bài tiếp theo: BÀI 4.3: SQL NÂNG CAO
All rights reserved