Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 40

@Thuộc tính Khóa - Có giá trị duy nhất:

- Khóa là thuộc tính hoặc tập thuộc tính mà giá trị của khóa dùng để phân biệt
các thực thể với nhau.
- Thuộc tính của khóa của tập thực thể:
+ Phải có giá trị khác NULL
+ Xác định duy nhất cho từng thực thể
- Tập thực thể có thể có:
+ 1 khóa chính → trong thực hành thì chỉ chọn 1 thuộc tính làm khóa
chính, những thuộc tính còn lại cũng mang tính chất duy nhất thì ta sẽ
áp cho nó một cái ràng buộc khác, gọi là khóa duy nhất.
+ Khóa mà chúng ta nói chung chung, đó là khóa chính (Primary key),

- Có hai loại khóa: Khóa chính - Primary Key (trong 1 quan hệ thì chỉ có duy
nhất 1 khóa chính, khác NULL), Khóa duy nhất (vẫn chấp nhận giá trị
NULL)

- Trường hợp khác: Khóa duy nhất là phải có số liệu, để khác NULL là người ta
không nhập thì bài toán sẽ bị sai. Trong trường hợp đó sẽ chỉ định khóa chính
thứ 2 bằng cách chọn khóa duy nhất và cho giá trị của nó là NOT NULL, gọi
nó là khóa tương đương.

@Mối kết hợp và loại mối kết hợp


- Mối kết hợp (relationship): liên hệ với hai hay nhiều thực thể khác nhau
mang một ý nghĩa nào đó
+ Cấp mối kết hợp (relationship degree)
1. Liên kết giữa hai thực thể gọi là liên kết 2 (mối kết hợp cấp 2)
2. Liên kết giữa ba thực thể gọi là liên kết 3, liên kết 3 có thể bẻ thành hai
liên kết 2 thì ưu tiên liên kết 2 → Vậy thì khi nào bẻ được?, dựa vào yêu
cầu của bài toán
+ Có nhiều hơn một loại mối kết hợp có thể trong cùng loại thực thể
+ Bảng số
+ 1:1
+ 1:n

+ n:n (n:m)

→ Một nhân viên có thể làm việc ở nhiều phòng ban nhưng tại 1 thời điểm chỉ
làm việc ở 1 phòng ban và một phòng ban có thể có nhiều nhân viên
- Loại mối kết hợp (relationship type): các thực thể được nhóm lại hay phân
loại thành một loại mối kết hợp.

@Các bước thiết kế ER


1. Xác định các loại thực thể và thuộc tính khóa
2. Xác định loại mối kết hợp
3. Xác định và gắn thuộc tính với loại thực thể và loại mối kết hợp
4. Quyết định miền giá trị của thuộc tính
5. Gắn (tinh chế) cardinalty ratio(s) vào loại mối kết hợp
6. Thiết kế phân cấp chuyên biệt hóa/ tổng quát hóa (specialization/
generalization) trong các ràng buộc

@Các ký hiệu của mô hình ER


- Derived attribute: thuộc tính dẫn xuất, phải có sự tính toán
- Thuộc tính gạch chân là khóa
- Thuộc tính đa trị thì có là có 2 vòng tròn

*Ví Dụ*
Một siêu thị có nhiều nhân viên. Thông tin về nhân viên: MaNV, TenNV, Luong. Mỗi
nhân viên làm việc ở 1 bộ phận, 1 bộ phận có thể có nhiều nhân viên. Thông tin về
bộ phận: MaBP và tenBP. Trong các nhân viên có người làm quản lý, một người chỉ
quản lý tối đa 1 bộ phận và 1 bộ phận chỉ có 1 người quản lý.
1. Xác định thực thể
NHANVIEN (MANV, HO, TEN, LUONG)
BOPHAN (MABP, TENBP)
NGUOIQUANLY (MANVQL)
MATHANG (MAH, TENMH)
NHACC(MANCC, TENCC, DIACHI)
KHACHHANG (MAKH, TENKH, DIACHI)
DONDATHANG (SOHIEU, NGAY)

2. Mô hình ER
@Các trường hợp liên kết đặc biệt
- Mối liên kết 3: có 2 trường hợp 1-n-n và n-n-n
→ Liên kết 3 thực thể với nhau
*Ví dụ*
1. Liên kết 3: 1-n-n
Thiết kế ERD: Giảng viên X hướng dẫn môn học Y cho lớp Z
Đặt câu hỏi: Dựa vào thực tế để xây dựng mối quan hệ
Biết GV, Lop, MH thì có biết được duy nhất 1 môn học hay không?
GV dạy lớp đó là 1 môn hay nhiều môn?
Một GV với một MH thì có dạy cho nhiều lớp không?
Một LOP với một MH thì có tối đa bao nhiêu người dạy?

HUONGDAN (MAGV, MALOP, MAMH) 1:n:n

- Liên kết giữa thực thể với 1 mối liên kết


*Ví dụ*
Một lớp được sắp lịch thi 1 môn học tại 1 phòng thi theo 1 ca, 1 ngày thi sẽ có
4 ca, 1 phòng thi có thể sắp cho nhiều lớp thi ở những ca khác nhau:
Yêu cầu: Viết SQL trả lời câu hỏi sau:
1. Lịch thi của lớp có mã lớp @X (MAPH PHONGTHI NGAYTHI CA)
2. Lịch sắp phòng thi của phòng có mã phòng @Y (MALOP MAPH NGAY
CA)
Chỗ khóa chính của LICHTHI đáng lẽ là bê nguyên cái SOPH NGTH MACA
xuống nhưng mà nhiều quá không hay, nên sẽ tạo ra một cái khóa tương
đương với các thuộc tính đó là IDCA.

@Chuyển ERD sang bảng (Table) 1 thực thể trở thành 1 quan hệ thực
thể
1. Mối liên kết 1-1: quan hệ này sẽ chứa khóa chính của quan hệ kia và
ngược lại;
2. Mối liên kết 1-n: quan hệ đầu nhiều sẽ chứa khóa chính của quan
hệ đầu 1.
3. Mối liên kết n-n: sẽ có thêm quan hệ mới với các thuộc tính là khóa
chính ở các thực thể và các thuộc tính riêng của nó. Khóa chính của
quan hệ mới này sẽ là khóa tổ hợp (Khóa chính của các thực thể đầu
nhiều), có thể có thêm thuộc tính riêng trong khóa.

@Phụ thuộc hàm


Cho R là 1 quan hệ, U là tập thuộc tính, r là một thể hiện của thể hiện R, r
tập con của R
- X → Y là phụ thuộc hàm trên quan hệ R, nếu ta tùy ý chọn 2 bộ bất kỳ thuộc r, nếu
giá trị vế trái giống nhau thì vế phải giống nhau => Phụ thuộc hàm

Ví dụ:
MaNV → HoTen: là PTH, không vi phạm
HoTen → MaNV: không phải PTH vì có thể trùng tên

- Vế trái là thuộc tính ít nhất để suy ra vế phải → PTH đầy đủ


→ Nếu X → Y là PTH đầy đủ thì X sẽ là khóa chính
→ Vì vậy nếu X là khóa chính thì các PTH xuất phát từ đây cũng là PTH đầy
đủ
- Nếu tập con của vế trái suy ra được vế phải → PTH không đầy đủ

Ví dụ:
1. MaNCC → MaMH: không phải PTH
2. SOHIEU → MaKH: PTH đầy đủ
3. MaMH → GIA: không phải PTH, vì phải có thêm MaNCC
4. SOHIEU → GIA: không phải PTH

@Xác định một khóa

Ví dụ: Cho Q(A B C D E H)


F = {AB → C, CD → E, EC → A, CD → H, H → B}
Tìm 1 khóa của Q.

Bài làm
B1: Nút gốc = {vế trái} - {vế phải} + {các thuộc tính không xuất hiện}
={A B C D E H} - {C E A H B}
={ D }
Gọi X = { D }

B2: Ta thấy chỉ mình D thì không suy ra được nên ta bắt đầu tìm thêm 1
thuộc tính nữa. Ta đếm xem thuộc tính nào xuất hiện nhiều trong vế trái, thì
ta thấy đó là thuộc tính C. Vậy suy ra ta có { C D } là khóa

@Xác định tất cả khóa chính

Ví dụ: Q( A B C D E G)
F = { f1: AE → C, f2: CG → A, f3: BD → G, f4: GA →
E}
Xác định tất cả khóa của Q
B1:
Tập gốc: N = { A B C D E G } - { C A G E }
={BD}
Tập trung gian: L = Q \ N = { A C E G }

ACEG L X=N◡L Tập con


@Phủ tối thiểu của tập phụ thuộc hàm
- Tập phụ thuộc hàm bé nhất, nhưng đủ suy ra mọi phụ thuộc hàm còn lại có
trong quan hệ
- Ta nói F tương đương G, kí hiệu là F ≡ G nếu F |= G và G |= F
Cho tập phụ thuộc hàm F. Xét tập phụ thuộc hàm G nếu G |= F ta nói G là
một phủ của F ( và ngược lại)

Ví dụ:
F = { A → B, B → C, A → C, AB → C, B → BC }
G = { A → B, B → C }
Ta thấy F ≡ G tuy nhiên ta cần nói G là 1 phủ của F theo nghĩa là G tốt hơn F
vì ít phụ thuộc hàm hơn.

Ví dụ: Cho tập phụ thuộc hàm F


F = { AB → C, C → A, BC → D, ACD → B, D → EG, BE → C, CG →
BD, CE → AG}
Tìm phủ tối thiểu của F?

Thực hiện giải thuật trên ta có:

G = { AB → C,
C → A,
BC → D,
ACD → B,
D → E,
D → G,
BE → C,
CG → B,
CG → D,
CE → A,
CE → G}

→ Loại CE → A, vì CE là PTH không đầy đủ (C → A)


→ ACD → B, vì [D → G, CG → B] có cụm CD → B. PTH không đầy đủ
→ Loại CD → B, CG → D vì có thể suy ra được từ các PTH còn lại

@Dạng chuẩn
- Mục đích: Thiết kế cơ sở dữ liệu sao cho đạt tối thiểu Dạng chuẩn 3 để đảm
bảo không dư thừa dữ liệu.
a) Dạng chuẩn 1: 1NF (Normal Form): Một quan hệ R được xem là ở dạng
chuẩn 1 nếu và chỉ nếu tất cả các thuộc tính trong R đều chứa các giá
trị nguyên tố (giá trị không tách ra được nữa)

Ví dụ
SV (MASV, HOTEN, NGAYSINH, MALOP) → Vi phạm DC1 vì HOTEN
KHACHHANG(MAKH, HOTEN, SDT, DIACHI) → Đạt DC1, vì trong thực tế
không ai sắp xếp HOTEN của khách hàng

Ví dụ
Trong đề tài thống kê dân số thì PERSON vi phạm dạng chuẩn 1, vì trong
công tác thống kê dân số thì người ta muốn biết cụ thể cái địa chỉ đó, gồm
số nhà, phường, quận, tỉnh)
PERSON(MAP, HO, TEN, SDT, DIACHI)

Ví dụ
BS(MABS, HO, TEN, MAKHOA)
BENHAN(MABENHAN, MABN)
LICHMO(MABENHAN, NGAYGIO, MAPHONG, EKIPMO) → vi phạm DC1
EKIPMO(BS01, BS02, BS02, YT01, YT02)

**Tùy theo trường hợp cụ thể mà có vi phạm hay không

b) Dạng chuẩn 2: Một quan hệ R được xem ở dạng chuẩn 2 nếu và chỉ
nếu R đạt DC1 và các thuộc tính không khóa phụ thuộc hàm đầy đủ
vào khóa chính

Ví dụ
Xét quan hệ R(S#, P#, City, Status, Qty)
Các PTH: S# → City, Status (này là PTH không đầy đủ, từ tập con của
khóa chính suy ra được thuộc tính khác)
City → Status
S#, P# → R
→ Vi phạm DC2. Vì ta nhận thấy rằng tồn tại PTH: S# → City, Status. Do
City và Status là 2 thuộc tính không khóa, không PTH đầy đủ vào khóa
chính là (S#, P#). Vì vậy, R(S#, P#, City, Status, Qty) chưa đạt DC2.

Để R đạt DC2, ta tách R ra thành 2 quan hệ con R1( S#, P#, Qty) và R2(
S#, City, Status)
R1 là lấy R trừ cho các thuộc tính bên vế phải là (City, Status) là còn
R1( S#, P#, Qty)
R2 gồm những PTH gây ra vi phạm

c) Dạng chuẩn 3
Tuy nhiên sau khi tách thì lược đồ quan hệ R1. R2 vẫn còn có nhược điểm:
- Không thể thêm 1 thành phố (R2) mới nếu chưa có người cung cấp (S#)
- Tốn thời gian khi sửa dữ liệu, ví dụ như sửa Status của London thành 15
- Một quan hệ R được xem ở dạng chuẩn 3 nếu và chỉ nếu R đạt DC2 và các
thuộc tính không khóa không phụ thuộc hàm bắc cầu vào khóa chính
Trong PTH, các thuộc tính không nằm trong khóa chính/ các thuộc tính
nằm trong vế phải của khóa chính mà suy ra lẫn nhau thì chắc chắn là vi
phạm DC3

Ví dụ
Xét quan hệ R2( S#, City, Status) và các PTH:
S# → City, Status
City → Status
Ta nhận thấy rằng trong R2, tồn tại PTH City → Status làm cho Status bị
PTH bắc cầu vào khóa chính alf S#. Vì vậy R2 (S#, City, Status) chưa đạt
DC3.

Ví dụ
Để R2 đạt DC3, ta rách R2 ra thành 2 quan hệ con
+ R2.1(S#, City) → đây là R2 trừ đi vế phải
+ R2.2(City, Status) → Các thuộc tính của PTH khiến quan hệ không đạt
dạng chuẩn

Trong 3NF có thể có nhiều khóa chính chứ không phải 1 khóa chính. Nhưng
khi thể hiện ở múc vật lý thì có 1 khóa chính thôi, các khóa còn lại gọi là khóa
tương đương
d) Boyce-Codd Normal Form (Dạng chuẩn 4)
- Một quan hệ R được xem là ở dạng chuẩn BCNF, nếu tất cả những PTH trên
R thỏa 1 trong 2 điều kiện sau:
- A ∈ X; PTH hiển nhiên
- X là 1 siêu khóa
→ Vế trái của tất cả PTH đều chứa khóa chính là đạt DC4

Nhận xét:
- Thuộc tính khóa chính còn 1 thuộc tính là đạt DC2
(Vi phạm khi một thuộc tính trong khóa chính suy được thuộc tính không
khóa) (Chỉ đúng khi cả cái khóa đó cùng suy ra thuộc tính khác, mấy thuộc
tính không khóa còn lại tự suy ra nhau đều không sao cả)

- Thuộc tính không khóa còn 1 thuộc tính duy nhất là đạt DC3
(Vi phạm khi thuộc tính không thuộc khóa chính suy ra lẫn nhau)
- Vế trái của tất cả PTH đều chứa khóa chính là đạt DC4

Bài tập lý thuyết


1. Hãy cho 1 tập PTH trên lược đồ quan hệ R(A, B, C, D) với khóa
chính là AB sao cho R thuộc 1NF nhưng không thuộc 2NF.
A → C
A → D
B → C
B → D

2. Hãy cho 1 tập PTH trên lược đồ quan hệ R(A, B, C ,D) với khóa
chính AB sao cho R thuộc 2NF nhưng không thuộc 3NF.
A, B → C, D
C → D
D → C

3. Khảo sát lược đồ quan hệ R(A, B, C), R có PTH B → C. Nếu A là 1


khóa trên R, thì R có thuộc BCNF?
→ Không, vì
+ Vi phạm DC3, có thuộc tính khóa suy ra lẫn nhau
+ Để đạt DC4(BCNF) thì vế trái của tất cả PTH phải là khóa chính,
nhưng mà PTH B → C thì B không phải là khóa chính

@Các kiểu dữ liệu của thuộc tính


- Số nguyên
- Số thực

nChar: số lượng kí tự ít biến động: thường sử dụng cho mã


nvarchar: đánh Unicode (sử dụng cho những thuộc tính có sự thay đổi kí tự
lớn): không sử dụng cho thuộc tính mã
nText: ghi chú những đoạn văn lớn (được mặc định là 1GB)

@Các ràng buộc trên database: Thông thường thì có 2 loại ràng buộc
- Ràng buộc cứng: Có thể định nghĩa được ngay trong lòng database
(không cần viết code)
+ Khóa chính: trong một bảng trong SQL thì chỉ set được 1 khóa chính
duy nhất
+ Khóa duy nhất: các khóa tương đương với khóa chính thì ta sẽ set nó
thành UNIQUE
+ Khóa ngoại: thường là cái mã (thường là khóa chính có trước rồi mới
có khóa ngoại)
+ Miền giá trị
+ Not Null
- Ràng buộc mềm: Không thể đặt được ngay trong lòng database (phải
viết code ra)
@Thực hành SQL
- Miền giá trị:
GIOITINH=N’NAM’ OR GIOITINH=N’NỮ’
→ Có chữ N trước thì SQL mới hiểu chúng ta gõ tiếng Việt
LUONG BETWEEN 5000000 AND 5000000
- Có nghĩa là 5000000 <= LUONG <= 50000000
- Mô hình dữ liệu quan hệ: Cái nào mà không phải khóa chính, mà hay lọc hay
truy vấn dữ liệu nhiều thì nên để đầu → tạo chỉ mục (index)

@Mô hình dữ liệu quan hệ và đại số quan hệ: Xử lý, truy vấn, cập nhật dữ
liệu
Để có thể diễn tả các ý truy vấn thì trên CSDL có 2 ngôn ngữ:
- Ngôn ngữ đại số quan hệ: phép toán dưới dạng hình thức, giúp chúng ta
điều khiển quá trình câu lệnh chạy theo bước 1, bước 2, bước 3 → mình hiểu
nhưng máy tính không hiểu
- Ngôn ngữ truy vấn SQL: tất cả các phép toán đều nằm trong câu lệnh →
máy tính chạy theo hướng của nó, mình không điều khiển được
→ Kết hợp hai ngôn ngữ này vào trong câu lệnh truy vấn

@Ngôn ngữ đại số quan hệ


a) Định nghĩa hình thức về quan hệ
- Một quan hệ R trên một tập hợp D1 ,D2 ,.. ., Dn là một tập con của tích
Cartesian ( D1 x D2 x .. .xDn )
→ Một quan hệ là tập hợp các bộ có n thuộc tính (d 1 ,d 2 ,.. ., d n), trong đó d i∈ Di

Ví dụ:
- Cho S1= {0, 1}, S1= {a, b, c}, R là tập con của S1x S2
- Ta có: r(R) = {(0, a), (o,b), (1,c)} là một quan hệ trên S1x S2
- Quan hệ cơ sở (base relational): là quan hệ thực sự được lưu xuống một
tập tin lưu trữ (khác với các quan hệ tạm thời hay khung nhìn)

b) Các thao tác trên CSDL quan hệ


- Có hai loại thao tác
+ Cập nhật dữ liệu (thay đổi dữ liệu)
+ Truy vấn dữ liệu (rút trích dữ liệu)
- Các cách thực hiện:
+ Ngôn ngữ hình thức: Đại số quan hệ - cho phép mô tả các câu truy vấn
dưới dạng chuỗi các phép toán đại số
+ Ngôn ngữ thực sự: SQL - ngôn ngữ thao tác CSDL quan hệ chuẩn

c) Ngôn ngữ truy vấn


- Query Language (QL): ngôn ngữ cho phép user thực hiện và rút trích dữ
liệu từ CSDL.
- QL ≠ PL (ngôn ngữ lập trình)
+ QL không nhằm mục đích dùng cho các ứng dụng phức tạp
+ QL hỗ trợ truy xuất dễ dàng tới các tập tin dữ liệu lớn
- Ngôn ngữ truy vấn (toán học) là cơ sở của các ngôn ngữ thực sự (vd:
SQL,..)
- Hiểu được đại số quan hệ là chìa khóa để hiểu cách xử lý và tối ưu hóa câu
truy vấn
** Đại số quan hệ
- Ngôn ngữ thủ tục
- Bao gồm tập hợp các phép toán được áp dụng trên các thể hiện quan hệ, kết
quả của một câu truy vấn là một thể hiện quan hệ.
- Chuỗi các phép toán đại số quan hệ hình thành nên biểu thức đại số quan hệ
mà kết quả của nó cũng trả về một thể hiện quan hệ

a) Phép chiếu
Cho r(R) ⊂ R, phép chiếu r lên X, ký kiệu là
π x(r) = r[X]={t.X,∀t
∊ r}

Ví dụ: Quan hệ SV(masv, hoten, lop) với tập X = {masv, hoten}


Ta có chiếu SV trên X như sau

- Số lượng các bộ trong một quan hệ kết quả của phép chiếu luôn luôn ít hơn hoặc
bằng số lượng các bộ trong r. Các dòng trùng nhau sẽ được loại bỏ khỏi quan hệ kết
quả.

b) Phép chọn
Cho r(R) và điều kiện p, phép chọn trên r các bộ thỏa điều kiện p, ký hiệu là

σ p(r )= {t ∊ r | p(t)}
r: quan hệ được chọn
p: biểu thức mệnh đề điều kiện
Ví dụ: Quan hệ SV(masv, hoten, lop) với tập p: Lop=TH

Ví dụ:

Cho biết A = B và D >5 →


c) Phép gán
- Làm cho câu lệnh về sau viết đỡ phức tạp hơn
- Gán kết quả tạm vào một bảng tạm
- Bên trái là tên biến, bên phải là phép toán đại số quan hệ ←

d) Phép đổi tên


- Cho phép đặt tên và do đó có thể tham chiếu tới kết quả của biểu thức đại số quan
hệ
- Cho phép tham chiếu tới một quan hệ bằng chiều tên (Ví dụ: Nếu cùng một quan
hệ được dùng hai lần trong một biểu thức đại số quan hệ )
* Đổi tên quan hệ và tên thuộc tính
- Cho một biểu thức đại số quan hệ E có n thuộc tính, biểu thức:

trả về kết quả biểu thức E dưới tên , và với các tên thuộc tính đã được thay đổi
thành A1, A2,.., An
e) Phép kết tự nhiên
Cho r(R) ,s(S) và Q = R ⋂ S, P = R U S, phép kết tự nhiên trên hai quan hệ r
và s, ký hiệu là

r ⊳⊲ s (P) = {t(P) | 彐t 1 ∊ r và 彐t 2∊ s, t.R = t 1 và t.S = t 2


Khi Q = Ø thì phép kết tự nhiên là phép tích Descartes
Khi Q ≠ Ø thì đó là phép kết có điều kiện theo các thuộc tính Q
Ví dụ:
KẾT TỰ NHIÊN
1. Khi thực hiện phép kết tự nhiên, chúng ta sẽ thu được một quan hệ kết quả bao
gồm các bộ có một hay nhiều thuộc tính có giá trị là giá trị chung tương ứng trong
hai bộ thuộc hai quan hệ tham gia.
Ví dụ này cho thấy hai phép kết khác nhau
Chúng ta thực hiện phép kết trên hai quan hệ Paternity và Maternity, ta thấy rằng
hai quan hệ này có chung một thuộc tính là “Child”, phép kết được thực hiện bằng
việc so sánh các giá trị thông qua thuộc tính này.

2. Vậy trong trường hợp hai quan hệ không có chung thuộc tính nào, thì khi đó
phép kết sẽ trở thành phép tích quen thuộc.
Ví dụ phép tích: nhân tất cả các giá trị lại với nhau

3. Một biến thể nữa của phép kết tự nhiên khi đảm bảo sự xuất hiện của tất cả các
bộ của một toán hạng hoặc của cả hai toán hạng trong quan hệ kết quả.
Chúng ta thấy sự tương đồng giữa các phép toán trên với các phép join trong SQL.
Khi thực hiện phép kết trái (left join), toàn bộ các bộ thuộc quan hệ đứng trên trái
phép toán được giữ lại bao gồm cả những bộ không thỏa mãn điều kiện kết. Tương
tự đối với phép kết phải (right join) và phép kết toàn phần (full join)
KẾT THETA (Kết có điều kiện)
Điểm khác nhau giữa phép kết tự nhiên và phép kết theta là phép kết theta chỉ rõ
các thuộc tính trên các quan hệ cùng với các phép toán sẽ được sử dụng để làm
điều kiện kết. Các phép toán có thể sử dụng giữa các thuộc tính đó là =, >, <, >=,
<=,... Trong trường hợp là dấu “=” ta gọi đó là phép kết bằng (equi-join).
f) Kết có điều kiện

Ta thực hiện phép kết SV ⋈ Lop theo điều kiện SV.lop = Lop.malop
Ta có kết quả, ký hiệu là 𝑆𝑉 ⋈SV.𝑙𝑜𝑝=𝐿𝑜𝑝.𝑚𝑎𝑙𝑜𝑝 𝐿𝑜p

g) Kết ngoài
h) Phép chia: r ÷ s

- Thuộc tính là gồm các thuộc tính không có trong quan hệ chia
+ Quan hệ chia là CongViec
+ Vậy sau khi thực hiện phép chia thì ra cái cột nhân NhanVien thôi
- Dòng vừa có sơn xe, vừa có rửa xe

@Tập lệnh xử lý dữ liệu gồm 3 tập lệnh


a) DDL: tạo cấu trúc database, bắt đầu bằng chữ CREATE
Cú pháp: Create Database <tenCSDL>
Cái nào mà hiệu chỉnh thì sử dụng Alter Database <tenCSDL>
Xóa toàn bộ csdl: Drop Database <tenCSDL>

USE QLVT
Create Table QLVT. bdo.Vattu
(MAVT nChar(4) Not Null,
TENVT nVarChar(30) unique Not Null,
DVT nVarChar(15) Default ‘ ‘
Constraint PK_Vattu Primary Key (MAVT))

Create Table QLVT.dbo.NhanVien


(MANV int Primary key,
HO NVarChar(40) Not Null,
TEN NVarChar(10) Not Null,
GioiTinh NVarChar(3) Default ‘Nam’
CHECK(GioiTinh = N‘NAM’ OR GioiTinh = N’NỮ’),
DIACHI NVarChar(50) Default ‘ ‘,
NGAYSINH SmallDateTime,
LUONG Money Default 5000000
CHECK( LUONG >= 5000000 And LUONG <= 20000000),
GHICHU NText)
Create Table QLVT.dbo.CT_PhatSinh
(PHIEU nChar(8) Not Null,
MAVT nChar(4) Not Null,
MAKHO nChar(2) Not Null,
SOLUONG int Not Null CHECK(SOLUONG > 0),
DONGIA money Not Null CHECK(DONGGIA >0),
LYDO nvarchar(30)

Constraint PK_CTPS Primary Key (PHIEU, MAVT)


Constraint FK_CTPS_PS Foreign Key (PHIEU)
references dbo.PHATSINH(PHIEU)
ON DELETE CASCADE ON UPDATE CASCADE,
Constraint FK_CTPS_VT Foreign Key(MAVT)
references dbo.VATTU(MAVT)
ON DELETE CASCADE ON UPDATE CASCADE,
Constraint UK_DGSL UNIQUE(DONGIA, SOLUONG) )

b) DML: cho phép thao tác lên dữ liệu


c) DCL: điều khiển dữ liệu trong quá trình thực thi (control, phân quyền)
@Truy vấn từ hai bảng trở lên
a) Các loaị kết nối (các loại JOIN) trong SQL Server
- Khi cần truy vấn các cột dữ liệu từ nhiều bảng khác nhau để trả về trong
cùng một tập kết quả
- Có 3 bảng tham giao vào liên kết thì phải có 2 điều kiện kết

**INNER JOIN: Kết nối trong (chiếm tới 90%)


- Trả về kết quả là các bản ghi mà trường được join ở hai bảng khớp nhau, các
bản ghi chỉ xuất hiện ở trong hai bảng sẽ bị loại.
- Nếu trong bảng A có dữ liệu X thì trong B cũng phải có X

**OUTER JOIN
+) FULL OUTER JOIN: kết quả bao gồm tất cả các bản ghi của cả hai bảng. Với
các bản ghi chỉ xuất hiện trong một bảng thì cột dữ liệu từ bảng kia được điền
giá trị NULL
+) HALF OUTER JOIN (LEFT HOẶC RIGHT): nếu bảng A LEFT JOIN với bảng
B thì kết quả gồm các bản ghi có trong bảng A, với các bản ghi không có mặt
trong bảng B thì các cột từ B được điền NULL. Các bản ghi chỉ có trong B mà
không có trong A sẽ không được trả về.

→ Nếu là left thì ưu tiên lấy dữ liệu bên trái, nếu right thì ưu tiên lấy dữ liệu bên phải

Chọn phép chọn phép chiếu trước, phép kết làm sau

Các hàm về ngày giờ, số, chuỗi


Year()
Month()
Getdate()

Declare: khai báo biến cục bộ


Set: gán giá trị cho biến
Select: các field hiện lên
From: từ các bảng nào
Where: điều kiện là gì

Tìm khóa, tìm bao đóng


+ Khóa chính: chỉ gồm những thuộc tính nằm bên vế trái mà không nằm
bên vế phải

Group By: gôm theo một số field cố định


- KHI NÀO DÙNG DISTINCT?
→ Trong đề bài có cái dữ liệu khiến cho dữ liệu trong bảng bị lặp lại (Ví dụ
như là một phim chiếu nhiều suất trong một ngày → khi ngta kêu truy vấn ra
cái phim mà chiếu trước 1 khung giờ nào đó trong ngày thì mình phải distinct)
- KHI NÀO DÙNG LIKE, %
+ The percent sign % represents zero, one, or multiple characters
+ The underscore sign _ represents one, single character

Chuyện gì xảy ra nếu có count mà không có group by


→ nó sẽ đếm nguyên cái bảng luôn chứ không chia ra

Thứ tự:
update bảng nào đó
set sự thay đổi ví dụ set budget = budget * 2
where điều kiện

insert into + tên bảng nào đó (tên cột, tên cột,...)


values (value1, value2,...)

delete from + tên bảng


where + điều kiện

(không có điều kiện là xóa hết bảng đó)

SELECT *
FROM Customers
WHERE NOT Country = 'Spain';

SELECT MAX(column_name)
FROM table_name
WHERE condition;

alter table
a) Thêm cột
alter table bảng nào đó
add cái_cột_nào_đó kiểu_dữ_liệu

b) Xóa cột
alter table_nào_đó
drop column cột_nào_đó

c) Đổi tên
alter table + tên_table
rename column old_table to new_table

d) NOTNULL
alter table + tên table
alter column cột kiểu notnull;

e) Unique
Alter table + tên table
add constraint UC_bảng Unique ( , );

f) Primary key
alter table + tên table
add constraint PK_bảng Primary Key ( , );

g) Foreign key
alter table + tên table
add constraint FK_bảng Foreign Key (cột)
references bảng(cột)’

h) Check
alter table + tên table
add constraint CK_bảng Check(điều kiện);

Constraint PK_bảng Primary Key ( , )


FK_bảng Foreign Key (cột ) references bảng (cột)
UC_bảng Unique ( , )
CK_bảng Check (Age >2 and City = ‘Sandness’)

—-------------------------------------------------------------------------------
BT4 - 1

8. Viết câu truy vấn cho ra danh sách gồm mã cụm, tên cụm mà không
hề chiếu phim có tên là “Tôi không thấy hoa vàng”.

Select macum c
from cumrap c
where c. macum not in (
select r.macum
from( lichchieu l inner join phim p on p.maphim = l.maphim)
inner join rap r on r.marap = l.marap
where p.tenphim = (‘Toi khong thay hoa vang’)
)

BT4 - 2

1. Viết câu truy vấn cho ra danh sách gồm mã phim, tên phim, tổng số thể
loại của phim đó. (Quy định: giá trị của trường mã thể loại chính của 1 phim
bắt buộc phải nằm trong danh sách các mã thể loại trong bảng
PhimTheLoai của phim đó).

Select p.maphim, t.tenphim , count(ptl.matheloai)

From phim p inner join phimtheloai ptl on ptl.maphim= p.maphim

Groupby p.maphim, t.tenphim

2. Viết câu truy vấn cho ra danh sách gồm mã phim, tên phim, tổng số thể
loại của phim đó. (Quy định: giá trị của trường mã thể loại chính của 1 phim
bắt buộc không nằm trong danh sách các mã thể loại trong bảng
PhimTheLoai của phim đó, mã thể loại chính không thể là giá trị rỗng).

select p.maphim, t.tenphim, count(ptl.matheloai) + 1 as tongsotheloai

from phim p inner join phimtheloai ptl on ptl.maphim = p.maphim

Groupby p.maphim, t.tenphim

3. Viết câu truy vấn cho ra danh sách gồm mã phim, tên phim mà trong
năm 2015 có hơn 3 kế hoạch chiếu

select p.maphim, p.tenphim


from phim p inner join kehoach kh on kh.maphim = p.maphim

where year(kh.ngaykhoichieu) = 2015

Where not (kh.ngaykhoichieu > ‘2015 - 12 -31’ or kh.ngaybatdau < ‘2015


- 1 - 1’ 5

group by p.maphim, p.tenphim

having count (distinct k.macum) > 3

4. Viết câu truy vấn cho ra danh sách gồm mã quận, tên quận, tên
thành phố mà có số lượng thành viên nam dưới 30 tuổi là hơn 100
người.

select q.maquan , q.tenquan , tp.tenthanhpho

from ((quan q inner join thanh pho tp on tp.mathanhpho = q.mathanhpho)

inner join thanhvien tv on tv.maquan = q.maquan)

where tv.gioitinh = ‘0’ and tv.namsinh > 1994

group by maquan q, tenquan q, tenthanhpho tp

having count (tv.mathanhvien) > 100

5. Viết câu truy vấn cho ra danh sách gồm mã cụm, tên cụm mà có kế
hoạch chiếu nhiều phim nhất.

select c.macum, c.tencum, count (distinct kh.maphim) as ts into


soluongkehoach

from macum c inner join kehoach kh on kh.macum = c.macum

group by c.macum, c.tencum

select * from soluongkehoach where ts = (select max(ts) from


soluongkehoach)
6. Viết câu truy vấn cho ra danh sách gồm ngày chiếu mà có số lượng
người thực xem phim là nhiều nhất trong quý 4 năm 2015. (Lưu ý: Nếu mã
loại ghế trong 1 vé có SLGhe = n, thì được hiểu là có n người thực đi xem)

select v.ngaychieu, sum(lg.SLGhe) as ts into tongsoluongghe

from ve v inner join loaighe g on g.maloaighe = v.maloaighe

where (month(v.ngaychieu ) between 10 and 12 ) and year(v.ngaychieu) =


2015

group by v.ngaychieu

select * from tongsoluongghe where ts = ( select max(ts) from


tongsoluongghe)

8. Viết câu truy vấn cho ra danh sách gồm mã cụm, tên cụm, tổng số
ngày có lịch chiếu phim có tên là “Em là bà ngoại của anh” hơn 20
ngày.

select c.macum, c.tencum, count (l.ngaychieu) as ts

from ((cumrap c inner join rap r on r.macum = c.macum)

inner join lichchieu l on l.marap = r.marap)

inner join phim p on p.maphim = l.maphim

where p.tenphim = ‘Em là bà ngoại của anh’

group by c.macum, c.tencum

having count (distinct l.ngaychieu) > 20

10. Viết câu truy vấn cho ra danh sách gồm mã phim, tên phim mà mọi
ngày chiếu, mọi suất chiếu tại mọi rạp đều không dư bất kỳ chỗ ngồi nào.

select p.maphim, p.tenphim

from phim, lichchieu


BT4-3

1. Viết câu truy vấn cho ra danh sách gồm mã thành viên, tên thành viên
mà xem hết tất cả các phim được khởi chiếu trong năm 2015.

(được khởi chiếu hiểu là chiếu thật)

Select tv.mathanhvien, tv.tenthanhvien

from ((thanhvien tv inner join ve v on v.mathanhvien = tv. mathanhvien)

left join kehoach kh on kh.maphim = v.maphim)

where year(kh.ngaykhoichieu) = 2015

group by tv.mathanhvien, tv.tenthanhvien

having count (kh.maphim) = having count (v.maphim)

mathanhvien tenthanhvien maphim ngaykhoichieu maphim ngaychieu

null null 8989 2015 null


BT4 - 4

1. Viết trigger để khi thêm mới một rạp chiếu phim thì rạp đó phải có tổng
số ghế không vượt quá 200 ghế.

Mã giả: Khi thêm 1 Rap

→ Thì xem cái MaRap: xem xét là cái MaRap đó có TongGhe là bao nhiêu

→ Nếu TongGhe <= 200 thì chấp nhận, nếu TongGhe > 200 thì loại

Create trigger c1 on rap for insert

As

Begin

If exists

(select r.marap

from rap r

where r.tongghe > 200)

RollBack tran

End

2. Viết trigger để khi thêm mới một rạp chiếu phim thì cụm rạp mà rạp đó
thuộc vào không có quá 3 rạp với tổng số ghế mỗi rạp không quá 200.

C1 Nguyen Du R1 250

R2 150

R3 215

R4 215
R5 100

Them vao R8 C1 180 → R8 180

R10 C1 230 → R10 230 x

Create trigger c2 on rap for insert

As

Begin

If exists

select r.marap

from rap r

where r.tongghe > 200

group by r.marap

having count(r.marap) > 3

rollback tran

End

3. Viết trigger để thoả mãn điều kiện một phim chỉ có thể có tối đa 5 thể
loại mà nó thuộc vào (tính luôn thể loại chính). Và điều kiện mã thể loại
chính không được ghi trong bảng phim thể loại.

Create trigger c3 on phimtheloai for insert

As

Begin

If exists

(Select ptl.maphim
from phimtheloai ptl

group by ptl.maphim

having count (ptl.maphim) > 4)

Rollback tran

end

You might also like