ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC SƯ PHẠM
---------------------------------------
LÊ THỊ THẢO NGUYÊN
XÂY DỰNG MÔ-ĐUN SINH TỰ ĐỘNG MÃ NGUỒN
TRIGGER TRÊN NGÔN NGỮ C PHỤC VỤ CẬP NHẬT GIA
TĂNG, ĐỒNG BỘ CÁC KHUNG NHÌN THỰC VỚI TRUY
VẤN LỒNG CHO POSTGRESQL
LUẬN VĂN THẠC SĨ
NGÀNH HỆ THỐNG THÔNG TIN
Đà Nẵng - Năm 2018
ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC SƯ PHẠM
---------------------------------------
LÊ THỊ THẢO NGUYÊN
XÂY DỰNG MÔ-ĐUN SINH TỰ ĐỘNG MÃ NGUỒN
TRIGGER TRÊN NGÔN NGỮ C PHỤC VỤ CẬP NHẬT GIA
TĂNG, ĐỒNG BỘ CÁC KHUNG NHÌN THỰC VỚI TRUY
VẤN LỒNG CHO POSTGRESQL
Chuyên ngành
Mã số
: Hệ thống thông tin
: 8480104
LUẬN VĂN THẠC SĨ
NGƯỜI HƯỚNG DẪN KHOA HỌC:
TS. Nguyễn Trần Quốc Vinh
Đà Nẵng - Năm 2018
i
LỜI CAM ĐOAN
Tôi xin cam đoan công trình nghiên cứu khoa học này là của riêng tôi.
Các số liệu, kết quả nêu trong luận văn là trung thực và chưa từng được ai
công bố trong bất kỳ công trình nào. Mọi sự giúp đỡ cho việc thực hiện luận văn
này đã được cảm ơn và các thông tin trích dẫn trong luận văn đã được chỉ rõ
nguồn gốc rõ ràng và được phép công bố.
Tac gia lu�n van
�
Le Thj Thao Nguyen
iv
MỤC LỤC
LỜI CAM ĐOAN .......................................................................................................... i
TRANG THÔNG TIN LUẬN VĂN THẠC SĨ .......................................................... ii
DANH MỤC CÁC TỪ VIẾT TẮT ............................................................................ vi
DANH MỤC HÌNH VẼ.............................................................................................. vii
DANH MỤC CÁC BẢNG......................................................................................... viii
LỜI MỞ ĐẦU ................................................................................................................1
1. Lý do chọn đề tài .........................................................................................................1
2. Mục tiêu và nhiệm vụ đề tài ........................................................................................2
3. Đối tượng và phạm vi nghiên cứu ...............................................................................3
4. Phương pháp nghiên cứu .............................................................................................3
5. Ý nghĩa khoa học và thực tiễn của đề tài.....................................................................4
6. Cấu trúc của luận văn ..................................................................................................4
CHƯƠNG 1. NGHIÊN CỨU TỔNG QUAN ..............................................................5
1.1. Tổng quan về ngôn ngữ lập trình C ......................................................................5
1.1.1. Ngôn ngữ lập trình C .....................................................................................5
1.1.2. Đặc điểm của ngôn ngữ C ..............................................................................5
1.2. Tổng quan về truy vấn lồng ..................................................................................6
1.2.1. Đặc điểm của truy vấn lồng ...........................................................................6
1.2.2. Phân loại ........................................................................................................8
1.3. Tổng quan về khung nhìn thực .............................................................................9
1.3.1. Giới thiệu chung .............................................................................................9
1.3.2. Phân loại khung nhìn thực ...........................................................................14
1.4. Tổng quan về cập nhật gia tăng, đồng bộ khung nhìn thực ................................15
1.4.1. Tổng quan về cập nhật gia tăng ...................................................................15
1.4.2. Cập nhật đồng bộ khung nhìn thực ..............................................................16
1.5. Cập nhật khung nhìn thực bằng trigger trên C trong PostgreSQL .....................16
1.5.1. Khái niệm về trigger ....................................................................................16
1.5.2. Trigger trên các HQT CSDL ........................................................................17
1.5.3. Trigger trong PostgreSQL ...........................................................................17
1.5.4. Hàm trong C .................................................................................................18
1.5.5. Hàm trigger trong C ....................................................................................19
1.5.6. Ví dụ tạo trigger trên C trong PostgreSQL..................................................19
1.6. Kết chương 1 .......................................................................................................19
v
CHƯƠNG 2: KHUNG NHÌN THỰC TRONG POSTGRESQL VÀ THUẬT
TOÁN CẬP NHẬT GIA TĂNG KHUNG NHÌN THỰC VỚI TRUY VẤN LỒNG
.......................................................................................................................................20
2.1. PostgreSQL và khung nhìn thực trong PostgreSQL ...........................................20
2.2. Các phương pháp cập nhật KNT ........................................................................21
2.2.1. Phương pháp làm mới KNT .........................................................................21
2.2.2. Phương pháp cập nhật gia tăng đồng bộ .....................................................21
2.2.3. Một số vấn đề cần quan tâm khi CNGT KNT với truy vấn lồng ..................22
2.3. Thuật toán cập nhật gia tăng KNT với truy vấn lồng .........................................23
2.3.1. Thuật toán chuyển từ truy vấn lồng sang truy vấn nối trong .......................23
2.3.2. Điều kiện triển khai thuật toán ....................................................................25
2.3.3. Thuật toán cập nhật gia tăng khung nhìn thực với truy vấn nối trong ........26
2.4. Kết chương 2 .......................................................................................................35
CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH SINH TỰ ĐỘNG MÃ NGUỒN
CÁC TRIGGER THỰC HIỆN CẬP NHẬT GIA TĂNG KHUNG NHÌN THỰC
VỚI TRUY VẤN LỒNG .............................................................................................36
3.1. Cài đặt môi trường CSDL và ngôn ngữ lập trình ...............................................36
3.2. Xây dựng mô-đun sinh mã tự động trigger.........................................................36
3.2.1. Tạo cơ sở dữ liệu thực nghiệm .....................................................................36
3.2.2. Chương trình sinh tự động mã trigger .........................................................36
3.2.3. Sử dụng kết quả của chương trình sinh mã..................................................40
3.2.4. Đánh giá kết quả thực nghiệm .....................................................................41
3.3. Kết chương 3 .......................................................................................................47
KẾT LUẬN VÀ KIẾN NGHỊ .....................................................................................48
1. THẢO LUẬN MỘT SỐ KẾT QUẢ ĐẠT ĐƯỢC....................................................48
2. GIỚI HẠN CỦA LUẬN VĂN NÀY ........................................................................48
TÀI LIỆU THAM KHẢO...........................................................................................49
PHỤ LỤC 1 ...................................................................................................................51
PHỤ LỤC 2 ...................................................................................................................55
PHỤ LỤC 3 ...................................................................................................................74
vi
DANH MỤC CÁC TỪ VIẾT TẮT
Chữ cái viết tắt/
ký hiệu
BG
Cụm từ đầy đủ
Bảng gốc
CNGT
Cập nhật gia tăng
CSDL
Cơ sở dữ liệu
HQTCSDL
Hệ quản trị cơ sở dữ liệu
KNT
Khung nhìn thực
SPJ
Select – Project – Join; Kết nối trong bao gồm phép
chọn, chiếu
TVG
Truy vấn gốc
DSSV
Danh sách sinh viên
Col
QLSV
Columns (cột)
Quản lý sinh viên
vii
DANH MỤC HÌNH VẼ
Số
hiệu
hình
vẽ
1.1.
Tên hình vẽ
Cơ sở dữ liệu quản lý đặt và giao hàng hóa.
Trang
12
Mô tả hoạt động của HQT CSDL khi xuất hiện truy vấn yêu
1.2.
cầu sử dụng dữ liệu khi không sử dụng KNT
13
1.3.
Cơ sở dữ liệu quản lý đặt và giao hàng hóa sử dụng khung
nhìn thực.
13
2.1.
Mô tả quá trình CNGT KNT bằng trigger
22
2.2.
CSDL quản lý sinh viên đơn giản với 3 bảng
24
3.1.
Ví dụ về dữ liệu đầu vào
40
3.2.
Giao diện chương trình sinh mã
41
3.3.
Tốc độ thực thi lệnh Select 1000 row không dùng KNT
42
3.4.
Tốc độ thực thi lệnh Select 1000 row có dùng KNT
43
3.5.
Tốc độ thực thi lệnh insert 1 row không dùng câu lệnh
trigger
43
3.6.
Tốc độ thực thi lệnh insert 1 row có dùng câu lệnh trigger
44
3.7.
Tốc độ thực thi lệnh update 1 row không dùng câu lệnh
trigger
44
3.8.
Tốc độ thực thi lệnh update 1 row có dùng câu lệnh trigger
45
3.9.
Tốc độ thực thi lệnh update 1000 row không dùng câu lệnh
trigger
45
3.10.
Tốc độ thực thi lệnh update 1000 row có dùng câu lệnh
trigger
46
viii
DANH MỤC CÁC BẢNG
Số hiệu
bảng
1.1
1.2
Tên bảng
Trang
Mô tả thông tin chi tiết dữ liệu bảng SINHVIEN và
bảng LOP
10
Khung nhìn thực DSSV với dữ liệu lấy từ bảng
SINHVIEN và LOP
10
1
LỜI MỞ ĐẦU
1. Lý do chọn đề tài
Khung nhìn thực (KNT) là một kỹ thuật giúp cải thiện và nâng cao tốc độ
thực thi đối với các truy vấn phức tạp, có tần suất sử dụng cao trên một lượng dữ
liệu lớn. Ý tưởng của KNT là dựa trên các bảng kết quả sẵn có để trả lời truy
vấn một cách nhanh chóng mà không cần thực thi lại truy vấn. Đối với những
truy vấn phức tạp bao gồm nhiều phép nối và các hàm thống kê, hiệu quả sử
dụng KNT càng rõ rệt, đặc biệt khi áp dụng trên một lượng dữ liệu đủ lớn, do đã
bỏ qua các bước thực thi phép nối và các hàm thống kê vốn là những thành phần
chiếm nhiều chi phí trong quá trình thực thi truy vấn. Đến nay, kỹ thuật KNT đã
được triển khai trên các hệ quản trị cơ sở dữ liệu (HTQCSDL) thương mại lớn
như Oracle, Microsoft SQL Server, IBM DB2,… và ngày càng được ứng dụng
rộng rãi.
PostgreSQL là một HQTCSDL mã nguồn mở hàng đầu trên thế giới, tuy
nhiên KNT mới được triển khai trên PostgreSQL ở phiên bản 9.3.4 và chưa hỗ
trợ vấn đề cập nhật đồng bộ gia tăng. Thay vào đó, PostgreSQL cập nhật KNT
theo cơ chế toàn phần bất đồng bộ, tức là thực thi lại toàn bộ truy vấn dùng để
tạo KNT mỗi khi cần cập nhật. Điều này tốn chi phí xấp xỉ chi phí thực hiện truy
vấn, và không đảm bảo được dữ liệu trên KNT luôn luôn là mới nhất. Đến phiên
bản 10 có bổ sung tính năng cập nhật đồng thời, tuy nhiên tính năng này chỉ hỗ
trợ việc truy cập đồng thời đến KNT, nghĩa là cung cấp khả năng truy cập bảng
KNT để trả lời truy vấn ngay cả khi nó đang được cập nhật bằng lệnh refresh
materialized view, chứ chưa đề cập đến vấn đề CNGT.
Cập nhật gia tăng (CNGT) là kỹ thuật cập nhật dữ liệu trên KNT một cách
đồng bộ, được thực hiện mỗi khi dữ liệu tại các bảng gốc (BG) tham gia vào
KNT có sự thay đổi, nhờ đó giúp cho KNT luôn trong trạng thái được cập nhật.
Do vậy, việc nghiên cứu các kỹ thuật CNGT cho KNT trên PostgesSQL đang rất
được quan tâm.
Việc CNGT KNT có thể được thực hiện thông qua việc xây dựng các
trigger bắt các sự kiện làm thay đổi dữ liệu trên các bảng gốc, từ đó tiến hành
xác định các thay đổi có thể làm ảnh hưởng đến tính đúng đắn của kết quả được
lưu trong KNT, sau đó tiến hành việc cập nhật dữ liệu trong KNT. PostgreSQL
hỗ trợ 2 loại trigger là trigger viết bằng ngôn ngữ PL/pgSQL và trigger viết bằng
2
ngôn ngữ C. Đã có nghiên cứu về việc sử dụng trigger mã nguồn PL/pgSQL để
CNGT đồng bộ cho KNT trong PostgreSQL [2, 3, 5], nhưng trigger mã nguồn
PL/pgSQL được đánh giá là có hiệu năng chưa cao ở hầu hết các xử lý so với
trigger trong ngôn ngữ C, trigger trên ngôn ngữ C thực thi nhanh hơn so với
trigger trên ngôn ngữ PL/pgSQL (khoảng 13%). Vì vậy, nghiên cứu này đề xuất
sử dụng ngôn ngữ C làm mã nguồn cho trigger và xây dựng mô-đun để sinh tự
động các trigger cho tất cả các BG tham gia vào truy vấn, phục vụ thực hiện
CNGT KNT trong cơ chế đồng bộ, như một phần của giao tác thực hiện thao tác
dữ liệu trong các BG.
Đã có các nghiên cứu [1, 2, 3] xây dựng được chương trình sinh mã nguồn
trigger tự động bằng ngôn ngữ C, triển khai các thuật toán CNGT KNT trên
HQTCSDL PostgreSQL. Tuy nhiên nghiên cứu này vẫn chưa quan tâm đến các
KNT được tạo bởi truy vấn lồng, truy vấn đệ quy, truy vấn bao gồm phép nối
ngoài. Có thể thấy truy vấn lồng (SubQuery) là một dạng truy vấn phổ biến, tần
suất xuất hiện cao, tuy nhiên các nghiên cứu về CNGT KNT cho PostgreSQL
đến nay vẫn chưa hỗ trợ dạng truy vấn này.
Vì vậy, tôi chọn đề tài “Xây dựng mô-đun sinh tự động mã nguồn trigger
trên ngôn ngữ C phục vụ cập nhật gia tăng, đồng bộ các khung nhìn thực với
truy vấn lồng cho PostgreSQL” làm khóa luận tốt nghiệp cao học.
2. Mục tiêu và nhiệm vụ đề tài
2.1. Mục tiêu
- Xây dựng chương trình sinh tự động mã nguồn trigger trên ngôn ngữ C
phục vụ cập nhật gia tăng, đồng bộ các khung nhìn thực với truy vấn lồng
trong PostgreSQL.
- Chương trình có khả năng sinh mã SQL cài đặt khung nhìn thực, trigger
trên các bảng gốc để cập nhật gia tăng, đồng bộ các khung nhìn thực.
Để đạt được mục tiêu chung đó, tác giả nghiên cứu các mục tiêu cụ thể như
sau:
- Nghiên cứu tổng quan về KNT, truy vấn lồng.
- Nghiên cứu cơ sở lý thuyết về cập nhật gia tăng, đồng bộ KNT với truy
vấn lồng.
- Nghiên cứu tổng quan về trigger trên C trong PostgreSQL.
- Xây dựng thuật toán cập nhật gia tăng KNT với truy vấn lồng.
3
- Xây dựng mô-đun sinh tự động mã nguồn trigger.
2.2. Nhiệm vụ
- Tìm hiểu các biên dịch và sử dụng trigger viết bằng ngôn ngữ C trên
PostgreSQL.
- Tìm hiểu và nghiên cứu cơ sở lý thuyết về cập nhật gia tăng, đồng bộ
KNT với truy vấn lồng.
- Khai thác các thuật toán CNGT KNT đã có để ứng dụng vào đề tài, đặc
biệt là thuật toán CNGT KNT với truy vấn lồng.
3. Đối tượng và phạm vi nghiên cứu
3.1. Đối tượng nghiên cứu
- CSDL quan hệ, HQT CSDL quan hệ
- Ngôn ngữ lập trình C
- Trigger trên các HQT CSDL quan hệ
- Truy vấn lồng
- Khung nhìn thực
- Thuật toán CNGT KNT với truy vấn lồng
3.2. Phạm vi nghiên cứu
- HQT CSDL PostgreSQL
- Kỹ thuật viết trigger cho PostgreSQL bằng ngôn ngữ C
- Cách sử dụng trigger được viết bằng ngôn ngữ C trên PostgreSQL
- Các thuật toán CNGT cho KNT trên PostgreSQL
- Thuật toán CNGT KNT hỗ trợ truy vấn lồng
4. Phương pháp nghiên cứu
Về phương pháp nghiên cứu, tôi sử dụng hai phương pháp chính là nghiên
cứu lý thuyết và nghiên cứu thực nghiệm.
4.1. Phương pháp lý thuyết
Thu thập, chọn lọc, phân loại, ghi chú và nghiên cứu các tài liệu (sách, bài
báo, luận văn, trang web) có liên quan đến khung nhìn thực, HQTCSDL
PostgreSQL, cập nhật gia tăng KNT, đồng bộ KNT, sinh mã trigger trong
ngôn ngữ C.
4.2. Phương pháp thực nghiệm
Dựa trên lý thuyết đã nghiên cứu, tiến hành xây dựng chương trình sinh tự
động mã các trigger thực hiện cập nhật gia tăng khung nhìn thực với truy vấn
4
lồng trong hệ cơ sở dữ liệu PostgreSQL; thử nghiệm trên máy đơn và đánh
giá tốc độ cập nhật dữ liệu trên các bảng gốc (BG) có trigger cập nhật KNT.
5. Ý nghĩa khoa học và thực tiễn của đề tài
5.1. Ý nghĩa khoa học
- Đề xuất thuật toán cập nhật gia tăng KNT truy vấn lồng.
- Đề xuất thuật toán sinh tự động mã nguồn các trigger trong ngôn ngữ C
phục vụ cập nhật gia tăng các bảng khung nhìn thực truy vấn lồng trong hệ
quản trị cơ sở dữ liệu PostgreSQL.
5.2. Ý nghĩa thực tiễn
Áp dụng chương trình vào cơ sở dữ liệu PostgreSQL nhằm làm tăng tốc
độ thực thi các truy vấn dữ liệu mà vẫn đảm bảo ràng buộc toàn vẹn dữ liệu.
Chương trình sinh tự động mã trigger C thực hiện CNGT KNT có tính ứng
dụng cao, giúp tiết kiệm thời gian và công sức của người quản trị CSDL khi
làm việc với HQTCSDL PostgreSQL cũng như các HQTCSDL mã nguồn mở
có hỗ trợ trigger trong ngôn ngữ C. Chương trình sinh tự động mã nguồn các
trigger có thể hỗ trợ các lập trình viên sinh mã trigger. Lập trình viên chỉ cần
điều chỉnh trigger được sinh ra theo ý muốn thay vì phải lập trình từ đầu.
6. Cấu trúc của luận văn
Ngoài phần mở đầu và kết luận, cấu trúc nội dung của luận văn bao gồm 3
chương:
Chương 1: Nghiên cứu tổng quan, chương này giới thiệu tổng quan về
ngôn ngữ lập trình C, truy vấn lồng và KNT, cập nhật gia tăng, đồng bộ KNT.
Trình bày các vấn đề liên quan đến trigger trên C trong PostgreSQL.
Chương 2: Khung nhìn thực trong PostgreSQL và thuật toán cập nhật gia
tăng khung nhìn thực với truy vấn lồng, chương này trình bày các phương pháp
cập nhật KNT; phân tích thuật toán cập nhật gia tăng KNT với truy vấn lồng.
Chương 3: Xây dựng chương trình sinh tự động mã nguồn các trigger
thực hiện cập nhật gia tăng khung nhìn thực với truy vấn lồng, chương này trình
bày cách cài đặt môi trường CSDL và ngôn ngữ lập trình; xây dựng mô-đun sinh
mã tự động trigger.
5
CHƯƠNG 1. NGHIÊN CỨU TỔNG QUAN
1.1. Tổng quan về ngôn ngữ lập trình C
1.1.1. Ngôn ngữ lập trình C
Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu
thập niên 1970 bởi Dennis Ritchie, là một trong những ngôn ngữ phổ dụng
nhất. C là ngôn ngữ rất có hiệu quả và được ưa chuộng để viết các phần mềm
hệ thống, mặc dù nó cũng được dùng cho việc viết các ứng dụng. C là ngôn
ngữ lập trình tương đối nhỏ gọn vận hành gần với phần cứng, được tạo ra với
một mục tiêu là làm cho nó thuận tiện để viết các chương trình lớn.
Ngôn ngữ lập trình C là một ngôn ngữ lập trình hệ thống rất mạnh và rất
“mềm dẻo”, có một thư viện gồm rất nhiều các hàm (function) đã được tạo
sẵn. Người lập trình có thể tận dụng các hàm này để giải quyết các bài toán
mà không cần phải tạo mới. Hơn thế nữa, ngôn ngữ C hỗ trợ rất nhiều phép
toán nên phù hợp cho việc giải quyết các bài toán kỹ thuật có nhiều công thức
phức tạp. Ngoài ra, C cũng cho phép người lập trình tự định nghĩa thêm các
kiểu dữ liệu trừu tượng khác.
1.1.2. Đặc điểm của ngôn ngữ C
Ngôn ngữ C có các đặc điểm sau:
C là một ngôn ngữ đơn giản theo nghĩa là nó giúp ta cách tiếp cận có cấu
trúc (chia bài toán thành các phần khác nhau), tập hợp các hàm thư viện
phong phú, các kiểu dữ liệu, ...
Không giống như hợp ngữ, các chương trình C có thể thực thi trên nhiều
loại máy khác nhau mà không có sự thay đổi nào. Nhưng nó không phải là
độc lập về nền tảng như Java.
C cũng được sử dụng để lập trình bậc thấp. Nó được dùng để phát triển
các ứng dụng hệ thống như các nhân Hệ điều hành, trình điều khiển thiết bị,
... Nó cũng hỗ trợ những tính năng của ngôn ngữ bậc cao. Đó là tại sao được
gọi là ngôn ngữ bậc trung.
C là ngôn ngữ lập trình theo nghĩa chúng ta chia chương trình thành các
phần bằng cách sử dụng hàm. Vì thế, nó dễ hiểu và dễ chỉnh sửa.
C cung cấp nhiều hàm có sẵn giúp việc phát triển các ứng dụng trở nên
nhanh chóng hơn.
6
Nó hỗ trợ nhiều tính năng của Cấp phát bộ nhớ động. Trong ngôn ngữ C,
chúng ta có thể giải phóng một bộ nhớ được cấp phát tại thời điểm bất kỳ
bằng cách gọi hàm free().
Quá trình biên dịch và thực thi của ngôn ngữ C rất nhanh trong thời gian
rất ngắn.
C cung cấp tính năng con trỏ, chúng ta có thể tương tác trực tiếp với bộ
nhớ bằng việc sử dụng con trỏ. Chúng ta có thể sử dụng con trỏ cho bộ nhớ,
cấu trúc, hàm, mảng, ...
Trong C, chúng ta có thể gọi hàm ngay bên trong bản thân hàm đó. Nó
cung cấp những mã có khả năng sử dụng lại cho mỗi hàm.
Ngôn ngữ C có khả năng mở rộng vì nó dễ dàng nhận một tính năng mới.
1.2. Tổng quan về truy vấn lồng
1.2.1. Đặc điểm của truy vấn lồng
Là dạng truy vấn mà câu lệnh Select lồng trong câu lệnh Select.
Câu lệnh Select bên ngoài gọi là truy vấn ngoài
Câu lệnh Select bên trong gọi là truy vấn trong hay truy vấn con
Có 2 loại:
- Loại 1: Truy vấn con nằm trong mệnh đề WHERE
SELECT
FROM INNER JOIN ON <điều kiện nối>
INNER JOIN ON <điều kiện nối>…
WHERE (
SELECT
FROM < danh sách các bảng>
WHERE<điều kiện>)
- Loại 2: Truy vấn con nằm trong mệnh đề FROM
SELECT
FROM , , () AS
WHERE <điều kiện>
7
Các câu lệnh Select có thể lồng nhau ở nhiều mức
Câu truy vấn con thường trả về một tập các giá trị
Mệnh đề Where của câu truy vấn ngoài
So sánh tập hợp thường đi cùng với một số toán tử
-
-
-
-
IN
SELECT ma_sv, ten_sv
FROM sinh_vien
WHERE ma_lop IN (
SELECT ma_lop
FROM lop
WHERE ten_lop = ‘CNTT – 1’)
NOT IN
SELECT ma_sv, ten_sv
FROM sinh_vien
WHERE ma_lop NOT IN (
SELECT ma_lop
FROM lop
WHERE ten_lop = ‘CNTT – 1’)
ALL
SELECT ma_sv, ten_sv
FROM sinh_vien
WHERE ma_lop = ‘ML1’ AND ngay_sinh < ALL (
SELECT ngay_sinh
FROM sinh_vien
WHERE ma_lop = ‘ML1’
ANY hoặc SOME
SELECT ma_sv, ten_sv
FROM sinh_vien
WHERE ma_lop = ‘ML1’ AND ngay_sinh < ANY (
8
SELECT ngay_sinh
FROM sinh_vien
WHERE ma_lop = ‘ML1’
-
-
EXISTS
SELECT *
FROM sinh_vien
WHERE EXISTS (
SELECT *
FROM lop
WHERE ma_lop= sinh_vien.ma AND ma_lop = ‘ML1’)
NOT EXISTS
SELECT *
FROM sinh_vien
WHERE NOT EXISTS (
SELECT *
FROM lop
WHERE ma_lop= sinh_vien.ma AND ma_lop = ‘ML1’)
1.2.2. Phân loại
Dựa vào đặc điểm của câu truy vấn con người ta phân truy vấn lồng thành
2 loại chính:
- Truy vấn lồng phân cấp: Khi nội dung của câu truy vấn con độc lập với
câu truy vấn cha.
Cú pháp:
SELECT A
FROM X
WHERE … (SELECT B, C FROM Y) …
Ví dụ: Đưa ra mã, tên của những sinh viên thuộc lớp CNTT 1
SELECT ma_sv, ten_sv
FROM sinhvien
WHERE ma_lop IN (
SELECT ma_lop
FROM lop
WHERE ten_lop = ‘CNTT – 1’)
9
Ở ví dụ trên, câu truy vấn con SELECT ma_lop FROM lop WHERE
ten_lop = ‘CNTT – 1’ không sử dụng bất kỳ thành phần nào của câu truy vấn
cha. Do đó đây là một câu truy vấn lồng phân cấp.
- Truy vấn lồng tương quan: Khi nội dung của câu truy vấn con phụ thuộc
vào câu truy vấn cha.
Cú pháp:
SELECT A
FROM X
WHERE … (SELECT B, C FROM Y WHERE B = X.A) …
Ví dụ: Đưa ra mã, tên của những sinh viên thuộc lớp CNTT – 1
SELECT ma_sv, ten_sv
FROM sinhvien
WHERE EXISTS (
SELECT*
FROM Lop
WHERE ma_lop = sinhvien.ma_lop AND ten_lop = ‘CNTT – 1’)
Ở ví dụ này, câu truy vấn con SELECT*. FROM Lop. WHERE ma_lop =
sinhvien.ma_lop and ten_lop = ‘CNTT – 1’.
WHERE ma_lop = sinhvien.ma_lop có sử dụng thành phần của câu truy
vấn cha qua biểu thức so sánh ma_lop = sinhvien.ma_lop. Do đó, đây là một
câu truy vấn lồng tương quan.
1.3. Tổng quan về khung nhìn thực
1.3.1. Giới thiệu chung
Một khung nhìn (view) có thể được xem như là một bảng “ảo” trong cơ sở
dữ liệu có nội dung được định nghĩa thông qua một truy vấn (câu lệnh
SELECT). Điểm khác biệt giữa khung nhìn và bảng là khung nhìn không
được xem là một cấu trúc lưu trữ dữ liệu tồn tại trong cơ sở dữ liệu. Thực chất
dữ liệu quan sát được trong khung nhìn được lấy từ các bảng thông qua câu
lệnh truy vấn dữ liệu.
Bảng 1.2 dưới đây minh hoạ cho ta thấy khung nhìn có tên DSSV được
định nghĩa thông qua câu lệnh SELECT truy vấn dữ liệu trên hai bảng
SINHVIEN và LOP:
10
Bảng 1.1 – Mô tả thông tin chi tiết dữ liệu bảng SINHVIEN và bảng LOP
Từ hai bảng này, ta tạo được khung nhìn sau đây
Bảng 1.2 – Khung nhìn thực DSSV với dữ liệu lấy từ bảng SINHVIEN và LOP