You are on page 1of 17

ĐỀ CƯƠNG ÔN TẬP MÔN CSDL

Đặng Minh Tuấn


UIT 20522106
TuanDM – HTTT2020

Mục lục
I. NGÔN NGỮ SQL ......................................................................................................................................... 2
1. Giới thiệu............................................................................................................................................... 2
2. Các ngôn ngữ giao tiếp.......................................................................................................................... 2
3. Ngôn ngữ định nghĩa dữ liệu ................................................................................................................ 2
3.1 Lệnh tạo bảng.................................................................................................................................. 2
3.2 Sửa cấu trúc bảng............................................................................................................................ 3
3.3 Lệnh xóa bảng ................................................................................................................................. 4
4. Ngôn ngữ thao tác dữ liệu .................................................................................................................... 4
4.1 Thêm dữ liệu ................................................................................................................................... 4
4.2 Sửa dữ liệu ...................................................................................................................................... 4
4.3 Xóa dữ liệu ...................................................................................................................................... 4
5. Ngôn ngữ truy vấn dữ liệu có cấu trúc ................................................................................................. 4
5.1 Toán tử truy vấn.............................................................................................................................. 4
5.2 Câu truy vấn tổng quát.................................................................................................................... 5
5.3 Truy vấn đơn giản ........................................................................................................................... 5
5.4 Đặt bí danh, sử dụng *, distinct, order by, top ............................................................................... 5
5.5 Phép kết: Inner Join, Left Join, Right Join........................................................................................ 5
5.6 Phép toán tập hợp: Phép hội (UNION), Phép trừ (EXCEPT), Phép giao (INTERSECT). .................... 5
5.7 Gom nhóm dữ liệu – GROUP BY, điều kiện trên nhóm dữ liệu – HAVING ..................................... 5
5.8 Truy vấn lồng ................................................................................................................................... 5
5.9 Phép chia ......................................................................................................................................... 7
5.10 Một số hàm toán học và xử lý chuỗi ký tự, ngày tháng, năm ....................................................... 7
5.11 Dạng với từng A, tìm A, B, C có C cao nhất (nếu không in B thì dùng GROUP BY) ....................... 8
5.12 Dạng với từng A, tìm B có C cao nhất ........................................................................................... 8
II. Ràng buộc toàn vẹn .................................................................................................................................. 9
1. Ràng buộc toàn vẹn .............................................................................................................................. 9
2. Trigger ................................................................................................................................................... 9
III. Khóa và dạng chuẩn ............................................................................................................................... 14
1. Dạng chuẩn 2 ...................................................................................................................................... 14
2. Dạng chuẩn 3 ...................................................................................................................................... 15
3. Dạng chuẩn BCNF ................................................................................................................................ 16

Trang 1 / 16
TuanDM – HTTT2020

ĐỀ CƯƠNG ÔN TẬP CUỐI KỲ


MÔN CƠ SỞ DỮ LIỆU

I. NGÔN NGỮ SQL


1. Giới thiệu
• Là ngôn ngữ chuẩn để truy vấn và thao tác trên CSDL quan hệ
• Là ngôn ngữ phi thủ tục
• Khởi nguồn của SQL là SEQUEL - Structured English Query Language,
năm 1974)
• Các chuẩn SQL
o SQL89
o SQL92 (SQL2)
o SQL99 (SQL3)
2. Các ngôn ngữ giao tiếp
• Ngôn ngữ định nghĩa dữ liệu (Data Definition Language - DDL): cho phép
khai báo cấu trúc bảng, các mối quan hệ và các ràng buộc.
• Ngôn ngữ thao tác dữ liệu (Data Manipulation Language - DML): cho
phép thêm, xóa, sửa dữ liệu.
• Ngôn ngữ truy vấn dữ liệu (Structured Query Language – SQL): cho phép
truy vấn dữ liệu.
• Ngôn ngữ điều khiển dữ liệu (Data Control Language – DCL): khai báo
bảo mật thông tin, cấp quyền và thu hồi quyền khai thác trên cơ sở dữ liệu.
3. Ngôn ngữ định nghĩa dữ liệu
3.1 Lệnh tạo bảng
3.1.1 Cú pháp

CREATE TABLE <tên_bảng>


(
<tên_cột1> <kiểu_dữ_liệu> [not null],
<tên_cột2> <kiểu_dữ_liệu> [not null],

<tên_cộtn> <kiểu_dữ_liệu> [not null],
khai báo khóa chính, khóa ngoại, ràng buộc
)

Trang 2 / 16
TuanDM – HTTT2020

3.1.2 Một số kiểu dữ liệu

3.2 Sửa cấu trúc bảng


3.2.1 Thêm thuộc tính
ALTER TABLE tên_bảng ADD tên_cột kiểu_dữ_liệu
3.2.2 Sửa kiểu dữ liệu thuộc tính
ALTER TABLE tên_bảng ALTER COLUMN tên_cột kiểu_dữ_liệu_mới
3.2.3 Đổi tên thuộc tính
sp_rename 'tên_bảng.tên_cột_cũ', 'tên_cột_mới', 'COLUMN'
3.2.4 Xóa thuộc tính
ALTER TABLE tên_bảng DROP COLUMN tên_cột
3.2.5 Sao chép bảng
INSERT INTO tên_bảng_đích SELECT * FROM tên_bảng_nguồn
3.2.6 Đổi tên bảng
sp_rename 'tên_bảng_cũ', 'tên_bảng_mới'
3.2.6 Thêm ràng buộc toàn vẹn
• Thêm ràng buộc khóa chính:
ALTER TABLE tên_bảng ADD CONSTRAINT tên_ràng_buộc
PRIMARY KEY (thuộc_tính_khóa)

• Thêm ràng buộc khóa ngoại:


ALTER TABLE tên_bảng_01 ADD CONSTRAINT tên_ràng_buộc
FOREIGN KEY (thuộc_tính) REFERENCES tên_bảng_2
(thuộc_tính_khóa)

Trang 3 / 16
TuanDM – HTTT2020

• Thêm ràng buộc check:


ALTER TABLE tên_bảng ADD CONSTRAINT tên_ràng_buộc CHECK
(điều_kiện)

• Thêm ràng buộc Unique:


ALTER TABLE tên_bảng ADD CONSTRAINT tên_ràng_buộc
UNIQUE (thuộc_tính)
3.2.5 Xóa ràng buộc toàn vẹn
ALTER TABLE tên_bảng DROP CONSTRAINT tên_ràng_buộc
Lưu ý: đối với ràng buộc khóa chính, muốn xóa ràng buộc này phải xóa hết các
ràng buộc khóa ngoại tham chiếu tới nó.
3.3 Lệnh xóa bảng
DROP TABLE tên_bảng
Lưu ý: khi muốn xóa một bảng phải xóa tất cả những khóa ngoại tham chiếu tới
bảng đó trước.
4. Ngôn ngữ thao tác dữ liệu
4.1 Thêm dữ liệu
INSERT INTO tên_bảng (cột1,…,cộtn) VALUES (giá_trị_1,…., giá_trị_n)
INSERT INTO tên_bảng VALUES (giá_trị_1, giá_trị_2,…, giá_trị_n)
4.2 Sửa dữ liệu
UPDATE tên_bảng
SET cột_1 = giá_trị_1, cột_2 = giá_trị_2 ….
[WHERE điều_kiện]
4.3 Xóa dữ liệu
DELETE FROM tên_bảng [WHERE điều_kiện]
5. Ngôn ngữ truy vấn dữ liệu có cấu trúc
5.1 Toán tử truy vấn
• Toán tử so sánh: =, >,<,>=,<=,<>
• Toán tử logic: AND, OR, NOT
• Phép toán: +, - ,* , /
• BETWEEN …. AND

Trang 4 / 16
TuanDM – HTTT2020

• IS NULL, IS NOT NULL


• LIKE (_ %)
• IN, NOT IN
• EXISTS , NOT EXISTS
• SOME, ALL
5.2 Câu truy vấn tổng quát
SELECT [DISTINCT] *|tên_cột | hàm
FROM bảng
[WHERE điều_kiện]
[GROUP BY tên_cột]
[HAVING điều_kiện]
[ORDER BY tên_cột ASC | DESC]
5.3 Truy vấn đơn giản
5.4 Đặt bí danh, sử dụng *, distinct, order by, top
5.5 Phép kết: Inner Join, Left Join, Right Join
5.6 Phép toán tập hợp: Phép hội (UNION), Phép trừ (EXCEPT), Phép giao
(INTERSECT).
5.7 Gom nhóm dữ liệu – GROUP BY, điều kiện trên nhóm dữ liệu – HAVING
5.8 Truy vấn lồng
Lượng từ Exists (tồn tại)
WHERE Exists (<Tập hợp| truy vấn con>)
True: nếu tập hợp (truy vấn con) khác rỗng
False: ngược lại
In hoặc Exists

Trang 5 / 16
TuanDM – HTTT2020

In hoặc Not Exists


Lượng từ All
Where <Tên thuộc tính> <Phép so sánh> All (<Tập hợp giá trị | truy vấn
con> )
True: khi một giá trị của thuộc tính thỏa mãn phép so sánh với mọi
phần tử trong tập hợp giá trị (hoặc tập giá trị do truy vấn con trả ra).
False: ngược lại

Trang 6 / 16
TuanDM – HTTT2020

5.9 Phép chia

5.10 Một số hàm toán học và xử lý chuỗi ký tự, ngày tháng, năm
• Hàm toán học:
o Hàm ABS: trả về giá trị tuyệt đối của một số.
ABS(-1234.56)
o Hàm PI() trả về số pi trong toán học.
PI() Kết quả: 3.14159265358979
o Hàm POWER trả về phép tính lũy thừa
POWER(3,2). Kết quả là: 9
o Hàm ROUND trả về số được làm tròn lên
ROUND(123.4567,2) = 123.4600
ROUND(123.4567,-1) = 120.000
o Hàm SQRT trả về kết quả căn bậc hai
SQRT(9) = 3
o Hàm FLOOR trả về số nguyên nhỏ hơn hoặc bằng số được làm tròn:
FLOOR(12.3) = 12

Trang 7 / 16
TuanDM – HTTT2020

o Hàm CEILING trả về số nguyên lớn hơn hoặc bằng giá trị làm tròn:
CEILING (23.45) = 24
• Hàm xử lý chuỗi ký tự:
o Hàm UPPER: trả về chữ in hoa
UPPER ('Hello') = 'HELLO'
o Hàm LOWER: trả về chữ in thường
LOWER ('HEllo') = 'hello'
o Hàm LEN: trả về số ký tự trong chuỗi
LEN ('HEllo') = 5
o Hàm LEFT, RIGHT, SUBSTRING: hàm cắt chuỗi bên trái, phải, giữa
LEFT ('HEllo world', 3) = 'HEl'
RIGHT ('HEllo world', 5) = 'world'
SUBSTRING ('HEllo world', 3, 2) = 'll'
o Hàm LTRIM, RTRIM: loại bỏ khoảng trắng bên trái, bên phải.
• Hàm xử lý ngày tháng năm
o Hàm GETDATE() trả về ngày tháng hiện tại.
o Hàm DAY(date): trả về ngày của tham số date
o Hàm MONTH(date): trả về tháng của tham số date
o Hàm YEAR(date): trả về năm của tham số date
5.11 Dạng với từng A, tìm A, B, C có C cao nhất (nếu không in B thì dùng
GROUP BY)

SELECT HoTen, NgayDK, DATEDIFF(DAY, TuNgay, DenNgay) AS SoNgayGHLauNhat


FROM (NGUOI_BAN nb JOIN PHIEU_DANG_KY pdk ON nb.MANB = pdk.MaNB) JOIN
PHIEU_GIA_HAN pgh ON pdk.MaPDK = pgh.MaPDK
WHERE MAPGH = (SELECT TOP 1 MAPGH
FROM PHIEU_GIA_HAN pgh2 JOIN PHIEU_DANG_KY pdk2 ON pdk2.MaPDK
= pgh2.MaPDK
WHERE pdk2.MANB = nb.MANB
ORDER BY DATEDIFF(DAY, TuNgay, DenNgay) DESC)
----
SELECT HoTen, Max(DATEDIFF(DAY, TuNgay, DenNgay)) AS SoNgayGHLauNhat
FROM (NGUOI_BAN nb JOIN PHIEU_DANG_KY pdk ON nb.MANB = pdk.MaNB) JOIN
PHIEU_GIA_HAN pgh ON pdk.MaPDK = pgh.MaPDK
GROUP BY HoTen

5.12 Dạng với từng A, tìm B có C cao nhất


--27. Trong từng lớp, tìm học viên (mã học viên, họ tên) có số môn đạt điểm
9,10 nhiều nhất.
SELECT MaLop, MaHV, HoTen

Trang 8 / 16
TuanDM – HTTT2020
FROM (SELECT MaLop, hv.MaHV, (Ho+' '+Ten) HoTen, RANK() OVER (PARTITION BY
MaLop ORDER BY COUNT(*) DESC) AS XepHang
FROM HocVien hv JOIN KetQuaThi kqt ON hv.MaHV = kqt.MaHV
WHERE Diem BETWEEN 9 AND 10
GROUP BY MaLop, hv.MaHV, Ho, Ten) AS A
WHERE XepHang = 1

--29. Trong từng học kỳ của từng năm, tìm giáo viên (mã giáo viên, họ tên)
giảng dạy nhiều nhất.
SELECT HocKy, Nam, A.MaGV, HoTen
FROM GiaoVien gv, (SELECT HocKy, Nam, MaGV, RANK() OVER (PARTITION BY HocKy,
Nam ORDER BY COUNT(*) DESC) AS XepHang
FROM GiangDay
GROUP BY HocKy, Nam, MaGV) AS A
WHERE A.MAGV = gv.MaGV AND XepHang = 1
ORDER BY Nam, HocKy
--35. ** Tìm học viên (mã học viên, họ tên) có điểm thi cao nhất trong từng
môn (lấy điểm ở lần thi sau
--cùng).
SELECT MaMH, MaHV, HoTen
FROM (SELECT MaMH, hv.MaHV, (Ho+' '+Ten) HoTen, RANK() OVER (PARTITION BY
MaMH ORDER BY MAX(Diem) DESC) AS XepHang
FROM HocVien hv JOIN KetQuaThi kqt ON hv.MaHV = kqt.MaHV
WHERE LanThi = (SELECT MAX(LanThi)
FROM KetQuaThi
WHERE MaHV = hv.MaHV AND MaMH = kqt.MaMH
GROUP BY MaHV)
GROUP BY MaMH, hv.MaHV, Ho, Ten) AS A
WHERE XepHang = 1

II. Ràng buộc toàn vẹn


1. Ràng buộc toàn vẹn
2. Trigger
• Trigger là một loại stored procedure đặc biệt được thực thi (execute) một
cách tự động khi có một sự kiện thay đổi dữ liệu (data modification) xảy ra
như Update, Insert hoặc Delete.
• Trigger được dùng để đảm bảo tính toàn vẹn dữ liệu (Data Integrity) hoặc
thực hiện các quy tắc nghiệp vụ (business rules) nào đó.
• Khi trigger được thực thi, SQL tự động tạo ra 2 bảng tạm với cùng cấu trúc
với bảng mà trigger được định nghĩa trên đó.
• Bảng INSERTED chứa dữ liệu mới khi thực thi câu lệnh Insert hoặc câu
lệnh Update.

Trang 9 / 16
TuanDM – HTTT2020

• Bảng DELETED chứa dữ liệu bị xoá khi thực thi câu lệnh Delete hoặc chứa
dữ liệu cũ (old) khi thực thi câu lệnh Update.
• Hai bảng này chỉ tồn tại trong thời gian trigger xử lý và cục bộ cho mỗi
trigger.

Hoạt động Bảng INSERTED Bảng DELETED

INSERT dữ liệu mới được insert không có dữ liệu

DELETE không có dữ liệu chứa dữ liệu bị xóa

UPDATE chứa dữ liệu sau khi được cập nhật chứa dữ liệu trước khi cập nhật

• Tạo trigger: cú pháp


CREATE [OR ALTER] TRIGGER Tên_Trigger
ON Tên_Table
AFTER (FOR) | INSTEAD OF INSERT, DELETE, UPDATE
AS
Các _lệnh_của_Trigger
• Có 2 loại triggers: INSTEAD OF và AFTER (FOR).
o INSTEAD OF:
Trigger được gọi thực hiện thay cho thao tác delete/insert/update
tương ứng.
Trigger instead of thường được dùng để xử lý cập nhật trên view.
o AFTER (FOR):
Trigger được gọi thực hiện sau khi thao tác delete/ insert/ update
tương ứng đã được thực hiện thành công.
Có thể quay lui thao tác đã thực hiện bằng lệnh rollback transaction.

Trang 10 / 16
TuanDM – HTTT2020

CREATE TRIGGER nghd_hoadon_insert


ON hoadon
AFTER INSERT
AS
DECLARE @ng_muahang smalldatetime
DECLARE @ng_dangky smalldatetime
SELECT @ng_muahang=nghd, @ng_dangky=ngdk
FROM khachhang, inserted
WHERE khachhang.makh=inserted.makh
IF @ng_muahang< @ng_dangky
BEGIN
rollback transaction
print 'ngay mua hang phai lon hon ngay dang ky'
END
HOẶC:
CREATE TRIGGER nghd_hoadon_insert
ON hoadon
AFTER INSERT
AS
IF (EXISTS (SELECT *
FROM inserted i JOIN khachhang kh ON
i.makh=kh.makh
WHERE i.nghd<kh.ngdk))
BEGIN
rollback transaction
print 'ngay mua hang phai lon hon ngay dang ky'

Trang 11 / 16
TuanDM – HTTT2020

END
-----
CREATE TRIGGER nghd_hoadon_update
ON hoadon
AFTER UPDATE
AS
IF (UPDATE (makh) OR UPDATE (nghd))
BEGIN
DECLARE @ng_muahang smalldatetime
DECLARE @ng_dangky smalldatetime
SELECT @ng_muahang=nghd, @ng_dangky=ngdk
FROM khachhang, inserted
WHERE khachhang.makh=inserted.makh
IF @ng_muahang< @ng_dangky
BEGIN
rollback transaction
print 'ngay mua hang phai lon hon ngay dang ky'
END
END
HOẶC:
CREATE TRIGGER nghd_hoadon_update
ON hoadon
AFTER UPDATE
AS
IF (UPDATE (makh) OR UPDATE (nghd)
BEGIN
IF (EXISTS (SELECT *
FROM inserted i JOIN khachhang kh ON
i.makh=kh.makh
WHERE i.nghd<kh.ngdk))
BEGIN
rollback transaction
print 'ngay mua hang phai lon hon ngay dang ky'
END
END

Trang 12 / 16
TuanDM – HTTT2020
----------

CREATE TRIGGER cthd_hd_delete


ON cthd
FOR DELETE
AS
DECLARE @sl int
SELECT @sl=count(SoHD) FROM cthd
WHERE SoHD IN (SELECT SoHD
FROM deleted)
IF @sl<1
BEGIN
DELETE FROM hoadon WHERE SoHD IN (SELECT SoHD
FROM deleted)
PRINT('da xoa het cthd cua 1 HD, nen phai xoa luon HD do trong
table HD')
END
ELSE
PRINT 'da delete thanh cong'

CREATE TRIGGER hd_sp_cthd_update


ON hoadon
FOR UPDATE
AS
IF UPDATE(trigia)
BEGIN
DECLARE @trigia money
DECLARE @tg money
SELECT @trigia=trigia FROM inserted
SELECT @tg=SUM(sl*gia) FROM cthd INNER JOIN sanpham
ON sanpham.masp=cthd.masp
WHERE SoHD IN (SELECT SoHD FROM inserted)
IF(@trigia<>@tg)
BEGIN
rollback tran
print 'trigia phai bang tong SL*Gia cua SP'
END
END
Trang 13 / 16
TuanDM – HTTT2020

III. Khóa và dạng chuẩn


1. Dạng chuẩn 2

Nhận xét:
Nếu tất cả các khóa K của Q chỉ có một thuộc tính thì Q đạt dạng chuẩn 2.
Nếu Q không có thuộc tính không khóa thì Q đạt dạng chuẩn 2.
Còn xuất hiện sự trùng lắp dữ liệu -> Cần có dạng chuẩn cao hơn
Ví dụ 1:
Cho Q (ABCD), F={A→B, B→DC}
Q có đạt dạng chuẩn 2 không?
Giải:
N=A
(A)+ = ABCD = Q+
=> Khóa là A.
Ta có: Các thuộc tính không khóa B, C, D phụ thuộc đầy đủ vào khóa nên Q đạt
dạng chuẩn 2.
Ví dụ 2:
Cho Q(ABCD), F={AB → D, C → D}
Khóa: ABC
Q có đạt dạng chuẩn 2 không?
Giải:
Thuộc tính khóa: A, B, C. Thuộc tính không khóa: D.
Tập con thực sự của khóa: A, B, C.
Ta có: (C)+ = CD, chứa thuộc tính không khóa D.
=> D phụ thuộc riêng phần vào khóa => Không đạt dạng chuẩn 2.
Ví dụ 3:
Cho Q(ABCD), F={AB→C, C→D}
Khóa AB
Q có đạt dạng chuẩn 2 không?
Giải:
Thuộc tính khóa: A, B. Thuộc tính không khóa: C, D.
Tập con thực sự của khóa: A, B.
(A)+ = A, không chứa thuộc tính không khóa.
(B)+ = B, không chứa thuộc tính không khóa.

Trang 14 / 16
TuanDM – HTTT2020

=> Các thuộc tính không khóa phụ thuộc đầy đủ vào khóa
=> Q đạt dạng chuẩn 2.
2. Dạng chuẩn 3

Định nghĩa 1:
Lược đồ Q ở dạng chuẩn 3 nếu mọi phụ thuộc hàm X → A ∈ F , với A ∉ X đều có:
(1) X là siêu khóa, hoặc
(2) A là thuộc tính khóa
Định nghĩa 2:
Lược đồ Q ở dạng chuẩn 3 nếu:
Q đạt dạng chuẩn 2
Không tồn tại thuộc tính không khóa nào phụ thuộc bắc cầu vào khóa
Ví dụ 1:
Cho Q(ABCD), F={AB→C, C→BD}
Khóa là: AB, AC
Hỏi: Q có đạt dạng chuẩn 3 không?
Giải:
Xét phụ thuộc hàm C → BD
có C không phải là siêu khóa và BD không phải là thuộc tính khóa.
=> Q không đạt dạng chuẩn 3.
Ví dụ 2:
Cho Q(ABCD), F={AB→C, C→D}
Khóa AB
Hỏi: Q đạt dạng chuẩn 3 hay dạng chuẩn 2?
Giải:
Xét phụ thuộc hàm C → D
có C không phải là siêu khóa và D không phải là thuộc tính khóa.
=> Q không đạt dạng chuẩn 3.
Tập con thực sự của khóa: A, B.
(A)+ = A, không chứa các thuộc tính không khóa.
(B)+ = B, không chứa các thuộc tính không khóa.
=> Các thuộc tính không khóa phụ thuộc đầy đủ vào khóa
=> Q đạt dạng chuẩn 2.
Ví dụ 3:
Q(ABC), F={AB→C, C→B}
Khóa là AB, AC

Trang 15 / 16
TuanDM – HTTT2020

Q có đạt dạng chuẩn 3 không?


Giải:
Xét phụ thuộc hàm AB→C
có AB là siêu khóa.
Xét phụ thuộc hàm C→B
có B là thuộc tính khóa
=> Q đạt dạng chuẩn 3.
(Hoặc tất cả A, B, C đều là thuộc tính khóa => Q đạt dạng chuẩn 3).

Q(A,B,C,D)
F= (AB → CD, C → B)
Khóa là AB, AC
Q có đạt dạng chuẩn 3 không?
Giải:
Xét phụ thuộc hàm AB→CD
có AB là khóa
Xét phụ thuộc hàm C→B
có B là thuộc tính khóa.
=> Q đạt dạng chuẩn 3.
3. Dạng chuẩn BCNF

Cho Q (ABCDEI)
F={ACD → EBI, CE → AD}
Q có đạt dạng chuẩn BCNF không?
Giải:
N = C; (C)+ khác Q+
TG: ADE
CTG: A, D, E, AD, AE, DE, ADE
N Xi N U Xi (N U Xi)+
C A CA CA
C D CD CD
C E CE CEADBI = Q+ Khóa là CE. Loại CTG có chứa E: AE, DE, ADE.
C AD ADC ADCEBI = Q+ Khóa là ADC.
Xét phụ thuộc hàm ACD → EBI có ACD là khóa.
Xét phụ thuộc hàm CE → AD có CE là khóa.
=> Q đạt dạng chuẩn BCNF.

Trang 16 / 16

You might also like