














Preview text:
  lOMoAR cPSD| 58647650
THỰC HÀNH CƠ SỞ DỮ LIỆU  A.Svtech:  1.Môi trường: 
1.1.Hiển thị phiên bản của database:  Select version();   
1.2.Hiển thị danh sách database:  Show databases;   
1.3.Hiển thị danh sách các table của một database:  Show table from dblab; 
1.4. Hiển thị cấu trúc của một table.  Show columns from sinhvien; 
(sinhvien là tên của 1 table có trong database dblab) 
1.5. Hiển thị user đang kết nối:  Select user();        lOMoAR cPSD| 58647650
1.6. Hiển thị database(schema) đang sử dụng.Select  database();   
1.7. Hiển thị ngày giờ hiện tại của database.Select now();    2.DDL 
2.1 Tạo bảng khoa: create table khoa( 
ma_khoa varchar(4) primary key, 
ten_khoa varchar(100) not null  );    2.  2.Tạo bảng sinh viên:  CREATE TABLE sinhvien(  masinhvien INT (10) NOT  NULL, ten VARCHAR(100) NOT  NULL, ngaysinh DATE NOT  NULL, makhoa VARCHAR(4),  diachi VARCHAR(200),  PRIMARY KEY(masinhvien),      lOMoAR cPSD| 58647650
FOREIGN KEY(makhoa) REFERENCES khoa(ma_khoa)  );   
2.3. Bổ sung thêm cột “dienthoai” cho bảng sinh viên.  ALTER TABLE sinhvien 
ADD COLUMN dienthoai VARCHAR(20);   
2.4. Mở độ rộng cho cột dienthoai để có lưu số điện thoại có cả mã vùng và  số máynội bộ.  ALTER TABLE sinhvien 
MODIFY COLUMN dienthoai VARCHAR(30); 
2.5. Bổ sung constraint cho bảng sinhvien để (tên, ngày sinh) không trùng  nhau.  ALTER TABLE sinhvien 
ADD CONSTRAINT unique_ten_ngaysinh UNIQUE (ten, ngay_sinh); 
2.6. Tạo một view chỉ cho hiển thị sinh viên của một khoa có mã nhất định 
CREATE VIEW view_sinhvien_theo_khoa AS 
SELECT ma, ten, ngaysinh, dienthoai, diachi  FROM sinhvien 
WHERE makhoa = 'KHOA_ID'; -- Thay 'KHOA_ID' bằng mã khoa cụ thể 
2.7. Gán quyền cho người dùng dblab.user02 có quyền them bản ghi vào  bảngsinhvien      lOMoAR cPSD| 58647650
GRANT INSERT ON sinhvien TO 'dblab.user02'@'localhost'; 
2.8. Tạo thêm index cho cột dienthoai của bảng sinhvien. 
CREATE INDEX idx_dienthoai ON sinhvien(dienthoai);  3.DML 
3.1. Thêm 3 bản ghi mới vào table khoa:  SELECT *FROM dblab.khoa; 
INSERT INTO khoa(ma_khoa,ten_khoa)  VALUES ('VT', 
'Vien_thong'), ('CNTT', 'Cong_nghe_thong_tin'), ('DT', 'Dien_tu');   
3.2. Thêm 3 bản ghi mới vào bảng sinhvien:  SELECT * FROM dblab.sinhvien; 
INSERT INTO sinhvien (masinhvien, ten, ngaysinh, makhoa, diachi, dienthoai) 
VALUES (1, 'Nguyen Van A', '2003-06-05', 'VT','Ha_noi ','0383123878'), 
(1234, 'Tran Van B', '2003-05-25', 'CNTT','Bac_Ninh','0584262343'), 
(235, 'Nguyen Thi C', '2003-08-25', 'DT','Hai_Phong','029347869');        lOMoAR cPSD| 58647650 3.3, 3.4 
-Cập nhật số điện thoại thêm vào đầu mỗi số chuỗi '+84'. -
Cập nhật số điện thoại thêm vào đầu mỗi số chuỗi '+84'. Nếu 
số điện thoại đã có mã quốc tế thì không được thêm vào nữa.  SELECT * FROM dblab.sinhvien;  SET SQL_SAFE_UPDATES = 0;  UPDATE sinhvien 
SET dienthoai = CONCAT('+84', dienthoai) 
WHERE dienthoai NOT LIKE '+%';    4. DQL: 
4.1 Tìm nhân viên trong tên có chữ “A”:  SELECT * FROM hr.employees  WHERE first_name LIKE '%A%'; 
4.2 Tìm nhân viên trong họ tên có chữ “V”:  SELECT * FROM hr.employees 
WHERE first_name LIKE '%V%' OR last_name LIKE '%V%'; 
4.3 Tìm nhân viên chưa có phân công vào phòng nào:  SELECT * FROM hr.employees  WHERE department_id IS NULL; 
4.4 Tìm nhân viên vào công ty trong năm 2000:      lOMoAR cPSD| 58647650 SELECT * FROM hr.employees  WHERE YEAR(hire_date) = 2000; 
4.5 Tìm nhân viên vào công ty trong các tháng chẵn:  SELECT * FROM hr.employees 
WHERE MONTH(hire_date) IN (2, 4, 6, 8, 10, 12); 
4.6 Hiển thị danh sách phòng cùng mã nhân viên, họ, tên, ngày vào công ty, 
thâmniên của nhân viên có thâm niên trên 30 năm: 
SELECT d.department_name, e.employee_id, e.first_name, e.last_name,  e.hire_date,   
TIMESTAMPDIFF(YEAR, e.hire_date, CURDATE()) AS seniority_years  FROM hr.employees e 
JOIN hr.departments d ON e.department_id = d.department_id 
WHERE TIMESTAMPDIFF(YEAR, e.hire_date, CURDATE()) > 30; 
4.7 Hiển thị tổng số nhân viên của công ty: SELECT COUNT(*) AS  total_employees  FROM hr.employees; 
4.8 Hiển thị tên phòng và tổng số nhân viên của phòng đó 
SELECT d.department_name, COUNT(e.employee_id) AS total_employees  FROM hr.departments d 
LEFT JOIN hr.employees e ON d.department_id = e.department_id  GROUP BY d.department_name; 
4.9 Hiển thị tên phòng và tổng số nhân viên của phòng đó, nếu không có 
nhân viênthì hiển thị là 0: 
SELECT d.department_name, COUNT(e.employee_id) AS total_employees  FROM hr.departments d      lOMoAR cPSD| 58647650
LEFT JOIN hr.employees e ON d.department_id = e.department_id  GROUP BY d.department_name; 
4.10 Hiển thị danh sách phòng cùng mã nhân viên, họ, tên, ngày vào công 
ty, lươngcủa nhân viên có lương cao nhất phòng: 
SELECT d.department_name, e.employee_id, e.first_name, e.last_name,  e.hire_date, e.salary  FROM hr.employees e 
JOIN hr.departments d ON e.department_id = d.department_id  WHERE e.salary = (     SELECT MAX(salary)     FROM hr.employees e2   
WHERE e2.department_id = e.department_id  ); 
B.KIỂM TRA THỰC HÀNH:  CREATE schema thsql;  USE thsql;  SET SQL_SAFE_UPDATES = 0;  *Tạo bảng phong:  CREATE TABLE PHONG ( 
 MaPhong VARCHAR(10) PRIMARY KEY,   LoaiPhong VARCHAR(50),   SoKhachToiDa INT,   GiaPhong DECIMAL(10, 2),   MoTa TEXT  );      lOMoAR cPSD| 58647650   * Bảng KHACH_HANG  CREATE TABLE KHACH_HANG ( 
 MaKH VARCHAR(10) PRIMARY KEY,   TenKH VARCHAR(100),   DiaChi VARCHAR(100),   SoDT VARCHAR(15)  );    *Bảng DICH_VU_DI_KEM  CREATE TABLE DICH_VU_DI_KEM ( 
 MaDV VARCHAR(10) PRIMARY KEY,   TenDV VARCHAR(100),   DonViTinh VARCHAR(50),   DonGia DECIMAL(10, 2)  );        lOMoAR cPSD| 58647650 *Bảng DAT_PHONG  CREATE TABLE DAT_PHONG ( 
 MaDatPhong VARCHAR(10) PRIMARY KEY,   MaPhong VARCHAR(10),   MaKH VARCHAR(10),   NgayDat DATE,   GioBatDau TIME,   GioKetThuc TIME,   TienDatCoc DECIMAL(10, 2),  GhiChu VARCHAR(100),   TrangThaiDat VARCHAR(20), 
 FOREIGN KEY (MaPhong) REFERENCES PHONG(MaPhong), 
 FOREIGN KEY (MaKH) REFERENCES KHACH_HANG(MaKH)  );   
*Bảng CHI_TIET_SU_DUNG_DV 
CREATE TABLE CHI_TIET_SU_DUNG_DV (   MaDatPhong VARCHAR(10),   MaDV VARCHAR(10),   SoLuong INT, 
 PRIMARY KEY (MaDatPhong, MaDV), 
 FOREIGN KEY (MaDatPhong) REFERENCES DAT_PHONG(MaDatPhong), 
 FOREIGN KEY (MaDV) REFERENCES DICH_VU_DI_KEM(MaDV)      lOMoAR cPSD| 58647650 );   
*Dữ liệu cho bảng PHONG 
INSERT INTO PHONG (MaPhong, LoaiPhong, SoKhachToiDa, GiaPhong, MoTa)  VALUES 
('P0001', 'Loai 1', 20, 60000, NULL), 
('P0002', 'Loai 1', 25, 80000, NULL), 
('P0003', 'Loai 2', 15, 50000, NULL), 
('P0004', 'Loai 3', 20, 50000, NULL);   
*Dữ liệu cho bảng KHACH_HANG 
INSERT INTO KHACH_HANG (MaKH, TenKH, DiaChi, SoDT)  VALUES 
('KH0001', 'Nguyen Van A', 'Hoa xuan', '1111111111'), 
('KH0002', 'Nguyen Van B', 'Hoa hai', '1111111112'), 
('KH0003', 'Phan Van A', 'Cam le', '1111111113'), 
('KH0004', 'Phan Van B', 'Hoa xuan', '1111111114');      lOMoAR cPSD| 58647650  
*Dữ liệu cho bảng DICH_VU_DI_KEM 
INSERT INTO DICH_VU_DI_KEM (MaDV, TenDV, DonViTinh, DonGia)  VALUES 
('DV001', 'Beer', 'lon', 10000), 
('DV002', 'Nuoc ngot', 'lon', 8000), 
('DV003', 'Trai cay', 'dia', 35000), 
('DV004', 'Khan uot', 'cai', 2000);   
*Dữ liệu cho bảng DAT_PHONG 
INSERT INTO DAT_PHONG (MaDatPhong, MaPhong, MaKH, NgayDat, 
GioBatDau, GioKetThuc, TienDatCoc, GhiChu, TrangThaiDat)  VALUES 
('DP0001', 'P0001', 'KH0002', '2018/03/26', '11:00', '13:30', 100000, 'Da dat', 'Da  dat'), 
('DP0002', 'P0003', 'KH0003', '2018/03/27', '17:15', '19:15', 500000, 'Da huy', 'Da  huy'), 
('DP0003', 'P0002', 'KH0002', '2018/03/30', '20:30', '22:00', 300000, 'Da dat', 'Da  dat'),      lOMoAR cPSD| 58647650
('DP0004', 'P0001', 'KH0001', '2018/04/01', '19:30', '21:15', 200000, 'Da dat', 'Da  dat');   
*Dữ liệu cho bảng CHI_TIET_SU_DUNG_DV 
INSERT INTO CHI_TIET_SU_DUNG_DV (MaDatPhong, MaDV, SoLuong)  VALUES  ('DP0001', 'DV001', 20),  ('DP0001', 'DV002', 10),  ('DP0001', 'DV003', 5),  ('DP0001', 'DV004', 10),  ('DP0002', 'DV001', 10),  ('DP0002', 'DV004', 5),  ('DP0003', 'DV001', 10),  ('DP0003', 'DV002', 10),  ('DP0004', 'DV001', 20),  ('DP0004', 'DV002', 10);      lOMoAR cPSD| 58647650   Câu 1: 
SELECT MaDatPhong, MaDV, SoLuong  FROM CHI_TIET_SU_DUNG_DV 
WHERE SoLuong > 10 AND SoLuong < 20;  Câu 2:  UPDATE PHONG 
SET GiaPhong = GiaPhong + 15000  WHERE SoKhachToiDa > 20;  Câu 3:  DELETE FROM DAT_PHONG 
WHERE TrangThaiDat = 'Da huy';  Câu 4:  SELECT TenKH  FROM KHACH_HANG 
WHERE LEFT(TenKH, 1) IN ('H', 'V', 'M') AND LENGTH(TenKH) <= 20;  Câu 5:  SELECT DISTINCT TenKH      lOMoAR cPSD| 58647650 FROM KHACH_HANG;  Câu 6: 
SELECT MaDV, TenDV, DonViTinh, DonGia  FROM DICH_VU_DI_KEM 
WHERE (DonViTinh = 'dia' AND DonGia > 35000) 
 OR (DonViTinh = 'Cai' AND DonGia < 5000);  Câu 7: 
SELECT dp.MaDatPhong, dp.MaPhong, p.LoaiPhong, p.SoKhachToiDa, 
p.GiaPhong, kh.MaKH, kh.TenKH, kh.SoDT, dp.NgayDat, dp.GioBatDau, 
dp.GioKetThuc, dv.MaDV, dvct.SoLuong, dv.DonGia  FROM DAT_PHONG dp 
JOIN PHONG p ON dp.MaPhong = p.MaPhong 
JOIN KHACH_HANG kh ON dp.MaKH = kh.MaKH 
LEFT JOIN CHI_TIET_SU_DUNG_DV dvct ON dp.MaDatPhong =  dvct.MaDatPhong 
LEFT JOIN DICH_VU_DI_KEM dv ON dvct.MaDV = dv.MaDV  WHERE YEAR(dp.NgayDat) = 2018  AND p.GiaPhong < 80000;  Câu 8: 
SELECT dp.MaDatPhong, p.MaPhong, p.LoaiPhong, p.GiaPhong, kh.TenKH,  dp.NgayDat, 
 (p.GiaPhong * (TIME_TO_SEC(dp.GioKetThuc) - 
TIME_TO_SEC(dp.GioBatDau)) / 3600) AS TongTienHat, 
 COALESCE(SUM(dvct.SoLuong * dv.DonGia), 0) AS  TongTienSuDungDichVu, 
 (p.GiaPhong * (TIME_TO_SEC(dp.GioKetThuc) - 
TIME_TO_SEC(dp.GioBatDau)) / 3600)      lOMoAR cPSD| 58647650
 + COALESCE(SUM(dvct.SoLuong * dv.DonGia), 0) AS TongTienThanhToan  FROM DAT_PHONG dp 
JOIN PHONG p ON dp.MaPhong = p.MaPhong 
JOIN KHACH_HANG kh ON dp.MaKH = kh.MaKH 
LEFT JOIN CHI_TIET_SU_DUNG_DV dvct ON dp.MaDatPhong =  dvct.MaDatPhong 
LEFT JOIN DICH_VU_DI_KEM dv ON dvct.MaDV = dv.MaDV 
GROUP BY dp.MaDatPhong, p.MaPhong, p.LoaiPhong, p.GiaPhong, kh.TenKH, 
dp.NgayDat, dp.GioBatDau, dp.GioKetThuc; Câu 9: 
SELECT kh.MaKH, kh.TenKH, kh.DiaChi, kh.SoDT  FROM DAT_PHONG dp 
JOIN KHACH_HANG kh ON dp.MaKH = kh.MaKH  WHERE kh.DiaChi = 'Hoa xuan';  Câu 10: 
SELECT kh.MaKH, kh.TenKH, kh.DiaChi, kh.SoDT  FROM DAT_PHONG dp 
JOIN KHACH_HANG kh ON dp.MaKH = kh.MaKH  WHERE kh.DiaChi = 'Hoa xuan';