You are on page 1of 9

BÀI THỰC HÀNH SỐ 2

Thao tác Cơ sở dữ liệu sử dụng T-SQL 1.

Yêu cầu thực hành


1. Truy vấn cơ bản
a. Cho biết thông tin (mã cầu thủ, họ tên, số áo, vị trí, ngày sinh, địa chỉ) của tất cả
các cầu thủ’.
SELECT MACT, HOTEN, SO, VITRI, NGAYSINH, DIACHI FROM dbo.CAUTHU
b. Hiển thị thông tin tất cả các cầu thủ có số áo là 7 chơi ở vị trí Tiền vệ.
SELECT * FROM dbo.CAUTHU WHERE SO = 7 AND VITRI = N'Tiền vệ'
c. Cho biết tên, ngày sinh, địa chỉ, điện thoại của tất cả các huấn luyện viên.
SELECT TENHLV , NGAYSINH, DIACHI, DIENTHOAI
FROM dbo.HUANLUYENVIEN
d. Hiển thi thông tin tất cả các cầu thủ có quốc tịch Việt Nam thuộc câu lạc bộ
Becamex Bình Dương.
SELECT * FROM dbo.CAUTHU WHERE MAQG = 'VN' AND MACLB = 'BBD'
e. Cho biết mã số, họ tên, ngày sinh, địa chỉ và vị trí của các cầu thủ thuộc đội bóng
‘SHB Đà Nẵng’ có quốc tịch
SELECT MACT, HOTEN, VITRI, NGAYSINH, DIACHI FROM dbo.CAUTHU WHERE
MACLB = 'SDN' AND MAQG != 'NULL'
f. Hiển thị thông tin tất cả các cầu thủ đang thi đấu trong câu lạc bộ có sân nhà là
“Long An”.
SELECT CT.MACT, CT.HOTEN, CT.VITRI, CT.NGAYSINH, CT.DIACHI, CT.MACLB, CT.MAQG FROM SANVD,
CAUTHU AS CT, CAULACBO
WHERE CT.MACLB = CAULACBO.MACLB AND CAULACBO.MASAN = SANVD.MASAN AND
SANVD.MASAN = 'LA'

g. Cho biết kết quả (MATRAN, NGAYTD, TENSAN, TENCLB1, TENCLB2,


KETQUA) các trận đấu vòng 2 của mùa bóng năm 2009.

SELECT TD.MATRAN, TD.NGAYTD, SANVD.TENSAN, CLB1.TENCLB AS TENCLB1, CLB2.TENCLB AS


TENCLB2, TD.KETQUA
FROM TRANDAU AS TD , SANVD, CAULACBO AS CLB1, CAULACBO AS CLB2
WHERE NAM = 2009 AND VONG = 2 AND TD.MASAN = SANVD.MASAN AND TD.MACLB1 = CLB1.MACLB
AND TD.MACLB2 = CLB2.MACLB
h. Cho biết mã huấn luyện viên, họ tên, ngày sinh, địa chỉ, vai trò và tên CLB đang
làm việc của các huấn luyện viên có quốc tịch “ViệtNam”.
SELECT HLV.MAHLV, HLV.TENHLV, HLV.NGAYSINH, HLV.DIACHI, HLV_CLB.VAITRO ,
CLB.TENCLB
FROM HUANLUYENVIEN AS HLV , CAULACBO AS CLB, HLV_CLB
WHERE HLV.MAQG = 'VN' AND HLV.MAHLV = HLV_CLB.MAHLV AND HLV_CLB.MACLB =
CLB.MACLB
i. Lấy tên 3 câu lạc bộ có điểm cao nhất sau vòng 3 năm 2009.
j. 10. Cho biết mã huấn luyện viên, họ tên, ngày sinh, địa chỉ, vai trò và tên CLB
đang làm việc mà câu lạc bộ đó đóng ở tỉnh Binh Dương.
2. Các phép toán trên nhóm
a. Thống kê số lượng cầu thủ của mỗi câu lạc bộ.
SELECT CT.MACLB, COUNT(CT.MACT) AS N'Số lượng cầu thủ nước ngoài'
FROM CAUTHU AS CT
WHERE CT.MAQG != 'VN'
GROUP BY CT.MACLB
b. Thống kê số lượng cầu thủ nước ngoài (có quốc tịch khác Việt Nam) của mỗi câu
lạc bộ
SELECT CT.MACLB, COUNT(CT.MACT) AS N'Số lượng cầu thủ nước ngoài'
FROM CAUTHU AS CT
WHERE CT.MAQG != 'VN'
GROUP BY CT.MACLB
c. Cho biết mã câu lạc bộ, tên câu lạc bộ, tên sân vận động, địa chỉ và số lượng cầu
thủ nước ngoài (có quốc tịch khác Việt Nam) tương ứng của các câu lạc bộ có
nhiều hơn 2 cầu thủ nước ngoài.

d. Cho biết tên tỉnh, số lượng cầu thủ đang thi đấu ở vị trí tiền đạo trong các câu lạc
bộ thuộc địa bàn tỉnh đó quản lý.

SELECT TINH.TENTINH, COUNT(MACT) AS N'Số lượng cầu thủ chơi vị trí tiền đạo'
FROM TINH, CAULACBO AS CLB, CAUTHU AS CT
WHERE TINH.MATINH = CLB.MATINH AND CT.MACLB = CLB.MACLB and CT.VITRI
= N'Tiền đạo'
GROUP BY TINH.TENTINH
e. Cho biết tên câu lạc bộ, tên tỉnh mà CLB đang đóng nằm ở vị trí cao nhất của
bảng xếp hạng vòng 3, năm 2009.
SELECT TOP 1 CLB.TENCLB, TINH.TENTINH
FROM BANGXH, CAULACBO AS CLB, TINH
WHERE BANGXH.MACLB = CLB.MACLB AND TINH.MATINH = CLB.MATINH AND
BANGXH.VONG = 3
ORDER BY BANGXH.DIEM DESC
3. Các toán tử nâng cao
a. Cho biết tên huấn luyện viên đang nắm giữ một vị trí trong một câu lạc bộ mà
chưa có số điện thoại.
SELECT TENHLV FROM HUANLUYENVIEN WHERE DIENTHOAI IS NULL
b. Liệt kê các huấn luyện viên thuộc quốc gia Việt Nam chưa làm công tác huấn
luyện tại bất kỳ một câu lạc bộ nào.
SELECT HLV.MAHLV, HLV.TENHLV
FROM HUANLUYENVIEN AS HLV, CAULACBO AS CLB, HLV_CLB AS HVB
WHERE HLV.MAHLV = HVB.MAHLV AND CLB.MACLB = HVB.MACLB
AND HLV.MAQG = 'VN' AND HVB.VAITRO IS NULL
c. Liệt kê các cầu thủ đang thi đấu trong các câu lạc bộ có thứ hạng ở vòng 3 năm
2009 lớn hơn 6 hoặc nhỏ hơn 3.
SELECT DISTINCT CT.HOTEN FROM
BANGXH
INNER JOIN
CAULACBO AS CLB ON BANGXH.MACLB = CLB.MACLB
INNER JOIN
CAUTHU AS CT ON CLB.MACLB = CT.MACLB
WHERE BANGXH.VONG = 3 AND BANGXH.HANG < 3 OR BANGXH.HANG > 6
d. Cho biết danh sách các trận đấu (NGAYTD, TENSAN, TENCLB1, TENCLB2,
KETQUA) của câu lạc bộ (CLB) đang xếp hạng cao nhất tính đến hết vòng 3 năm
2009.
SELECT DISTINCT CT.HOTEN FROM
BANGXH
INNER JOIN
CAULACBO AS CLB ON BANGXH.MACLB = CLB.MACLB
INNER JOIN
CAUTHU AS CT ON CLB.MACLB = CT.MACLB
WHERE BANGXH.VONG = 3 AND BANGXH.HANG < 3 OR BANGXH.HANG > 6

Cú pháp chung của câu lệnh SELECT có dạng:


SELECT [ALL | DISTINCT][TOP n] danh_sách_chọn [INTO tên_bảng_mới] FROM
danh_sách_bảng/khung_nhìn [WHERE điều_kiện] [GROUP BY danh_sách_cột] [HAVING
điều_kiện] [ORDER BY cột_sắp_xếp] [COMPUTE danh_sách_hàm_gộp [BY danh_sách_cột]]

CASE biểu_thức WHEN biểu_thức_kiểm_tra THEN kết_quả [...] [ELSE kết_quả_của_else]


END hoặc: CASE WHEN điều_kiện THEN kết_quả [...] [ELSE kết_quả_của_else] END

AS : tên cột mới tạm thời


BÀI THỰC HÀNH SỐ 3
Thao tác Cơ sở dữ liệu sử dụng T-SQL nâng cao

1. Xử lý chuỗi, ngày giờ


a. Cho biết NGAYTD, TENCLB1, TENCLB2, KETQUA các trận đấu diễn ra vào
tháng 3 trên sân nhà mà không bị thủng lưới
SELECT NGAYTD, CLB1.TENCLB AS TENCLB1, CLB2.TENCLB AS TENCLB2, KETQUA
FROM TRANDAU, CAULACBO CLB1, CAULACBO CLB2
WHERE KETQUA LIKE '%-0' AND month(NGAYTD) = 3
AND (MACLB1 = CLB1.MACLB AND MACLB2 = CLB2.MACLB)

b. Cho biết mã số, họ tên, ngày sinh của những cầu thủ có họ lót là “Công”
SELECT MACT , HOTEN, NGAYSINH
FROM CAUTHU
WHERE HOTEN LIKE N'%_cÔNG_%'

c. Cho biết mã số, họ tên, ngày sinh của những cầu thủ có họ không phải là họ
“Nguyễn “.
SELECT MACT , HOTEN, NGAYSINH
FROM CAUTHU
WHERE HOTEN NOT LIKE N'NGUYỄN_%'

d. Cho biết mã huấn luyện viên, họ tên, ngày sinh, đ ịa chỉ của những huấn luyện
viên Việt Nam có tuổi nằm trong khoảng 35-40.
SELECT MAHLV, TENHLV, NGAYSINH , DIACHI
FROM HUANLUYENVIEN
WHERE MAQG = 'VN'
AND (((year(getdate()) - year(NGAYSINH)) >= 35 and (year(getdate()) - year(NGAYSINH))
<= 40))

e. Cho biết tên câu lạc bộ có huấn luyện viên trưởng sinh vào ngày 20 tháng 8 năm
2019
SELECT TENCLB
FROM CAULACBO, HUANLUYENVIEN, HLV_CLB
WHERE VAITRO = N'HLV Chính ' AND HUANLUYENVIEN.MAHLV = HLV_CLB.MAHLV
AND HLV_CLB.MACLB = CAULACBO.MACLB
AND (YEAR(NGAYSINH) = 2019 AND MONTH(NGAYSINH)= 8 AND DAY(NGAYSINH) = 20)

f. Cho biết tên câu lạc bộ, tên tỉnh mà CLB đang đóng có số bàn thắng nhiều nhất
tính đến hết vòng 3 năm 2009.
SELECT TOP 1 TENCLB, TENTINH
FROM CAULACBO, TINH, BANGXH
WHERE CAULACBO.MATINH = TINH.MATINH AND BANGXH.MACLB= CAULACBO.MACLB
AND VONG <=3 AND NAM <= 2019
ORDER BY THANG DESC

2. Truy vấn con


a. Cho biết mã câu lạc bộ, tên câu lạc bộ, tên sân vận động, địa chỉ và số lượng cầu
thủ nước ngoài (Có quốc tịch khác “Việt Nam”) tương ứng của các câu lạc bộ có
nhiều hơn 2 cầu thủ nước ngoài.
SELECT CAULACBO.MACLB, TENCLB, TENSAN, SANVD.DIACHI, COUNT(MACT) AS [SO CT NUOC NGOAI]
FROM CAULACBO, SANVD, CAUTHU, QUOCGIA
WHERE CAULACBO.MACLB = CAUTHU.MACLB
AND SANVD.MASAN = CAULACBO.MASAN
AND CAUTHU.MAQG = QUOCGIA.MAQG AND TENQG != N'Việt Nam'
GROUP BY CAULACBO.MACLB, TENCLB, TENSAN, SANVD.DIACHI
HAVING (count(MACT) >= 2)

b. Cho biết tên câu lạc bộ, tên tỉnh mà CLB đang đóng có hiệu số bàn thắng bại cao
nhất năm 2009.
SELECT TENCLB, TENTINH
FROM CAULACBO, TINH, BANGXH, (select max(vong) as vongcuoi from BANGXH) v

WHERE VONG = v.vongcuoi


AND CAULACBO.MACLB = BANGXH.MACLB
AND CAULACBO.MATINH = TINH.MATINH
AND (cast(left(HIEUSO, charindex('-', HIEUSO)-1) as int)
- cast(right(HIEUSO, len(HIEUSO) - charindex('-', HIEUSO)) as int)) =
(select MAX(cast(left(HIEUSO, charindex('-', HIEUSO)-1) as int)
- cast(right(HIEUSO, len(HIEUSO) - charindex('-', HIEUSO)) as
int))
from BANGXH where VONG = v.vongcuoi)

select * from BANGXH where vong = 4

c. Cho biết danh sách các trận đấu ( NGAYTD, TENSAN, TENCLB1, TENCLB2,
KETQUA) của câu lạc bộ CLB có thứ hạng thấp nhất trong bảng xếp hạng vòng 3
năm 2009
SELECT NGAYTD, TENSAN, C1.TENCLB AS TENCLB1, C2.TENCLB AS TENCLB2, KETQUA
FROM TRANDAU, SANVD, CAULACBO C1, CAULACBO C2, BANGXH
WHERE BANGXH.VONG = 3
AND HANG >= ALL (select HANG from BANGXH where VONG = 3)
AND (TRANDAU.MACLB1 = BANGXH.MACLB OR TRANDAU.MACLB2 = BANGXH.MACLB)
AND TRANDAU.MACLB1 = C1.MACLB AND TRANDAU.MACLB2 = C2.MACLB
AND TRANDAU.MASAN = SANVD.MASAN

d. Cho biết mã câu lạc bộ, tên câu lạc bộ đã tham gia thi đấu với tất cả các câu lạc bộ
còn lại (kể cả sân nhà và sân khách) trong mùa giải năm 2009
SELECT MACLB, TENCLB
FROM CAULACBO
WHERE MACLB IN
(select MACLB from CAULACBO as C1 where
(select count(MATRAN) from TRANDAU where TRANDAU.MACLB1 = C1.MACLB or TRANDAU.MACLB2 =
C1.MACLB) =
(select count(CAULACBO.MACLB) from CAULACBO) - 1
)

e. Cho biết mã câu lạc bộ, tên câu lạc bộ đã tham gia thi đấu với tất cả các câu lạc bộ
còn lại ( chỉ tính sân nhà) trong mùa giải năm 2009.
SELECT MACLB, TENCLB
FROM CAULACBO
WHERE MACLB IN
(select MACLB from CAULACBO as C1 where
(select count(MATRAN) from TRANDAU where TRANDAU.MACLB1 = C1.MACLB) =
(select count(CAULACBO.MACLB) from CAULACBO) - 1

3. Bài tập về Rule


a. Khi thêm cầu thủ mới, kiểm tra vị trí trên sân của cầu thủ chỉ thuộc một trong các
vị trí sau: Thủ môn, tiền đạo, tiền vệ, trung vệ, hậu vệ.
alter table CAUTHU add constraint fk_role check (VITRI in (N'Thủ môn', N'Tiền đạo',
N'Tiền vệ', N'Trung vệ', N'Hậu vệ'))

b. Khi phân công huấn luyện viên, kiểm tra vai trò của huấn luyện vi ên chỉ thuộc
một trong các vai trò sau: HLV chính, HLV phụ, HLV thể lực, HLV thủ môn
alter table HLV_CLB add constraint fk_vaitro check (VAITRO in (N'HLV chính', N'HLV
phụ', N'HLV thể lực', N'HLV thủ môn'))

c. Khi thêm cầu thủ mới, kiểm tra cầu thủ đó có tuổi phải đủ 18 trở lên (chỉ tính năm
sinh)
alter table CAUTHU add constraint fk_age check(year(getdate()) - year(NGAYSINH) >= 18)

d. Kiểm tra kết quả trận đấu có dạng số_bàn_thắng- số_bàn_thua.


alter table TRANDAU add constraint fk_ketqua check(KETQUA like '%-%')

4. Bài tập về View


a. . Cho biết mã số, họ tên, ngày sinh, địa chỉ và vị trí của các cầu thủ thuộc đội bón
g “SHB Đà Nẵng” có quốc tịch “Bra-xin”.
select MACT, HOTEN, NGAYSINH, DIACHI, VITRI from CAUTHU
where MACLB = 'SDN' and MAQG = 'BRA'

b. Cho biết kết quả (MATRAN, NGAYTD, TENSAN, TENCLB1, TENCLB2,


KETQUA) các trận đấu vòng 3 của mùa bóng năm 2009.
select TD.MATRAN, TD.NGAYTD, SANVD.TENSAN , CLB1.TENCLB as 'TEN CLB1', CLB2.TENCLB as
'TEN CLB2', KETQUA
from TRANDAU as TD, SANVD, CAULACBO as CLB1, CAULACBO as CLB2
where TD.VONG = 3 and CLB1.MACLB = TD.MACLB1
and CLB2.MACLB = TD.MACLB2
and SANVD.MASAN = TD.MASAN

c. Cho biết mã huấn luyện viên, họ tên, ngày sinh, địa chỉ, vai trò và tên CLB đang
làm việc của các huấn luyện viên có quốc tịch “Việt Nam”.
select HLV.MAHLV, HLV.TENHLV,HLV.NGAYSINH, HLV.DIACHI, HLV_CLB.VAITRO, CLB.TENCLB
from HUANLUYENVIEN as HLV, HLV_CLB, CAULACBO as CLB
where HLV.MAQG = 'VN'
and HLV.MAHLV = HLV_CLB.MAHLV
and HLV_CLB.MACLB = CLB.MACLB
d. Cho biết mã câu lạc bộ, tên câu lạc bộ, tên sân vận động, địa chỉ và số lượng cầu
thủ nước ngoài (có quốc tịch khác “Việt Nam”) tương ứng của các câu lạc bộ
nhiều hơn 2 cầu thủ nước ngoài.
select CT.MACLB, CLB.TENCLB,SANVD.TENSAN, SANVD.DIACHI,COUNT(CT.MACT) as N'Số
lượng cầu thủ nước ngoài' from CAULACBO as CLB, SANVD, CAUTHU as CT
where CT.MAQG not like 'VN' and CLB.MASAN = SANVD.MASAN and CT.MACLB = CLB.MACLB
group by CT.MACLB, CLB.TENCLB,SANVD.TENSAN, SANVD.DIACHI
having count(CT.MACT) > 2

e. Cho biết tên tỉnh, số lượng câu thủ đang thi đấu ở vị trí tiền đạo trong các câu lạc
bộ thuộc địa bàn tỉnh đó quản lý.
SELECT TINH.TENTINH , count(ct.MACT) as [số lượng cầu thủ]
FROM TINH , CAULACBO as clb , CAUTHU as ct
WHERE TINH.MATINH = clb.MATINH
AND clb.MACLB = ct.MACLB
AND ct.VITRI = N'Tiền đạo'
GROUP BY TINH.TENTINH ;
f. select * from view5Cho biết tên câu lạc bộ,tên tỉnh
mà CLB đang đóng
nằm ở vị trí cao nhất của bảng xếp hạng của vòng 3 năm 2009.
SELECT TOP 1 clb.TENCLB , TINH.TENTINH
FROM CAULACBO as clb , TINH , BANGXH as bxh
WHERE clb.MATINH = TINH.MATINH
AND clb.MACLB = bxh.MACLB
AND bxh.VONG = 3 AND bxh.NAM = 2009
ORDER BY bxh.DIEM DESC ;
g. Cho biết tên huấn luyện viên đang nắm giữ một vị trí trong 1 câu lạc bộ mà chưa
có số điện thoại.

SELECT TENHLV
FROM HUANLUYENVIEN
WHERE DIENTHOAI IS NULL ;

h. Liệt kê các huấn luyện viên thuộc quốc gia Việt Nam chưa làm công tác huấn
luyện tại bất kỳ một câu lạc bộ nào

SELECT hlv.TENHLV
FROM HUANLUYENVIEN as hlv , QUOCGIA as qg , HLV_CLB
WHERE hlv.MAQG = qg.MAQG
AND qg.TENQG = N'Việt Nam'
AND hlv.MAHLV = HLV_CLB.MAHLV
AND HLV_CLB.VAITRO IS NULL ;

i. Cho biết kết quả các trận đấu đã diễn ra (MACLB1, MACLB2, NAM, VONG,
SOBANTHANG,SOBANTHUA).
SELECT td.MACLB1 as MACLB, NAM, VONG, KETQUA
FROM TRANDAU as td
k. Cho biết kết quả các trận đấu trên sân nhà (MACLB, NAM, VONG,
SOBANTHANG, SOBANTHUA).
SELECT MACLB1, MACLB2, NAM, VONG, KETQUA
FROM TRANDAU as td

l. Cho biết kết quả các trận đấu trên sân khách (MACLB, NAM, VONG,
SOBANTHANG,SOBANTHUA).

SELECT td.MACLB2 as MACLB, NAM, VONG, KETQUA


FROM TRANDAU as td

m. Cho biết danh sách các trận đấu (NGAYTD, TENSAN, TENCLB1, TENCLB2,
KETQUA) của câu lạc bộ CLB đang xếp hạng cao nhất tính đến hết vòng 3 năm
2009.

SELECT td.NGAYTD, svd.TENSAN, clb1.TENCLB as TENCLB1, clb2.TENCLB as


TENCLB2, td.KETQUA
FROM TRANDAU as td , SANVD as svd , BANGXH as bxh , CAULACBO as clb1 , CAULACBO as
clb2
WHERE (clb1.MACLB = bxh.MACLB OR clb2.MACLB = bxh.MACLB)
AND bxh.HANG = 1
AND td.MASAN = svd.MASAN
AND td.MACLB1 = clb1.MACLB
AND td.MACLB2 = clb2.MACLB
AND (bxh.VONG = 3 AND bxh.NAM = 2009) ;

n. Cho biết danh sách các trận đấu (NGAYTD, TENSAN, TENCLB1, TENCLB2,
KETQUA) của câu lạc bộ CLB có thứ hạng thấp nhất trong bảng xếp hạng vòng 3
năm 2009.

SELECT td.NGAYTD, svd.TENSAN, clb1.TENCLB as TENCLB1, clb2.TENCLB as TENCLB2,


td.KETQUA
FROM TRANDAU as td , SANVD as svd , BANGXH as bxh , CAULACBO as clb1 , CAULACBO as
clb2
WHERE (clb1.MACLB = bxh.MACLB OR clb2.MACLB = bxh.MACLB)
AND bxh.HANG = ( SELECT max(HANG)
FROM BANGXH
WHERE VONG = 3 AND NAM = 2009 )
AND td.MASAN = svd.MASAN
AND td.MACLB1 = clb1.MACLB
AND td.MACLB2 = clb2.MACLB
AND (bxh.VONG = 3 AND bxh.NAM = 2009) ;

You might also like