我有以下查询正常工作,但我不明白为什么。我正在更改每一行的余额列。它如何知道要为特定客户更新哪一行。
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);
答案 0 :(得分:0)
为了举例,假设您有以下两个表
[Users]
+---------+----------+
| user_id | username |
+---------+----------+
| 1 | patrick |
| 2 | chris |
+---------+----------+
[Names]
+---------+------------+-----------+
| user_id | first_name | last_name |
+---------+------------+-----------+
| 1 | Patrick | Stewart |
| 2 | Chris | Angel |
+---------+------------+-----------+
如果你有一个类似原始帖子中的更新查询,你可能想告诉它如何对齐这两个表。如果您有子句WHERE Users.user_id = Names.user_id,那么您实际上是在告诉SQL查看数据,就像两个表并排对齐一样,使用两个表中的user_id来确定它们的匹配位置。这意味着user_id 1的[Names]表中的first_name和last_name将是更新[Users]表中user_id 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中的加入,如果您感兴趣,可以使用更多information that illustrates how it works。