mysql子查询的问题

UPDATE

                xxx_zy_supplier_item_id id

                SET `status` = 1

                WHERE

                orderID IN (

                SELECT

                line.salesOrderID

                FROM

                xxx_zy_carrier_note note

                LEFT JOIN

                xxx_zy_carrier_note_line line ON note.mainID =

                line.carrierNoteID

                WHERE

                note.mainID = 'PU20160102124222960'

                ) 

这个sql更新了20多秒




 优化后



 

 sql语句修改成:

UPDATE

kplus_zy_supplier_item_id id,

(SELECT

line.salesOrderID as orderID

FROM

kplus_zy_carrier_note note

LEFT JOIN

kplus_zy_carrier_note_line line ON note.mainID =

line.carrierNoteID

WHERE

note.mainID = 'PU20160102124222960'

) x 

SET id.status = 1

WHERE

 

id.orderID=x.orderID

### MySQL 子查询的使用方法与示例 #### 什么是子查询子查询(Subquery)是在一个 SQL 查询语句中嵌套另一个 SELECT 查询语句的技术。这种技术允许开发者基于内部查询的结果对外部查询进行进一步的数据筛选或计算[^3]。 #### 子查询的分类 根据功能和用途的不同,MySQL 中的子查询主要分为以下几类: 1. **标量子查询**:返回单个值的子查询。 2. **多行子查询**:返回多个值的子查询。 3. **多列子查询**:返回多列或多行的子查询。 4. **相关子查询**:子查询依赖外部查询的值,在每次外部查询迭代时重新执行一次[^4]。 --- #### 示例一:非相关子查询 假设有一个名为 `employees` 的表,结构如下: | id | name | salary | |----|---------|--------| | 1 | Alice | 5000 | | 2 | Bob | 7000 | | 3 | Charlie | 6000 | 需求:查找工资高于平均工资的所有员工。 ```sql SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); ``` 此查询中 `(SELECT AVG(salary) FROM employees)` 是一个标量子查询,用于计算所有员工的平均工资,并将其作为外部查询的条件。 --- #### 示例二:IN 运算符配合多行子查询 继续使用上述 `employees` 表,现在的需求是找出部门编号为 `101` 和 `102` 的所有员工姓名。 ```sql SELECT name FROM employees WHERE department_id IN ( SELECT DISTINCT department_id FROM departments WHERE department_name IN ('Sales', 'Marketing') ); ``` 这里 `(SELECT DISTINCT department_id ...)` 是一个多行子查询,返回符合条件的部门 ID 列表。 --- #### 示例三:相关子查询 假设有两个表 `orders` 和 `customers`,分别存储订单信息和客户信息。目标是从 `customers` 表中找到那些没有任何订单记录的客户。 ```sql SELECT c.name FROM customers AS c WHERE NOT EXISTS ( SELECT 1 FROM orders AS o WHERE o.customer_id = c.id ); ``` 在这个例子中,`(SELECT 1 ...)` 是一个相关子查询,因为它依赖于外部查询中的每一行数据 `c.id` 来判断是否存在对应的订单记录。 --- #### 性能优化建议 为了提高子查询的性能,可以考虑以下几个方面: 1. 尽量减少子查询的复杂度,优先使用索引来加速查询。 2. 对于频繁使用的子查询结果,可以通过创建临时表或视图来缓存中间结果。 3. 替代方案:某些情况下可以用 JOIN 取代子查询以提升效率[^1]。 --- #### 结论 MySQL 子查询是一种强大的工具,能够显著增强查询能力并简化复杂的业务逻辑。然而,在实际应用中需要注意性能调优,合理设计查询结构以避免不必要的开销[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值