Hướng dẫn mysql select except - mysql chọn ngoại trừ

13.2.13.6 & NBSP; Các nhóm phụ có tồn tại hoặc không tồn tại

Nếu một công cụ con trả về bất kỳ hàng nào, EXISTS subquery

SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
0 và
SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
1 là
SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
2. Ví dụ:

SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);

Theo truyền thống, một truy vấn con

SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
3 bắt đầu với
SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
4, nhưng nó có thể bắt đầu bằng
SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
5 hoặc
SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
6 hoặc bất cứ điều gì. MySQL bỏ qua danh sách
SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
7 trong một truy vấn con như vậy, vì vậy nó không có gì khác biệt.

Đối với ví dụ trước, nếu

SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
8 chứa bất kỳ hàng nào, thậm chí các hàng không có gì ngoài các giá trị
SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
9, điều kiện
SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
3 là
SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
0. Đây thực sự là một ví dụ không thể xảy ra bởi vì một truy vấn con
SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
2 hầu như luôn luôn chứa các mối tương quan. Dưới đây là một số ví dụ thực tế hơn:

  • Những loại cửa hàng có mặt trong một hoặc nhiều thành phố?

    SELECT DISTINCT store_type FROM stores
      WHERE EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
  • Loại cửa hàng nào có mặt ở No City?

    SELECT DISTINCT store_type FROM stores
      WHERE NOT EXISTS (SELECT * FROM cities_stores
                        WHERE cities_stores.store_type = stores.store_type);
  • Những loại cửa hàng có mặt ở tất cả các thành phố?

    SELECT DISTINCT store_type FROM stores s1
      WHERE NOT EXISTS (
        SELECT * FROM cities WHERE NOT EXISTS (
          SELECT * FROM cities_stores
           WHERE cities_stores.city = cities.city
           AND cities_stores.store_type = stores.store_type));

Ví dụ cuối cùng là truy vấn

SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
3 được lồng đôi. Đó là, nó có một mệnh đề
SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
3 trong mệnh đề
SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
5. Chính thức, nó trả lời câu hỏi mà một thành phố có tồn tại với một cửa hàng không có trong
SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
6 không? Nhưng dễ dàng hơn để nói rằng một
SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
5 được lồng vào câu hỏi là
SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
8
SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
0 cho tất cả
SELECT DISTINCT store_type FROM stores s1
  WHERE NOT EXISTS (
    SELECT * FROM cities WHERE NOT EXISTS (
      SELECT * FROM cities_stores
       WHERE cities_stores.city = cities.city
       AND cities_stores.store_type = stores.store_type));
0?does a city exist with a store that is not in
SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
6
? But it is easier to say that a nested
SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
5 answers the question is
SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
8
SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
0 for all
SELECT DISTINCT store_type FROM stores s1
  WHERE NOT EXISTS (
    SELECT * FROM cities WHERE NOT EXISTS (
      SELECT * FROM cities_stores
       WHERE cities_stores.city = cities.city
       AND cities_stores.store_type = stores.store_type));
0?

Trong MySQL 8.0.19 và sau đó, bạn cũng có thể sử dụng

SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
3 hoặc
SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
5 với
SELECT DISTINCT store_type FROM stores s1
  WHERE NOT EXISTS (
    SELECT * FROM cities WHERE NOT EXISTS (
      SELECT * FROM cities_stores
       WHERE cities_stores.city = cities.city
       AND cities_stores.store_type = stores.store_type));
3 trong truy vấn con, như thế này:

SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);

Các kết quả giống như khi sử dụng

SELECT DISTINCT store_type FROM stores s1
  WHERE NOT EXISTS (
    SELECT * FROM cities WHERE NOT EXISTS (
      SELECT * FROM cities_stores
       WHERE cities_stores.city = cities.city
       AND cities_stores.store_type = stores.store_type));
4 mà không có mệnh đề
SELECT DISTINCT store_type FROM stores s1
  WHERE NOT EXISTS (
    SELECT * FROM cities WHERE NOT EXISTS (
      SELECT * FROM cities_stores
       WHERE cities_stores.city = cities.city
       AND cities_stores.store_type = stores.store_type));
5 trong truy vấn con.


Toán tử EXCEPT trong SQL Server được dùng để trả về các hàng trong lệnh SELECT đầu tiên mà không trả về trong lệnh SELECT thứ hai. Mỗi lệnh SELECT sẽ có một bộ dữ liệu. Toán tử EXCEPT lấy bản ghi từ bộ thứ 1 và bỏ các kết quả từ bộ 2.

Truy vấn EXCEPT

Hướng dẫn mysql select except - mysql chọn ngoại trừ

Minh họa truy vấn EXCEPT

Giải thích: Truy vấn EXCEPT trả về bản ghi trong khu vực màu xanh, chỉ nằm trong bộ dữ liệu 1 và không nằm trong bộ dữ liệu 2. Truy vấn EXCEPT trả về bản ghi trong khu vực màu xanh, chỉ nằm trong bộ dữ liệu 1 và không nằm trong bộ dữ liệu 2.

Mỗi lệnh SELECT trong truy vấn EXCEPT phải có cùng số trường trong bộ kết quả với kiểu dữ liệu giống nhau.

Cú pháp toán tử EXCEPT

SELECT bieu_thuc1, bieu_thuc2, … bieu_thucn
FROM bang
[WHERE dieu_kien]
EXCEPT
SELECT bieu_thuc1, bieu_thuc2, … bieu_thucn
FROM bang
[WHERE dieu_kien];

Tên biến hoặc giá trị biến

bieu_thuc

Cột hoặc giá trị mà bạn muốn so sánh giữa 2 lệnh SELECT. Chúng không nhất thiết phải nằm trong cùng 1 trường thông tin ở mỗi lệnh SELECT nhưng các cột tương ứng phải có dữ liệu giống nhau.

bang

Bảng muốn lấy bản ghi từ đó. Phải có ít nhất 1 bảng trong mệnh đề FROM.

WHERE dieu_kien

Tùy chọn. Điều kiện phải đáp ứng để bản ghi được chọn.

Lưu ý:

  • Hai lệnh SELECT phải có cùng số biểu thức.
  • Cột tương ứng trong mỗi lệnh SELECT phải có cùng kiểu dữ liệu.
  • Toán tử EXCEPT trả về tất cả bản ghi từ lệnh SELECT đầu tiên và không nằm trong lệnh SELECT thứ 2.
  • Toán tử EXCEPT trong SQL Server tương đương với toán tử MINUS trong Oracle.

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

SELECT sanpham_id
FROM sanpham
EXCEPT
SELECT sanpham_id
FROM hangtonkho;

Ở ví dụ với toán tử EXCEPT này, kết quả trả về tất cả các giá trị sanpham_id nằm trong bảng sanpham và không nằm trong bảng hangtonkho. Nghĩa là nếu giá trị sanpham_id nào có ở cả 2 bảng thì sẽ không được trả về.

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

SELECT danhba_id, ho, ten
FROM danhba
WHERE ho = ‘Anderson’
EXCEPT
SELECT nhanvien_id, ho, ten
FROM nhanvien;

Ở ví dụ này, truy vấn trả về các bản ghi trong bảng danhba với ID của số liên lạc, họ và tên không trùng với ID, họ và tên của nhân viên trong bảng nhanvien.

Ví dụ - dùng mệnh đề ORDER BY

SELECT nhacung_id, nhacung_ten
FROM nhacung
WHERE bang = ‘Florida’
EXCEPT
SELECT congty_id, congty_ten
FROM congty
WHERE congty_id <= 400
ORDER BY 2;

Trong ví dụ này, do tên cột ở 2 lệnh SELECT khác nhau nên sẽ dễ hơn khi tham chiếu tới cột bằng mệnh đề ORDER BY qua vị trí trong bộ kết quả. Ở ví dụ trên, ta lọc kết quả nhacung_ten / congty_ten theo thứ tự tăng dần qua cụm từ ORDER BY 2.

Vì nhacung_ten / congty_ten đứng thứ 2 trong bộ kết quả.

Bài trước: Toán tử INTERSECT trong SQL Server

Bài sau: Truy vấn con SUBQUERY trong SQL Server