Professional Documents
Culture Documents
SQLCoBan ThucHanhSQL DB1 PhanCoBan
SQLCoBan ThucHanhSQL DB1 PhanCoBan
1. Tạo lược đồ CSDL đã cho trong SQL Server. Học viên tư định nghĩa các kiểu dữ liê ̣u cho
từng cô ̣t ở các bảng.
Chú ý:
- Cột nào KHÔNG được thiết lập (KHÔNG được chọn) là NOT
NULL nghĩa là các cột đó chúng ta có quyền không nhập dữ liệu cho
nó mà chỉ để chữ NULL. Để chữ NULL chứ không phải là ‘NULL’,
để ‘NULL’ thì nghĩa là chuỗi có giá trị là NULL mất rồi. Các cột là
khóa chính, khóa ngoại đương nhiên phải NOT NULL.
- Các cột dữ liệu có liên quan với nhau ở các bảng thì phải có kiểu dữ
liệu giống hệt nhau. Vd: Nếu cột MaGV trong bảng GIAOVIEN có
kiểu dữ liệu là char(10) thì cột MaGVCN trong bảng LOP cũng phải
có kiểu dữ liệu là char(10) vì cột MaGVCN là khóa ngoại ở trong
bảng LOP, nó được nối với MaGV (là khóa chính trong bảng
GIAOVIEN).
- Để nhập được tiếng Việt có dấu thì chúng ta sẽ khai kiểu dữ liệu là
nchar hoặc nvarchar (kiểu char và varchar thì chỉ có thể nhập được
dữ liệu là tiếng Anh/Mỹ).
- Phải để ý các cột nào là ngày tháng năm thì phải khai kiểu dữ liệu là
Date. Cột nào là giờ mà không có ngày tháng năm thì phải khai là
Time. Còn cột nào vừa chứa ngày tháng năm vừa chứa giờ thì khai
là Datetime.
- Nếu tạo diagram bị lỗi (không tạo được như hướng dẫn trong video
hoặc tài liệu hướng dẫn) thì tạm thời không cần tạo diagram cũng
được. Nhưng phải đảm bảo dữ liệu ở các bảng phải chính xác với
nhau.
Lưu ý: Nếu bài học trước mà học viên đã tạo DB cho hê ̣ thống này rồi thì thôi,
không cần tạo nữa
2. INSERT dữ liê ̣u (Không cần nhập tiếng Việt có dấu) vào tất cả các bảng theo 2 cách:
a. Cách 1: INSERT bằng tay. Mỗi bảng cần insert tối thiểu 10 dòng bằng cách này.
b. Cách 2: INSERT bằng lê ̣nh. Mỗi bảng cần insert tối thiểu 10 dòng bằng cách này.
3. UPDATE dữ liê ̣u (sửa dữ liệu cho các dòng có sẵn) cho bảng HOCSINH theo 3 cách:
Confidential 1/15
b. Cách 2: UPDATE bằng lê ̣nh (không có điều kiê ̣n WHERE).
b. Cách 2: DELETE bằng lê ̣nh (có điều kiê ̣n WHERE). Lưu ý: đừng DELETE bằng
lê ̣nh mà không có điều kiê ̣n WHERE, vì nếu làm như vâ ̣y thì toàn bô ̣ các dòng dữ
liê ̣u trong bảng sẽ bị mất hết, mất công ngồi nhâ ̣p lại dữ liê ̣u.
5. Hãy liê ̣t kê (sử dụng lệnh SELECT đơn giản không có WHERE):
SELECT *
FROM GIAOVIEN
b. Họ tên học sinh, giới tính, họ tên phụ huynh của toàn bô ̣ sinh viên trong trường.
From GIAOVIEN
c. Toàn bô ̣ thông tin của tất cả các lớp trong trường.
Gợi ý: Xem tài liê ̣u của thầy Phong, từ trang 18 đến trang 22 hoă ̣c truy câ ̣p vào
các link sau:
https://quantrimang.com/lenh-select-trong-sql-server-147319
https://www.w3schools.com/sql/sql_select.asp
FROM HOCSINH
Where GioiTinh='Nam'
Confidential 2/15
c. Những lớp chưa có giáo viên chủ nhiê ̣m.
f. Những học sinh nam có địa chỉ ở Hải Châu hoă ̣c những học sinh nữ có địa chỉ ở
Thanh Khê.
g. Những học sinh nam chưa có tên phụ huynh và những học sinh nữ chưa được
phân lớp.
h. Những học sinh nam chưa được phân lớp và những học sinh nam chưa có tên phụ
huynh.
i. Mã môn học của những môn học được dạy trong học kỳ 2.
Gợi ý: Lệnh SELECT đơn giản có WHERE trên 1 bảng. Các toán tử so sánh,
quan hê.̣ Đô ̣ ưu tiên của các toán tử.
Xem giáo trình của thầy Phong trang 25, 26, 28, 29
https://quantrimang.com/menh-de-where-trong-sql-server-147325
https://www.w3schools.com/sql/sql_where.asp
a. Những học sinh có họ tên bắt đầu bằng từ Nguyễn.
from HOCSINH
b. Những học sinh có họ tên kết thúc bằng từ Nở.
d. Những học sinh chứa từ Thị ở giữa (không được chứa ở đầu và ở cuối).
e. Những học sinh có họ tên với đô ̣ dài là 30 ký tự (kể cả khoảng trắng).
f. Những học sinh có họ tên với đô ̣ dài tối đa là 30 ký tự.
Confidential 3/15
g. Những học sinh có họ tên với đô ̣ dài tối đa là 30 ký tự và bắt đầu bằng ký tự N.
h. Những học sinh có họ tên bắt đầu bằng các ký tự: N, T, V.
i. Những học sinh có họ tên không được bắt đầu bằng các ký tự: N, T, V.
j. Những học sinh có họ tên với phần họ có đúng 4 ký tự.
k. Những học sinh có họ tên KHÔNG bắt đầu bằng Ng (Ví dụ Nguyen Van A là
không được hiển thị ra).
https://quantrimang.com/dieu-kien-like-trong-sql-server-147583
https://quantrimang.com/dieu-kien-not-trong-sql-server-147625
https://www.w3schools.com/sql/sql_like.asp
a. Họ tên của toàn bô ̣ học sinh trong trường, nếu họ tên nào trùng nhau thì chỉ hiển
thị 1 lần.
FROM HOCSINH
b. Mã lớp của các lớp đã có học sinh học ở lớp đó. Nếu mã lớp nào trùng nhau thì
chỉ hiển thị 1 lần.
c. Mã môn học của những môn học đã có ít nhất 1 giáo viên được phân công phụ
trách rồi. (*)
d. Mã môn học của những môn học đã từng được tổ chức thi ít nhất 1 lần.
e. Mã giáo viên của những giáo viên đã từng làm chủ nhiê ̣m cho ít nhất 1 lớp nào
đó.
Confidential 4/15
https://quantrimang.com/menh-de-distinct-trong-sql-server-147487
https://www.w3schools.com/sql/sql_distinct.asp
a. Thông tin của toàn bô ̣ học sinh trong trường. Kết quả trả về cần được sắp xếp tăng
dần theo họ tên học sinh.
FROM HocSinh
(Có chữ ASC cũng được mà ko có cũng được, vì nó mă ̣c định là tăng dần)
b. Thông tin của toàn bô ̣ học sinh trong trường. Kết quả trả về cần được sắp xếp
giảm dần theo địa chỉ.
c. Thông tin của toàn bô ̣ học sinh trong trường. Kết quả trả về cần được sắp xếp tăng
dần theo họ tên học sinh và giảm dần theo địa chỉ.
d. Thông tin của toàn bô ̣ học sinh trong trường. Kết quả trả về cần được sắp xếp tăng
dần theo họ tên học sinh và tăng dần theo địa chỉ.
e. Thông tin của toàn bô ̣ học sinh trong trường. Kết quả trả về cần được sắp xếp
giảm dần theo họ tên học sinh, giảm dần theo địa chỉ.
f. Thông tin của toàn bô ̣ học sinh trong trường. Kết quả trả về cần được sắp xếp
giảm dần theo họ tên học sinh, giảm dần theo địa chỉ và tăng dần theo họ tên phụ
huynh.
*** Trả lời thêm: Trong 2 từ khóa ASC và DESC, từ nào là không bắt buô ̣c phải
ghi rõ trong câu SELECT mà kết quả thực hiê ̣n vẫn đảm bảo tính đúng đắn?
https://quantrimang.com/menh-de-order-by-trong-sql-server-147326
https://www.w3schools.com/sql/sql_orderby.asp
Confidential 5/15
https://docs.google.com/document/d/e/2PACX-
1vQRBS3qGVVUYX7ntSBfmg7iTiwXVOb13-Y8ckUhY-
IDkZhMpQvADLrZRjurljK08ATh_tRzjj1Pur45/pub
a. MaHS, HoTenHS, GioiTinh, MaLop, TenLop, MaGVCN của học sinh trong
trường.
FROM HOCSINH
ON HOCSINH.MaLop=LOP.MaLop
Hoặc là:
ON HOCSINH.MaLop=LOP.MaLop
c. MaGV, HoTenGV, MaLop, MaMH, HocKy của những giáo viên đã được giao
phụ trách ít nhất 1 môn học.
https://quantrimang.com/inner-join-trong-sql-162351
https://www.w3schools.com/sql/sql_join_inner.asp
Confidential 6/15
FROM HOCSINH
g. MaMH, MaLop, HocKy của những môn học đã được thi cuối kỳ vào năm 2019
h. MaMH, MaLop, HocKy của những môn học đã được thi vào tháng 8 năm 2019
i. MaMH, MaLop, HocKy của những môn học đã được thi trước ngày 20 tháng 8
năm 2019
j. MaMH, MaLop, HocKy của những môn học đã được thi trước ngày 20 tháng 8
năm 2019 đúng 1 tuần. (***)
k. MaMH, MaLop, HocKy của những môn học đã được thi sau ngày 20 tháng 8 năm
2019 đúng 21 ngày. (***)
l. MaMH, MaLop, HocKy của những môn học đã được thi trong khoảng từ ngày 10
đến ngày 20 tháng 8 năm 2019.
Confidential 7/15
m. MaMH, MaLop, HocKy của những môn học đã được thi trong khoảng từ 10 giờ
00 phút ngày 10 đến 20 giờ 30 phút ngày 20 tháng 8 năm 2019.
Gợi ý: Sử dụng INNER JOIN nhiều bảng và có dùng các hàm xử lý Ngày, giờ
và có BETWEEN và AND
https://quantrimang.com/ham-datediff-trong-sql-server-161896
https://www.w3schools.com/sql/func_sqlserver_datediff.asp
a. Liê ̣t kê những địa chỉ khác nhau trong bảng HOCSINH (bằng 2 cách khác nhau)
(*)
Cách 1:
FROM HOCSINH
Cách 2:
SELECT DiaCHi
FROM HOCSINH
Group by DiaChi
b. Liê ̣t kê HoTenHS, GioiTinh của các nhóm được phân nhóm theo HoTenHS và
GioiTinh trong bảng HOCSINH.
c. Liê ̣t kê HoTenHS của các nhóm được phân nhóm theo HoTenHS và GioiTinh
trong bảng HOCSINH. Chú ý thử giải thích vì sao không liê ̣t kê GioiTinh mà vẫn
không bị lỗi. (*)
d. Liê ̣t kê MaMH, TenMH, DiemThiCuoiKy của từng môn học chia theo từng
mức điểm thi cuối kỳ. (Gợi ý: chỉ liê ̣t kê những môn đã từng có học sinh thi cuối
kỳ). (*)
e. Liê ̣t kê MaGV, TenGV của những giáo viên đã từng được phân công phụ trách ít
nhất 1 môn học. Nếu MaGV, TenGV trùng lă ̣p nhiều lần thì chỉ hiển thị ra 1 lần
trong kết quả trả về.
Confidential 8/15
Xem giáo trình của thầy Phong trang 43, 44, 45
https://quantrimang.com/menh-de-group-by-trong-sql-server-147832
https://www.w3schools.com/sql/sql_groupby.asp
https://docs.google.com/document/d/e/2PACX-
1vQRBS3qGVVUYX7ntSBfmg7iTiwXVOb13-Y8ckUhY-
IDkZhMpQvADLrZRjurljK08ATh_tRzjj1Pur45/pub
a. Liê ̣t kê HoTenHS, GioiTinh, DiaChi của các nhóm được phân nhóm theo
HoTenHS và GioiTinh trong bảng HOCSINH. Thử suy nghĩ về nguyên nhân lỗi
nếu có lỗi xảy ra (*)
from HOCSINH
*Nguyên nhân lỗi ở đây là: mỗi GROUP chỉ được trả về 1 dòng kết quả. Mỗi
học sinh có nhiều Địa Chỉ khác nhau nên không biết chọn địa chỉ nào để trả về kết
c. Đếm số lượng học sinh trong lớp có tên là Lơp 1/1 và lớp đó nằm trong năm học
2019-2020.
d. Đếm số lớp đã phụ trách (có thể là 1 hoă ̣c nhiều môn nào đó) của từng giáo viên.
Gợi ý: Sử dụng từ khóa GROUP BY kết hợp SELECT TOP và truy vấn con
(còn gọi là truy vấn lồng nhau – SUB QUERY)
https://quantrimang.com/truy-van-con-subquery-trong-sql-server-148049
https://www.tutorialspoint.com/sql/sql-sub-queries.htm
https://docs.google.com/document/d/e/2PACX-
1vQRBS3qGVVUYX7ntSBfmg7iTiwXVOb13-Y8ckUhY-
IDkZhMpQvADLrZRjurljK08ATh_tRzjj1Pur45/pub
Confidential 9/15
14. Hãy liê ̣t kê:
SELECT HOCSINH.MaHS
(SELECT HOCSINH.MaHS
FROM KETQUAHOCTAP
WHERE KETQUAHOCTAP.MaHS=HOCSINH.MaHS)
Hoặc:
SELECT HOCSINH.MaHS
FROM HOCSINH
FROM KETQUAHOCTAP)
Lưu ý: 1 cái là tìm HS ko có trong tâ ̣p hợp những HS đã từng thi (NOT IN)
còn 1 cái là phủ định lại của phép NỐI, từng là PHÉP KHÔNG NỐI ĐƯỢC (NOT
EXITS)
d. Môn học chưa từng được tổ chức thi lần nào.
e. Đếm xem tương ứng với mỗi địa chỉ (của học sinh), số lượng học sinh đang ở mỗi
địa chỉ là bao nhiêu em. Chỉ hiển thị kết quả cho những địa chỉ có ít nhất 5 học
sinh đang ở đó.
https://docs.google.com/document/d/e/2PACX-
1vQRBS3qGVVUYX7ntSBfmg7iTiwXVOb13-Y8ckUhY-
IDkZhMpQvADLrZRjurljK08ATh_tRzjj1Pur45/pub
https://quantrimang.com/menh-de-having-trong-sql-server-147839
https://www.w3schools.com/sql/sql_having.asp
Confidential 10/15
Xem giáo trình của thầy Phong trang 51, 52
https://trongthaonh.wordpress.com/2011/11/06/not-in-and-not-exists-in-sql/
https://www.w3schools.com/sql/sql_in.asp
https://freetuts.net/toan-tu-in-va-not-in-trong-sql-1471.html
https://v1study.com/sql-in-va-not-in.html
https://webcoban.vn/mysql/exists-trong-mysql
https://shareprogramming.net/sql-exists-kiem-tra-su-ton-tai-trong-sql/
a. Học sinh nam ở Thanh Khê và học sinh nữ ở Hải Châu (theo 2 cách khác nhau).
Cách 1:
From HOCSINH
Cách 2:
From HOCSINH
UNION
From HOCSINH
b. Họ tên của học sinh và giáo viên trong toàn trường.
c. Họ tên, nghề nghiê ̣p của học sinh và giáo viên trong toàn trường. (Nghề nghiê ̣p
bao gồm: học sinh hoă ̣c giáo viên).
Confidential 11/15
d. Những học sinh đang học ở năm học 2019-2020 và những học sinh chưa từng thi
môn Toán và môn Tiếng Viê ̣t.
https://quantrimang.com/toan-tu-union-trong-sql-server-148035
https://www.w3schools.com/sql/sql_union.asp
16. Đếm tổng số lượt thi 2 môn Toán và tiếng Viê ̣t của tất cả học sinh trong toàn trường. Yêu
cầu: (YC1) Đếm Theo từng tháng (đầy đủ 12 tháng, từ tháng 1 đến tháng 12) trong năm
2019. (YC2) Tháng nào có tổng số lượt thi của riêng môn Toán dưới 3 lượt, thì tháng đó
không tính (không cô ̣ng) số lượt thi môn Toán vào kết quả trả về. (***)
Gợi ý: Sử dụng từ khóa UNION ALL. Bài này rất khó, có thể bỏ qua.
a. MaLop, TenLop, MaGVCN, HoTenGV (chủ nhiê ̣m) của tất cả các lớp trong
trường. (Gợi ý: tất cả các lớp nghĩa là kể cả những lớp chưa được phân công
GVCN).
FROM LOP
ON LOP.MaGVCN = GIAOVIEN.MaGV
c. MaHS, HoTenHS, MaLop, TenLop, MaGVCN, HoTenGV (Chủ nhiê ̣m) của tất
cả học sinh trong trường. (Chú ý những trường hợp: học sinh chưa được phân lớp
và lớp chưa được phân GVCN).
d. MaGV, HoTenGV, MaLop, TenLop, MaMH, HocKy, TenMH của tất cả giáo
viên trong trường.
Confidential 12/15
https://quantrimang.com/left-join-trong-sql-162356
https://www.w3schools.com/sql/sql_join_left.asp
https://docs.google.com/document/d/e/2PACX-
1vQRBS3qGVVUYX7ntSBfmg7iTiwXVOb13-Y8ckUhY-
IDkZhMpQvADLrZRjurljK08ATh_tRzjj1Pur45/pub
18. Sử dụng RIGHT JOIN (hoă ̣c LEFT JOIN và RIGHT JOIN kết hợp với nhau) để trả lời
các câu hỏi của yêu cầu ngay ở trên.
https://docs.google.com/document/d/e/2PACX-
1vQRBS3qGVVUYX7ntSBfmg7iTiwXVOb13-Y8ckUhY-
IDkZhMpQvADLrZRjurljK08ATh_tRzjj1Pur45/pub
https://quantrimang.com/right-join-trong-sql-162359
https://www.w3schools.com/sql/sql_join_right.asp
a. MaHS, HoTenHS, MaLop, TenLop của tất cả học sinh và tất cả các lớp trong
trường. (Gợi ý: lớp chưa có học sinh và học sinh chưa được phân lớp đều phải
được trả về kết quả).
FROM HOCSINH
ON LOP.MaLop = HOCSINH.MaLop
b. MaMH, TenMH, MaGV (phụ trách), HoTenGV (phụ trách) của tất cả những
môn học và tất cả giáo viên trong trường. Kết quả trả về cần loại bỏ bớt những
dòng trùng lă ̣p (những dòng nào trùng nhau thì chỉ hiển thị kết quả 1 lần).
Confidential 13/15
https://docs.google.com/document/d/e/2PACX-
1vQRBS3qGVVUYX7ntSBfmg7iTiwXVOb13-Y8ckUhY-
IDkZhMpQvADLrZRjurljK08ATh_tRzjj1Pur45/pub
https://quantrimang.com/full-join-trong-sql-162362
https://www.w3schools.com/sql/sql_join_full.asp
a. MaGV, HoTenGV của những giáo viên đã từng làm chủ nhiê ̣m lớp và từng dạy
môn Âm nhạc.
FROM GIAOVIEN
on LOP.MaGVCN=GIAOVIEN.MaGV)
intersect
FROM GIAOVIEN GV
On GV.MaGV = PTBM.MaGVPT
Where MaMH='AN')
b. MaHS, TenHS của những học sinh đã từng thi môn Toán trong học kỳ 1 và đã
từng thi môn Âm nhạc trong học kỳ 2.
c. MaMH, TenMH của những môn học đã từng được ít nhất 5 học sinh thi cuối kỳ
và đã từng được ít nhất 2 giáo viên phụ trách giảng dạy.
https://quantrimang.com/toan-tu-intersect-trong-sql-server-148044
https://www.tutorialspoint.com/sql/sql-intersect-clause.htm
Confidential 14/15
a. MaGV, HoTenGV của những giáo viên đã từng làm chủ nhiê ̣m lớp và chưa từng
dạy môn Âm nhạc.
b. MaHS, TenHS của những học sinh đã từng thi môn Toán trong học kỳ 1 và chưa
từng thi môn Âm nhạc trong học kỳ 2.
c. MaMH, TenMH của những môn học đã từng được ít nhất 5 học sinh thi cuối kỳ
và chỉ được đúng 2 giáo viên phụ trách giảng dạy.
https://quantrimang.com/toan-tu-except-trong-sql-server-148048
https://www.tutorialspoint.com/sql/sql-except-clause.htm
Confidential 15/15