24/05/2018, 16:52

Phép hợp, toán tử UNION, EXISTS, IN và Truy vấn lồng

Toán tử UNION cho phép ta hợp các kết quả của hai hay nhiều truy vấn thành Query_1[UNION [ALL] Query_2 ]...[UNION [ALL] Query_N ][ORDER BY clause ][COMPUTE clause ]một tập kết quả duy nhất. Cú pháp của phép hợp như sau: ...

Toán tử UNION cho phép ta hợp các kết quả của hai hay nhiều truy vấn thành

Query_1[UNION [ALL] Query_2 ]...[UNION [ALL] Query_N ][ORDER BY clause][COMPUTE clause]một tập kết quả duy nhất. Cú pháp của phép hợp như sau:

Và Query_i (i = 2,..,N) có dạng SELECT select_list[FROM clause][WHERE clause][GROUP BY clause][HAVING clause]Trong đó Query_1 có dạng như sau:SELECT select_list[INTO clause][FROM clause][WHERE clause][GROUP BY clause][HAVING clause]

Giả sử chúng ta có hai bảng như sau:

Khi đó phép hợp

SELECT A, C FROM R

UNION SELECT * FROM S

Sẽ có kết quả là

Theo mặc định, phép toán UNION sẽ loại bỏ những dòng giống nhau trong kết quả. Nếu ta sử dụng tùy chọn ALL thì các dòng giống nhau sẽ không bị loại bỏ. Ta có thể sử dụng các dấu ngoặc để xác định thứ tự tính toán trong phép hợp.

Các nguyên tắc khi sử dụng toán tử UNION

Khi xây dựng các câu lệnh UNION, ta cần chú ý các nguyên tắc sau:

+ Tất cả các danh sách chọn trong câu lệnh UNION phải có cùng số biểu thức

(các tên cột, các biểu thức số học, các hàm gộp,...)

+ Các cột tương ứng trong tất cả các bảng, hoặc tập con bất kỳ các cột được

sử dụng trong bản thân mỗi truy vấn phải cùng kiểu dữ liệu.

+ Các cột tương ứng trong bản thân từng truy vấn của một câu lệnh UNION

phải xuất hiện theo thứ tự như nhau. Nguyên nhân là do phép hợp so sánh các

cột từng cột một theo thứ tự được cho trong mỗi truy vấn.

+ Khi các kiểu dữ liệu khác nhau được kết hợp với nhau trong câu lệnh

UNION, chúng sẽ được chuyển sang kiểu dữ liệu cao hơn (nếu có thể được).

+ Tiêu đề cột trong kết quả của phép hợp sẽ là tiêu đề cột được chỉ định trong

truy vấn đầu tiên.

Cú pháp của câu truy vấn lồng

Ví dụ : trong cơ sở dữ liệu quản lý vật tư, hiển thị mã và tên vật không được xuất trong năm 2007, chúng ta sẽ thiết kế câu truy vấn như sau:

SELECT MA_VTU, TEN_VTU

FROM VAT_TU

WHERE MA_VTU NOT IN (SELECT MA_VTU

FROM PHIEU_XUAT AS PX,DONG_XUAT AS DX

WHERE PX.SO_PXUAT =DX.SO_PXUAT AND

NGAY_XUAT BETWEEN '1/1/2007' AND '12/31/2007' )

  • 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ị
  • Các câu truy vấn con trong cùng một mệnh đề WHERE được kết hợp bằng phép nối logic
  • Mệnh đề WHERE của câu truy vấn cha
    • <biểu thức> <so sánh tập hợp> <truy vấn con>
    • So sánh tập hợp thường đi cùng với một số toán tử
      • IN, NOT IN
      • ALL
      • ANY hoặc SOME
    • Kiểm tra sự tồn tại
      • EXISTS và NOT EXISTS

Truy vấn lồng phân cấp

+ Mệnh đề WHERE của truy vấn con không tham chiếu đến thuộc tính của các

quan hệ trong mệnh đề FROM ở truy vấn cha

+ Khi thực hiện, câu truy vấn con sẽ được thực hiện trước

Truy vấn lồng tương quan

+ Mệnh đề WHERE của truy vấn con tham chiếu ít nhất một thuộc tính của các quan hệ trong mệnh đề FROM ở truy vấn cha

+ Khi thực hiện, câu truy vấn con sẽ được thực hiện nhiều lần, mỗi lần tương ứng với một bộ của truy vấn cha

Toán tử In và Exists

  • IN
    • <tên cột> IN <câu truy vấn con>
    • Thuộc tính ở mệnh đề SELECT của truy vấn con phải có cùng kiểu dữ liệu với thuộc tính ở mệnh đề WHERE của truy vấn cha
  • EXISTS
    • Không cần có thuộc tính, hằng số hay biểu thức nào khác đứng trước
    • Không nhất thiết liệt kê tên thuộc tính ở mệnh đề SELECT của truy vấn con
    • Những câu truy vấn có ANY hay IN đều có thể chuyển thành câu truy vấn có EXISTS

Xét cơ sở dữ liệu “Quản lý vật tư” như vẽ dưới đây

Hãy sử dụng ngôn ngữ truy vấn ( SQL) để trả lời các câu hỏi sau:

Câu 1: Hiển thị tên nhân viên, ngày sinh của những nhân viên đã xuất vật tư trong tháng 8 năm 2008.

Câu 2: Hiển thị tên nhân viên, ngày sinh của những nhân viên đã xuất vật tư có tên là ‘Màn hình máy tính’

Câu 3: Hiển thị mã, tên vật tư đã được xuất với khối lượng lớn nhất.

0