Bài tập SQL giải bài test SQL cơ bản FPT FSOFT 2018

Tiếp tục chúng ta sẽ tìm hiểu về bài tập SQL cơ bản của FPT FSOFT năm 2018. Bài tập này không khó, chúng ta sẽ cùng nhau giải và tìm ra đáp án cho từng câu hỏi.

SQL cơ bản FPT FSOFT 2018

Trước khi bắt đầu, hãy cùng tìm hiểu một số điều cần lưu ý về cấu trúc cơ sở dữ liệu:

  • Bảng KHACH_HANG: lưu trữ thông tin của khách hàng
  • Bảng PHONG: lưu trữ thông tin phòng karaoke
  • Bảng DICH_VU_DI_KEM: lưu trữ thông tin các dịch vụ đi kèm được cung cấp tại quán Karaoke
  • Bảng DAT_PHONG: lưu trữ thông tin đặt phòng karaoke của khách hàng
  • Bảng CHI_TIET_SU_DUNG_DV: lưu trữ thông tin chi tiết khi khách hàng sử dụng các dịch vụ đi kèm
  • PK: là các trường tham gia vào khóa chính của bảng

Hãy xem qua hình ảnh dưới đây để hiểu rõ hơn về cấu trúc cơ sở dữ liệu:

SQL cơ bản FPT FSOFT 2018

Bây giờ chúng ta sẽ viết các câu lệnh SQL để thực hiện các yêu cầu sau (mỗi yêu cầu chỉ được viết tối đa 1 câu lệnh SQL):

Yêu cầu I:

Câu 1:

Liệt kê MaDatPhong, MaDV, SoLuong của tất cả các dịch vụ có số lượng lớn hơn 3 và nhỏ hơn 10.

SELECT MADATPHONG, MADV, SOLUONG 
FROM CHI_TIET_SU_DUNG_DV 
WHERE SOLUONG > 3 AND SOLUONG < 10;

Câu 2:

Cập nhật dữ liệu trên trường GiaPhong thuộc bảng PHONG tăng lên 10,000 VNĐ so với giá phòng hiện tại, chỉ cập nhật giá phòng của những phòng có số khách tối đa lớn hơn 10.

UPDATE PHONG 
SET GiaPhong = GiaPhong + 10000 
WHERE SoKhachToiDa > 10;

Câu 3:

Xóa tất cả những đơn đặt phòng (từ bảng DAT_PHONG) có trạng thái đặt (TrangThaiDat) là “Da huy”.

DELETE FROM DAT_PHONG 
WHERE TrangThaiDat = 'Da huy';

Yêu cầu II:

Câu 4:

Hiển thị TenKH của những khách hàng có tên bắt đầu là một trong các ký tự “H”, “N”, “M” và có độ dài tối đa là 20 ký tự.

SELECT TenKH 
FROM KHACH_HANG 
WHERE TenKH LIKE 'H%' OR TenKH LIKE 'N%' OR TenKH LIKE 'M%' AND LENGTH(TenKH) <= 20;

Câu 5:

Hiển thị TenKH của tất cả các khách hàng có trong hệ thống, mỗi TenKH nào trùng nhau thì chỉ hiển thị một lần. Sinh viên sử dụng hai cách khác nhau để thực hiện yêu cầu trên, mỗi cách sẽ được 0,5 điểm.

SELECT DISTINCT TenKH FROM KHACH_HANG;
SELECT TenKH FROM KHACH_HANG GROUP BY TenKH;

Câu 6:

Hiển thị MaDV, TenDV, DonViTinh, DonGia của những dịch vụ đi kèm có DonViTinh là “lon” và có DonGia lớn hơn 10,000 VNĐ hoặc những dịch vụ đi kèm có DonViTinh là “Cai” và có DonGia nhỏ hơn 5,000 VNĐ.

SELECT MaDV, TenDV, DonViTinh, DonGia 
FROM DICH_VU_DI_KEM 
WHERE (DonViTinh = 'lon' AND DonGia > 10000) OR (DonViTinh = 'Cai' AND DonGia < 5000);

Câu 7:

Hiển thị MaDatPhong, MaPhong, LoaiPhong, SoKhachToiDa, GiaPhong, MaKH, TenKH, SoDT, NgayDat, GioBatDau, GioKetThuc, MaDichVu, SoLuong, DonGia của những đơn đặt phòng có năm đặt phòng là “2016”, “2017” và đặt những phòng có giá phòng > 50,000 VNĐ/1 giờ.

SELECT dp.MADATPHONG, dp.MAPHONG, p.LOAIPHONG, p.SoKhachToiDa, p.GiaPhong, kh.MAKH, kh.TenKH, kh.SoDT, dp.NgayDat, dp.GioBatDau, dp.GioKetThuc, dv.MaDichVu, ct.SoLuong, dv.DonGia 
FROM DAT_PHONG dp 
JOIN KHACH_HANG kh ON dp.MAKH = kh.MAKH 
JOIN PHONG p ON dp.MAPHONG = p.MAPHONG 
JOIN CHI_TIET_SU_DUNG_DV ct ON dp.MADATPHONG = ct.MADATPHONG 
JOIN DICH_VU_DI_KEM dv ON ct.MADV = dv.MADV 
WHERE (YEAR(NgayDat) = 2016 OR YEAR(NgayDat) = 2017) AND p.GiaPhong > 50000;

Yêu cầu III:

Câu 8:

Hiển thị MaDatPhong, MaPhong, LoaiPhong, GiaPhong, TenKH, NgayDat, TongTienHat, TongTienSuDungDichVu, TongTienThanhToan tương ứng với từng mã đặt phòng có trong bảng DAT_PHONG. Những đơn đặt phòng nào không sử dụng dịch vụ đi kèm thì cũng liệt kê thông tin của đơn đặt phòng đó ra.

SELECT dp.MADATPHONG, p.MAPHONG, p.LOAIPHONG, p.GiaPhong, kh.TenKH, dp.NgayDat, p.GiaPhong * TIME_TO_SEC(TIMEDIFF(dp.GioKetThuc, dp.GioBatDau)) AS TongTienHat, SUM(ct.SoLuong * dv.DonGia) AS TongTienSuDungDichVu, (p.GiaPhong * TIME_TO_SEC(TIMEDIFF(dp.GioKetThuc, dp.GioBatDau)) + SUM(ct.SoLuong * dv.DonGia)) AS TongTienThanhToan
FROM DAT_PHONG dp
JOIN KHACH_HANG kh ON dp.MAKH = kh.MAKH
JOIN PHONG p ON dp.MAPHONG = p.MAPHONG
JOIN CHI_TIET_SU_DUNG_DV ct ON dp.MADATPHONG = ct.MADATPHONG
JOIN DICH_VU_DI_KEM dv ON ct.MADV = dv.MADV
GROUP BY dp.MADATPHONG;

Câu 9:

Hiển thị MaKH, TenKH, DiaChi, SoDT của những khách hàng đã từng đặt phòng karaoke có địa chỉ ở “Hoa Xuan”.

SELECT kh.MAKH, kh.TenKH, kh.DiaChi, kh.SoDT
FROM KHACH_HANG kh
WHERE EXISTS (
    SELECT *
    FROM DAT_PHONG dp
    WHERE kh.MAKH = dp.MAKH
) AND kh.DiaChi = 'Hoa Xuan';

Câu 10:

Hiển thị MaPhong, LoaiPhong, SoKhachToiDa, GiaPhong, SoLanDat của những phòng được khách hàng đặt có số lần đặt lớn hơn 2 lần và trạng thái đặt là “Da dat”.

SELECT p.MAPHONG, p.LOAIPHONG, p.SoKhachToiDa, p.GiaPhong, COUNT(dp.MAPHONG) AS SoLanDat
FROM PHONG p
JOIN DAT_PHONG dp ON p.MAPHONG = dp.MAPHONG
WHERE dp.TRANGTHAIDAT = 'Da dat'
GROUP BY p.MAPHONG
HAVING COUNT(dp.MAPHONG) > 2;

Đây là đáp án cho bài test SQL cơ bản FPT FSOFT 2018. Hãy thử tự làm bài trước khi xem đáp án của chúng tôi từ việc tạo cơ sở dữ liệu. Đừng quá lo lắng nếu bạn không làm được ngay, chỉ cần có ý tưởng, bạn có thể tìm kiếm trên Google để tìm đáp án. Điều này sẽ giúp bạn cải thiện kỹ năng tìm kiếm trên Google :))

Trên đây là hướng dẫn giải bài tập SQL cơ bản FPT FSOFT 2018. Tiếp theo, chúng tôi sẽ chia sẻ với bạn bài tập SQL của năm 2019. Sau đó, chúng tôi sẽ chia sẻ các bài tập SQL nâng cao, Java cơ bản và Java nâng cao của FPT. Hy vọng bài chia sẻ này sẽ giúp bạn trong quá trình học tập. Nếu có bất kỳ câu hỏi nào, hãy để lại comment ở dưới, chúng tôi sẽ giải đáp cho bạn!

ĐỌC THÊM:
Bài viết tiếp theo: Bài tập SQL giải bài test SQL cơ bản FPT FSOFT 2019

FEATURED TOPIC