Hướng dẫn intersect mysql - giao nhau mysql

Hướng dẫn intersect mysql - giao nhau mysql


Hướng dẫn MySQL này giải thích cách sử dụng toán tử giao nhau với cú pháp và ví dụ.INTERSECT operator with syntax and examples.

Sự mô tả

Mặc dù không có toán tử giao nhau trong MYSQL, bạn có thể dễ dàng mô phỏng loại truy vấn này bằng mệnh đề IN trong mệnh đề hoặc mệnh đề tồn tại, tùy thuộc vào sự phức tạp của truy vấn giao nhau.

Đầu tiên, chúng ta hãy giải thích một truy vấn giao nhau là gì. Một truy vấn giao nhau trả về giao điểm từ 2 bộ dữ liệu trở lên. Nếu một bản ghi tồn tại trong cả hai bộ dữ liệu, nó sẽ được đưa vào kết quả giao nhau. Tuy nhiên, nếu một bản ghi tồn tại trong một tập dữ liệu chứ không phải trong dữ liệu khác, nó sẽ bị bỏ qua khỏi kết quả giao nhau.

Truy vấn giao nhau

Giải thích: Truy vấn giao nhau sẽ trả lại các hồ sơ trong khu vực bóng mờ màu xanh. Đây là những bản ghi tồn tại trong cả DataSet1 và DataSet2. The INTERSECT query will return the records in the blue shaded area. These are the records that exist in both Dataset1 and Dataset2.

Cú pháp

Cú pháp cho toán tử giao nhau trong MySQL là:

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
INTERSECT
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];

Tham số hoặc đối số

expression1, expression2, ... expression_nthe các cột hoặc tính toán mà bạn muốn truy xuất. Phải có ít nhất một bảng được liệt kê trong mệnh đề từ điều kiện. Các điều kiện phải được đáp ứng cho các hồ sơ được chọn.

Ghi chú

  • Phải có cùng số biểu thức trong cả hai câu lệnh chọn và có các loại dữ liệu tương tự.

Ví dụ - với biểu thức đơn lẻ

Đầu tiên, hãy khám phá cách mô phỏng truy vấn giao nhau trong MySQL có một trường có cùng loại dữ liệu.

Nếu cơ sở dữ liệu hỗ trợ toán tử giao nhau (mà MySQL không có), đây là cách bạn sử dụng toán tử giao nhau để trả về các giá trị CAGE_ID phổ biến giữa các sản phẩm và bảng hàng tồn kho.

SELECT category_id
FROM products
INTERSECT
SELECT category_id
FROM inventory;

Vì bạn không thể sử dụng toán tử giao nhau trong MySQL, bạn sẽ sử dụng toán tử trong để mô phỏng truy vấn giao nhau như sau:

SELECT products.category_id
FROM products
WHERE products.category_id IN (SELECT inventory.category_id FROM inventory);

Trong ví dụ đơn giản này, bạn có thể sử dụng toán tử trong để trả về tất cả các giá trị category_id tồn tại trong cả hai sản phẩm và bảng hàng tồn kho.

Bây giờ, hãy làm phức tạp ví dụ của chúng tôi thêm bằng cách thêm các điều kiện vào truy vấn giao nhau.

Ví dụ, đây là cách giao nhau sẽ trông như thế nào với các điều kiện:

SELECT category_id
FROM products
WHERE category_id < 100
INTERSECT
SELECT category_id
FROM inventory
WHERE quantity > 0;

Đây là cách bạn sẽ mô phỏng truy vấn giao nhau bằng cách sử dụng toán tử trong và bao gồm các điều kiện ở đâu:

SELECT products.category_id
FROM products
WHERE products.category_id < 100
AND products.category_id IN
   (SELECT inventory.category_id
    FROM inventory
    WHERE inventory.quantity > 0);

Trong ví dụ này, các mệnh đề đã được thêm vào đó lọc cả bảng sản phẩm cũng như kết quả từ bảng hàng tồn kho.

Ví dụ - với nhiều biểu thức

Tiếp theo, chúng ta hãy xem cách mô phỏng truy vấn giao nhau trong MySQL trả về nhiều cột.

Đầu tiên, đây là cách bạn sẽ sử dụng toán tử giao nhau để trả về nhiều biểu thức.

SELECT contact_id, last_name, first_name
FROM contacts
WHERE contact_id < 100
INTERSECT
SELECT customer_id, last_name, first_name
FROM customers
WHERE last_name <> 'Johnson';

Một lần nữa, vì bạn không thể sử dụng toán tử giao nhau trong MySQL, bạn có thể sử dụng mệnh đề tồn tại trong các tình huống phức tạp hơn để mô phỏng truy vấn giao nhau như sau:

SELECT contacts.contact_id, contacts.last_name, contacts.first_name
FROM contacts
WHERE contacts.contact_id < 100
AND EXISTS (SELECT *
            FROM customers
            WHERE customers.last_name <> 'Johnson'
            AND customers.customer_id = contacts.contact_id
            AND customers.last_name = contacts.last_name
            AND customers.first_name = contacts.first_name);

Trong ví dụ phức tạp hơn này, bạn có thể sử dụng mệnh đề tồn tại để trả về nhiều biểu thức tồn tại trong cả hai bảng liên hệ trong đó contact_id nhỏ hơn 100 cũng như bảng khách hàng nơi Last_Name không bằng Johnson.

Bởi vì bạn đang thực hiện giao nhau, bạn cần tham gia các trường giao nhau như sau:

AND customers.customer_id = contacts.contact_id
AND customers.last_name = contacts.last_name
AND customers.first_name = contacts.first_name

Sự tham gia này được thực hiện để đảm bảo rằng các trường khách hàng_id, last_name và first_name từ bảng khách hàng được giao với các trường contact_id, last_name và first_name từ bảng Danh bạ.