Professional Documents
Culture Documents
DB Thầy Thư
DB Thầy Thư
- 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.
+ 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.
*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?
@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.
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í 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
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
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 }
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.
G = { AB → C,
C → A,
BC → D,
ACD → B,
D → E,
D → G,
BE → C,
CG → B,
CG → D,
CE → A,
CE → G}
@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)
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
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
@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
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)
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}
- 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ụ:
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à
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
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))
**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
Thứ tự:
update bảng nào đó
set sự thay đổi ví dụ set budget = budget * 2
where điều kiện
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);
—-------------------------------------------------------------------------------
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 đó).
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).
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
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.
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.
group by v.ngaychieu
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.
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.
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.
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ế.
→ 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
As
Begin
If exists
(select r.marap
from rap r
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
As
Begin
If exists
select r.marap
from rap r
group by r.marap
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.
As
Begin
If exists
(Select ptl.maphim
from phimtheloai ptl
group by ptl.maphim
Rollback tran
end