You are on page 1of 55

CHƯƠNG 2: QUẢN

TRỊ CSDL BẰNG


SQL SERVER
1. GIỚI THIỆU
 SQL Server là công cụ để tổ chức, quản lý
và truy xuất dữ liệu được lưu trữ trong các
CSDL
 Các thao tác về tổ chức lưu trữ, quản lý,
truy xuất trong SQL Server bao gồm:
•Định nghĩa dữ liệu
•Truy xuất và thao tác dữ liệu
•Điều khiển truy cập
•Đảm bảo toàn vẹn dữ liệu
2
2. TRANSACT - SQL
T – SQL (Transact – SQL) là ngôn ngữ SQL mở rộng
dựa trên SQL chuẩn được sử dụng trong SQL Server.

T-SQL được chia làm 3 nhóm:


 Ngôn ngữ định nghĩa dữ liệu – Data Definition Language
Ngôn ngữ điều khiển dữ liệu – Data Control Language
Ngôn ngữ thao tác dữ liệu – Data manipulation Language

3
2. TRANSACT - SQL
Nhóm định nghĩa dữ liệu: Nhóm này gồm các câu lệnh
CREATE, ALTER, DROP table, dùng để tạo, sửa đổi
hoặc xóa bảng dữ liệu. Các lệnh này được sử dụng để
định nghĩa cấu trúc một table.
Nhóm điều khiển dữ liệu: Gồm các lệnh GRANT, DENY,
REVOKE,… dùng để phân quyền truy cập của các đối
tượng table, function, view,…
Nhóm thao tác dữ liệu: Là tập hợp các lệnh để thao tác
trực tiếp với dữ liệu có trong table, giúp truy vấn, tìm kiếm
dữ liệu nhanh chóng. Các câu lệnh nhóm này gồm
INSERT, UPDATE, SELECT, DELETE.
4
Quy ước trong T-SQL
Các đối tượng: Table, View, Index, Store
procedure, Trigger,…
Truy cập đến bảng do người khác sở
hữu sử dụng:
tên_người_sở_hữu.tên_bảng
Truy cập đến cột cùng tên
phải sử dụng:
tên_bảng.tên_cột
5
CẤU TRÚC MỘT KHỐI LỆNH CÓ DẠNG NHƯ SAU

BEGIN

-- Khai báo biến


-- Các câu lệnh T-SQL

END
SỰ KHÁC NHAU GIỮA SQL VÀ T-SQL
Các thành phần trong T-SQL
 Các kiểu dữ liệu Biến
 Hàm
 Toán tử
 Chú thích
 Giá trị NULL
2.1. Các kiểu dữ liệu
Char(n): kiểu chuỗi với độ dài cố định là n
Nchar(n): kiểu chuỗi với độ dài cố định hỗ trợ Unicode
Varchar(n): kiểu chuỗi với độ dài chính xác
Nvarchar(n): kiểu chuỗi với độ dài chính xác hỗ trợ
Unicode
Int số nguyên
Float | Real: số thực
Datetime: ngày giờ, chính xác đến giây
Smalldatetime: ngày giờ, chính xác đến phút

9
2.1. Các kiểu dữ liệu
Text: kiểu chuỗi với độ dài lớn (tối đa 2,147,483,647)
Ntext: kiểu chuỗi với độ dài lớn có hỗ trợ Unicode
(1,073,741, 823)
Bit: nhận hai giá trị 0 và 1
Money: tiền tệ
Binary: kiểu nhị phân với độ dài cố định
Varbinary: kiểu nhị phân với độ dài chính xác
Image: kiểu hình ảnh

10
CÁC ĐỐI TƯỢNG CẦN SỬ DỤNG KIỂU DỮ LIỆU

• Cột trong bảng và trong view


• Tham số trong thủ tục lưu trữ
• Biến
• Hàm trả về giá trị
• Thủ tục lưu trữ trả về giá trị
HỆ QUẢN TRỊ CSDL PHÂN TÁN – SQLSERVER 11
Kiểu dữ liệu Kích thước Miền giá trị dữ liệu lưu trữ

Các kiểu dữ liệu dạng số nguyên

Int 4 bytes từ-2,147,483,648đến +2,147,483,647

SmallInt 2 bytes từ -32768 đến +32767

TinyInt 1 byte từ 0 đến 255

Bit 1 byte 0, 1 hoặc Null

Các kiểu dữ liệu dạng số thập phân

Decimal, Numeric 17bytes từ -10^38 đến +10^38

Các kiểu dữ liệu dạng số thực

Float 8 bytes từ -1.79E+308 đến +1.79E+308

Real 4 bytes từ -3.40E+38 đến +3.40E+38


HỆ QUẢN TRỊ CSDL PHÂN TÁN – SQLSERVER 12
Các kiểu dữ liệu dạng chuỗi có độ dài cố định

Char N bytes từ 1 đến 8000 ký tự, mỗi ký tự là một byte

Các kiểu dữ liệu dạng chuỗi có độ dài biến đổi

VarChar N bytes từ 1 đến 8000 ký tự, mỗi ký tự là 1 byte

Text N bytes từ 1 đến 2,147,483,647 ký tự, mỗi ký tự là 1


byte

Các kiểu dữ liệu dạng chuỗi dùng font chữ Unicode

NChar 2*N bytes từ 1 đến 4000 ký tự, mỗi ký tự là 2 bytes

NVarChar 2*N bytes từ 1 đến 4000 ký tự, mỗi ký tự là 2 bytes

NText 2*N bytes từ 1 đến 1,073,741,823 ký tự, mỗi ký tự là 2


bytes
HỆ QUẢN TRỊ CSDL PHÂN TÁN – SQLSERVER 13
Các kiểu dữ liệu dạng tiền tệ

Money 8 bytes từ -922,337,203,685,477.5808 đến


+922,337,203,685,477.5807

SmallMoney 4 bytes từ -214,748.3648 đến + 214,748.3647

Các kiểu dữ liệu dạng ngày và giờ

DateTime 8 bytes từ 01/01/1753 đến 31/12/9999

SmallDateTime 4 bytes từ 01/01/1900 đến 06/06/2079

Các kiểu dữ liệu dạng chuỗi nhị phân (Binary String)

Binary N bytes từ 1 đến 8000 bytes

VarBinary N bytes từ 1 đến 8000 bytes

Image HỆ QUẢN TRỊ CSDL PHÂN TÁN từ


N bytes 1 đến 2,147,483,647 bytes
– SQLSERVER 14
2.2. Biến trong T-SQL
Biến: là một đối tượng để lưu trữ một giá trị
dữ liệu. Dữ liệu có thể được truyền đến câu
lệnh SQL bằng cách sử dụng tên biến.
Biến có thể phân thành 2 loại:
•Biến cục bộ (khai báo bắt đầu bằng @)
•Biến toàn cục

15
Biến cục bộ
Trong Transact-SQL, biến cục bộ được khai báo và sử dụng
tạm thời khi thực thi câu lệnh SQL
Cú pháp:
Declare @tên_biến kiểu_dữ_liệu
Trong đó:
• @tên_biến: đặt theo quy tắc đặt tên, phải bắt đầu bằng ký
hiệu @
• Kiểu_dữ_liệu: kiểu dữ liệu hệ thống hoặc kiểu dữ liệu
người dùng
Ví dụ:
declare @manv int

16
Biến cục bộ - Khai báo biến
 Cú pháp
 Declare tên_biến Kiểu_dữ_liệu
 Lưu ý: Tên biến phải bắt đầu bằng 1 ký tự @
 Ví dụ
 Declare @MaSinhVien nvarchar(10)
 Declare @TienLuong float
 Declare @Sum float, @Count int
 Declare @temp TABLE (ma int,
ten nvarchar(10))

17
Lệnh gán
Set @TenBien = GiaTri Set
@TenBien = TenBien Set
@TenBien = BieuThuc
Select @TenBien = (KetQuaTruyVan)
Ví dụ :
Set @MaLop = ‘TH2001’
Set @SoSV = (select count(*) from SinhVien)
Set @MaLop = ‘TH’ + CAST
(Year(@NgayTuyenSinh) AS char(4))
HỆ QUẢN TRỊ CSDL PHÂN TÁN – SQLSERVER 18
Lệnh gán
Cũng có thể gán giá trị cho biến bằng câu
truy vấn thay vì chỉ thị set
 Ví dụ :
SV(MaSV, HoTen, Tuoi)
Select @Var2 = HoTen, @Var1 = Tuoi
from SV
where MaSV = 1 Kiều dữ liệu phải tương ứng.
Nếu câu truy vấn trả về nhiều
dòng thì các biến chỉ nhận giá
trị từ dòng đầu tiên

HỆ QUẢN TRỊ CSDL PHÂN TÁN – SQLSERVER 19


Lệnh gán
Cũng có thể gán giá trị cho biến bằng câu
truy vấn thay vì chỉ thị set
 Ví dụ :
NhanVien(MaNV, HoTen, NgaySinh)
Declare @Var1 datetime
Select @Var1 = NgaySinh
from NhanVien
where MaNV = 1
If (year(getdate()) – year(@Var1) > 50)
…....
HỆ QUẢN TRỊ CSDL PHÂN TÁN – SQLSERVER 20
Biến toàn cục
- Biến toàn cục là biến có sẵn và hệ thống quản lý
-Biến toàn cục trong SQL Server được đặt tên bắt đầu bởi hai
ký hiệu @
-Ví dụ: biến toàn cục được sử dụng để xem thông tin phiên
bản của SQL Server
SELECT @@VERSION AS PHIEN

21
Một số biến toàn cục thường dùng
Tên Biến Ý nghĩa
@@Error Cho biết các lệnh trước đó có lỗi
hay
không, nếu có lỗi @@Error <>0
@@Rowcount Cho biết số dòng bị tác động bởi
câu truy vấn gần nhất
@@Fetch_Status Trả về <>0 nếu lệnh duyệt Cursor
gây lỗi

22
2.3. Toán tử
Mức ưu Các toán tử
tiên
1 *, /, %
2 +(Add), -(Subtract)
3 =, >, <, >=, <=, <>
4 Not
5 And
6 All, Any, Between, Exits, In, Like, Or, Some
7 = (assignment)

23
2.4. Chú thích và nhập tiếng việt
 Dòng đơn  --
 Nhóm dòng  /* … */
 Nhập tiếng việt trong Query:
-Chọn kiểu dữ liệu hỗ trợ Unicode (nchar, nvarchar,
ntext)
-Thêm tiền tố N (National Characters) vào trước chuỗi
cần nhập để báo cho SQL Server đây là chuỗi Unicode
VD:
Insert into PHONGBAN( MAPHG, TENPHG )
values('QL', N'Quản lý')

24
2.5. Giá trị null
Giá trị không xác định được biểu diễn bởi
NULL
Một giá trị không xác định xuất hiện có thể
do:
•Giá trị đó có tồn tại nhưng không biết
•Tại một thời điểm nào đó giá trị chưa có
nhưng rồi có thể sẽ có.
•Giá trị bị lỗi do tính toán (tràn số, chia
cho không, …)
25
3. Ngôn ngữ định nghĩa dữ liệu
Gồm:
 CREATE
 ALTER
 DROP

26
3.1. Tạo Database
Để tạo Database trong SQL Server có 2 cách:
 SQL Server Management Studio (thao tác trực quan)
 Dùng T-SQL (Sử dụng câu lệnh)

27
Lệnh CREATE DATABASE
CREATE DATABASE <database-name>
[ ON [primary] [<filespec> [ ,… n] [ , <filegroup> [ , … n ] ] ]
[ LOG ON { <filespec> [ , … n ] } ]
[ FOR { Attach | Attach_Rebuild_Log}]

Trong đó:
<filespec> ::= ( NAME = logical_file_name,
FILENAME = os_file_name
[, SIZE = n [KB|MB|GB|TB] ]
[, MAXSIZE = max [KB|MB|GB|TB] | Unlimited ]
[, FILEGROWTH = grow [ KB|MB|GB|TB|% ])
<filegroup> ::= ( FILEGROUP filegroup_name [ DEFAULT ]
<filespec> [ ,… ])

28
Lệnh CREATE DATABASE (tiếp)

Ví dụ:
-Tạo Database MyDB với tập tin dữ liệu chính là
MyDB_Data.mdf, dung lượng khởi tạo là 10Mb, tối đa là 100Mb
và độ gia tăng kích thước cho phép là 10%.
-Tập tin bản ghi giao dịch là MyDB_Log.ldf với dung lượng ban
đầu là 2MB và kích thước tối đa không giới hạn, độ gia tăng là
10%

29
Create Database MyDB
On( Name = MyDB_Data,
FileName = 'C:\SQL_Home\MyDB_Data.mdf',
Size = 10MB,
Maxsize=100MB,
FileGrowth = 10%
)
Log On( Name = MyDB_Log,
FileName = 'C:\SQL_Home\MyDB_Log.ldf',
Size = 2MB,
Maxsize=Unlimited,
FileGrowth = 10%
)

30
3.2. Tạo bảng
Khi định nghĩa bảng mới cần xác định:
• Bảng mới được tạo ra với mục đích gì? Vài trò gì?
•Cấu trúc bảng gồm trường nào? Mỗi trường có ý nghĩa
gì? Kiểu dữ liệu của trường là gì? Có có cho phép nhận
giá trị Null không?
• Trường nào làm khóa chính?
•Bảng có quan hệ với bảng khác không? Quan hệ như
thế nào?
• Có ràng buộc – yêu cầu gì cho từng cột không?

HỆ QUẢN TRỊ CSDL PHÂN TÁN – SQLSERVER 31


3.2. Tạo bảng
Cú pháp:
CREATE TABLE tên_bảng
( <tên_trường> <kiểu_dữ_liệu>
[các ràng buộc trên các trường]
)

Trong đó:
+ Mỗi bảng phải có tối thiểu một trường.
+ Nếu có nhiều trường thì ngăn cách chúng bởi dấu phẩy.
+ [các ràng buộc trên trường]: gồm các ràng buộc về
khuôn dạng dữ liệu hay các ràng buộc về bảo toàn dữ liệu:
NOT NULL, NULL, UNIQUE, DEFAULT, PRIMARY
KEY, FOREIGN KEY, IDENTITY, CHECK,…

32
Ví dụ 1:
use MyDB
CREATE TABLE NHANVIEN
( MANV CHAR(9) PRIMARY KEY,
TENNV VARCHAR(50) NOT NULL,
NS DATETIME,
DCHI VARCHAR(50),
GT NVARCHAR (3) NOT NULL
CHECK ( GT IN ('Nam', N'Nữ') ),
LUONG INT DEFAULT (10000),
MaPB INT
)

33
Ví dụ 2:
use MyDB
CREATE TABLE Customers
( customerID int primary key,
customerName nvarchar(50) not null,
address nvarchar(100) null,
birthday datetime null,
gender bit default('true') not null
)

34
*) Tham chiếu khóa ngoại
Với chỉ định khóa ngoại, ta có:
+ Tên bảng mà khóa ngoại tham chiếu đến.
+ Tên trường được tham chiếu đến.
+ ON DELETE: Xóa bản ghi phía 1 của quan hệ thì có xóa
các bản ghi phía nhiều hay không?
+ ON UPDATE: Sửa khóa chính phía 1 của quan hệ thì có sửa
khóa liên kết tại các bản ghi phía nhiều hay không?

35
Các trường hợp sử dụng tham chiếu khóa ngoại được xử lý:
• CASCADE: tự động xóa (cập nhật) nếu bản ghi được
tham chiếu bị xóa (cập nhật)
•NO ACTION: (mặc định) nếu bản ghi trong bảng tham
chiếu đang được tham chiếu bởi một bản ghi bất kỳ trong
bảng được định nghĩa thì bản ghi đó không được phép xóa
hoặc cập nhật
•SET NULL: cập nhật lại khóa ngoại của bản ghi thành giá
trị NULL (nếu cột cho phép nhận giá trị NULL)
•SET DEFAULT: cập nhật lại khóa ngoại của bản ghi nhận
giá trị mặc định (nếu có giá trị mặc định)

36
Ví dụ: tạo bảng Hoadon, trong đó các trường MaNV của bảng là các
trường khóa ngoại có các ràng buộc Update và Delete với trường
MaNV của bảng Nhanvien.
Use MyDB
CREATE TABLE Hoadon
( SoHD nvarchar(8) NOT NULL Primary Key,
Ngaylap Datetime NOT NULL,
Tenkhach nVarchar (20),
MaNV char (8),
CONSTRAINT MaNV FOREIGN KEY (MaNV)
REFERENCES Nhanvien(MaNV)
ON DELETE CASCADE
ON UPDATE CASCADE
)

37
*) Ràng buộc CHECK
Sử dụng nhằm chỉ định điều kiện hợp lệ đối với dữ liệu, khi có
thay dữ liệu trên bảng thì ràng buộc này được kiểm tra
Cú pháp:
[CONSTRAINT tên-ràng-buộc] CHECK ( điều kiện)
Ví dụ sử dụng CHECK (cách 1):
Use MyDB
CREATE TABLE SINHVIEN
( MASV VARCHAR(9) PRIMARY KEY,
TENSV VARCHAR(50) NOT NULL,
D_TOAN INT
constraint chk_Toan CHECK (D_Toan between 0 and 10),
D_VAN INT
constraint chk_Van CHECK (D_Van>=0 and D_Van<=10)
)

38
*) Ràng buộc CHECK
Có thể đặt các ràng buộc CHECK sau cùng:
Ví dụ sử dụng CHECK (cách 2):

use MyDB
CREATE TABLE SINHVIEN
( MASV VARCHAR(9) PRIMARY KEY,
TENSV VARCHAR(50) NOT NULL,
D_TOAN INT,
D_VAN INT
constraint chk_Diem CHECK (D_Van>=0 and D_Van<=10) ,
CHECK(D_Toan between 0 and 10)
)

39
*) Ràng buộc DEFAULT
- Xác định giá trị mặc định cho từng cột
- Cú pháp:
[CONSTRAINT tên-ràng-buộc] DEFAULT ( giá-trị )

- Ví dụ:
use MyDB
CREATE TABLE VATTU
( PK_Mavtu varchar(4) not null
primary key,
TenVtu varchar(100),
Soluong int
Constraint Soluong Default (10)
)

40
*) Ràng buộc UNIQUE
-Dùng khi quy định một cột nào đó cho phép chỉ nhập một
giá trị duy nhất cho từng dòng
- Cú pháp:
[ CONSTRAINT Tên_ràng_buộc ]
UNIQUE (Danh_sách_các_cột)

Chú ý: Trong một bảng chỉ có một ràng buộc khoá chính
nhưng có thể có nhiều ràng buộc dữ liệu duy nhất

41
*) Ràng buộc UNIQUE
- Ví dụ:
CREATE TABLE VATTU1
( MAVTU varchar(4) primary key,
TenVtu varchar(100) UNIQUE )

CREATE TABLE VATTU2


( MAVTU varchar(4) not null,
TenVtu varchar(100),
Constraint UN_TenVtu UNIQUE (TenVtu) )

42
*) Ràng buộc IDENTITY
Xác định cột định danh: Trong một bảng chỉ có tối đa một cột
được chỉ định làm cột định danh.
- Cú pháp:
[constraint name] IDENTITY [ (start, step) ],

•start: là số mà SQL Server sử dụng để cấp phát cho bđầu


tiên. Mặc định là 1.
•step: là chỉ số mà SQL Server cộng lên để cấp phát cho từng
bản ghi kế tiếp. Mặc định là 1.

43
Bài tập thí dụ
Xây dựng CSDL QLDIEM với các bảng sau:
SINHVIEN (MaSV, HoTen, NgaySinh, Gioitinh, Malop)
LOP(Malop, Tenlop, NamVaohoc)
MON(Mamon, Tenmon, SoDVHT)
DIEM(MaSV, Mamon, DiemCC, DiemKT, Diemthi)

Ràng buộc:
• Giới tính chỉ nhận 2 giá trị ‘Nam’ và ‘Nữ’
• Các trường gạch chân: khóa chính, khóa ngoại
• Các ràng buộc về các điểm thành phần [0..10]
• Tên môn, tên lớp là duy nhất.
•…

44
3.2.1. Sửa cấu trúc bảng
Sử dụng câu lệnh ALTER TABLE.
Câu lệnh này cho phép thực hiện được các thao tác sau:
• Bổ sung một cột vào bảng.
• Xoá một cột khỏi bảng.
• Thay đổi định nghĩa kiểu của một cột trong bảng.
• Xoá bỏ hoặc bổ sung các ràng buộc cho bảng

45
Thêm cột mới
Cú pháp:
ALTER TABLE Tên_bảng
ADD Tên_cột Kiểu_dữ_liệu [Ràng buộc] [,... ]
Chú ý: Luôn thêm cột mới vào cuối bảng
Ví dụ:
ALTER TABLE VATTU
ADD Soluong int

46
Một số lưu ý:
oKhi thêm cột vào bảng đã có ít nhất 1 bản ghi thì cột mới
thêm phải cho phép nhận giá trị NULL hoặc phải có giá trị
mặc định
oMuốn xóa cột có tồn tại ràng buộc/có tham chiếu khóa
ngoài thì phải xóa ràng buộc hoặc khóa ngoài.
oNếu thêm ràng buộc cho bảng đã có dữ liệu mà ràng
buộc không thỏa mãn với các dữ liệu đã có thì nó sẽ thêm
vào được.

47
Sửa cấu trúc bảng (sửa cột)
Cú pháp:
ALTER TABLE tên_bảng
[ ALTER COLUMN tên_trường kiểu dữ liệu, ràng
buộc,…
]
Chú ý: Kiểu dữ liệu mới phải lơn hơn kiểu dữ liệu cũ đã có

Ví dụ: Sửa cấu trúc trường sTenhang trong bảng tblHang:


use MyDB
Alter Table VATTU
Alter Column TenVTu varchar(50) Not Null

48
Xóa cột
Cú pháp:
ALTER TABLE Tên_bảng
DROP COLUMN Tên_cột [,...]

Ví dụ:
ALTER TABLE VATTU
DROP COLUMN TenVtu

49
Chú ý:
Ta không thể xóa các trường sau:
•Trường đang có các ràng buộc Primary Key,
Foreign Key, Unique, Check,…
•Trường đang có trong Index
•Trường Replicate
•Trường đang được gắn với một Rule
(quyền) nào đó.

50
*) Thêm ràng buộc cho cột
 Cú pháp:
ALTER TABLE Tên_bảng
ADD CONSTRAINT Tên_ràng_buộc Loại_ràng_buộc

 Ví dụ:
ALTER TABLE VATTU
ADD CONSTRAINT CK_NgayNhap
CHECK ( Ngaynhap <= GetDate() )

51
*) Hủy ràng buộc đã đặt
 Cú pháp:
ALTER TABLE Tên_bảng
DROP CONSTRAINT Tên_ràng_buộc
 Ví dụ:
ALTER TABLE VATTU
DROP CONSTRAINT CK_NgayNhap

52
*) Đổi tên cột
 Cú pháp:
EXEC SP_RENAME ‘Tên_bảng.Tên_cột’, ‘Tên_mới’ ,
‘COLUMN’
 Ví dụ:
EXEC SP_RENAME ‘VATTU.MAVTU’,
‘MAVATTU’, ‘COLUMN’

53
*) Đổi tên bảng
 Cú pháp:
EXEC SP_RENAME ‘Tên_bảng’, ‘Tên_mới’
 Ví dụ:
EXEC SP_RENAME ‘VATTU’, ’VT’

54
3.2.2. Xóa bảng
• Cú pháp:
DROP TABLE Danh_sách_tên_các_bảng

• Ví dụ:
DROP TABLE VatTu, Customers

• Lưu ý:
+ Câu lệnh Drop Table không thể thực hiện nếu bảng cần
xóa được tham chiếu bởi một Foreign Key
+ Các ràng buộc, chỉ mục, trigger,.. đều bị xóa, nếu tạo lại
bảng thì cũng phải tạo lại các đối tượng này.
+ Sau khi xóa không thể khôi phục lại bảng và dữ liệu bảng.

55

You might also like