Запрос на обновление с помощью select — как он узнает, какую строку обновлять

#mysql

#mysql

Вопрос:

У меня есть следующий запрос, который работает правильно, но я не понимаю, почему. Я меняю столбец баланса для каждой строки .. Как он узнает, какую строку обновлять для конкретного клиента.

 UPDATE phppos_customers SET balance = 
IFNULL((SELECT SUM(transaction_amount) 
FROM `phppos_store_accounts`
WHERE deleted = 0 and customer_id = phppos_customers.person_id), 0);
  

Комментарии:

1. Это раздел ‘customer_id = phppos_customers.person_id’, который сообщает ему, как объединить таблицу, которую вы обновляете, и таблицу, из которой вы выбираете.

2. @Patrick Я не понимаю, что вы имеете в виду, говоря о том, как объединить таблицу вместе. Как он узнает, какую строку обновлять из подзапроса?

3. опубликовал ответ ниже с некоторыми подробностями, надеюсь, это поможет.

Ответ №1:

Для примера предположим, что у вас есть следующие две таблицы

 [Users]
 --------- ---------- 
| user_id | username |
 --------- ---------- 
|       1 | patrick  |
|       2 | chris    |
 --------- ---------- 

[Names]
 --------- ------------ ----------- 
| user_id | first_name | last_name |
 --------- ------------ ----------- 
|       1 | Patrick    | Stewart   |
|       2 | Chris      | Angel     |
 --------- ------------ ----------- 
  

Если бы у вас был запрос на обновление, подобный тому, что был в вашем исходном сообщении, вы бы хотели сообщить ему, как выровнять две таблицы. Если у вас было предложение, В КОТОРОМ Users.user_id = Names.user_id , вы фактически указываете SQL просматривать данные так, как если бы обе таблицы были выровнены рядом, используя user_id в обеих таблицах, чтобы определить, где они совпадают. Это означало бы, что first_name и last_name в таблице [Имена] для идентификатора пользователя 1 будут использоваться при обновлении строки в таблице [Пользователи], которая является идентификатором пользователя 1. По сути, это просмотр данных, объединенных вместе, вот так:

 [Users] and [Names] tables aligned by the user_id columns
 --------- ---------- --------- ------------ ----------- 
| user_id | username | user_id | first_name | last_name |
 --------- ---------- --------- ------------ ----------- 
|       1 | patrick  |       1 | Patrick    | Stewart   |
|       2 | chris    |       2 | Chris      | Angel     |
 --------- ---------- --------- ------------ ----------- 
  

Поэтому, когда SQL выполняет обновление, он обновляет каждую строку соответствующими данными из другой таблицы, используя это выравнивание, чтобы узнать, какие данные использовать для обновления каждой строки.

Процесс выравнивания / слияния данных из нескольких таблиц называется объединением в SQL, вот еще немного информации, которая иллюстрирует, как это работает, если вам интересно.

Комментарии:

1. Я понимаю объединения при выполнении обычного выбора, но при выполнении подзапроса в обновлении я не вижу, как это применяется