Bài Tập SQL Có Lời Giải Chi Tiết Từ Cơ Bản Đến Nâng Cao

Bạn đang tìm kiếm các Bài Tập Sql Có Lời Giải để nâng cao kỹ năng truy vấn cơ sở dữ liệu? Bạn muốn thực hành các dạng bài tập SQL khác nhau để làm quen với các tình huống thực tế? Bài viết này của chúng tôi sẽ cung cấp cho bạn một bộ sưu tập các bài tập SQL có lời giải chi tiết, từ cơ bản đến nâng cao, giúp bạn tự tin hơn khi làm việc với SQL.

Bài Tập SQL Câu Lệnh Truy Vấn Có Điều Kiện

Đây là dạng bài tập SQL cơ bản nhất, giúp bạn làm quen với cú pháp và cách sử dụng các mệnh đề WHERE, AND, OR, NOT, LIKE, IN, BETWEEN,…

Bài 1: Câu lệnh SQL không kết nối

Hiển thị danh sách gồm: MaSV, HoTen, MaLop, NgaySinh(dd/mm/yyyy), GioiTinh (Nam, Nữ), Namsinh của những sinh viên có họ không bắt đầu bằng chữ N,L,T.

Lời giải:

SELECT MaSV, HoTen, MaLop, 
       DATE_FORMAT(NgaySinh, '%d/%m/%Y') AS NgaySinh,
       CASE GioiTinh WHEN 1 THEN 'Nam' ELSE 'Nữ' END AS GioiTinh,
       YEAR(NgaySinh) AS NamSinh
FROM SINHVIEN
WHERE SUBSTRING(HoTen, 1, 1) NOT IN ('N', 'L', 'T');

Bài 2: Câu lệnh SQL có kết nối

Hiển thị danh sách gồm MaSV, HoTên, MaLop, DiemHP, MaHP của những sinh viên có điểm HP >= 7.0.

Lời giải:

SELECT SV.MaSV, SV.HoTen, SV.MaLop, DH.DiemHP, DH.MaHP
FROM SINHVIEN SV
INNER JOIN DIEMHP DH ON SV.MaSV = DH.MaSV
WHERE DH.DiemHP >= 7.0;

Bài Tập SQL Câu Lệnh Truy Vấn Phân Nhóm (GROUP BY)

Dạng bài tập này yêu cầu bạn sử dụng mệnh đề GROUP BY để nhóm các bản ghi theo một hoặc nhiều cột, thường kết hợp với các hàm tổng hợp như COUNT, SUM, AVG, MIN, MAX.

Bài 1: Câu lệnh SQL có từ khoá GROUP BY không điều kiện.

Cho biết MaLop, TenLop, tổng số sinh viên của mỗi lớp.

Lời giải:

SELECT L.MaLop, L.TenLop, COUNT(SV.MaSV) AS TongSoSinhVien
FROM DMLOP L
LEFT JOIN SINHVIEN SV ON L.MaLop = SV.MaLop
GROUP BY L.MaLop, L.TenLop;

Bài 2: Câu lệnh SQL có từ khóa Group By có điều kiện lọc.

Cho biết MaSV, HoTen, Số các học phần thiếu điểm (DiemHP < 5) của mỗi sinh viên.

Lời giải:

SELECT SV.MaSV, SV.HoTen, COUNT(DH.MaHP) AS SoHocPhanThieuDiem
FROM SINHVIEN SV
INNER JOIN DIEMHP DH ON SV.MaSV = DH.MaSV
WHERE DH.DiemHP < 5
GROUP BY SV.MaSV, SV.HoTen;

Bài 3: Câu lệnh SQL có từ khoá TOP.

  1. Cho biết MaSV, HoTen sinh viên có điểm TBC cao nhất ở học kỳ 1.
  2. Cho biết MaSV, HoTen sinh viên có số học phần điểm HP >= 8 nhiều nhất.

Lời giải:

-- Câu 1
SELECT SV.MaSV, SV.HoTen, AVG(DH.DiemHP) AS DiemTBC
FROM SINHVIEN SV
INNER JOIN DIEMHP DH ON SV.MaSV = DH.MaSV
INNER JOIN DMHOCPHAN HP ON DH.MaHP = HP.MaHP
WHERE HP.HocKy = 1
GROUP BY SV.MaSV, SV.HoTen
ORDER BY DiemTBC DESC
LIMIT 1;

-- Câu 2
SELECT SV.MaSV, SV.HoTen, COUNT(DH.MaHP) AS SoLuongHocPhan
FROM SINHVIEN SV
INNER JOIN DIEMHP DH ON SV.MaSV = DH.MaSV
WHERE DH.DiemHP >= 8
GROUP BY SV.MaSV, SV.HoTen
ORDER BY SoLuongHocPhan DESC
LIMIT 1;

Bài Tập SQL Câu Lệnh Truy Vấn Lồng Nhau (Subquery)

Dạng bài tập này sử dụng một câu lệnh SQL bên trong một câu lệnh SQL khác. Truy vấn lồng nhau giúp bạn giải quyết các bài toán phức tạp hơn bằng cách chia nhỏ vấn đề thành các bước nhỏ hơn.

Bài 1: Cấu trúc lồng nhau phủ định (KHÔNG, CHƯA).

  1. Cho biết Họ tên sinh viên KHÔNG học học phần nào.
  2. Cho biết Họ tên sinh viên CHƯA học học phần có mã ‘001’.

Lời giải:

-- Câu 1
SELECT MaSV, Hoten
FROM SINHVIEN
WHERE MaSV NOT IN (SELECT MaSV FROM DIEMHP);

-- Câu 2
SELECT MaSV, HoTen
FROM SINHVIEN
WHERE MaSV NOT IN (SELECT MaSV FROM DIEMHP WHERE MaHP = '001');

Bài 2: Cấu trúc câu lệnh sql lồng nhau không kết nối.

  1. Cho biết Tên lớp có sinh viên tên Hoa.
  2. Cho biết HoTen sinh viên có điểm học phần ‘001’là 9.

Lời giải:

-- Câu 1
SELECT TenLop
FROM DMLOP
WHERE MaLop IN (SELECT MaLop FROM SINHVIEN WHERE HoTen LIKE N'% Hoa');

-- Câu 2
SELECT HoTen
FROM SINHVIEN
WHERE MaSV IN (SELECT MaSV FROM DIEMHP WHERE MaHP = '001' AND DiemHP = 9);

Bài Tập SQL Câu Lệnh Truy Vấn Lượng Từ (ALL, ANY, EXISTS)

Dạng bài tập này sử dụng các lượng từ ALL, ANY, EXISTS để so sánh một giá trị với một tập hợp các giá trị.

Bài tập sql về câu lệnh chứa lượng từ all.

  1. Cho biết HoTen sinh viên có DiemHP cao nhất.
  2. Cho biết HoTen sinh viên có tuổi cao nhất.

Lời giải:

-- Câu 1
SELECT SV.HoTen
FROM SINHVIEN SV
INNER JOIN DIEMHP DH ON SV.MaSV = DH.MaSV
WHERE DH.DiemHP >= ALL (SELECT DiemHP FROM DIEMHP);

-- Câu 2
SELECT HoTen
FROM SINHVIEN
WHERE YEAR(CURDATE()) - YEAR(NgaySinh) >= ALL (SELECT YEAR(CURDATE()) - YEAR(NgaySinh) FROM SINHVIEN);

Bài tập sql về câu lệnh chứa lượng từ any.

  1. Cho biết MaSV, MaHP có điểm HP lớn hơn bất kỳ các điểm HP của sinh viên mã ‘001’.
  2. Cho biết sinh viên có điểm học phần nào đó lớn hơn gấp rưỡi điểm trung bình chung của sinh viên đó.

Lời giải:

-- Câu 1
SELECT MaSV, MaHP
FROM DIEMHP
WHERE DiemHP > ANY (SELECT DiemHP FROM DIEMHP WHERE MaSV = '001');

-- Câu 2
-- Giả sử bảng DIEMTBC đã có thông tin DiemTBC của mỗi sinh viên
SELECT MaSV
FROM DIEMTBC
WHERE DiemTBC * 1.5 < ANY (SELECT DiemHP FROM DIEMHP WHERE DIEMHP.MaSV = DIEMTBC.MaSV);

Bài tập sql về câu lệnh chứa lượng từ exists:

  1. Cho biết MaSV, HoTen sinh viên đã ít nhất một lần học học phần nào đó.
  2. Cho biết MaSV, HoTen sinh viên đã không học học phần nào.

Lời giải:

-- Câu 1
SELECT MaSV, HoTen
FROM SINHVIEN
WHERE EXISTS (SELECT * FROM DIEMHP WHERE SINHVIEN.MaSV = DIEMHP.MaSV);

-- Câu 2
SELECT MaSV, HoTen
FROM SINHVIEN
WHERE NOT EXISTS (SELECT * FROM DIEMHP WHERE SINHVIEN.MaSV = DIEMHP.MaSV);

Các Câu Lệnh SQL Bổ Sung, Cập Nhập, Xóa Dữ Liệu (INSERT, DELETE, UPDATE)

Ngoài các câu lệnh truy vấn, bạn cũng cần nắm vững các câu lệnh thao tác dữ liệu như INSERT, DELETE, UPDATE.

Bài tập sql số 1: câu Lệnh sql INSERT bổ sung dữ liệu

  1. Bổ sung một dòng dữ liệu cho bảng DMKHOA bộ giá trị sau: (‘KT’, ‘Kế toán’).
  2. Bổ sung một sinh viên cho bảng SINHVIEN (dữ liệu nào bất kỳ).

Lời giải:

-- Câu 1
INSERT INTO KHOA (MaKhoa, TenKhoa) VALUES ('KT', N'Kế toán');
-- Hoặc
INSERT INTO KHOA VALUES ('KT', N'Kế toán', NULL);

-- Câu 2
INSERT INTO SINHVIEN (MaSV, HoTen, MaLop, GioiTinh, NgaySinh, NoiSinh)
VALUES ('012', N'Nguyễn Văn Hòa', 'CT12', 1,'1994-02-12', N'Quy Nhơn');

Bài tập sql số 2: câu lệnh sql DELETE xoá dữ liệu

  1. Xóa những sinh viên có DTBC < 3.
  2. Xóa những sinh viên không học học phần nào.

Lời giải:

-- Câu 1 (Giả sử đã có bảng DIEMTBC chứa MaSV và DiemTBC)
DELETE FROM SINHVIEN
WHERE MaSV IN (SELECT MaSV FROM DIEMTBC WHERE DiemTBC < 3);

-- Câu 2
DELETE FROM SINHVIEN
WHERE MaSV NOT IN (SELECT DISTINCT MaSV FROM DIEMHP);

Bài tập sql số 3: câu lệnh sql UPDATE cập nhật dữ liệu

Thêm cột XepLoai, Cập nhật dữ liệu cột XepLoai theo yêu cầu sau: Nếu DiemTBC >=8 thì xếp loại Giỏi, ngược lại Nếu DiemTBC >=7 thì xếp loại Khá, ngược lại Nếu DiemTBC >=5 thì xếp loại Trung bình, Ngược lại là yếu

Lời giải:

-- Giả sử đã có bảng DIEMTBC chứa MaSV và DiemTBC
ALTER TABLE DIEMTBC ADD XepLoai nvarchar(10);
ALTER TABLE DIEMTBC ADD XetLenLop nvarchar(50);

UPDATE DIEMTBC
SET XepLoai =
  CASE
    WHEN DiemTBC >= 8 THEN N'Giỏi'
    WHEN DiemTBC >= 7 THEN N'Khá'
    WHEN DiemTBC >= 5 THEN N'Trung bình'
    ELSE N'Yếu'
  END;

UPDATE DIEMTBC
SET XetLenLop =
  CASE
    WHEN DiemTBC >= 5 THEN N'Được lên lớp'
    WHEN DiemTBC >= 3 THEN N'Tạm ngừng tiến độ'
    ELSE N'Buộc thôi học'
  END;

Hy vọng với các bài tập SQL có lời giải chi tiết này, bạn sẽ nắm vững hơn các kiến thức SQL và tự tin giải quyết các bài toán thực tế. Chúc bạn thành công!

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *