You are on page 1of 16

Bài 1:

1.1

a/ Câu lệnh Create Table để tạo các bảng:

Bảng SINHVIEN

CREATE TABLE SINHVIEN (

Ten NVARCHAR(50) NOT NULL,

Masv NVARCHAR(10) PRIMARY KEY,

Nam INT NOT NULL,

Khoa NVARCHAR(50) NOT NULL

);

Bảng MHOC

CREATE TABLE MHOC (

Ten_mh NVARCHAR(50) NOT NULL,

Mamh NVARCHAR(10) PRIMARY KEY,

Tinchi INT NOT NULL,

Khoa NVARCHAR(50) NOT NULL

);

Bảng DKIEN

CREATE TABLE DKIEN (

Mamh NVARCHAR(10) PRIMARY KEY,

Mamh_truoc NVARCHAR(10) NOT NULL

);
Bảng K_HOC

CREATE TABLE K_HOC (

Makh NVARCHAR(10) PRIMARY KEY,

Mamh NVARCHAR(10) NOT NULL,

Hocky INT NOT NULL,

Nam INT NOT NULL,

Gv NVARCHAR(50) NOT NULL

);

Bảng KQUA

CREATE TABLE KQUA (

Masv NVARCHAR(10) NOT NULL,

Makh NVARCHAR(10) NOT NULL,

Diem FLOAT NOT NULL,

PRIMARY KEY (Masv, Makh)

);

b/ Câu lệnh Insert Into để nhập dữ liệu cho các bảng

Bảng SINHVIEN:

INSERT INTO SINHVIEN (Ten, Masv, Nam, Khoa)

VALUES ('Truong Thanh Huong Giang', 'SV001', 2003, 'Khoa A');

Bảng MHOC:

INSERT INTO MHOC (Ten_mh, Mamh, Tinchi, Khoa)

VALUES ('Toan cao cap', 'M001', 3, 'Khoa Toan');

Bảng DKIEN:
INSERT INTO DKIEN (Mamh, Mamh_truoc)

VALUES ('M002', 'M001');

Bảng K_HOC:

INSERT INTO K_HOC (Makh, Mamh, Hocky, Nam, Gv)

VALUES ('HK001', 'M001', 1, 2023, 'Le Thi B');

Bảng KQUA:

INSERT INTO KQUA (Masv, Makh, Diem)

VALUES ('SV001', 'HK001', 8.5);

1.2

a/ Câu lệnh Create Table để tạo các bảng:

Bảng NHANVIEN:

CREATE TABLE NHANVIEN (

Holot NVARCHAR(50) NOT NULL,

Tennv NVARCHAR(50) NOT NULL,

Manv NVARCHAR(10) PRIMARY KEY,

NgSinh DATE NOT NULL,

Dchi NVARCHAR(100) NOT NULL,

Phai NVARCHAR(5) NOT NULL,

Luong FLOAT NOT NULL,

Ma_nql NVARCHAR(10),

Phg NVARCHAR(10) NOT NULL,

FOREIGN KEY (Ma_nql) REFERENCES NHANVIEN(Manv),

FOREIGN KEY (Phg) REFERENCES PHONGBAN(Maphg)


);

Bảng PHONGBAN:

CREATE TABLE PHONGBAN (

Tenphg NVARCHAR(50) NOT NULL,

Maphg NVARCHAR(10) PRIMARY KEY,

Trphg NVARCHAR(50) NOT NULL,

Ng_nhanchuc DATE NOT NULL

);

Bảng DIADIEM_PHG:

CREATE TABLE DIADIEM_PHG (

Maphong NVARCHAR(10) PRIMARY KEY,

Diadiem NVARCHAR(100) NOT NULL

);

Bảng DEAN:

CREATE TABLE DEAN (

Tendean NVARCHAR(50) NOT NULL,

Mada NVARCHAR(10) PRIMARY KEY,

Ddiem_DA NVARCHAR(100) NOT NULL,

Phong NVARCHAR(10) NOT NULL,

FOREIGN KEY (Phong) REFERENCES PHONGBAN(Maphg)

);

Bảng PHANCONG:

CREATE TABLE PHANCONG (


Ma_nvien NVARCHAR(10) NOT NULL,

Soda NVARCHAR(50) NOT NULL,

Thoigian DATE NOT NULL,

PRIMARY KEY (Ma_nvien, Soda),

FOREIGN KEY (Ma_nvien) REFERENCES NHANVIEN(Manv)

);

Bảng THANNHAN:

CREATE TABLE THANNHAN (

Ma_nvien NVARCHAR(10) NOT NULL,

Tentn NVARCHAR(50) NOT NULL,

Phai NVARCHAR(5) NOT NULL,

Ngsinh DATE NOT NULL,

Quanhe NVARCHAR(50) NOT NULL,

PRIMARY KEY (Ma_nvien, Tentn),

FOREIGN KEY (Ma_nvien) REFERENCES NHANVIEN(Manv)

);

b/ Câu lệnh Insert Into để nhập dữ liệu cho các bảng

Bảng NHANVIEN:

INSERT INTO NHANVIEN (Holot, Tennv, Manv, NgSinh, Dchi, Phai,


Luong, Ma_nql, Phg)

VALUES ('Nguyen', 'Van A', 'NV001', '1990-01-15', '123 ABC Street', 'Nam',
1000, NULL, 'PHG001');

Bảng PHONGBAN:
INSERT INTO PHONGBAN (Tenphg, Maphg, Trphg, Ng_nhanchuc)

VALUES ('Phong Ky Thuat', 'PHG001', 'Truong Phong A', '2022-05-20');

Bảng DIADIEM_PHG:

INSERT INTO DIADIEM_PHG (Maphong, Diadiem)

VALUES ('PHG001', 'Tang 5, Toa nha ABC');

Bảng DEAN:

INSERT INTO DEAN (Tendean, Mada, Ddiem_DA, Phong)

VALUES ('Nguyen Van B', 'DA001', 'Tang 3, Toa nha XYZ', 'PHG001');
Bảng PHANCONG:

INSERT INTO PHANCONG (Ma_nvien, Soda, Thoigian)

VALUES ('NV001', 'Cong viec A', '2023-02-10');

Bảng THANNHAN:

INSERT INTO THANNHAN (Ma_nvien, Tentn, Phai, Ngsinh, Quanhe)

VALUES ('NV001', 'Nguyen Thi B', 'Nu', '1995-03-20', 'Vo');

Bài 2:

1.1 In ra tên sinh viên:

SELECT Ten

FROM SINHVIEN;

1.2 In ra tên các môn học và số tín chỉ:

SELECT Ten_mh, Tinchi

FROM MHOC;

1.3 Cho biết kết quả họ tên của sinh viên có mã số 8:

SELECT Ten

FROM SINHVIEN

WHERE Masv = 'SV008';

1.4 Cho biết các mã số môn học phải học ngay trước môn có mã số COSC3320:

SELECT Mamh

FROM DKIEN

WHERE Mamh_truoc = 'COSC3320';

1.5 Cho biết các mã số môn học phải học ngay sau môn có mã số COSC3320:

SELECT Mamh_truoc
FROM DKIEN

WHERE Mamh = 'COSC3320';

1.6 Cho biết tên các sinh viên thuộc về khoa phụ trách môn "Toán rời rạc":

SELECT Ten

FROM SINHVIEN

WHERE Khoa = (SELECT Khoa

FROM MHOC

WHERE Ten_mh = 'Toán rời rạc');

1.7 Sửa lại giá trị cột NAM của sinh viên Sơn thành 2:

UPDATE SINHVIEN

SET Nam = 2

WHERE Ten = 'Sơn';

1.8 Cho biết tên sinh viên và các môn học mà sinh viên đó tham gia với kết quả
cuối khoá trên 7 điểm:

SELECT SINHVIEN.Ten, MHOC.Ten_mh

FROM SINHVIEN

INNER JOIN KQUA ON SINHVIEN.Masv = KQUA.Masv

INNER JOIN K_HOC ON KQUA.Makh = K_HOC.Makh

INNER JOIN MHOC ON K_HOC.Mamh = MHOC.Mamh

WHERE KQUA.Diem > 7;

1.9 Cho biết tên các môn học phải học ngay trước môn "Cơ sở dữ liệu":

SELECT MHOC.Ten_mh

FROM MHOC
INNER JOIN DKIEN ON MHOC.Mamh = DKIEN.Mamh_truoc

WHERE DKIEN.Mamh = 'CSDL';


1.10 Cho biết tên các môn học phải học liền sau môn "Cơ sở dữ liệu":

SELECT MHOC.Ten_mh

FROM MHOC

INNER JOIN DKIEN ON MHOC.Mamh = DKIEN.Mamh

WHERE DKIEN.Mamh_truoc = 'CSDL';

1.11 Cho biết tên các môn học mà giáo viên An tham gia giảng dạy và tên sinh
viên theo học môn đó. Sắp xếp kết quả tăng dần theo thứ tự: tên môn học, tên sinh
viên:

SELECT MHOC.Ten_mh, SINHVIEN.Ten

FROM MHOC

INNER JOIN K_HOC ON MHOC.Mamh = K_HOC.Mamh

INNER JOIN GIAOVIEN ON K_HOC.Gv = GIAOVIEN.Ten_gv

INNER JOIN KQUA ON K_HOC.Makh = KQUA.Makh

INNER JOIN SINHVIEN ON KQUA.Masv = SINHVIEN.Masv

WHERE GIAOVIEN.Ten_gv = 'An'

ORDER BY MHOC.Ten_mh, SINHVIEN.Ten;

1.12 Thêm vào bảng SINHVIEN một cột mới: DIACHI char(50):

ALTER TABLE SINHVIEN

ADD DIACHI NVARCHAR(50);

1.13 Bổ sung địa chỉ cho sinh viên Sơn: "12 nguyễn trãi, Đà Nẵng":

UPDATE SINHVIEN

SET DIACHI = '12 Nguyễn Trãi, Đà Nẵng'

WHERE Ten = 'Sơn';


1.14 Thêm vào bảng KQUA dòng <18, 135, 8>. Câu lệnh này có thành công hay
không? Nếu không thì hãy giải thích lý do:

INSERT INTO KQUA (Masv, Makh, Diem) VALUES ('SV018', 'MKH135',


8);

Câu lệnh này không thành công vì bảng KQUA có khóa chính (Masv, Makh), và
giá trị SV018 và MKH135 đã tồn tại trong bảng. Không thể thêm dòng có giá trị
trùng lặp vào bảng có khóa chính.

1.15 Xóa đi trong bảng SINHVIEN dòng <Sơn, 17, 1, CNTT>. Câu lệnh này thực
hiện có thành công không? Nếu không hãy giải thích lý do:

DELETE FROM SINHVIEN

WHERE Ten = 'Sơn' AND Masv = 'SV017' AND Khoa = 'CNTT';

Câu lệnh này không thành công nếu dòng có giá trị SV017 và CNTT không tồn tại
trong bảng SINHVIEN. Không thể xóa một dòng không tồn tại.

1.16 Cập nhật các sinh viên thuộc khoa CNTT thành khoa TOAN:

UPDATE SINHVIEN

SET Khoa = 'TOAN'

WHERE Khoa = 'CNTT';

1.17 Tăng số tín chỉ lên 1 cho mỗi môn học:

UPDATE MHOC

SET Tinchi = Tinchi + 1;

1.18 Nếu sinh viên có điểm số dưới trung bình thì xoá dữ liệu trong bảng KQUA:

DELETE FROM KQUA

WHERE Diem < 5.5;

2.1 Cho biết họ tên và địa chỉ các nhân viên sống ở Tp. HCM sắp xếp tăng dần
theo họ tên:
SELECT Holot, Tennv, Dchi

FROM NHANVIEN

WHERE Dchi LIKE '%Tp. HCM%'

ORDER BY Holot, Tennv;

2.2 Cho biết họ tên và mức lương các nhân viên trên 40 tuổi sắp xếp tăng dần theo
lương:

SELECT Holot, Tennv, Luong

FROM NHANVIEN

WHERE DATEDIFF(YEAR, NgSinh, GETDATE()) > 40

ORDER BY Luong;
2.3 Liệt kê danh sách những nhân viên (HONV, TENNV) có cùng tên (TENNV)
với người thân:

SELECT NV1.Holot AS HONV, NV1.Tennv AS TENNV

FROM NHANVIEN NV1

INNER JOIN THANNHAN TN ON NV1.Manv = TN.Ma_nvien

INNER JOIN NHANVIEN NV2 ON TN.Tentn = NV2.Tennv AND


NV1.Manv <> NV2.Manv;

2.4 Với mọi đề án ở "Hà Nội", liệt kê các mã số đề án (Mada), mã số phòng ban
chủ trì đề án (PHONG), họ tên trưởng phòng (TENNV, HO_NV) cũng như địa chỉ
(DCHI) và ngày sinh (NG_SINH) của người ấy:

SELECT DA.Mada, DA.PHONG, NV.Tennv AS TENNV, NV.Holot AS


HO_NV, NV.Dchi, NV.NgSinh

FROM DEAN DA

INNER JOIN NHANVIEN NV ON DA.Mada = NV.Ma_nql

WHERE DA.Ddiem_DA = 'Hà Nội';

2.5 Cho biết tên những nhân viên phòng số 5 có tham gia đề án "Sản phẩm X" với
số giờ làm việc trên 10 giờ/tuần:

SELECT NV.Tennv

FROM NHANVIEN NV

INNER JOIN K_HOC KH ON NV.Manv = KH.Ma_nql

INNER JOIN PHANCONG PC ON KH.Makh = PC.Makh

INNER JOIN KQUA KQ ON PC.Ma_nvien = KQ.Masv

INNER JOIN MHOC MH ON KH.Mamh = MH.Mamh

INNER JOIN DEAN DA ON NV.Manv = DA.Mada


WHERE DA.PHONG = 5 AND MH.Ten_mh = 'Sản phẩm X' AND
KH.Tinchi > 10;

2.6 Cho biết danh sách những nhân viên (HONV, TENNV) không có thân nhân
nào:

SELECT NV.Holot AS HONV, NV.Tennv AS TENNV

FROM NHANVIEN NV

LEFT JOIN THANNHAN TN ON NV.Manv = TN.Ma_nvien

WHERE TN.Ma_nvien IS NULL;

2.7 Cho biết danh sách những trưởng phòng có tối thiểu một thân nhân:

SELECT NV.Holot AS HONV, NV.Tennv AS TENNV

FROM DEAN DA

INNER JOIN NHANVIEN NV ON DA.Mada = NV.Manv

INNER JOIN THANNHAN TN ON NV.Manv = TN.Ma_nvien

GROUP BY NV.Holot, NV.Tennv

HAVING COUNT(TN.Ma_nvien) >= 1;

2.8 Cho biết danh sách những nhân viên (HONV, TENNV) không làm việc cho bất
kỳ đề án nào:

SELECT NV.Holot AS HONV, NV.Tennv AS TENNV

FROM NHANVIEN NV

LEFT JOIN DEAN DA ON NV.Manv = DA.Mada

WHERE DA.Mada IS NULL;

2.9 Cho biết danh sách những nhân viên (HONV, TENNV) có trên 2 thân nhân:

SELECT NV.Holot AS HONV, NV.Tennv AS TENNV

FROM NHANVIEN NV
INNER JOIN (SELECT Ma_nvien, COUNT(*) AS SoTN FROM
THANNHAN GROUP BY Ma_nvien) TNCount

ON NV.Manv = TNCount.Ma_nvien

WHERE TNCount.SoTN > 2;

2.10 Tìm tên và địa chỉ của tất cả các nhân viên của phòng "Nghiên cứu":

SELECT NV.Tennv, NV.Dchi

FROM NHANVIEN NV

INNER JOIN DEAN DA ON NV.Manv = DA.Mada

WHERE DA.Tenphg = 'Nghiên cứu';


2.11 Cho biết danh sách những nhân viên (HONV, TENNV) được "Nguyễn Thanh
Tùng" phụ trách trực tiếp:

SELECT NV.Holot AS HONV, NV.Tennv AS TENNV

FROM NHANVIEN NV

INNER JOIN DEAN DA ON NV.Manv = DA.Mada

WHERE DA.Tendean = 'Nguyễn Thanh Tùng';

2.12 Tìm họ tên, địa chỉ của những nhân viên làm việc cho một đề án ở Tp.HCM
nhưng phòng ban mà họ trực thuộc tất cả không toạ lạc ở Tp.HCM:

SELECT NV.Holot AS HONV, NV.Tennv AS TENNV, NV.Dchi

FROM NHANVIEN NV

INNER JOIN DEAN DA ON NV.Manv = DA.Mada

INNER JOIN K_HOC KH ON NV.Manv = KH.Ma_nql

WHERE KH.Gv = 'Tp.HCM' AND NOT EXISTS (

SELECT 1 FROM DEAN DA2 WHERE NV.Manv = DA2.Mada AND


DA2.Gv = 'Tp.HCM'

);

You might also like