SQL Server Hệ quản trị cơ sở dữ liệu Hướng dẫn làm bài môn Hệ quản trị cơ sở dữ liệu SQL Server Kiến thức môn Hệ quản trị cơ sở dữ liệu SQL Server Các câu lệnh trong Hệ quản trị cơ sở dữ liệu SQL Server 23 hàm trong Hệ quản trị cơ sở dữ liệu SQL Server (hàm Ascii, hàm Char, hàm Charindex, hàm Left, hàm Right, hàm Len, hàm Lowder, hàm Upper, hàm LTrim, hàm RTrim, hàm PatIndex, hàm Quote, hàm Replace, hàm Replicate, hàm Reverse, hàm Space, hàm Str, hàm Stuff, hàm Substring, hàm Unicode, hàm NChar, hàm Soundex, hàm Different) Một số câu hỏi ôn tập kiến thức môn Hệ quản trị cơ sở dữ liệu SQL Server
Trang 1/*tao database moi*/
create database Quanlysinhvien
/*xóa database*/
drop database Quanlysinhvien
/*Sửa tên của database*/
alter database quanlysinhvien
modify name = QLSV
/* sử dụng database cụ thể*/
use Quanlysinhvien
GO
/* thêm bảng*/
create table Sinhvien
(
MaSV int not null primary key identity,
TenSV nvarchar(100) not null,
Gioitinh nvarchar( ) default 'NAM',
Ngaysinh date,
Que nvarchar(500),
Lop nvarchar(10)
)
create table Monhoc
(
MaMH int not null,
TenMH nvarchar(50) not null,
DVHT int
)
create table Ketqua
(
MaSV int,
MaMH int,
Diem int check (Diem>=0 and Diem<=10) /*Biểu thức luận lý */ constraint primary_key primary key (MaSV, MaMH)
)
/* Đổi tên cột */
exec sp_rename "sinhvien.tensv", "hoten"
/*Đổi tên bảng*/
exec sp_rename sv,"sinhvien"
/* Xóa bảng*/
/*drop table Sinhvien*/
/* Sửa bảng*/
/*Chèn thêm 1 cột*/
Alter table Sinhvien ADD
Dienthoai varchar(11), abc nvarchar(40)
/*thay đổi kiểu dữ liệu của cột*/
Alter table sinhvien Alter column abc int not null /*thêm khóa*/
alter table Monhoc ADD
constraint pk_monhoc primary key(MaMH)
Trang 2alter table sinhvien add constraint u_sinhvien_abc unique (abc) /*Xóa cột*/
Alter table Sinhvien Drop column abc, Dienthoai /*Xóa ràng buộc*/
Alter table sinhvien Drop constraint pk_monhoc /* tắt các constraint*/
ALTER TABLE Tên_bảng NOCHECK CONSTRAINT ALL| Tên_constraint [ , ]
/*Bật các Constraint */
ALTER TABLE Tên_bảng CHECK CONSTRAINT ALL| Tên_constraint [ , ]
/*Tạo khóa ngoại kết nối giữa 2 bảng */
Alter table Ketqua
ADD
constraint foreignkey_SV_KQ foreign key (MaSV) references Sinhvien(MaSV) alter table ketqua
ADD
constraint foreignkey_MH_KQ foreign key (MaMH) references Monhoc(MaMH)
/*chèn dữ liệu
Insert into Tên_Bảng [(tên trường cần chèn)] values (Giá trị của trường)
*/
insert into sinhvien
values (N'Phạm Trung Tính','Nam','03/30/1996','Quảng Ninh','AT10D') insert into sinhvien TenSV,Gioitinh,Ngaysinh, Que, Lop)
values (N'Trần Bảo Trọng','Nam','2000/12/14','Hà Giang','AT10D')
insert sinhvien
values (N'Lê Thùy Dung',N'Nữ','05/12/1997','Hà Nội','AT10D')
insert Sinhvien
values (N'Lê Trường An',N'Nam','11/20/1995',N'Ninh Bình','AT10D')
insert sinhvien
values (N'Phạm Thị Hương Giang',N'Nữ','2/21/1999',N'Hòa Bình','AT10C') insert sinhvien
values (N'Đoàn Duy Thức',N'Nam','4/12/1993',N'Hà Nội','AT10C')
insert sinhvien
values (N'Dương Tuấn Thông',N'Nam','4/12/1991',N'Nam Định','AT10D') insert sinhvien
values (N'Lê Thành Đạt',N'Nam','4/15/1993',N'Phú Thọ','AT10A')
insert Monhoc MaMH,TenMH)
values ( , N'Lý Thuyết Cơ sở dữ liệu')
Trang 3insert Monhoc
values ( , N'Toán cao cấp', )
insert Monhoc
values ( , N'Mạng máy tính', )
insert Monhoc
values ( , N'Tin đại cương', )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , , )
insert Ketqua
values ( , ,10)
/* update dữ liệu
Update Ten_Bang set giá_trị_gán_cho_các_trường [where điều_kiện]
*/
Trang 4update Sinhvien set TenSV=N'Lê Trung Tính', Lop=N'At10D' where
MaSV='SV001'
select from Sinhvien
update Sinhvien set Gioitinh = N'Nữ' where MaSV=
/* xóa bản ghi (dữ liệu)
Delete Ten_bang [where điều_kiện]
*/
delete Sinhvien where Gioitinh='Nữ'
delete Ketqua where Diem<
/*chuyển ID tự tăng về 1 giá trị */
DBCC CHECKIDENT 'Sinhvien', RESEED, ) /*chuyển id về 0 */ /*////////////////////////////////////////////////////////////////////////////
*/
/* Truy vấn dữ liệu */
/*Cấu trúc câu lệnh Select
Select [Ten_Bang.]Ten_Cot[,…]
From Ten_Bang1 <Liên kết > Ten_Bang2
Where <Điều kiện>
Group by <các cột gom nhóm>
HaVing <Điều kiện lọc nhóm>
Order by [Ten_Bang.]Ten_cot [asc/desc,…]
Compute Hàm thống kê [By Ten_cot] */
/* lấy dữ liệu từ bảng*/
select from Sinhvien
select from Monhoc
select from Ketqua
/* đặt định danh cho cột, bảng*/
select sv.MaSV, TenSV as 'Tên Sinh Viên'
from Sinhvien as sv
/* Kết nối dữ liệu từ nhiều bảng */
/* kết nối sử dụng where*/
select sv.MaSV, TenSV as 'Tên Sinh Viên', TenMH, Diem from Sinhvien as sv, Monhoc as Mh, Ketqua as kq
Where sv.MaSV = kq.MaSV and kq.MaMH = mh.MaMH /* Kết nối dùng JOIN chính là inner join*/
select sv.MaSV, TenSV as 'Tên Sinh Viên', TenMH, Diem from ((Sinhvien as sv join Ketqua as kq on sv.MaSV = kq.MaSV) join Monhoc as Mh on kq.MaMH=mh.MaMH)
/* Kết nối dùng left JOIN*/
select sv.MaSV, TenSV as 'Tên Sinh Viên', TenMH, Diem from ((Sinhvien as sv left join Ketqua as kq on sv.MaSV = kq.MaSV) left join Monhoc as Mh on kq.MaMH=mh.MaMH)
/* Kết nối dùng right JOIN*/
select sv.MaSV, TenSV as 'Tên Sinh Viên', TenMH, Diem from ((Sinhvien as sv left join Ketqua as kq on sv.MaSV = kq.MaSV) right join Monhoc as Mh on kq.MaMH=mh.MaMH)
/* Kết nối dùng full JOIN*/
select sv.MaSV, TenSV as 'Tên Sinh Viên', TenMH, Diem from ((Sinhvien as sv full join Ketqua as kq on sv.MaSV = kq.MaSV) full join Monhoc as Mh on kq.MaMH=mh.MaMH)
/* Sử dụng cấu trúc lệnh trong Select */
Trang 5select Masv, TenSV,
case
when Gioitinh=N'NAM' then N'đây là nam'
when Gioitinh =N'Nữ' then N'Đây là nữ'
else N'Không Xác định' end as 'thông tin'
from Sinhvien
select sinhvien.Masv, TenSV, Monhoc.TenMH, Diem,
case
when Diem>=8 then N'Đạt điểm giỏi'
when Diem>=7 and Diem<8 then N'Đạt điểm khá'
when Diem>=5 and Diem<7 then N'Đạt điểm trung bình'
else N'Thi lại' end as 'thông tin'
from Sinhvien, Monhoc, Ketqua
where Sinhvien.MaSV=Ketqua.MaSV and Ketqua.MaMH=Monhoc.MaMH
/* Sử dụng các toán tử trong select
Distinct : loại bỏ các dòng dữ liệu trùng
Top n : lấy n dòng đầu tiên
Top n with ties : lấy những dòng thuộc n cấp đầu tiên
Top n PERCENT : lấy N % dòng đầu tiên */
select distinct TenSV
from Sinhvien, Ketqua
where Sinhvien.MaSV = Ketqua.MaSV
select top ( ) TenSV,TenMH, Diem
from Sinhvien, Ketqua, Monhoc
where Sinhvien.MaSV = Ketqua.MaSV and Ketqua.MaMH = Monhoc.MaMH
select top (50) percent TenSV,TenMH, Diem
from Sinhvien, Ketqua, Monhoc
where Sinhvien.MaSV = Ketqua.MaSV and Ketqua.MaMH = Monhoc.MaMH
/* Sử dụng mệnh đề where để lọc dữ liệu hoặc để gom nhóm*/
select TenMH,DVHT from Monhoc where DVHT<>''
select MaSV, TenSV from Sinhvien where Gioitinh=N'Nam' and Que=N'Hà nội'
/*Có thể sử dụng các toán tử:
like: tìm chuỗi gần đúng
%: Thay thế 1 chuỗi -: thay thế 1 ký tự Between GT1 AND GT2: giá trị nằm giữa 2 giá trị */
select from Sinhvien where TenSV like '%trung%'
select from Sinhvien where TenSV like '%tí[k-o][^M-Z]'
select TenSV,TenMH, Diem
from Sinhvien, Ketqua, Monhoc
where Sinhvien.MaSV = Ketqua.MaSV and Ketqua.MaMH = Monhoc.MaMH and (Diem between 5 and 8)
select distinct tensv
from Sinhvien, Ketqua, Monhoc
where Sinhvien.MaSV = Ketqua.MaSV and Ketqua.MaMH = Monhoc.MaMH and (Monhoc.MaMH=1 or Monhoc.MaMH= )
select distinct tensv
Trang 6from Sinhvien, Ketqua, Monhoc
where Sinhvien.MaSV = Ketqua.MaSV and Ketqua.MaMH = Monhoc.MaMH and Monhoc.MaMH=
Intersect /*EXCEPT phép trừ, phép hợp là UNION, phép giao là
Intersect */
select distinct tensv
from Sinhvien, Ketqua, Monhoc
where Sinhvien.MaSV = Ketqua.MaSV and Ketqua.MaMH = Monhoc.MaMH and Monhoc.MaMH=
/* sắp xếp theo thứ tự tăng, giảm*/
select from Ketqua
order by Diem DESC,MaSV ASC
select TenSV, TenMH,Diem
from sinhvien, Monhoc,Ketqua
where Sinhvien.MaSV = Ketqua.MaSV and Ketqua.MaMH = Monhoc.MaMH
order by Diem DESC
/* Mệnh đề Group by : mệnh đề gom nhóm dữ liệu
Mệnh đề này phải có khi trong câu truy vấn có sử dụng hàm thống kê và trên mệnh đề Select có lấy các giá trị không sử dụng hàm thống kê
Cú pháp : Group By Danh sách cột,Biểu thức
Với Danh sách cột,Biểu thức :được lấy trên mệnh đề Select không sử dụng hàm thống kê
Các Hàm thống kê:
Sum(Ten_Cot) :tính tổng với cột có kiểu số
Count(Ten_Cot/*) :tính tổng số dòng
AVG(Ten_Cot) :tính giá trị trung bình
Max(Ten_cot) : giá trị lớn nhất
Min(Ten_Cot) :giá trị nhỏ nhất)
*/ */
/*
Mệnh đề HaVing : mệnh đề Lọc nhóm dữ liệu
Mệnh đề này chỉ tồn tại khi trong câu truy vấn có mệnh đề Group By và điều kiện lọc dữ liệu có hàm thống kê
Chú ý : trong câu truy vấn có hai mệnh đề lọc dữ liêu là Where và havinh
Where :lọc dữ liệu để tạo nhóm ( có điều kiện không sữ dụng hàm thống kê) Having :lọc nhóm( các điều kiện có thống kê)
Mệnh đề OrDer By : Mệnh đề sắp xếp dữ liệu
Cú pháp Order by [Ten_bang.]Ten_Cot [asc/Desc] [,…]
Mệnh đề Compute /Compute By : là mệnh đề tạo giá trị thống kê cuối kết quả hoặc thống kê theo cột
Cú pháp
Compute Hàm thống kê : tạo thống kê cuối kết quả
Compute Hàm thống kê By [Ten_Bang.]Ten_cot :thống kê theo cột,dữ liệu phải được sắp xếp theo cột này
Chú ý: Trong View không có mệnh đề này
*/
select COUNT(*)
from Ketqua
/* sử dụng group by*/
select tensv, avg(ketqua.Diem)
from Sinhvien, Monhoc, Ketqua
where Sinhvien.masv = Ketqua.MaSV and Monhoc.MaMH = Ketqua.MaMH
Group by tensv
Trang 7/* truy vấn lồng nhau*/
select tensv, Diem from Ketqua, sinhvien
where sinhvien.masv = Ketqua.MaSV and MaMH = 'MH001' and
Diem = (select MAX(Diem) from Ketqua where MaMH = 'MH001')
(select tensv, Diem from Ketqua, sinhvien
where sinhvien.masv = Ketqua.MaSV)
EXCEPT /*EXCEPT phép trừ, dùng phép hợp là UNION, phép giao là
Intersect */
(select tensv, Diem from Ketqua, sinhvien
where sinhvien.masv = Ketqua.MaSV and Diem< )
select tensv, Diem from Ketqua, sinhvien
where sinhvien.masv = Ketqua.MaSV
and Diem not IN select Diem from Ketqua, sinhvien
where sinhvien.masv = Ketqua.MaSV and Diem< )
select TenSV
from Sinhvien where Masv = 'SV001'
/*Update dữ liệu*/
update Sinhvien set Gioitinh=N'Nữ', Que = 'HCM' where Masv = 'SV001'
select COUNT(distinct Masv)
from Ketqua
select top 50 percent from sinhvien
select Top 1 Masv
from ketqua
select MaSV,avg(Diem)
from Ketqua
group by Masv
/*Câu 1: Cho biết mã số, tên, điểm thi tất cả các môn của sv: abc*/
select Sinhvien.MaSV, Tensv, TenMH, Diem
from Sinhvien, Ketqua, Monhoc
where Sinhvien.Masv = Ketqua.MaSV and Ketqua.MaMH=Monhoc.MaMH and Tensv=N'Phạm Trung Tính'
select Sinhvien.MaSV, Tensv, TenMH, Diem
from ((Sinhvien join Ketqua on sinhvien.masv = Ketqua.MaSV) join Monhoc on Ketqua.MaMH=Monhoc.MaMH)
where Tensv=N'Phạm Trung Tính'
/*câu 2: Cho biết mã số, tên môn và điểm thi ở những môn mà sinh viên abc phải thi lại (điểm<5)*/
select sinhvien.masv, TenMH, Diem
from ((Sinhvien join Ketqua on sinhvien.masv = Ketqua.MaSV) join Monhoc on Ketqua.MaMH=Monhoc.MaMH)
where Tensv=N'Phạm Trung Tính' and Diem<
/*câu 3: Cho biết mã số, tên những sinh viên đã thi ít nhất là 1 trong 3 môn
Cơ sở dữ liệu,
cấu trúc dữ liệu, mạng máy tính.*/
select distinct sinhvien.Masv, tensv
from ((Sinhvien join Ketqua on sinhvien.masv = Ketqua.MaSV) join Monhoc on Ketqua.MaMH=Monhoc.MaMH)
Trang 8where TenMH in select TenMH from Monhoc where
TenMH =N'Mạng máy tính' or TenMH=N'Toán cao cấp' or TenMH=N'Hệ quản trị cơ sở dữ liệu')
/* câu 4: Cho biết mã số, tên những môn mà sinh viên có mã số ms001 chưa có điểm */
(select Mamh, tenmh from Monhoc)
EXCEPT /*phép trừ, dùng phép hợp là UNION, phép giao là Intersect */ (select Monhoc.MaMH, TenMH
from (Ketqua join Monhoc on Ketqua.MaMH=Monhoc.MaMH)
where masv ='SV001')
select from sinhvien
select from Ketqua
select from Monhoc
/* câu 5: Cho biết mã số, tên những sinh viên có điểm thi môn MH001 không thấp nhất khoa*/
select Sinhvien.Masv, tensv, diem
from Sinhvien, Ketqua
where sinhvien.masv = Ketqua.MaSV and MaMH='MH001' and Diem>(select MIN(Diem) from Ketqua where MaMH='MH001')
/*câu 6: Cho biết mã số và tên những sinh viên có điểm thi môn MH001 lớn hơn điểm thi môn MH001 của sinh viên SV003*/
/* câu 7: Cho biết số sinh viên phải thi lại môn Cơ sở dữ liệu */
select TenMH as 'Tên Môn Học', COUNT(*) as 'Số sinh viên thi lại'
from Ketqua, Monhoc
where Ketqua.MaMH = Monhoc.MaMH and TenMH=N'Lý thuyết cơ sở dữ liệu' and
Diem<
group by TenMH
/* câu 8: Đối với mỗi môn, cho biết tên môn và số sinh viên phải thi lại môn
đó mà số sinh viên thi lại >=2*/
select TenMH as 'Tên Môn Học', COUNT(*) as 'Số sinh viên thi lại'
from Ketqua join Monhoc on Ketqua.MaMH = Monhoc.MaMH
where Diem<5
group by TenMH
having COUNT(*) >=2
Order by TenMH desc
/*Câu 9: Cho biết điểm cao nhất môn MH001 mà các sinh viên đạt được*/
select sinhvien.MaSV, Tensv
from Ketqua join sinhvien on Ketqua.MaSV = sinhvien.masv
where MaMH='MH001' and Diem=(select MAX(Diem) from Ketqua where MaMH='MH001') /*Câu 10: Cho biết mã số, tên và lớp của sinh viên đạt điểm cao nhất môn Lý thuyết cơ sở dữ liệu */
/*câu 11: Cho biết sinh viên có điểm trung bình chung >=5 */
use QLSV
select Tensv as 'tên sinh viên', AVG(CAST(Diem as float)) as 'Điểm trung bình' from sinhvien, Ketqua
where sinhvien.masv = Ketqua.MaSV and ketqua.MaSV='SV001'
group by Tensv
having AVG(DIEM)>=5
/*test*/
Trang 9select from Ketqua where MaSV='SV001'
/*Câu 12: Với mỗi sinh viên cho biết mã số, tên và điểm trung bình chung học tập của sinh viên đó*/
/* câu 13: Đối với mỗi lớp, lập bảng điểm gồm mã số, tên sinh viên và điểm trung bình chung học tập
Sắp xếp danh sách theo chiều giảm dần của điểm trung bình chung học tập và chiều tăng dần của họ tên*/
select Lop, Tensv, AVG(Diem)
from sinhvien, Ketqua
where sinhvien.masv = Ketqua.MaSV
Group by Lop, Tensv
order by Lop desc, tensv asc
/* Câu 14: Cho biết mã số và số điểm lớn hơn 7 của những sinh viên có hơn một nửa số điểm là >=7 *//////////
select from Ketqua order by MaSV
select ketqua.masv, count(mamh)
from ketqua
where Diem>=5
group by Ketqua.MaSV
having COUNT(MaMH) >=(select count(distinct mamh)/2 from ketqua)
select distinct mamh from Ketqua
/* Câu 15: Cho biết mã số và tên nhưng sinh viên có hơn một nửa số điểm >=5*/
/* Câu 16: Đối với mỗi lớp, cho biết mã số và tên nhưng sinh viên phải thi lại
từ 2 môn trở lên*/
select ketqua.MaSV,tensv, COUNT(*)
from sinhvien, ketqua
where sinhvien.masv = ketqua.MaSV and Diem<
group by Ketqua.MaSV, tensv
having COUNT(*)>=2
/* câu 17: Cho biết mã số và tên những môn học mà tất cả các sinh viên đều đạt điểm >=5*/
((select MaMH, TenMH
from Monhoc)
EXCEPT
(select Distinct Ketqua.MaMH, Tenmh from Monhoc, Ketqua where
Monhoc.MaMH=Ketqua.MaMH and Diem< ))
EXCEPT
((select MaMH, TenMH
from Monhoc)
EXCEPT
(select Distinct Ketqua.MaMH, Tenmh from Monhoc, Ketqua where
Monhoc.MaMH=Ketqua.MaMH))
/*C2*/
select MaMH, TenMH
from Monhoc
Where MaMH not in select Distinct Ketqua.MaMH from Ketqua where Diem< ) and MaMH in select MaMH from Ketqua)
/* Câu 18: cho biết mã số và tên của sinh viên có điểm trung bình chung học tập >=8 */
Trang 10select sinhvien.masv, tensv
from sinhvien, Ketqua
where sinhvien.masv = Ketqua.MaSV
group by sinhvien.masv, tensv
having AVG(Diem)>=5
/*test*/
select ketqua.MaSV,AVG(Diem) from sinhvien, Ketqua where sinhvien.masv = ketqua.MaSV group by Ketqua.MaSV
/*câu 19: Cho biết mã số và tên những sinh viên có điểm trung bình chung học tập cao nhất*/
select sinhvien.masv, tensv
from sinhvien, Ketqua
where sinhvien.masv = Ketqua.MaSV
group by sinhvien.masv, tensv
having AVG(Diem)>=ALL(select AVG(DIEM) from Ketqua group by MaSV)
/*Câu 20: Cho biết mã số và tên những sinh viên phai thi lại ở ít nhất là những môn mà sin h viên có mã số SV003 phải thi lại*/
select DIStinct Ketqua.MaSV, tensv
from sinhvien, Ketqua
where sinhvien.masv = Ketqua.MaSV and MaMH in(select MaMH from Ketqua where Diem<5 and MaSV='SV003') and Diem<
select from Ketqua
create view view_sinhvien
as
select from Sinhvien
select from view_sinhvien
drop view view_sinhvien
delete from view_sinhvien where Masv= 'SV002'
create view view_ketqua
select from Ketqua ()
select from view_ketqua
delete from view_ketqua where MaSV='SV001' and MaMH='MH001'
update view_ketqua set Diem=6 where MaSV='SV001' and MaMH='MH002'
insert into view_ketqua values ('SV001','MH001', )
create view view_sinhvien_ketqua
as
select Sinhvien.MaSV as 'Masinhvien', TenSV, Ketqua.MaSV, MaMH, Diem
from Sinhvien join Ketqua on Sinhvien.MaSV=Ketqua.MaSV
insert into view_sinhvien_ketqua Masinhvien,TenSV) values ('SV007','lê bùi mão')
select from view_sinhvien_ketqua