0

[Java Backend Zero to Hello] BÀI 4.2: SQL CƠ BẢN

Java Backend Zero to Hello

📚 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ính
  • NOT NULL - Không được null
  • UNIQUE - Giá trị duy nhất
  • CHECK - Ràng buộc giá trị
  • DEFAULT - Giá trị mặc định
  • FOREIGN 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí