CHƯƠNG I - Tổng quan về hệ quản trị cơ sở dữ liệu và ngôn ngữ truy
vấn T-SQL trong SQL server
CHƯƠNG II – CSDL và bảng trong SQL Server
1. Cơ sở dữ liệu trong SQL
2. Khởi tạo databse trong sql server
+ Tạo databse mặc định:
Create databse <Ten_database>
+ Tạo database theo yêu cầu:
create database ten_csdl
on primary
name = ten_csdl,
filename = ‘đường_dẫn/tên_csdl.mdf’,
size = kích_thước_ban_đầu,
maxsize = kích_thước_tối_đa,
filegrowth = kích_thước_tăng
log on
name = tên_csdl_log,
filename = ‘đường_dẫn/tên_csdl.ldf’
size = kích_thước_ban_đầu,
maxsize = kích_thước-tối_đa,
filegrowth = kích_thước_tăng
3. Làm việc với database trong SQL Server
Sử dụng data: use <ten_database>
Đổi tên data: alter database <ten_csdl> modify name = <ten_moi>
Xóa data: khi sử dụng lệnh xóa, csdl sẽ bị xóa khỏi vùng lưu trữ, muốn tạo thì phải tự thực thi lại lệnh
Drop database <ten_csdl>
4. Table
- Tạo bảng:
create table <ten_bang>
<ten_truong_1> <kieu_du_lieu> [RBTV] [,…],
<ten_truong_2> <kieu_du_lieu> [RBTV] [,…],
<ten_truong_3> <kieu_du_lieu> [RBTV] [,…]
- Sửa cấu trúc bảng
+ Thêm 1 cột mới vào bảng:
Alter table <ten__bang>
Add <ten_cot> <kieu_du_lieu> [RBTV] [,…]
- Xóa 1 cột khỏi bảng
Alter table <ten_bang>
Drop column <ten_cot>
- Sửa đổi kiểu dữ liệu của cột
Alter table <ten_bang>
Alter column <ten_cot> <kieu_du_lieu_moi>
- Đổi tên cột
Sp_rename ‘ten_bang.ten_cot_cu’ , ‘ten_bang_moi’ , ‘COLUMN’
- Đổi tên bảng
Sp_rename ‘ten_bang_cu’ , ‘ten_bang_moi’
- Xem cấu trúc bảng
Sp_help ‘tên_bảng’
- Xem dữ liệu các bản ghi trong bảng
Select * from ten_bang
- Thêm ràng buộc cho cột
Alter table <tên_bảng>
Add constraint <tên_ràng_buộc> <Loại_ràng_buộc> (tên cột)
- Hủy ràng buộc đã đặt
Alter table <tên_bảng>
Drop constraint <tên_RB>
- Bật ràng buộc trong bảng
alter table tên_bảng
check constraint all | tên_constraint [,...]
- Tắt ràng buộc trong bảng:
alter table tên_bảng
nocheck constraint all | tên_constraint [,...]
5. Chèn dữ liệu vào bảng
Insert into ten_bang (cot1, cot2, …)
Values (gt1, gt2,…)
insert into <tên bảng> (ds cột)
values (giá trị cần chèn của hàng 1) , (giá trị cần chèn của hàng 2), …
insert <tên bảng> values (giá trị cần chèn của một hàng)
6. Xem dữ liệu bảng
Select * from <ten_bang>
7. Cập nhất dữ liệu trên bảng
Update <ten_bang> set cot1=gt1, cot2=gt2, ….,
Where [dieu_kien]
8. Xóa bản ghi trong bảng
Delete from <ten_bang>
[where <dieu_kien> ]
9. Xóa bảng
Drop table <danh_sách_tên_các_bảng>
10. Xóa tất cả các dòng nhưng vẫn giữ nguyên cấu trúc bảng
Delete from <tên_bảng>;
CHƯƠNG III – Các ràng buộc toàn vẹn
1. Ràng buộc toàn vẹn
2. Cách khai báo ràng buộc toàn vẹn
- Khai báo ở mức cột
Khai báo mức cột không đặt tên: <ten_cot> <kieudulieu> <loairangbuoc>
Khai báo mức cột có đặt tên: <tencot> <kieudukieu> constraint <tenrangbuoc> <loairangbuoc>
- Khai báo ở mức bảng
Constraint <tenrangbuoc> <loairangbuoc> (danh_sach_cot)
3. Thêm ràng buộc mới vào bảng
Alter table <ten_bang>
Add constraint <ten_rang_buoc> <loai_rang_buoc> (danh_sach_cot)
4. Default
Trong khi tạo bảng:
- Không đặt tên:
Create table MONHOC
Mamh char(4),
Tenmh nvarchar(40) default ‘giao trinh’,
DVHT tinyint
- Đặt tên:
Create table MONHOC
Mamh char(5),
Tenmh nvarchar(40) constraint MH default ‘ten mon hoc’
DVHT int )
Tạo ràng buộc sau khi tao bảng:
Alter table <ten_bang> add constraint <ten_rb> default ‘<ten_đặt> for <ten_cot_muon_tao_rb>
5. Check
Khai báo ràng buộc ở mức cột:
Ex:
C1: không đặt tên: Diem float check (diem>0 and diem<=10)
C2: đặt tên: Diem float constraint C1 check (diem>0 and diem<=10)
Khai báo ở mức bảng: khi muốn đặt tên cho ràng buộc và định nghĩa ràng buộc trên nhiều cột
Ex:
C1: trong khai báo bảng
Create table SV
ID int,
Hoten varchar (5),
Tuoi int,
Tp varchar (50),
constraint CH_SV check (tuoi>=18 and tp= ‘ HN’)
C2: sau khai báo bảng
Create table SV
ID int,
Hoten varchar (5),
Tuoi int,
Tp varchar (50)
Alter table SV
Add constraint CH_SV check (tuoi>=18 and tp= ‘ HN’)
6. Not null
7. Unique
- Trong khai báo bảng:
Constraint <ten_rb> unique (cot1, cot2)
- Sau khai báo bảng:
Alter table <ten_bang>
Add constraint <ten_rb>
Unique (cot1, cot2)
8. Khóa chính – Primary key
Ex:
Table có 1 khóa: masv char(6) primary key,
Table có 2 khóa: Constraint KH primary key (masv , mamh)
Sau khai báo bảng:
Alter table Ketqua
Add constraint PK primary key (masv , manmh)
10. Khóa ngoại – foreign key
Tạo khóa ngoại trong tạo bảng:
foreign key (tên_cột) references <tên bảng tham chiếu_khóachính>
Create table KQ
Masv char(2) foreign key references SINHVIEN,
Mamh char(5) foreign key conferences MONHOC,
Constraint KH primary key (Masv, Mamh)
Tạo khóa sau khi tạo bảng:
Alter table KQ add constraint KH_SV foreign key (Masv) references SINHVIEN (Masv)
11. Xóa ràng buộc
Alter table <ten_bang> drop constraint <ten_rb>
12. Thuộc tính IDENTITY
create table SINHVIEN
MaSV int identity primary key,
HotenSV nvarchar(30) not null,
GioiTinh nchar(7) check (Gioitinh = N'Nam' or Gioitinh = N'Nữ'),
NgaySinh date not null,
QueQuan nvarchar(20),
Lop nvarchar(5),
Email varchar(50) unique
)
Indentity (seed, increment) = indentity (giá trị khởi tạo, giá trị tăng cho mỗi lần)
CHƯƠNG IV – Truy vấn đơn giản trong cơ sở dữ liệu
1. Câu lệnh select
select [distinct / top n / *] <bieu_thuc/cot [as <ten_moi>] , …>
into <ten_bang_moi>
from <ten_bang>
where <dieu_kien_chon>
group by <danh_sach_cot_gom_nhom>
having <dieu_kien_loc_nhom>
order by <ten_cot> [asc/desc] , …
Truy vấn đơn giản:
Select <danh_sách_các_cột>
From <tên_bảng>
Where <biểu_thức_điều_kiên>
Chọn tất cả đối tượng trong bảng: Select * from <tenbang>
Chọn 1 số cột trong bảng: Select <tencot1> , <tencot2> , … from <ten_bang>
Liên kết các cột dữ liệu trong kết quả truy vấn
Select <tencot> + ‘string’ + <tencot> + ‘string’ + <tencot> + …. From <tenbang>
Hạn chế tập kết quả bằng việc sử dụng TOP và PERCENT
Lấy n hàng trong bản ghi với TOP:
Select top n <tencot> from <tenbang>
Lấy n hàng trong bản ghi với PERCENT:
Select top n percent <tencot> from <tenbang>
Loại bỏ dữ liệu lặp với DISTINCT
Select distinct <tencot> from <tenbang>
2. Sử dụng mệnh đề WHERE
Select <tencot>
From <tenbang>
Where <dieukien>
select * from monhoc where dvhp >2 and dvhp <5
select * from monhoc where not dvhp < 4
Lấy dữ liệu trong một khoảng với BETWEEN
Select <cot1>, <cot2>,…
From <tenbang>
Where <tencot> Between <giatri1> and <giatri2>
Tìm kiếm gần đúng với LIKE
Select <tencot1>, <tencot2>,…
From <tenbang>
Where <tencot> like <du_lieu_mau>
3. Mệnh đề ORDER BY
Select <tencot>
From <tenbang>
[ where <dieu_kien>]
Order by <tencot> [ASC/DESC]
4. Mệnh đề GROUP BY
Select <tencot>
From <tenbang>
[ Where <dieukien>]
Group by <tencot>
5. Mệnh đề HAVING
Select <tencot>, ham_tap_hop (<tencot>)
From <tenbang>
Where <dieukien>
Group by <tencot>
Having ham_tap_hop (<tencot>) dieukien giatri
CHƯƠNG V – Truy vấn nâng cao trên nhiều bảng
1. Kết nối sử dụng mệnh đề WHERE
Select bang1.cot1, bang2.cot2,…
From bang1, bang2,…
Where <điều kiện kết nối các bảng, điều kiện chắt lọc>
2. Kết nối bằng mệnh đề JOIN
2.1 Inner join
Select bang1.cot1, bang2.cot2,…
From bang1 inner join bang2
On bang1.cot_chung = bang2.cot_chung
2.2 Outer join
2.2.1 Left join
Select bang1.cot1, bang2.cot2,…
From bang1 left bang2
On bang1.cot_chung = bang2.cot_chung
2.2.2 Right join
Select bang1.cot1, bang2.cot2,…
From bang1 right join bang2
On bang1.cot_chung=bang2.cot_chung
2.2.3 Full right
Select bang1.cot1, bang2.cot2,…
From bang1 full join bang2
On bang1.cot_chung=bang2.cot_chung
2.3 Cross join
Select bang1.cot1 , bang2.cot2
From bang1 , bang2
không có WHERE
2.4 Self join
Select a.ten_cot , b.ten_cot, …
From bang1 as a , bang2 as b
Where a.cot_chung=b.cot_chung
3. Truy vấn con
a. So sánh tập hợp
b. Phân loại truy vấn con:
c. Truy vấn con – subquery
4. Truy vấn con trong SELECT
Select count(masv) – (select count(distinct masv) from ketqua) as ‘số lượng sv chưa thi’ from sinhvien
5. Truy vấn con trong FROM
Select <danh sách các cột>
From R1, R2 (<truy vấn con>) as ten_bang
Where <điều kiện>
6. Truy vấn con trong WHERE
Ex: cho biết số sinh viên đạt điểm cao nhất môn có mã là CSDL
Select count(masv) ‘Số sv đạt điểm cao nhất’
Form ketqua
Where mamh= ‘csdl’ and diem=(select max(diem) from ketqua where mamh= ‘csdl’)
Ex: cho biết danh sách sinh viên của các snh viên đạt điểm cao nhất có mã là cơ sở dữ liệu
Select sv.masv, hotensv, lop
From sinhvien sv, ketqua kq
Where sv.masv=kq.masv and mamh= ‘csdl’ and diem=(select max(diem) from ketqua where mamh=
‘csdl’)
7. Các phép toán tập hợp
- Union – hợp:
Select <danh sách cột> from <danh sách bảng> where <điều kiện>
Union
Select <danh sách cột> from <danh sách bảng> where <điều kiện>
- Union all:
Select <danh sách cột> from <danh sách bảng> where <điều kiện>
Union all
Select <danh sách cột> from <danh sách bảng> where <điều kiện>
- Except – trừ:
Select <danh sách cột> from <danh sách bảng> where <điều kiện>
Except
Select <danh sách cột> from <danh sách bảng> where <điều kiện>
- Intersect – giao:
Select <danh sách cột> from <danh sách bảng> where <điều kiện>
Intersect
Select <danh sách cột> from <danh sách bảng> where <điều kiện>
CHƯƠNG IV – Khung nhìn View
1. Khung nhìn
Create view tên_khung_nhìn [(danh_sach_cot)]
As câu_lệnh_select
2. Thay đổi định nghĩa khung nhìn
Alter view tên_khung_nhìn [(danh_sách_cột)]
As câu_lệnh_select
3. Xóa khung nhìn
Drop view tên_khung_nhìn
4. WITH CHECK OPTION trong view
5. UPDATE và INSERT trong view
6. Ưu điểm của khung nhìn
7. Nhược điểm của khung nhìn
CHƯƠNG VII – Lập trình trong T-SQL (Hàm và thủ tục)
1. Tổng quan về T-SQL
Begin
-- khai báo biến
-- các câu lệnh
End
2. Biến trong T-SQL
2.1 Biến hệ thống
Tên bắt đầu bằng chữ: @@
2.2 Biến do người sử dụng tự định nghĩa
Tên bắt đầu bằng chữ: @
Cú pháp:
-- khai báo biến: Declare @tên_biến kiểu_dữ_liệu
-- gán giá trị cho biến: set @tên_biến=gt hoặc select @tên_biến = gt
-- xuất kết quả: print hoặc select
Ex: gán giá trị 2 biến và in kết quả ra màn hình
Begin
-- khai báo hai biến
Declare @a int, @b int;
-- gán giá trị cho 2 biến
Set @a=4;
Select @b=8;
-- in ra màn hình, sử dụng hàm cast ép kiểu int về kiểu chuỗi
Print ‘a=’ + cast (@a as varchar (20))
Print ‘b=’ + cast (@b as varchar (20))
End
Ex: gán giá trị cho biến bằng giá trị trong câu lệnh
Begin
Use ql_sv
Declare @s int;
Set @s = (select count(masv) from sinhvien)
Print N’Số sv la: ‘+cast (@s as varchar (10))
End
3. Các cấu trúc lệnh trong T-SQL
3.1 Cấu trúc rẽ nhánh if … else
if (điều kiện)
khối lệnh 1;
else if (điều kiện)
khối lệnh 2;
else
khối lệnh;
Ex:
Begin
Declare @a int, @b int;
Set @a=1;
Set @b=2;
If(@a<@b)
Print N’số a nhỏ hơn số b’
Else
Print N’số a lơn hơn số b’
End
3.2 Câu lệnh CASE
Dạng 1:
Case <biểu_thức_lựa_chọn>
When gía_trị_1 then <thực_hiện_khi_gia_trị_1>
when gía_trị_2 then <thực_hiện_khi_gia_trị_2>
….
when gía_trị_n then <thực_hiện_khi_gia_trị_n>
else <thực_hiện_khi_gt_khác>
end
Dạng 2:
Case
When <điều_kiện_1> then <thực_hiện_lệnh_1>
When <điều_kiện_1> then <thực_hiện_lệnh_1>
When <điều_kiện_1> then <thực_hiện_lệnh_1>
Else <thực hiện khi gt khác>
End
Ex:
Select masv, hoten,
( case gioitinh
When N’Nữ’ then ‘đây là sinh viên nữ’
When N’Nam’ then N’đây là sinh viên nam’
Else N’Chưa phân biệt được’
End ) as N’Thông báo’
From sinhvien
3.3 Câu lệnh While
While (điều_kiện)
Begin
Khối lệnh;
End;
4. Các kiểu dữ liệu đặc biệt
Kiểu dữ liệu Table (dạng tường minh)
Declare @tên_biến Table (
Column 1 DataType 1,
Column 1 DataType 1 )
sử dụng các câu lệnh chèn dữ liệu, xóa hay cập nhất cho biến kiểu Table như một Table thông thường
Begin
Declare @a table (
Masv int primary key,
Tensv nvarchar (30),
Ngaysinh date,
Malop varchar(5)
-- sử dụng lệnh select xem thông tin bảng
Select * from @a
-- chèn dữ liệu cho bảng
Insert into @a
Values (2, N’A’, ‘2005-1-12’, ‘L01’)
Select * from @a
-- cập nhật dữ liệu bảng
Update @a set malop=’L02’ where masv=2
Select * from @a
End
4. Một số hàm thông dụng
Hàm iif: iif (điều kiện, gt1, gt2): nhận giá trị gt1 nếu điều kiện đúng và gt2 nếu điều kiện sai
Hàm xâu xử lý:
Left (S, n): trả về n ký tự bên trái trong xâu S
Right(S, n): trả về n ký tự bên phải trong xâu S
Rtrim(S): xóa các kí tự trắng dư thừa bên phải
Ltrim(S): xóa các kí tự trắng dư thừa bên trái
Hàm xử lý ngày tháng:
Datediff(định dạng, T1, T2): tính khoảng cách giữa T1 và T2 theo định dạng (ngày, tháng, năm, phút,
giây, quý, tuần…)
Datepart(định dạng, T): trả về giá trị thời gian (kiểu nguyên) tùy thuộc vào định dạng (ngày, tháng, năm,
phút, giây, quý, tuần…)
Dateadd (định dạng, n, T): thêm vào T số lượng thời gian n theo định dạng (ngày,…)
DatePart(N,date): date là ngày truyền vào để lấy các phần tương ứng, N là 1 hoặc 2 chữ cái viết tắt đại
diện cho một phần của tham số date.
N có thể có các giá trị sau:
- yy: năm của date
- qq, q: quý của date
- mm, m: tháng của date
- dy, y: ngày date là ngày thứ mấy của năm
- dd,d: Lấy phần ngày của date
- wk, w: date thuộc tuần thứ mấy trong năm
- dw: là ngày thứ mấy trong tuần, chú ý rằng 1 chính là ngày Chủ nhật.
5. Thủ tục lưu trữ - stores procedure
Tạo thủ tục lưu trữ:
Create procedure <ten_thu_tuc>
[( <danh sách tham số>)]
[with recompile / encrypition/ recompile, encryption]
As
<các câu lệnh của thủ tục>
Tập hợp các câu lệnh sử dụng trong nội dung thủ tục: các câu lệnh này có thể đặt trong cặp từ khóa
BEGIN…END hoặc không.
Lời gọi thủ tục lưu trữ:
Thủ tục lưu trữ được gọi theo cấu trúc: ten_thu_tuc [danh sách tham số]
Nếu thủ tục được gọi từ 1 thủ tục khác, thực hiện bên trong 1 trigger hay phối hợp với câu lệnh select,
cấu trúc như sau: Execute ten_thu_tuc_luu_tru [danh sách tham số]
Thứ tự các đối số có thể không cần tuân theo thứ tự các tham số như khi định nghĩa: @ten_tham_so =
giá trị
Sửa thủ tục lưu trữ:
alter procedure <tên thủ tục>
[(<danh sách tham số>)]
[with recompile / encryption / recompile, encryption]
as
Xóa thủ tục lưu trữ:
Drop procedure <tên thủ tục>
6. Hàm – function
Cách tạo hàm:
create function ten_hàm [(<danh sách tham số>)]
returns (kiểu_trả_về_của_hàm)
as
begin
các_câu_lệnh_của_hàm
return giá_trị
end
Sử dụng hàm:
dbo.<tên hàm> (danh sách tham số thực sự)
Hàm với giá trị trả về là 1 giá trị
Ex: hàm lấy giá trị là năm hiện hành
Create function namhienhanh()
Returns int
As
Begin
Return year(getdate())
End
Select dbo.namhienhanh() ‘Năm nay la năm’
Ex: viết hàm xác định thứ trong tuần của 1 giá trị kiểu ngày
Datepart (dangthoigian, thoigian)
Select datepart (dw, ‘2021/04/13’) ‘Ngày thứ’
Ex: viết hàm xác định thứ trong tuần của 1 giá trị kiểu ngày
Create function thu (@ngay date)
Returns nvarchar(20)
As
Begin
Declare @st nvarchar(20)
Select @st = case datepart (dw, @ngay)
When 1 then N’chủ nhật’
When 2 then N’thứ 2’
When 3 then N’thứ 3’
When 4 then N’thứ 4’
When 5 then N’thứ 5’
When 6 then N’thứ 6’
When 7 then N’thứ 7’
End
Return (@st)
End
Kết quả:
Set dateformat dmy
Select dbo.thu (‘20/09/2021’)
Cách sử dụng hàm
dbo.<tên hàm> (danh sách tham số thực sự)
Ex: xem danh sách sinh viên sinh vào thứ mấy trong tuần
Select masv, hoten, ngaysinh, dbo.thu(ngaysinh) as ‘thứ trong tuần’
From sinhvien
Hàm với giá trị trả về kiểu bảng
create function <tên_hàm> ([danh_sách_tham_số])
returns table
as
return <câu_lệnh_select>
Sửa hàm:
alter function ten_ham ([danh_sách_tham_so])
returns (kiểu_trả_về_hàm)
as
begin
các_câu_lệnh_của_hàm
end
Xóa hàm:
Drop function ten_ham
7. Hàm nội tuyến (inline)
Create function ten_ham ([<danh sách tham số>])
Returns table
As
Return (câu lệnh select)
Ex: tạo hàm xem điểm của sinh viên theo lớp
Create function diemlop
(@lop varchar (10))
Returns table
As
Return
(select sv.masv, hoten, tenmh, diem
From sinhvien sv, monhoc mh, ketqua kq
Where sv.masv=kq.masv and kq.mamh=mh.mamh and lop=@lop)
Sau khi khởi tạo thành công: select * from dbo.diemlop (‘at19a’)
8. Hàm bao gồm nhiều câu lệnh bên trong (multi-statement)
Create function ten_ham ([<danh sách tham số>])
Returns @biến_bảng table định_nghĩa_bảng
As
Begin
Các_câu_lệnh_trong_thân_hàm
Return
End
Ex: tạo hàm cho biết số sinh viên của mỗi lớp đã thi môn nhập vào
Create function tongsv
(@mamon char(5))
Returns @bangthongke table
Lop varchar (10),
Tongsosv int
As
Begin
Insert into @bangthongke
Select lop, count(sv.masv)
From sinhvien sv, ketqua kq, monhoc mh
Where sv.masv=kq.masv and mh.mamh=kq.mamh and mh.mamh=@mamon
Group by lop
Return
End
Sau khi khởi tạo thành công: select * from tongsv(‘csdl’)
CHƯƠNG VIII – TRIGGER
1. Trigger
2.
DDL Trigger
DML Trigger
3.
- After / For Trigger
- Instead of trigger
4.
5. Bảng ảo Inserted và deleted
- Bảng Inserted
- Bảng deleted
- Bảng của inserted và deleted
7. Cách tạo Trigger
Create trigger tên_trigger
On tên_table
{ for | after | instead of } { insert | update | delete }
As các_câu_lệnh_transact_sql
8. After trigger
Ex: Tạo Trigger không cho phép xóa sinh viên quê ở Hà Nội
CREATE TRIGGER Trigger_SV_NoDelete_HN ON dbo.sinhvien
AFTER DELETE
AS
IF (SELECT Quequan FROM Deleted) = N'Hà Nội'
BEGIN
PRINT N'Không xóa được sinh viên quê ở Hà Nội'
ROLLBACK TRANSACTION
END
CREATE Trigger Trigger_SV_NoDelete_HN ON dbo.sinhvien
FOR DELETE
AS
IF EXISTS (SELECT * FROM DELETED WHERE Quequan = N'Hà Nội')
BEGIN
PRINT N'Không thể xóa sinh viên ở Hà Nội'
ROLLBACK TRANSACTION
END
9. Instaed of trigger
Ex: Tạo Trigger không cho phép xóa sinh viên quê ở Hà Nội
CREATE TRIGGER Trigger_SV_NoDelete_HN ON dbo.sinhvien
INSTEAD OF DELETE AS
IF (SELECT DISTINCT Quequan FROM Deleted) = N'Hà Nội'
PRINT N'Không xóa được sinh viên quê ở Hà Nội'
10. Index
- Không nên dùng index khi:
- Cấu trúc của index:
- Phân loại index
11. Lệnh cấp phát quyề Grant
Grant privilege_name
On object_name
To { user_name | public | role_name }
[ with grant option ]
12. Lệnh thu hồi quyền đã cấp revoke
Revoke privilege_name
On object_name
From { user_name | public | role_name }
[ cascade ]
13. Privileges và role trong SQL