Using Subquiries in Updates
和上一篇文章的情景一样,如果我们想更新所有用户id=3的发票信息,但是如果我们没有某客户的id而只有他的名字怎么办?
这是我们可以在UPDATE的选择语句中插入查询语句
案例一
USE sql_invoicing;
UPDATE invoices
SET
payment_total = invoice_total * 0.5,
payment_date = due_date
WHERE client_id =
(
SELECT client_id
FROM clients
WHERE name = 'Myworks'
)
当前子查询语句返回的是单个值,因此我们可以用等号来连接子查询语句
案例二
当前子查询语句返回的是多个值,需要有所调整
例如,此时的查询语句:
SELECT client_id
FROM clients
WHERE state in ('CA','NY')
如果继续用=会报错
此时我们可以用IN来替代=号
```sql
USE sql_invoicing;
UPDATE invoices
SET
payment_total = invoice_total * 0.5,
payment_date = due_date
WHERE client_id IN
(
SELECT client_id
FROM clients
WHERE state in ('CA','NY')
)
案例三
当然,及时没有子查询,我们也可以查询到会被更新的记录
假设需要更新所有付款日期为空值的发票
USE sql_invoicing;
UPDATE invoices
SET
payment_total = invoice_total * 0.5,
payment_date = due_date
WHERE payment_date is NULL
不过需要养成好习惯,在执行更新前,最好先执行一下被更新的记录将会是哪些:
确认无误后在执行
练习
-- 给下过订单且积分>3000的客户增加评论
UPDATE orders
SET comments = 'Gold customer'
Where customer_id IN
(SELECT customer_id
FROM customers
WHERE points > 3000 )