Download as pdf or txt
Download as pdf or txt
You are on page 1of 136

TRƢỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM

KHOA CÔNG NGHỆ THÔNG TIN

BÀI GIẢNG HỌC PHẦN

CƠ SỞ DỮ LIỆU
Chương 4
NGÔN NGỮ SQL VÀ HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
MICROSOFT SQL SERVER

Giảng viên: ThS. Nguyễn Vƣơng Thịnh


Bộ môn: Hệ thống thông tin

Hải Phòng, 2020


Tài liệu tham khảo
1. Elmasri, Navathe, Somayajulu, Gupta, Fundamentals of Database
Systems (the 4th Edition), Pearson Education Inc, 2004.
2. Nguyễn Tuệ, Giáo trình Nhập môn Hệ Cơ sở dữ liệu, Nhà xuất bản
Giáo dục Việt Nam, 2007.
3. Nguyễn Kim Anh, Nguyên lý của các hệ Cơ sở dữ liệu, Nhà xuất bản
Đại học Quốc gia Hà Nội, 2004.

2
Tài liệu tham khảo

3
NGÔN NGỮ SQL VÀ HỆ QUẢN TRỊ
CƠ SỞ DỮ LIỆU MS SQL SERVER
1. TỔNG QUAN VỀ NGÔN NGỮ SQL VÀ MỘT SỐ KHÁI NIỆM CƠ BẢN
2. CÀI ĐẶT VÀ LÀM QUEN VỚI MÔI TRƢỜNG LÀM VIỆC CỦA SQL SERVER
3. LÀM VIỆC VỚI CƠ SỞ DỮ LIỆU TRONG SQL SERVER
4. LÀM VIỆC VỚI BẢNG DỮ LIỆU
5. THAO TÁC VỚI DỮ LIỆU TRONG BẢNG
6. TRUY VẤN DỮ LIỆU
7. TRUY VẤN CON
8. SỬ DỤNG KHUNG NHÌN (VIEW)
9. MỘT SỐ HÀM XÂY DỰNG SẴN TRONG SQL SERVER
10. KHAI BÁO BIẾN VÀ SỬ DỤNG CÁC CẤU TRÚC ĐIỀU KHIỂN TRONG T-SQL
11. THỦ TỤC VÀ HÀM DO NGƢỜI DÙNG TỰ ĐỊNH NGHĨA
12. SỬ DỤNG TRIGGER
13. XỬ LÝ GIAO DỊCH
14. SỬ DỤNG CON TRỎ
1.1. TỔNG QUAN VỀ NGÔN NGỮ SQL
a. Lịch sử phát triển
 Đƣợc phát triển bởi IBM vào những năm 70 với tên gọi ban đầu là
Squel dựa trên mô hình dữ liệu quan hệ của F.Codd.
 Viện Tiêu chuẩn quốc gia Hoa Kỳ (ANSI) và Tổ chức tiêu chuẩn
quốc tế (ISO) đã công bố các phiên bản chuẩn của SQL: SQL_86,
SQL_89, SQL_92, SQL:1999, SQL:2003, SQL:2006, SQL:2008,
SQL:2011.
 Các phần mềm hệ quản trị cơ sở dữ liệu khác nhau sẽ hỗ trợ ngôn
ngữ SQL ở các mức độ khác nhau (có thể bổ sung thêm hoặc
không hỗ trợ một số câu lệnh hay cú pháp).
Raymond F. Boyce Donal D. Chamberlin

CHA ĐẺ CỦA NGÔN NGỮ SQL


6
b. Các thành phần của ngôn ngữ SQL

NGÔN NGỮ ĐỊNH NGHĨA DỮ LIỆU


(DDL – Data Definition Language)

(Định nghĩa (xác lập) hoặc thay đổi


cấu trúc tập tin của CSDL, các bảng
dữ liệu, các liên kết,...)

NGÔN NGỮ THAO TÁC DỮ LIỆU


(DML – Data Definition Language)

(Cập nhật dữ liệu vào các bảng, truy


vấn (đọc) dữ liệu từ các bảng,...)
c. T-SQL: một phiên bản của Ngôn ngữ SQL

T-SQL hay còn gọi là Transact-SQL là một phiên bản của


Ngôn ngữ SQL đƣợc phát triển dành riêng cho Hệ quản trị
cơ sở dữ liệu Microsoft SQL Server.

T-SQL xây dựng dựa trên SQL chuẩn (ANSI) nhƣng đƣợc
Microsoft bổ sung thêm một số tính năng nâng cao, đặc
biệt là các chức năng của ngôn ngữ lập trình.
1.2. MỘT SỐ KHÁI NIỆM CƠ BẢN
Khi làm việc với SQL và các hệ quản trị cơ sở dữ liệu thông thƣờng:
 Dữ liệu đƣợc tổ chức dƣới dạng cơ sở dữ liệu (database). Đó là
một tập hợp gồm các bảng dữ liệu có liên quan.
 Mỗi bảng dữ liệu (data table) là tập hợp các hàng (bản ghi) và cột.
Đó chính là một quan hệ (relation) trong mô hình quan hệ.
Lưu ý: Một tập hợp các bản ghi là kết quả trả về của một câu lệnh truy
vấn SELECT cũng đƣợc xem là một quan hệ.
 Mỗi cột (column) của bảng là một thuộc tính (attribute) của quan hệ,
mỗi bản ghi (record) của bảng là một bộ (tuple) của quan hệ.
 Cấu trúc của bảng dữ liệu (danh sách các cột) đƣợc xác định (định
nghĩa) bởi lƣợc đồ quan hệ tƣơng ứng.

9
a. Khái niệm về bảng dữ liệu
 Dữ liệu trong cơ sở dữ liệu đƣợc tổ chức dƣới dạng các
bảng dữ liệu (Table). Bảng dữ liệu chính là một quan hệ
(relation) trong mô hình dữ liệu quan hệ.
 Một cơ sở dữ liệu có thể gồm 01 hoặc nhiều bảng.
Field: Trƣờng (Attribute: Thuộc tính)
Trong bảng dữ liệu không
được phép tồn tại 02 bản ghi
có nội dung giống nhau.

Record: Bản ghi (Tuple: Bộ)

 Bảng dữ liệu có thể đƣợc mô tả ngắn gọn thông qua


tên bảng và danh sách các trƣờng (chính là Lược đồ
10
quan hệ trong mô hình dữ liệu quan hệ).
KhachHang(MaKH, TenKH, DiaChi, DienThoai)

MaKH TenKH DiaChi DienThoai


KH001 Nguyễn Văn An 30/2 Lý Thái Tổ, Ba Đình, HN 0931222333
KH002 Trần Thạch Tú 12/5 Nơ Trang Long, Q5, TP HCM 0956178397
KH003 Vũ Tuấn Cường 234 Tô Hiệu, Lê Chân, HP 0983245667
KH004 Lê Thu Hà 23/6 Lý Hồng Nhật, Hạ Long, QN 0915133295

HocSinh(MaHS, TenHS, NgaySinh, Lop, D_Toan, D_TiengViet)

MaHS TenHS NgaySinh Lop D_Toan D_TiengViet


HS001 Vũ Tuấn Anh 2014-01-19 1A1 9.5 10.0
HS002 Lê Văn Bình 2014-05-16 1A1 10.0 10.0
HS003 Trần Văn Cường 2014-08-20 1A2 9.5 8.0
HS004 Lê Anh Dũng 2014-07-25 1A2 10.0 9.5

11
b. Khái niệm khóa chính và khóa ngoại của bảng dữ liệu
Khóa chính
Khóa chính (Primary Key) của bảng là ràng buộc được xác lập trên một tập
các trường sao cho không tồn tại đồng thời 02 bản ghi bất kỳ của bảng
mang các bộ giá trị hoàn toàn giống nhau trên các trường này.
Đặc điểm:
 Thông thường, khóa chính được xác lập trên 01 trường.
 Khóa chính được sử dụng khi muốn chỉ định (phân biệt) các bản ghi trong
bảng dữ liệu.
 Khi mô tả bảng dữ liệu, các trường xác lập là khóa chính sẽ được gạch
chân.

12
HocSinh(MaHS, TenHS, NgaySinh, Lop, D_Toan, D_TiengViet)

MaHS TenHS NgaySinh Lop D_Toan D_TiengViet


HS001 Vũ Tuấn Anh 2014-01-19 1A1 9.5 10.0
HS002 Lê Văn Bình 2014-05-16 1A1 10.0 10.0
HS003 Trần Văn Cường 2014-08-20 1A2 9.5 8.0
HS004 Lê Anh Dũng 2014-07-25 1A2 10.0 9.5
HS005 Lê Văn Bình 2014-05-16 1A1 10.0 10.0

Khóa chính
(Primary Key)

13
Lop(MaLop, NienKhoa, PhongHoc, GiaoVienCN)

MaLop NienKhoa PhongHoc GiaoVienCN


10A1 2001-2002 P205 Lê Thu Lan
10A2 2001-2002 P206 Vũ Hồng Nhung
11A1 2001-2002 P301 Trần Văn Thái
11A2 2001-2002 P302 Lê Quý Bình
10A1 2004-2005 P205 Lê Thu Lan
10A2 2004-2005 P206 Vũ Hồng Nhung

Khóa chính
(Primary Key)

14
Khóa ngoại
Khóa ngoại (Foreign Key) là ràng buộc được xác lập trên một tập các trường
của một bảng để phục vụ tham chiếu đến các trường tương ứng của một
bảng khác:
 Các trường khóa ngoại phải có cùng số lượng và kiểu dữ liệu tương ứng
với các trường của bảng được tham chiếu tới.
 Bộ giá trị tương ứng trên các trường khóa ngoại phải là một trong số các
bộ giá trị sẵn có tương ứng trên các trường của bảng được tham chiếu
hoặc là bộ các giá trị rỗng (NULL).
Đặc điểm:
 Khóa ngoại thường bao gồm 01 trường.
 Khóa ngoại thường sử dụng để tham chiếu đến khóa chính của bảng
khác.
 Bảng được tham chiếu đến gọi là bảng cha. Bảng chứa khóa ngoại gọi là
bảng con.
15
MaLop PhongHoc GiaoVienCN
1A1 P101 Lê Thu Lan
1A2 P102 Vũ Hồng Nhung
1A3 P103 Trần Văn Thái

Khóa chính
(Primary Key)
MaHS TenHS NgaySinh MaLop D_Toan D_TiengViet
HS001 Vũ Tuấn Anh 2014-01-19 1A1 9.5 10.0
HS002 Lê Văn Bình 2014-05-16 1A1 10.0 10.0
HS003 Trần Văn Cường 2014-08-20 1A2 9.5 8.0
HS004 Lê Anh Dũng 2014-07-25 1A2 10.0 9.5
HS005 Lê Văn Bình 2014-05-16 1A1 10.0 10.0

Khóa chính
(Primary Key)
16 Khóa ngoại
(Foreign Key)
Lớp Giảng viên
Mã Lớp Tên Lớp Thời Lƣợng Mã GV Tên GV
L01 MS Word 2013 15 GV01 Vũ Thu Trang
L02 MS Excel 2013 20 GV02 Lê Anh Tuấn
L03 MS Powerpoint 2013 10 GV03 Trần Tuấn Cƣờng
L04 MS Access 2013 20
Khóa chính

Khóa chính
Phân Công Mã GV Mã Lớp
GV03 L01
GV02 L02
GV01 L04
GV03 L03

Khóa ngoại Khóa ngoại

17
Khóa chính
c. Khái niệm về lược đồ cơ sở dữ liệu (database diagram)
Lược đồ cơ sở dữ liệu (Database Diagram) mô tả cấu trúc
của các bảng dữ liệu trong cơ sở dữ liệu và mối quan hệ
giữa chúng.

Lớp Mã Lớp Tên Lớp Phòng học


L1 Word T001 P203
L2 Word T002 P204

Học viên Mã HV Tên HV Năm Sinh Điểm Thi Mã Lớp


HV01 An 1984 5.5 L1
HV02 Bình 1989 7.0 L2
HV03 Cƣờng 1985 6.5 L1
18
HV04 Dƣơng 1988 7.7 L2
Lớp Học Viên

Mã Lớp Mã HV
Tên Lớp Tên HV
Phòng Học Năm Sinh
Điểm Thi
Mã Lớp

19
Lớp Giảng viên
Mã Lớp Tên Lớp Thời Lƣợng Mã GV Tên GV
L01 MS Word 2013 15 GV01 Vũ Thu Trang
L02 MS Excel 2013 20 GV02 Lê Anh Tuấn
L03 MS Powerpoint 2013 10 GV03 Trần Tuấn Cƣờng
L04 MS Access 2013 20
Khóa chính

Khóa chính
Phân Công Mã GV Mã Lớp
GV03 L01
GV02 L02
GV01 L04
GV03 L03

Khóa ngoại Khóa ngoại

20
Khóa chính
Lớp Giảng Viên

Mã Lớp Mã GV
Tên Lớp Tên GV
Thời Lƣợng

Phân Công

Mã GV
Mã Lớp

21
2.1. HƢỚNG DẪN CÀI ĐẶT
Bƣớc 1: Tải file cài đặt từ trang của Microsoft:

Click nút Download


để tải về

22
Chọn phiên bản
muốn cài đặt
(64 bit hay 32 bit)

23
File cài đặt:
SQLEXPRWT_x86_ENU.exe
Hoặc
SQLEXPRWT_x64_ENU.exe

Bƣớc 2: Chạy file cài đặt đã đƣợc tải về ở bƣớc 1 để tiến hành quá trình cài đặt
và thực hiện lần lƣợt các thao tác theo hƣớng dẫn:

24
1

25
2

26
3

27
4

28
5

29
6

30
7

31
8

32
9

33
2.2. LÀM QUEN VỚI MÔI TRƢỜNG LÀM VIỆC
Server Type: Kiểu Server muốn truy
cập. Có 02 kiểu Server:
a. Đăng nhập hệ thống SQL Server 1. Database Engine: CSDL SQL Server
dạng chuẩn.
2. SQL Server Compact: CSDL SQL
Server phiên bản thu gọn.

Server Name: Tên của Server dữ liệu


muốn truy cập, thường có dạng:
<Tên máy tính>\SQLEXPRESS

Authentication: Chế độ xác thực người


dùng. Có 02 chế độ:
 Windows Authentication: Xác thực
thông qua Windows (không cần
username và password).
 SQL Server Authentication: Xác thực
của SQL Server (phải có username
34
và password).
Windows Authentication: Chế độ SQL Server Authentication: Chế độ
xác thực thông qua Windows (không xác thực của SQL Server (phải có
cần username và password). username và password).

35
b. Giao diện SQL Server Management Studio

SQL Server Management Studio

SQL Server
Database Engine

36
User
Nút New Query: Mở ra cửa sổ soạn thảo mã lệnh SQL.

Cửa số Object Explorer: Quan sát


và tương tác với các đối tượng có
trên hệ thống SQL Server theo cấu
trúc phân cấp.
Server (máy tính) đang làm việc.
Các CSDL lưu thông tin hệ thống
của SQL Server..
Các CSDL do người dùng tạo.

Các đối tượng liên quan đến bảo mật


hệ thống (user, phân quyền,…)

37
Hủy bỏ Kiểm tra cú
Chỉ định CSDL Thực thi Chạy debug mã lệnh Cửa sổ soạn
pháp của
muốn làm việc mã lệnh (gỡ lỗi) thảo mã lệnh
đang chạy mã lệnh
(Query Editor)

Cửa sổ hiển thị


kết quả

38
Lƣu mã nguồn T-SQL
thành tệp văn bản có
phần mở rộng là .sql

39
3.1. TỔ CHỨC TỆP TIN TRONG CSDL SQL SERVER
Mỗi cơ sở dữ liệu SQL Server thường bao gồm 02 tệp tin:
 Tệp tin chứa dữ liệu (Main Data File) có phần mở rộng là
.MDF.
 Tệp tin nhật ký giao tác (Log Data File) có phần mở rộng là
.LDF: ghi lại thông tin cần thiết về các giao tác đã thực thi
trên CSDL.

Main Data File (.MDF) Log Data File (.LDF)


Mỗi tệp tin sẽ có 05 thuộc tính:
1. Tên logic (Name).
2. Tên (đƣờng dẫn) vật lý (File Name).
3. Kích thƣớc ban đầu (Size).
4. Kích thƣớc tối đa (Max Size).
5. Tốc độ tăng trƣởng (Growth Increment).

41
3.2. LÀM VIỆC VỚI CSDL SỬ DỤNG CÁC LỆNH T-SQL
a. Tạo cơ sở dữ liệu
CREATE DATABASE <Tên CSDL>
[ON
PRIMARY
(
NAME = <Tên logic của tệp>, Phần
FILENAME = <Đường dẫn vật lý của tệp> khai báo
[,SIZE = <Kích thước ban đầu của tệp>] tệp chứa
dữ liệu
[,MAXSIZE = <Kích thước tối đa của tệp>|UNLIMITED]
[,FILEGROWTH = <Tốc độ tăng trưởng kích thước tệp>]
)
LOG ON
(
NAME = <Tên logic của tệp>, Phần
khai báo
FILENAME = <Đường dẫn vật lý của tệp> tệp nhật
[,SIZE = <Kích thước ban đầu của tệp>] ký giao
[,MAXSIZE = <Kích thước tối đa của tệp>|UNLIMITED] tác (Log)
[,FILEGROWTH = <Tốc độ tăng trưởng kích thước tệp>]
)]
CREATE DATABASE Sales
ON
PRIMARY
(
NAME = Sales_dat,
FILENAME = 'C:\Program Files\Microsoft SQL
Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\saledat.mdf',
SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5
)
LOG ON
(
NAME = Sales_log,
FILENAME = 'C:\Program Files\Microsoft SQL
Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\salelog.ldf',
SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB
)
43
b. Chỉnh sửa các thuộc tính của cơ sở dữ liệu

ALTER DATABASE <Tên CSDL>


MODIFY NAME = <Tên mới của CSDL> | MODIFY FILE
(
NAME = <Tên logic của tệp cần sửa đổi>
[,NEWNAME = <Tên logic mới của tệp>]
[,FILENAME = <Đường dẫn vật lý của tệp>]
[,SIZE = <Kích thước ban đầu của tệp>]
[,MAXSIZE = <Kích thước tối đa của tệp>|UNLIMITED]
[,FILEGROWTH = <Tốc độ tăng trưởng kích thước tệp>]
)

44
Đổi nơi lƣu trữ tệp dữ liệu của cơ sở dữ liệu Sales sang
thƣ mục D:\Data và xác lập lại kích thƣớc ban đầu của
tệp này là 100MB:
ALTER DATABASE Sales
MODIFY FILE
(
NAME = Sales_dat,
FILENAME = 'D:\Data\Saledat.mdf',
SIZE = 100MB
)
Đổi tên cơ sở dữ liệu Sales thành dbBanHang
ALTER DATABASE Sales
MODIFY NAME = dbBanHang
45
c. Xóa cơ sở dữ liệu

DROP DATABASE <Tên CSDL cần xóa>

Xóa cơ sở dữ liệu dbBanHang:


DROP DATABASE dbBanHang

46
3.3. LÀM VIỆC VỚI CSDL SỬ DỤNG CÁC CHỨC NĂNG
TRÊN MANAGEMENT STUDIO
a. Tạo cơ sở dữ liệu

2. Chọn mục
New Database...
1. Click chuột trên menu pop-up
phải vào mục
Databases

47
Tên cơ sở
dữ liệu

Tệp dữ liệu (.mdf)


Tệp log (.ldf)

Tên logic Thông tin về Kích thƣớc Thiết lập sự Đƣờng dẫn Tên
của tệp loại tệp ban đầu của tăng trƣởng vật lý của tệp vật lý
(tệp dữ liệu tệp (MB) kích thƣớc của
Tên logic hay tệp .log) của tệp tự tệp
mặc định động Tên vật lý
được lấy
mặc định
theo tên
được lấy theo
của CSDL
tên logic của
tệp.

48
Click vào nút “…” ở cột Autogrowth để thay đổi thiết lập về
tăng trƣởng kích thƣớc tệp tự động → Mở ra hộp thoại
Change Autogrowth:

Cho phép tự động tăng trƣởng kích


thƣớc tệp khi cần

Thiết lập tốc độ tăng trƣởng Tốc độ


tăng trƣởng
tính theo %

Tốc độ
tăng trƣởng
tính theo MB
Thiết lập kích thƣớc tối đa
Giới hạn kích
thƣớc (MB)

Không giới hạn


kích thƣớc

49
Click vào nút “…” ở cột Path để thay đổi thiết lập đƣờng dẫn vật lý
đến nơi lƣu trữ tệp → Mở ra hộp thoại Locate Folder:

50
b. Sửa đổi cấu trúc tệp và các thuộc tính của cơ sở dữ liệu

1- Sửa đổi cấu trúc và thuộc


tính các tệp của cơ sở dữ liệu
B1. Click chuột phải vào cơ sở
dữ liệu muốn chỉnh sửa → Trên
menu popup, chọn Properties.

51
B2. Trong cửa sổ Database Properties, tại khung Select a page chọn mục Files.
B3. Sửa đổi các thuộc tính của các tệp trong phần Database file và nhấn OK để
kết thúc.

52
2- Đổi tên cơ sở dữ liệu
Click chuột phải vào cơ sở dữ liệu
muốn chỉnh sửa → Trên menu
popup, chọn Rename.

53
c. Xóa bỏ cơ sở dữ liệu

Click chuột phải vào cơ sở dữ liệu


muốn xóa bỏ → Trên menu popup,
chọn Delete.

54
Hộp thoại Delete Object xuất hiện → Nhấn OK để hoàn thành thao tác xóa CSDL.

55
4.1. LÀM VIỆC VỚI BẢNG SỬ DỤNG CÁC LỆNH T-SQL
a. Tạo bảng dữ liệu
CREATE TABLE <tên bảng>
(
<tên cột> <kiểu dữ liệu> [NOT NULL]
[,<tên cột> <kiểu dữ liệu> [NOT NULL]]
[,<tên cột> <kiểu dữ liệu> [NOT NULL]]
...
[,CONSTRAINT <tên ràng buộc> PRIMARY KEY (<DS cột>)]
[,CONSTRAINT <tên ràng buộc> FOREIGN KEY (<DS cột>)
REFERENCES <tên bảng được tham chiếu>(<DS cột>)]
...
[,CONSTRAINT <tên ràng buộc> CHECK(<biểu thức logic>)]
...
)
56
CÁC KIỂU DỮ LIỆU TRONG SQL
STT Kiểu dữ liệu Ý nghĩa
1 char(n) Chuỗi ký tự ASCI độ dài n cố định
2 varchar(n) Chuỗi ký tự ASCI có độ dài biến đổi
3 nchar(n) Chuỗi ký tự Unicode độ dài n cố định
4 nvarchar(n) Chuỗi ký tự Unicode độ dài biến đổi
5 bit Chứa giá trị tƣơng ứng với 01 trong 02 trạng thái 0 hoặc 1
6 tinyint Số nguyên (0 đến 255)
7 smallint Số nguyên (-215 đến 215 – 1)
8 int Số nguyên (-231 đến 231 – 1)
9 bigint Số nguyên (-263 đến 263 – 1)
10 money Tiền tệ (-922,337,203,685,477.5808 to 922,337,203,685,477.5807)
11 smallmoney Tiền tệ (- 214,748.3648 to 214,748.3647)
Số thực phần thập phân cố định (p: tổng số chữ số, s: số chữ số phần thập phân)
12 decimal(p,s)
Phạm vi biểu diễn: -1038 + 1 đến 1038 – 1.
Số thực phần thập phân cố định (p: tổng số chữ số, s: số chữ số phần thập phân)
13 numeric(p,s)
Phạm vi biểu diễn: -1038 + 1 đến 1038 – 1.
14 float Số thực dấu phẩy động (từ -1.79E+308 đến 1.79E+308)
15 real Số thực dấu phẩy động (từ -3.40E+38 đến 3.40E+38)
16 datetime Thời gian (gồm ngày/tháng và giờ/phút/giây) (từ 01/01/1753 đến 31/12/9999)
17 smalldatetime Thời gian (gồm ngày/tháng và giờ/phút/giây) (từ 01/01/1900 đến 06/06/2079)
18 date Thời gian (chỉ có ngày/tháng) (từ 01/01/0001 đến 31/12/9999)
19 time Thời gian (chỉ có giờ/phút/giây)
PhongBan(MaPB, TenPB, DiaDiem)
NhanVien(MaNV, TenNV, ChuyenMon, HSLuong, Phong)
CREATE TABLE PhongBan
(
MaPB char(3) NOT NULL,
TenPB nvarchar(30) NOT NULL,
DiaDiem nvarchar(100),
CONSTRAINT PK_PhongBan PRIMARY KEY(MaPB)
)
CREATE TABLE NhanVien
(
MaNV char(5) NOT NULL,
TenNV nvarchar(30) NOT NULL,
ChuyenMon nvarchar(100),
Phong char(3) NOT NULL,
HSLuong decimal(3,1) NOT NULL,
CONSTRAINT PK_NhanVien PRIMARY KEY(MaNV),
CONSTRAINT FK_NhanVien FOREIGN KEY (Phong) REFERENCES PhongBan(MaPB),
CONSTRAINT HSLuong_Check CHECK((HSLuong>2.34)AND(HSLuong<4.0))
)
58
b. Sửa đổi cấu trúc bảng dữ liệu
 Thêm cột dữ liệu mới
ALTER TABLE <tên bảng>
ADD <tên cột> <kiểu dữ liệu> [NOT NULL]
 Xóa cột dữ liệu
ALTER TABLE <tên bảng>
DROP COLUMN <danh sách cột>
 Sửa kiểu dữ liệu của cột
ALTER TABLE <tên bảng>
ALTER COLUMN <tên cột> <kiểu dữ liệu mới> [NOT NULL]
 Thêm một ràng buộc đối với bảng
ALTER TABLE <tên bảng>
ADD CONSTRAINT <tên ràng buộc> <kiểu ràng buộc>
 Xóa một ràng buộc đối với bảng
ALTER TABLE <tên bảng>
59 DROP CONSTRAINT <tên ràng buộc>
Ví dụ:
 Thêm cột NgaySinh vào bảng NhanVien
ALTER TABLE NhanVien
ADD NgaySinh Date NOT NULL
 Đổi kiểu dữ liệu của cột ChuyenMon trong bảng NhanVien từ
kiểu nvarchar có độ dài 100 sang kiểu nvarchar có độ dài 150
ALTER TABLE NhanVien
ALTER COLUMN ChuyenMon nvarchar(150)
 Xóa cột DiaDiem trong bảng PhongBan
ALTER TABLE PhongBan
DROP COLUMN DiaDiem
 Xóa ràng buộc khóa ngoại FK_NhanVien trong bảng NhanVien
ALTER TABLE NhanVien
60 DROP CONSTRAINT FK_NhanVien
c. Xóa bỏ bảng dữ liệu
DROP TABLE <tên bảng>
Ví dụ: Xóa bỏ bảng dữ liệu NhanVien
DROP TABLE NhanVien

61
4.2. LÀM VIỆC VỚI BẢNG SỬ DỤNG CÁC CHỨC NĂNG
TRÊN SQL SERVER MANAGEMENT STUDIO
a. Tạo bảng dữ liệu

Click chuột phải vào nhóm


Table của CSDL muốn làm
việc → Trên menu popup,
chọn New Table

62
1- KHAI BÁO CÁC CỘT CỦA BẢNG

Có cho phép
bỏ trống
(NULL) dữ
liệu trong cột
hay không?

Gõ tên cột
Chọn
kiểu dữ
liệu cho
cột

63
2- THIẾT LẬP KHÓA CHÍNH CHO BẢNG
Click chuột phải vào cột (hoặc một số cột) đang được chọn → Trên menu
popup chọn Set Primary Key

Cột sau khi


được thiết lập là
khóa chính sẽ
có biểu tượng
chìa khóa bên
cạnh

Lưu ý: Nếu khóa chính bao gồm nhiều cột: Phải chọn tất cả các cột này
bằng cách giữ phím Ctrl và click chọn từng cột. Sau đó mới click chuột
64 phải chọn Set Primary Key.
3- KHAI BÁO THÊM CỘT MỚI
Muốn khai báo thêm 01 cột mới vào trước vị trí của cột nào, click
chuột phải vào cột đó → Trên menu popup chọn Insert Column

65
4- XÓA KHAI BÁO CỘT
Muốn xóa khai báo của cột nào, click chuột phải vào vị trí ứng với
khai báo cột đó → Trên menu popup chọn Delete Column

66
5- THIẾT LẬP KHÓA NGOẠI
B1: Click chuột phải vào vị trí bất kỳ trong vùng khai báo cột → Trên
menu popup chọn Relationship

67
B2: Trên hộp thoại Foreign Key Relationships, click nút Add để bắt
đầu khai báo một ràng buộc khóa ngoại

68
Chọn mở mục Table And Columns Specification và nhấn vào nút “…”

69
Chọn bảng được
Khai báo tên
tham chiếu (bảng cha)
ràng buộc

Lựa chọn cột


được xác lập
làm khóa
ngoại

Chọn cột được


tham chiếu của
bảng cha

70 Lưu ý: Khóa ngoại có thể gồm nhiều cột


6- KẾT THÚC VÀ LƢU LẠI KẾT QUẢ
Sau khi đã thực hiện xong các thao tác → Vào menu File → Chọn
Save Table… (hoặc Ctrl+S) để lƣu lại bảng vừa tạo.

Xuất hiện hộp thoại Choose Name

Gõ tên bảng
vào đây
(để thay thế cho tên
mặc định mà SQL
Server tự chọn)

71
b. Chỉnh sửa cấu trúc bảng dữ liệu

Click chuột phải vào bảng


muốn sửa → Trên menu
popup, chọn mục Design →
Mở ra cửa sổ thiết kế bảng
để chỉnh sửa (các thao tác
tương tự như lúc tạo bảng).

72
c. Đổi tên bảng dữ liệu

Click chuột phải vào bảng


muốn đổi tên → Trên menu
popup, chọn mục Rename.

73
d. Xóa bỏ bảng dữ liệu

Click chuột phải vào bảng


muốn xóa → Trên menu
popup, chọn mục Delete.

74
Hộp thoại Delete Object xuất hiện → Nhấn OK để kết thúc thao tác xóa bảng.

75
5.1. CÁCH BIỂU DIỄN GIÁ TRỊ CỦA MỘT SỐ KIỂU DỮ LIỆU
TRONG NGÔN NGỮ T-SQL
a. Kiểu chuỗi ký tự ASCII: char(n), varchar(n)
Giá trị chuỗi đƣợc biểu diễn bằng một tập hợp các ký tự
ASCII nằm giữa 02 dấu nháy đơn.
Ví dụ: 'ABCD', 'John Smith',…
b. Kiểu chuỗi ký tự Unicode: nchar(n), nvarchar(n)
Giá trị chuỗi đƣợc biểu diễn bằng một tập hợp các ký tự
Unicode nằm giữa 02 dấu nháy đơn và đầu chuỗi có thêm
ký tự định dạng N (để phân biệt với chuỗi ASCII).
Ví dụ: N'Nguyễn Văn An', N'Hải Phòng', N'Kế toán',…
76
c. Kiểu ngày tháng kèm thời gian: datetime, smalldatetime
Giá trị ngày tháng kèm thời gian đƣợc biểu diễn bằng một
chuỗi ký tự nằm giữa 02 dấu nháy đơn theo định dạng năm-
tháng-ngày giờ-phút-giây: 'YYYY-MM-DD hh:mm:ss'.
Ví dụ: '2020-12-24 19:05:56'
d. Kiểu ngày tháng: date
Giá trị ngày tháng đƣợc biểu diễn bằng một chuỗi ký tự nằm
giữa 02 dấu nháy đơn theo định dạng năm-tháng-ngày:
'YYYY-MM-DD'. Ví dụ: '2020-12-24'
e. Kiểu thời gian: time
Giá trị thời gian đƣợc biểu diễn bằng một chuỗi ký tự nằm
giữa 02 dấu nháy đơn theo định dạng giờ-phút-giây:
'hh:mm:ss'. Ví dụ: '19:05:56'

77
f. Kiểu số thực với phần thập phân cố định: decimal(n,p),
numeric(n,p)
Giá trị số thực đƣợc biểu diễn bằng n chữ số, trong đó
có p chữ số phần thập phân.
Ví dụ: Các số thực sau đây có kiểu là decimal(3,2) hay
numeric(3,2): 3.14, 2.34, 1.67,…
g. Kiểu số thực dấu phẩy động: float, real
Giá trị số thực đƣợc biểu diễn thông qua lũy thừa của
10. Ví dụ:
0.0012 = 1.2 x 10-3 (ký hiệu 1.2E-3)
1200 = 1.2 x 103 (ký hiệu 1.2E3)
78
5.2. LÀM VIỆC VỚI DỮ LIỆU TRONG BẢNG SỬ DỤNG CÁC
LỆNH T-SQL

INSERT INTO <tên bảng>[(<DS cột>)] VALUES(<DS giá trị>)


Lƣu ý:
- Danh sách cột sau tên bảng và danh sách giá trị sau VALUES phải
tƣơng ứng 1-1 với nhau.
Ví dụ: PhongBan(MaPB, TenPB, DiaDiem)
INSERT INTO PhongBan(TenPB, MaPB) VALUES(N'Phòng Tài vụ', 'PTV')

- Nếu danh sách giá trị đƣa vào là đầy đủ và tƣơng ứng 1-1 với tất cả
các cột của bảng thì có thể không cần chỉ ra danh sách cột sau tên
bảng.
Ví dụ: PhongBan(MaPB, TenPB, DiaDiem)
INSERT INTO PhongBan VALUES('PTV', N'Phòng Tài vụ', N'P203')
UPDATE <tên bảng>
SET <tên cột 1> = <giá trị 1>, <tên cột 2> = <giá trị 2>, ...
[WHERE <điều kiện>]
Lƣu ý:
- Câu lệnh có tác dụng thay thế giá trị đang có trên các cột bằng giá trị mới.
- Nếu trong câu lệnh có khai báo mệnh đề WHERE thì chỉ những bản ghi thỏa
mãn điều kiện chỉ ra sau mệnh đề WHERE mới chịu tác động của câu lệnh.
- Nếu trong câu lệnh không có mệnh đề WHERE thì tất cả các bản ghi trong
bảng đều bị tác động.
Ví dụ:
UPDATE PhongBan
SET TenPB = N'Phòng Kế hoạch – Tài chính',
DiaDiem = N'P302 - Nhà A6'
WHERE MaPB = 'PTV'
80
DELETE FROM <tên bảng> [WHERE <điều kiện>]
Lƣu ý:
- Câu lệnh có tác dụng xóa bỏ các bản ghi có trong bảng.
- Nếu trong câu lệnh có khai báo mệnh đề WHERE thì chỉ những bản
ghi thỏa mãn điều kiện chỉ ra sau mệnh đề WHERE mới bị xóa.
- Nếu trong câu lệnh không có mệnh đề WHERE thì tất cả các bản ghi
trong bảng đều bị xóa.
Ví dụ:
DELETE FROM NhanVien WHERE ChuyenMon = N'Kỹ sư tin học'

81
5.3. LÀM VIỆC VỚI DỮ LIỆU TRONG BẢNG SỬ DỤNG TÍNH
NĂNG CỦA MANAGEMENT STUDIO

Click chuột phải vào bảng muốn


làm việc → Trên menu popup
chọn mục Edit Top…

82
Xuất hiện vùng nhập liệu để có thể thêm, sửa, xóa cho
các bản ghi trong bảng (giống trên các phần mềm bảng
tính):

Lưu ý: Mặc định vùng nhập liệu chỉ hiện thị số lượng bản
ghi giới hạn (200 bản ghi).

83
 Muốn xóa bản ghi nào thì click chuột phải vào bản ghi đó và chọn Delete
trên menu popup.
 Muốn tải lại dữ liệu để xử lý thì click chuột phải vào ví trí bất kỳ và chọn
Execute SQL trên menu popup
 Muốn hiển thị nhiều hơn 200 bản ghi hoặc muốn tùy biến dữ liệu tải về
trên vùng nhập liệu thì click chuột phải vào vị trí bất kỳ và vào mục Pane
trên menu popup, chọn mục SQL để thay đổi câu lệnh SELECT tải dữ
liệu.

84
6.1. TỔNG QUAN VỀ CÂU LỆNH TRUY VẤN SELECT
1- Chức năng: Đọc dữ liệu từ các bảng và trả về kết quả dƣới dạng tập
hợp các bản ghi (result set).
2- Cú pháp và các thành phần trong câu lệnh truy vấn SELECT

SELECT [DISTINCT] [TOP(N) [PERCENT]] *|<danh sách cột>


FROM <các bảng dữ liệu>
[WHERE <điều kiện>]
[GROUP BY <danh sách cột> [HAVING <điều kiện>]]
[ORDER BY <danh sách cột> [ASC|DESC]]

 Mệnh đề FROM <các bảng dữ liệu>


 Chỉ ra các bảng dữ liệu – nơi nguồn dữ liệu đƣợc lấy về. Các bảng
85 có thể đƣợc kết nối (join) với nhau theo 1 cách thức nào đấy.
 Mệnh đề WHERE <điều kiện>
 Giới hạn các bản ghi đƣợc trả về trong tập kết quả. Chỉ các bản ghi
thỏa mãn <điều kiện> đƣợc chỉ ra sau WHERE mới đƣợc trả về.
 Mệnh đề GROUP BY <danh sách cột>
Chia tập bản ghi lấy về thành các nhóm sao cho:
 Các bản ghi mà có giá trị giống nhau trên các cột trong <danh sách
cột> (chỉ ra sau GROUP BY) sẽ đƣợc xếp vào cùng nhóm.
 Các hàm thống kê (COUNT, SUM, MAX, MIN, AVG) có thể đƣợc áp
dụng để tính toán trên từng nhóm.
 Mỗi bản ghi trong tập kết quả chứa giá trị đại diện cho một nhóm.
 Mệnh đề HAVING <điều kiện>
 Đi kèm với GROUP BY để lọc ra các nhóm thỏa mãn <điều kiện>
cho trƣớc.
86
 Mệnh đề ORDER BY <danh sách cột> [ASC|DESC]
 Sắp xếp các bản ghi kết quả theo trật tự tăng dần (ASC) hay giảm
dần (DESC) của giá trị trên các cột đƣợc chỉ ra trong <danh sách
cột>.
 Mệnh đề SELECT *|<danh sách cột>
 Giới hạn các cột đƣợc phép hiển thị trong tập kết quả. Dùng ký hiệu
dấu * sau SELECT nếu muốn hiển thị tất cả các cột của tập kết quả.
 Từ khóa DISTINCT đƣợc sử dụng kèm khi muốn loại bỏ những bản
ghi trùng lắp trong tập kết quả.
 Từ khóa TOP(N) hoặc TOP(N) PERCENT đƣợc sử dụng khi chỉ muốn
lấy về N bản ghi đầu tiên hoặc N% số bản ghi đầu tiên trong tập kết
quả.
 Có thể dùng từ khóa AS để tạo tên khác (bí danh - alias) cho cột với
87 cú pháp <tên cột> AS <bí danh>.
3- Cách thức thực thi câu lệnh truy vấn SELECT

SELECT [DISTINCT] [TOP(N) [PERCENT] *|<danh sách cột> 6


FROM <các bảng dữ liệu> 1
[WHERE <điều kiện>] 2
[GROUP BY <danh sách cột> 3 [HAVING <điều kiện>]] 4
[ORDER BY <danh sách cột> [ASC|DESC]] 5
 Mệnh đề FROM đƣợc thực thi đầu tiên. Dữ liệu đƣợc đọc ra từ các
bảng và các bản ghi đƣợc kết nối (join) với nhau (nếu cần) để tạo
ra một tập bản ghi trung gian.
 Mệnh đề WHERE (nếu có) đƣợc thực hiện ngay sau đó để loại bỏ
các bản ghi không thỏa mãn điều kiện trong tập bản ghi trung gian.
88
 Mệnh đề GROUP BY (nếu có) đƣợc thực hiện tiếp theo để chia các
bản ghi thành các nhóm sao cho các bản ghi trong cùng nhóm thì
có giá trị trên các thuộc tính gộp nhóm là giống nhau. Tập bản ghi
kết quả của câu lệnh truy vấn lúc này sẽ gồm các bản ghi mà mỗi
bản ghi chứa giá trị đại diện cho 1 nhóm.
 Mệnh đề HAVING (nếu có) đƣợc thực hiện ngay sau đó để loại bỏ
bớt đi những nhóm không thỏa mãn điều kiện.
 Mệnh đề ORDER BY (nếu có) đƣợc thực hiện kế tiếp để sắp xếp tập
bản ghi kết quả theo trật tự tăng dần hay giảm dần của giá trị trong
các cột đƣợc chỉ định.
 Mệnh đề SELECT đƣợc thực thi sau cùng. Chỉ những cột đƣợc chỉ
ra sau SELECT mới xuất hiện trong tập kết quả.

89
6.2. CẤU TRÚC TRUY VẤN CƠ BẢN SELECT … FROM …
SELECT *|<danh sách cột> FROM <các bảng dữ liệu>

Ví dụ: tblHocSinh MaHS TenHS NamSinh Lop Diem


HS001 Nguyễn Vũ Anh 2014 1A1 6
HS002 Trần Vũ Anh 2014 1A1 3
HS003 Lê Trần Minh 2014 1A3 5
HS004 Vũ Thái Hòa 2014 1A3 4
HS005 Trần Bảo Châu 2014 1A2 8
HS006 Lê Thúy Ngân 2014 1A2 9

SELECT MaHS, TenHS, Diem FROM tblHocSinh


MaHS TenHS Diem
Nguồn dữ liệu
HS001 Nguyễn Vũ Anh 6
HS002 Trần Vũ Anh 3
HS003 Lê Trần Minh 5
Tập kết quả:
HS004 Vũ Thái Hòa 4
HS005 Trần Bảo Châu 8
90
HS006 Lê Thúy Ngân 9
Ví dụ: tblHocSinh MaHS TenHS NamSinh Lop Diem
HS001 Nguyễn Vũ Anh 2014 1A1 6
HS002 Trần Vũ Anh 2014 1A1 3
HS003 Lê Trần Minh 2014 1A3 5
HS004 Vũ Thái Hòa 2014 1A3 4
HS005 Trần Bảo Châu 2014 1A2 8
HS006 Lê Thúy Ngân 2014 1A2 9

SELECT * FROM tblHocSinh

MaHS TenHS NamSinh Lop Diem


HS001 Nguyễn Vũ Anh 2014 1A1 6
HS002 Trần Vũ Anh 2014 1A1 3
HS003 Lê Trần Minh 2014 1A3 5
Tập kết quả: HS004 Vũ Thái Hòa 2014 1A3 4
HS005 Trần Bảo Châu 2014 1A2 8
HS006 Lê Thúy Ngân 2014 1A2 9
91
6.3. LỌC CÁC BẢN GHI TRẢ VỀ VỚI MỆNH ĐỀ WHERE
SELECT *|<danh sách cột> FROM <tên bảng> WHERE <điều kiện> ...
Lưu ý: <điều kiện> là biểu thức logic gồm các phép toán so sánh
(<,>,>=,<=,<>,=, BETWEEN, LIKE) kết hợp với các phép toán logic
(AND, OR, NOT)
Ví dụ: Cho bảng dữ liệu HocSinh(MaHS, TenHS, NamSinh, Lop, Diem)
 Liệt kê các thông tin: MaHS, TenHS, Diem của các học sinh lớp 10A5
có điểm trên 8 hoặc dưới 5
SELECT MaHS, TenHS, Diem FROM HocSinh
WHERE ((Diem >= 8) OR (Diem < 5)) AND (Lop = '10A5')
 Liệt kê tất cả thông tin về những học sinh lớp 10A5 và lớp 10A7 có
điểm trong khoảng từ 7 đến 9
SELECT * FROM HocSinh
WHERE (Diem BETWEEN 7 AND 9) AND (Lop = '10A5' OR Lop = '10A7')
92
 Toán tử so sánh mờ LIKE:
 Giúp so sánh xem chuỗi ký tự có khớp với một mẫu (pattern) cho
trƣớc hay không.
 Mẫu so sánh thƣờng chứa các ký tự đại diện (wildcard):
 Ký tự "%": Đại diện cho một đoạn chuỗi ký tự bất kỳ.
 Ký tự "_": Đại diện cho một ký tự bất kỳ.
Ví dụ: Cho bảng dữ liệu HocSinh(MaHS, TenHS, NamSinh, Lop, Diem)
 Liệt kê tất cả thông tin của các học sinh có họ "Nguyễn"
SELECT * FROM HocSinh WHERE TenHS LIKE N'Nguyễn%'
 Liệt kê tất cả thông tin của các học sinh có phần họ và đệm là
"Nguyễn Văn" còn phần tên gồm 3 ký tự kết thúc bằng "n"
SELECT * FROM HocSinh WHERE TenHS LIKE N'Nguyễn Văn _ _n'

93
6.4. TRUY VẤN GỘP NHÓM VÀ TÍNH TOÁN THỐNG KÊ VỚI
MỆNH ĐỀ GROUP BY VÀ HAVING
SELECT *|<danh sách cột> FROM <tên bảng> [WHERE <điều kiện>]
GROUP BY <danh sách cột> [HAVING <điều kiện>]
 Chia dữ liệu lấy về thành các nhóm (group) sao cho các bản ghi trong cùng
nhóm thì sẽ có giá trị trên các cột dùng để gộp nhóm là giống nhau.

 Mỗi bản ghi của kết quả sẽ mang các giá trị đại diện cho một nhóm. Đó có
thể là một số các giá trị của cột gộp nhóm hoặc là kết quả khi áp dụng một
hàm thống kê trên nhóm đó (các hàm thống kê thường được sử dụng kèm
trong mệnh đề SELECT để thực hiện tính toán trên từng nhóm).

 Mệnh đề HAVING giúp lọc ra các nhóm (group) thỏa mãn <điều kiện>

Lưu ý: Chỉ những cột có mặt trong mệnh đề GROUP BY hoặc các hàm thống
kê (tức là những giá trị đại diện cho cả nhóm) mới được phép xuất hiện trong
mệnh đề SELECT và HAVING.
CÁC HÀM THỐNG KÊ THƢỜNG DÙNG:
 COUNT(*): Đếm số bản ghi có trong 1 nhóm.

 COUNT(Ai): Đếm số giá trị tƣơng ứng với cột Ai của các bản ghi trong

nhóm.
 SUM(Ai): Tính tổng các giá trị tƣơng ứng với cột Ai của các bản ghi

trong nhóm.
 MAX(Ai): Tìm giá trị lớn nhất trong số các giá trị tƣơng ứng với cột Ai

của các bản ghi trong nhóm.


 MIN(Ai): Tìm giá trị nhỏ nhất trong số các giá trị tƣơng ứng với cột Ai

của các bản ghi trong nhóm.


 AVG(Ai): Tính giá trị trung bình của các giá trị tƣơng ứng với cột Ai

của các bản ghi trong nhóm.

95
Ví dụ 4.11: Cho bảng dữ liệu:
Inventory(ID, Value, Type)
ID Value Type
Thống kê số lượng và tổng giá trị các đồ vật
1 10 A
2 20 A thuộc về mỗi loại
3 10 B SELECT Type, COUNT(*), SUM(Value)
4 20 B FROM Inventory GROUP BY Type
5 10 A
6 20 C
7 10 C
Type Count(*) SUM(Value)
A 3 40
B 2 30
C 2 30

96
ID Value Type
1 10 A Type COUNT(*) SUM(Value)
ID Value Type 2 20 A A 3 40
1 10 A 5 10 A
2 20 A
3 10 B ID Value Type
Type COUNT(*) SUM(Value)
4 20 B 3 10 B
B 2 30
5 10 A 4 20 B

6 20 C
ID Value Type Type COUNT(*) SUM(Value)
7 10 C
6 20 C C 2 30
7 10 C

Type COUNT(*) SUM(Value)


A 3 40
B 2 30
C 2 30
97
Ví dụ: HocSinh(MaHS, TenHS, NamSinh, Lop, DiemThi)
 Liệt kê số lượng học sinh có trong từng lớp mà có điểm thi từ 5
điểm trở lên
SELECT Lop, COUNT(*) AS SoLuong FROM HocSinh
WHERE DiemThi >= 5.0 GROUP BY Lop
 Liệt kê các lớp có số lượng học sinh trong bảng lớn hơn 30
SELECT Lop, COUNT(*) AS SoLuong FROM HocSinh
GROUP BY Lop HAVING COUNT(*) > 30
 Thống kê điểm số cao nhất và thấp nhất mà học sinh trong mỗi lớp
đạt được
SELECT Lop, MAX(DiemThi) AS CaoNhat, MIN(DiemThi) AS ThapNhat
FROM HocSinh GROUP BY Lop
 Thống kê điểm thi bình quân của học sinh mỗi lớp
SELECT Lop, AVG(DiemThi) AS DiemBinhQuan FROM HocSinh
98 GROUP BY Lop
Ví dụ: MatHang(MaMH, TenMH, LoaiHang, SoLuong, DonGia)
 Thống kê ứng với mỗi loại hàng có bao nhiêu mặt hàng
SELECT LoaiHang, COUNT(*) AS SL_MatHang FROM MatHang
GROUP BY LoaiHang
 Thống kê các mặt hàng số lượng lớn hơn 10
SELECT MaMH, TenMH, SoLuong FROM MatHang
WHERE SoLuong >10
 Thống kê các loại hàng có số lượng mặt hàng lớn hơn 3
SELECT LoaiHang, COUNT(*) AS SL_MatHang FROM MatHang
GROUP BY LoaiHang HAVING COUNT(*) > 3
 Thống kê tổng số sản phẩm ứng với mỗi loại hàng
SELECT LoaiHang, SUM(SoLuong) AS TongSoSP FROM MatHang
GROUP BY LoaiHang

99
 Thống kê giá trị (bằng tiền) ứng với mỗi mặt hàng (lưu ý: chỉ
thống kê các mặt hàng có số lượng trên 10 chiếc). Biết Giá trị =
Số lượng * Đơn giá
SELECT MaMH, TenMH, SoLuong * DonGia AS GiaTri
FROM MatHang WHERE SoLuong > 10
 Thống kê giá trị bằng tiền ứng với mỗi loại hàng (tổng tiền các
mặt hàng thuộc về loại hàng đó)
SELECT LoaiHang, SUM(SoLuong * DonGia) AS GiaTri
FROM MatHang GROUP BY LoaiHang

100
6.5. SẮP XẾP CÁC BẢN GHI KẾT QUẢ VỚI MỆNH ĐỀ
ORDER BY
SELECT *|<danh sách cột> FROM <tên bảng> [WHERE <điều kiện>]
[GROUP BY <danh sách cột> [HAVING <điều kiện>]]
ORDER BY <danh sách cột> [ASC|DESC]
Ví dụ: HocSinh(MaHS, TenHS, NamSinh, Lop, DiemThi)
 Liệt kê các học sinh theo thứ tự giảm dần của điểm thi
SELECT MaHS, Ten HS, DiemThi FROM HocSinh
ORDER BY DiemThi DESC
 Liệt kê các học sinh theo thứ tự lớp tăng dần (10A1, 10A2, 10A3...,
11A1, 11A2, 11A3...)
SELECT * FROM HocSinh ORDER BY Lop
 Liệt kê các học sinh theo thứ tự lớp tăng dần (10A1, 10A2,...), nếu
các học sinh cùng lớp thì xếp giảm dần theo điểm
101
SELECT * FROM HocSinh ORDER BY Lop ASC, DiemThi DESC
6.6. TRUY VẤN DỮ LIỆU TỪ NHIỀU BẢNG
SELECT *|<danh sách cột> FROM <các bảng dữ liệu>
[WHERE ... ] [GROUP BY ... ] [ORDER BY ...]
 Các bảng dữ liệu sau FROM thƣờng đƣợc kết nối với nhau nhờ các
mệnh đề join
a. Mệnh đề INNER JOIN
<bảng 1> INNER JOIN <bảng 2> ON <điều kiện 1-2>
 Trả về 01 tập các bản ghi. Mỗi bản ghi là kết quả của việc kết nối một
bản ghi của <bảng 1> với một bản ghi của <bảng 2> nếu chúng thỏa
mãn <điều kiện 1-2>
 Có thể mở rộng ra cho kết nối nhiều bảng hơn
<bảng 1> INNER JOIN <bảng 2> ON <điều kiện 1-2>
INNER JOIN <bảng 3> ON <điều kiện 1-2-3>...

102 INNER JOIN <bảng n> ON <điều kiện 1-2-..-n>


Ví dụ

HocSinh

Lop

SELECT * FROM Lop INNER JOIN HocSinh ON Lop.MaLop = HocSinh.MaLop

103
b. Các mệnh đề OUTER JOIN
 LEFT OUTER JOIN
<bảng 1> LEFT OUTER JOIN <bảng 2> ON <điều kiện 1-2>
Trả về 01 tập các bản ghi gồm:
 Các bản ghi là kết quả của việc kết nối các bản ghi của <bảng 1>
với các bản ghi của <bảng 2> nếu chúng thỏa mãn <điều kiện 1-2>
(chính là kết quả của INNER JOIN).
 Các bản ghi còn lại của <bảng 1> (mà không thể kết nối đƣợc với
bản ghi nào của <bảng 2>) sau khi đã bổ sung thêm các giá trị
NULL vào vị trí tƣơng ứng với các cột của <bảng 2>.

<bảng 1> <bảng 2>

104
Ví dụ

HocSinh

Lop
SELECT * FROM Lop LEFT OUTER JOIN HocSinh ON Lop.MaLop = HocSinh.MaLop

105
b. Các mệnh đề OUTER JOIN
 RIGHT OUTER JOIN
<bảng 1> RIGHT OUTER JOIN <bảng 2> ON <điều kiện 1-2>
Trả về 01 tập các bản ghi gồm:
 Các bản ghi là kết quả của việc kết nối các bản ghi của <bảng 1>
với các bản ghi của <bảng 2> nếu chúng thỏa mãn <điều kiện 1-2>
(chính là kết quả của INNER JOIN).
 Các bản ghi còn lại của <bảng 2> (mà không thể kết nối đƣợc với
bản ghi nào của <bảng 1>) sau khi đã bổ sung thêm các giá trị
NULL vào vị trí tƣơng ứng với các cột của <bảng 1>.

<bảng 1> <bảng 2>

106
Ví dụ

HocSinh

Lop HocSinh
SELECT * FROM Lop RIGHT OUTER JOIN HocSinh ON Lop.MaLop = HocSinh.MaLop

107
b. Các mệnh đề OUTER JOIN
 FULL OUTER JOIN
<bảng 1> FULL OUTER JOIN <bảng 2> ON <điều kiện 1-2>
Trả về 01 tập các bản ghi gồm:
 Các bản ghi là kết quả của việc kết nối các bản ghi của <bảng 1>
với các bản ghi của <bảng 2> nếu chúng thỏa mãn <điều kiện 1-2>
(chính là kết quả của INNER JOIN).
 Các bản ghi còn lại của <bảng 1> (mà không thể kết nối đƣợc với
bản ghi nào của <bảng 2>) sau khi đã bổ sung thêm các giá trị
NULL vào vị trí tƣơng ứng với các cột của <bảng 2>.
 Các bản ghi còn lại của <bảng 2> (mà không thể kết nối đƣợc với
bản ghi nào của <bảng 1>) sau khi đã bổ sung thêm các giá trị
NULL vào vị trí tƣơng ứng với các cột của <bảng 1>.

<bảng 1> <bảng 2>

108
Ví dụ

HocSinh

HocSinh
Lop
SELECT * FROM Lop FULL OUTER JOIN HocSinh ON Lop.MaLop = HocSinh.MaLop

109
c. Mệnh đề CROSS JOIN
<bảng 1> CROSS JOIN <bảng 2>
 Trả về 01 tập các bản ghi là kết quả của việc kết nối lần lƣợt mỗi
bản ghi của <bảng 1> với từng bản ghi của <bảng 2> (tƣơng tự nhƣ
phép tích Đề Các).
 Có thể mở rộng ra cho kết nối nhiều bảng hơn hoặc phối hợp với
các dạng JOIN khác.
<bảng 1> CROSS JOIN <bảng 2> ... CROSS JOIN <bảng n>

110
Ví dụ

SELECT * FROM Lop CROSS JOIN HocSinh

111
7.1. KHÁI NIỆM VỀ TRUY VẤN CON (SUB-QUERY)
Truy vấn con là một truy vấn được lồng trong một truy vấn
khác. Dạng thức thường gặp nhất của truy vấn con là
được lồng trong mệnh đề WHERE của truy vấn cha.
Ví dụ : Cho các bảng dữ liệu:
PhongKTX(SoPhong, SoGiuong)
SinhVien(MaSV, TenSV, Lop, SoPhong)
Liệt kê các phòng KTX chƣa có sinh viên nào vào ở.
SELECT * FROM PhongKTX
WHERE SoPhong NOT IN (SELECT SoPhong FROM SinhVien)
112
Truy vấn con
7. 2. CÁC DẠNG TRUY VẤN CON CƠ BẢN
Lồng trong mệnh đề WHERE của truy vấn cha sử dụng
kèm theo các lƣợng từ: ALL, ANY, các toán tử: IN, EXIST
kết hợp với phép toán phủ định (NOT) và so sánh
(>,<,>=,<=,=,<>):

WHERE <biểu thức cột> [NOT] IN (<truy vấn con>)

WHERE <biểu thức cột> <phép toán> ANY|ALL (<truy vấn con>)

WHERE [NOT] EXIST (<truy vấn con>)


Ở đây:
ALL: chỉ tất cả các phần tử trong tập kết quả truy vấn con.
ANY: chỉ phần tử nào đấy trong tập kết quả truy vấn con.
EXIST: TRUE khi tập kết quả của truy vấn con tồn tại ít nhất 1 phần từ.
Ví dụ: Cho bảng HocSinh(MaHS, TenHS, Lop, DiemThi)
Hãy liệt kê các học sinh của lớp 10B1 có điểm thi cao hơn tất cả học
sinh của lớp 10B2
SELECT * FROM HocSinh WHERE Lop = „10B1‟ AND
DiemThi >ALL(SELECT DiemThi FROM HocSinh WHERE Lop = „10B2‟)
Hãy liệt kê các học sinh của lớp 10B1 có điểm thi cao hơn ít nhất một
học sinh nào đó của lớp 10B2
SELECT * FROM HocSinh WHERE Lop = „10B1‟ AND
DiemThi >ANY(SELECT DiemThi FROM HocSinh WHERE Lop = „10B2‟)
Hãy liệt kê các học sinh của lớp 10B1 có trùng tên với ít nhất một học
sinh nào đó của lớp 10B2
SELECT * FROM HocSinh WHERE Lop = „10B1‟ AND
TenHS IN (SELECT TenHS FROM HocSinh WHERE Lop = „10B2‟)
8.1. KHÁI NIỆM VỀ KHUNG NHÌN (VIEW)
 Khung nhìn (view) là một dạng bảng dữ liệu ảo phục vụ
truy xuất dữ liệu của ngƣời dùng.
 Khi cần truy xuất dữ liệu, ngƣời dùng chỉ đƣợc cấp
quyền truy xuất vào view thay vì truy xuất trực tiếp vào
các bảng dữ liệu thật. Điều này giúp che dấu đi cấu trúc
lƣu trữ thật sự của các bảng dữ liệu.
 Cấu trúc của view đƣợc xác định thông qua một câu
lệnh truy vấn SELECT định nghĩa view.
 Bản thân view vì là bảng ảo nên nó không thực sự lƣu
trữ dữ liệu. Dữ liệu của view đƣợc lấy về từ các bảng
thật mỗi khi cần thông qua câu lệnh truy vấn định nghĩa
115
view.
Cơ sở dữ liệu

Người dùng

116
Phạm vi
người
dùng
không
được
phép truy
xuất

Dữ liệu thực

Phạm vi
người
dùng
được
phép truy
xuất
Khung nhìn
(view)

Người dùng
117
8.2. LÀM VIỆC VỚI KHUNG NHÌN (VIEW)

1- TẠO VIEW
CREATE VIEW <Tên View>[(<Danh sách cột>)]
AS
<Câu lệnh truy vấn SELECT định nghĩa view>

Ví dụ 1: Cho 02 bảng dữ liệu:


Lop(MaLop, TenLop, PhongHoc)
HocSinh(MaHS, TenHS, DiemThi, MaLop)
Tạo view gồm 3 cột HoTen, Lop, Phong lấy dữ liệu từ 02 bảng:
CREATE VIEW vwHocSinh(HoTen, Lop, Phong)
AS
SELECT TenHS, TenLop, PhongHoc FROM Lop INNER JOIN HocSinh ON
Lop.MaLop = HocSinh.MaLop

118
2- SỬA MỘT VIEW ĐÃ CÓ
ALTER VIEW <Tên View>[(<Danh sách cột mới>)]
AS
<Câu lệnh truy vấn SELECT mới định nghĩa view>

Ví dụ 2: Sửa lại view vwHocSinh thành 04 cột (thêm cột Diem) và chỉ
chứa thông tin về học sinh của lớp 10A1 và lớp 10A2:
ALTER VIEW vwHocSinh(HoTen, Lop, Phong, Diem)
AS
SELECT TenHS, TenLop, PhongHoc, DiemThi FROM Lop INNER JOIN HocSinh
ON Lop.MaLop = HocSinh.MaLop WHERE TenLop = „10A1‟ OR TenLop = „10A2‟

3- XOÁ VIEW
DROP VIEW <Tên View>
Ví dụ 3: Xoá view vwHocSinh
DROP VIEW vwHocSinh
119
4- TRUY VẤN DỮ LIỆU TRÊN VIEW
Truy vấn dữ liệu từ view giống nhƣ truy vấn dữ liệu từ một
bảng dữ liệu thông thƣờng.

Ví dụ 4: Liệt kê các học sinh học ở lớp 10A2 có điểm thi


trên 5 (dữ liệu lấy từ vwHocSinh):
SELECT * FROM vwHocSinh WHERE Lop = „10A2‟ AND
Diem >5

120
9.1. CÁC HÀM XỬ LÝ THỜI GIAN
1- Các giá trị thời gian trong SQL Server
- Giá trị kiểu datetime hoặc smalldatetime: Bao gồm cả
thông tin về ngày, tháng, năm, giờ, phút, giây và miligiây. Ví dụ:
'2020-4-25 19:30:05.004'
- Giá trị kiểu date: Chỉ gồm thông tin về ngày, tháng, năm. Ví
dụ: '2020-4-25'
- Giá trị kiểu time: Chỉ gồm thông tin về giờ, phút, giây và
miligiây. Ví dụ: '19:30:05.004'.
121
Chú ý:
- Tùy theo ngữ cảnh mà một giá trị thời gian bất kỳ (VD như
'2020-4-25') sẽ được SQL Server xử lý như là một giá trị
kiểu datetime/smalldatetime hoặc kiểu date hay kiểu time.
- Khi xử lý, nếu giá trị thời gian thiếu vắng thành phần nào
thì chúng tự được hiểu là mang giá trị mặc định. Ví dụ:
1. Giá trị thời gian '2020-4-25' trong kiểu datetime sẽ
được hiểu là: '2020-4-25 00:00:00.000', tức là phần
giờ phút giây nếu không được nhắc gì tới thì được ngầm
định là 00:00:00.000.
2. Giá trị thời gian '19:05:20.005' trong kiểu datetime sẽ
được hiểu là '1900-01-01 19:05:20.005', tức là nếu
phần ngày, tháng, năm không được nhắc gì tới thì sẽ được
hiểu ngầm định là ngày 01/01/1900.
122
2- Các hàm xử lý thời gian cơ bản
1) GETDATE()
- Hàm không có tham số.
- Chức năng: Trả về một giá trị kiểu datetime là thời gian hiện thời
của hệ thống.
2) YEAR(<datevalue>)
- <datevalue>: Giá trị kiểu date/datetime/smalldatetime/time.
- Chức năng: Trả về giá trị số nguyên của năm tương ứng
- Ví dụ: YEAR('2021-5-12')trả về giá trị 2021.
3) MONTH(<datevalue>)
- <datevalue>: Giá trị kiểu date/datetime/smalldatetime/time.
- Chức năng: Trả về giá trị số nguyên của tháng tương ứng.
- Ví dụ: MONTH('2021-5-12 23:05:26') trả về giá trị 5.
4) DAY(<datevalue>)
- <datevalue>: Giá trị kiểu date/datetime/smalldatetime/time.
- Chức năng: Trả về giá trị số nguyên của ngày tương ứng.
123
- Ví dụ: DAY('2021-5-12') trả về giá trị 12.
5) DATEPART(<part_code>,<datevalue>)
- <datevalue>: Giá trị kiểu date/datetime/smalldatetime/time.
- Chức năng: Trả về giá trị số nguyên biểu diễn thành phần tương ứng của
chuỗi giá trị thời gian do <part_code> quy định:
Year YY
Quarter QQ
Month MM
DayOfYear DY
Day DD
WeekDay DW
Week WW
Hour HH
Minute Mi
Second SS
Milisecond MS
Ví dụ: DATEPART(QQ,'2021-5-12') trả về giá trị 2 (quý 2).
124
6) DATENAME(<part_code>,<datevalue>)
- <datevalue>: Giá trị kiểu date/datetime/smalldatetime/time.
- Chức năng: Trả về chuỗi ký tự biểu diễn thành phần tương ứng của
chuỗi giá trị thời gian do <part_code> quy định:
Year YYYY
Quarter QQ
Month MM
DayOfYear DY
Day DD
WeekDay DW
Week WW
Hour HH
Minute Mi
Second SS
Milisecond MS
Ví dụ: DATENAME(MM,'2021-9-12') trả về giá trị 'September'.
125 DATEPART(MM,'2021-9-12') trả về giá trị số nguyên là 9.
7) DATEDIFF(<part_code>,<startdate>,<enddate>)
- <stardate>, <enddate>: Giá trị kiểu date/datetime/smalldatetime/time.
- Chức năng: Trả về khoảng thời gian bắt đầu từ <startdate> và kết thúc
bởi <enddate> với đơn vị tính được quy định bởi <part_code>:
Year YYYY
Quarter QQ
Month MM
DayOfYear DY
Day DD
WeekDay DW
Week WW
Hour HH
Minute Mi
Second SS
Milisecond MS
Ví dụ: DATEDIFF(DD,'2021-5-12','2021-7-30')trả về giá trị 79 (ngày)
126
8) DATEADD(<part_code>,<n>,<datevalue>)
- <datevalue>: Giá trị kiểu date/datetime/smalldatetime/time.
- <n>: Giá trị số nguyên.
- Chức năng: Trả về giá trị thời gian kiểu datetime được xác định bằng
<datevalue> cộng thêm 1 khoảng thời gian có độ dài <n>. Đơn vị của độ
dài thời gian cộng thêm được quy định bởi <part_code>:
Year YYYY
Quarter QQ
Month MM
DayOfYear DY
Day DD
WeekDay DW
Week WW
Hour HH
Minute Mi
Second SS
Milisecond MS
Ví dụ: DATEADD(DD,25,'2021-5-12')trả về giá trị:
127 '2021-06-06 00:00:00.000'
9.2. CÁC HÀM XỬ LÝ CHUỖI KÝ TỰ
1- LEN(<chuỗi>): Trả về chiều dài chuỗi ký tự.
Ví dụ: LEN('ABCDE') trả về giá trị bằng 5
2- LEFT(<chuỗi>, <n>): Trả về chuỗi con gồm n ký tự đƣợc cắt
ra từ bên trái chuỗi ban đầu.
Ví dụ: LEFT('ABCDE',3) trả về chuỗi con 'ABC'.
3- RIGHT(<chuỗi>, <n>): Trả về chuỗi con gồm n ký tự đƣợc cắt
ra từ bên phải chuỗi ban đầu.
Ví dụ: RIGHT('ABCDE',2) trả về chuỗi con 'DE'.
4- LTRIM(<chuỗi>): Cắt các ký tự cách trống ở đầu bên trái
chuỗi nếu có.
Ví dụ: LTRIM(' ABC ') trả về chuỗi 'ABC '.
5- RTRIM(<chuỗi>): Cắt các ký tự cách trống ở đầu bên phải
chuỗi nếu có.
Ví dụ: LTRIM(' ABC ') trả về chuỗi ' ABC'.
128
6- UPPER(<chuỗi>): Chuyển toàn bộ các ký tự thành chữ hoa.
Ví dụ: UPPER('AbcDe') trả về chuỗi 'ABCDE'
7- LOWER(<chuỗi>): Chuyển toàn bộ các ký tự thành chữ
thƣờng.
Ví dụ: LOWER('ABcDe') trả về chuỗi 'abcde'.
8- SUBSTRING(<chuỗi>,<start>,<n>): Trả về chuỗi con gồm n ký
tự đƣợc cắt ra từ chuỗi ban đầu, bắt đầu từ vị trí <start>.
Ví dụ: SUBSTRING('ABCDE',2,3) trả về chuỗi con 'BCD'.
9- STUFF(<chuỗi 1>,<start>,<n>,<chuỗi 2>): Xóa n ký tự trong
<chuỗi 1> bắt đầu từ vị trí <start> sau đó chèn <chuỗi 2> vào vị
trí vừa xóa.
Ví dụ: STUFF('ABCDEFG',2,3,'12345') trả về chuỗi
'A12345EFG.
10- REPLICATE(<chuỗi>,<n>): Tạo ra chuỗi mới bằng cách lặp
lại chuỗi đã cho n lần
129
Ví dụ: REPLICATE('ABC',3) trả về chuỗi 'ABCABCABC'.
10- REPLACE(<chuỗi1>,<mẫu>,<chuỗi2>): Thay thế các chuỗi
ký tự <mẫu> xuất hiện trong <chuỗi1> bằng <chuỗi2>
Ví dụ: REPLACE('ABCEDFGHICEDABCED','CED','101') trả
về chuỗi 'AB101FGHI101AB101'.
11- CHARINDEX(<chuỗi1>,<chuỗi2>[,<start>]): Tìm và trả về vị
trí xuất hiện đầu tiên của <chuỗi1> trong <chuỗi2>. Ví trí bắt
đầu tiến hành tìm kiếm đƣợc xác định bởi tham số <start>.
Nếu tham số <start> không đƣợc chỉ định thì mặc định tìm từ
đầu <chuỗi2>.
Ví dụ: CHARINDEX('101','ABCD101CDE101EF') trả về vị trí
số 5.
9.3. HÀM ÉP KIỂU CAST
CAST(<giá trị cần ép kiểu> AS <kiểu dữ liệu mong muốn>)

130
10.1. KHAI BÁO BIẾN VÀ GÁN GIÁ TRỊ CHO BIẾN
1- Khai báo biến
a. Cú pháp
DECLARE @<Tên biến> AS <Kiểu dữ liệu> [= <Giá trị khởi tạo>]

b. Ví dụ
DECLARE @NgayNhap AS Date;
DECLARE @HoTen AS nvarchar(30) = N'Nguyễn Văn Bình';
DECLARE @a AS int = 3, @b AS bigint = 5;

131
2- Gán giá trị cho biến
a. Cú pháp
- Gán giá trị cho một biến:
SET @<Tên biến> = <Giá trị>;
- Gán giá trị cho nhiều biến cùng lúc:
SELECT @<Tên biến 1> = <Giá trị 1>, @<Tên biến 2> = <Giá trị 2>,…;
- Gán giá trị trả về từ câu lệnh truy vấn cho biến:
SELECT @<Tên biến 1> = <Cột 1>, … , @<Tên biến n> = <Cột n>
FROM … WHERE …
b. Ví dụ
SET @a = 7;
SELECT @a = 6, @NgayNhap = '2017-9-11';
SELECT @HoTen = TenNV FROM NhanVien WHERE MaNV = 'NV001';

132
10.2. SỬ DỤNG CÁC CẤU TRÚC ĐIỀU KHIỂN
1- Định nghĩa khối lệnh
a. Cú pháp
BEGIN
<Các câu lệnh SQL>
END;
b. Chức năng
- Dùng để tập hợp một dãy các lệnh thành một đơn vị xử lý.
- Thường dùng kết hợp với các câu lệnh rẽ nhánh và lặp.

133
2- Câu lệnh rẽ nhánh IF … ELSE …
a. Cú pháp
- Dạng đơn:
IF <Biểu thức điều kiện>
<Khối lệnh 1>
ELSE
<Khối lệnh 2>
- Dạng lồng nhau:
IF <Biểu thức điều kiện 1>
<Khối lệnh 1>
ELSE IF <biểu thức điều kiện 2>
<Khối lệnh 2>

ELSE
<Khối lệnh n>
134
b. Ví dụ: Đọc điểm trung bình của học sinh có mã học sinh là
HS001 từ bảng dữ liệu HocSinh và gán vào biến @DiemTB sau
đó đưa ra xếp loại của học sinh đó.
BEGIN
DECLARE @DiemTB AS decimal(3,1), @MaHS AS varchar(5) = 'HS001';
SELECT @DiemTB = DiemTB FROM HocSinh WHERE MaHS = @MaHS;
IF (@DiemTB >= 9)
PRINT(N'Xếp loại Xuất sắc');
ELSE IF (@DiemTB < 9 AND @DiemTB >= 8)
PRINT(N'Xếp loại Giỏi');
ELSE IF (@DiemTB < 8 AND @DiemTB >= 6.5)
PRINT(N'Xếp loại Khá');
ELSE IF (@DiemTB < 6.5 AND @DiemTB >= 5)
PRINT(N'Xếp loại Trung bình');
ELSE
PRINT(N'Xếp loại Yếu');
END;

135
Q&A

136

You might also like