SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.09.2018 13:16:03

gotlib
Участник
Зарегистрирован: 29.09.2016
Сообщений: 12

Объясните как работает Exists

SELECT *
FROM customers
WHERE EXISTS (SELECT *
              FROM order_details
              WHERE customers.customer_id = order_details.customer_id);

Этот пример MySQL условия EXISTS возвращает все записи из таблицы customers, где есть хотя бы одна запись в таблице order_details с соответствующим customer_id.

Не понимаю как работает EXISTS. Подзапрос выше по идее должен вернуть всё из таблицы order_details, потому что в WHERE у него все id из таблицы customers.

И чем вышеупомянутый запрос отличается от

SELECT * FROM `customers` c
JOIN `order_details` od ON od.customer_id = c.customer_id


Тоже вернёт всех покупателей, чьи id есть в order_details.

Неактивен

 

#2 18.09.2018 13:31:42

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Объясните как работает Exists

Сравните результат этих запросов на простейшем примере:

create table customers (id int);
create table order_details (id int, customer_id int);
insert into customers values(1);
insert into order_details values(1, 1),(2,1);

mysql> SELECT * FROM `customers` c
    -> JOIN `order_details` od ON od.customer_id = c.id;
+------+------+-------------+
| id   | id   | customer_id |
+------+------+-------------+
|    1 |    1 |           1 |
|    1 |    2 |           1 |
+------+------+-------------+
2 rows in set (0.01 sec)

SELECT *
FROM customers
WHERE EXISTS (SELECT *
              FROM order_details
              WHERE customers.id = order_details.customer_id);
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

Неактивен

 

#3 18.09.2018 14:04:47

gotlib
Участник
Зарегистрирован: 29.09.2016
Сообщений: 12

Re: Объясните как работает Exists

Я читал мануал и гуглил, но не смог понять что делает EXISTS. Если вам не тяжело, объясните пожалуйста своими словами что он делает. Если строк в подзапросе нет (EXISTS возвращает false), то я так понимаю и основной запрос ничего не вернёт. Но что происходит когда он возращает TRUE я не понимаю, он ведь возвращает не все строки.

Отредактированно gotlib (18.09.2018 14:05:39)

Неактивен

 

#4 18.09.2018 14:13:43

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Объясните как работает Exists

подзапрос у вас зависимый (в нем фигурирует customers.id), т.е. он вычисляется для каждой строки внешнего запроса.
соответственно, в зависимости от результата вычисления false/true или возвращает строку или нет

Неактивен

 

#5 18.09.2018 14:22:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Объясните как работает Exists

для наглядности перенесите подзапрос в часть select

insert into customers values(4);

mysql> select * from customers;
+------+
| id   |
+------+
|    1 |
|    4 |
+------+

mysql> select * from order_details;
+------+-------------+
| id   | customer_id |
+------+-------------+
|    1 |           1 |
|    2 |           1 |
+------+-------------+

mysql> SELECT id, EXISTS (SELECT * FROM order_details WHERE customers.id = order_details.customer_id) as `exists` FROM customers;
+------+--------+
| id   | exists |
+------+--------+
|    1 |      1 |
|    4 |      0 |
+------+--------+
 

Неактивен

 

#6 18.09.2018 14:29:54

gotlib
Участник
Зарегистрирован: 29.09.2016
Сообщений: 12

Re: Объясните как работает Exists

Большое спасибо, разобрался.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson