Czasami może być konieczne znalezienie wierszy, których nie ma w innej tabeli lub zaznaczenie wierszy, których nie ma w innej tabeli. W tym artykule przyjrzymy się, jak wyświetlić wiersze, których nie ma w innej tabeli w MySQL, używając klauzuli NOT EXISTS.
Klauzula MySQL NOT EXISTS
MySQL udostępnia klauzule EXISTS, UNION i NOT EXISTS, które ułatwiają wykonywanie operacji SET na tabelach MySQL. Przez operacje SET rozumiemy, że można traktować tabele i wyniki zapytań MySQL jako zestawy matematyczne i wybierać wiersze, które występują w obu tabelach lub tylko w jednej z nich. W naszym artykule użyjemy klauzuli NOT EXISTS.
Jak pokazać wiersze nieobecne w innej tabeli
Oto kroki, aby znaleźć wiersze, których nie ma w innej tabeli. Załóżmy, że masz dwie tabele sprzedaż(id, data_zamówienia, kwota) i zamówienia(id, data_zamówienia, kwota)
mysql> create table sales(id int, order_date date, amount int);
mysql> insert into sales(id, order_date, amount)
values(1, '2021-01-24',250),
(2, '2021-01-25',250),
(3, '2021-01-26',250),
(4, '2021-01-27',250),
(5, '2021-01-28',250),
(6, '2021-01-29',250),
(7, '2021-01-30',250),
(8, '2021-01-31',250),
(9, '2021-02-01',250);
mysql> select * from sales;
+------+------------+--------+
| id | order_date | amount |
+------+------------+--------+
| 1 | 2021-01-24 | 250 |
| 2 | 2021-01-25 | 250 |
| 3 | 2021-01-26 | 250 |
| 4 | 2021-01-27 | 250 |
| 5 | 2021-01-28 | 250 |
| 6 | 2021-01-29 | 250 |
| 7 | 2021-01-30 | 250 |
| 8 | 2021-01-31 | 250 |
| 9 | 2021-02-01 | 250 |
+------+------------+--------+
mysql> create table orders(id int, order_date date, amount int);
mysql> insert into orders(id, order_date, amount)
values(5, '2021-01-28',250),
(6, '2021-01-29',250),
(7, '2021-01-30',250),
(8, '2021-01-31',250),
(9, '2021-02-01',250);
mysql> select * from orders;
+------+------------+--------+
| id | order_date | amount |
+------+------------+--------+
| 5 | 2021-01-28 | 250 |
| 6 | 2021-01-29 | 250 |
| 7 | 2021-01-30 | 250 |
| 8 | 2021-01-31 | 250 |
| 9 | 2021-02-01 | 250 |
+------+------------+--------+
Oto zapytanie SQL służące do wybrania danych ze sprzedaży tabela, której nie ma w zamówieniach tabela.
mysql> SELECT *
FROM sales D
WHERE NOT EXISTS(SELECT * FROM orders c
WHERE D.order_date = C.order_date);
+------+------------+--------+
| id | order_date | amount |
+------+------------+--------+
| 1 | 2021-01-24 | 250 |
| 2 | 2021-01-25 | 250 |
| 3 | 2021-01-26 | 250 |
| 4 | 2021-01-27 | 250 |
+------+------------+--------+ W powyższym zapytaniu używamy klauzuli NOT EXISTS, aby wybrać wiersz z sprzedaży tabela, której nie ma w zamówieniach tabeli, które są wybierane za pomocą podzapytania. W podzapytaniu wybieramy tylko te wiersze z zamówień tabela, której data_zamówienia jest taki sam jak w sprzedaży tabela.
Potrzebujesz narzędzia do raportowania dla MySQL? Ubiq ułatwia wizualizację danych w ciągu kilku minut i monitorowanie w pulpitach nawigacyjnych w czasie rzeczywistym. Wypróbuj już dziś!