MYSQL The USING Clause | 使用子句

本文讲解了SQL中JOINON与USING的区别,以及如何通过USING优化表连接查询,涉及订单、客户、支付等表的示例。

案例一

原始使用JOIN ON 进行的表连接如下:

SELECT 
	  o.order_id,
      c.first_name,
      sh.name AS shipper
FROM orders o 
JOIN customers c 
	 ON o.customer_id = c.customer_id 
     
LEFT JOIN shippers sh 
	 ON o.shipper_id = sh.shipper_id
	

结果如下

现使用USING语句对其进行简化

SELECT 
	  o.order_id,
      c.first_name,
      sh.name AS shipper
FROM orders o 
JOIN customers c 
	 -- ON o.customer_id = c.customer_id 
     using (customer_id)
LEFT JOIN shippers sh 
	 -- ON o.shipper_id = sh.shipper_id
	 using (shipper_id)

USING 语句使用的条件是,join两表时,两列的列名和数据必须完全相同时才可以进行使用。

案例二

SELECT *
FROM order_items oi
JOIN order_item_notes oin
	ON oi.order_id = oin.order_Id 
    AND oi.product_id = oin.product_id

简化后

SELECT *
FROM order_items oi
JOIN order_item_notes oin
	USING(order_id, product_id)

练习

输出下列表

SELECT 
	p.date,
    c.name AS clint,
    p.amount,
    pm.name
FROM payments p 
JOIN clients c 
	USING (client_id)
JOIN payment_methods pm
	ON p.payment_method = pm.payment_method_id

SQL中的`ORDER BY`子句用于对查询结果进行排序,可以根据一个或多个列的值以升序(`ASC`)或降序(`DESC`)排列数据。为了确保查询结果的可预测性和一致性,`ORDER BY`的使用需要遵循一些最佳实践。 当使用`TOP`子句(在MySQL中为`LIMIT`)来限制返回的行数时,如果没有明确的`ORDER BY`子句数据库引擎可能会根据执行计划返回任意行。这可能导致在不同时间点执行相同查询时得到不一致的结果,尤其是在数据频繁更新的表中。因此,在使用`TOP`或`LIMIT`时,推荐结合`ORDER BY`以确保结果集的稳定性[^1]。 在复杂的数据库环境中,例如使用了分区、集群等特性时,`ORDER BY`还可能影响到查询性能和资源消耗。MySQL内部会利用主键字段进行一些隐式的优化操作,这些操作在涉及排序时可能会对性能产生影响。因此,在设计查询时应充分考虑索引的使用,特别是当排序字段上有合适的索引时,可以显著提高查询效率[^2]。 对于大数据量的表,尤其是包含`VARCHAR`、`TEXT`、`BLOB`等变长字段的“动态”表,`ORDER BY`操作可能会导致额外的内存或磁盘I/O开销,因为这些类型的列通常无法直接在内存中完成排序[^4]。为了避免性能问题,建议在查询中仅选择必要的列,并尽量避免对大文本字段进行排序。 以下是一个使用`ORDER BY`结合`LIMIT`实现随机选择的示例: ```sql SELECT * FROM table_name ORDER BY RAND() LIMIT 1; ``` 虽然这种方法简单直观,但它并不高效,尤其是对于大型表。更好的做法是生成一个介于0和结果总数之间的随机数,并将其用作偏移量[^3]: ```sql SET @offset = FLOOR(RAND() * (SELECT COUNT(*) FROM table_name)); PREPARE stmt FROM 'SELECT * FROM table_name ORDER BY id LIMIT ?, 1'; EXECUTE stmt USING @offset; DEALLOCATE PREPARE stmt; ``` 此方法减少了不必要的全表扫描和排序操作,从而提高了查询效率。 ### 最佳实践总结 - **始终与`TOP`/`LIMIT`一起使用`ORDER BY`**:确保每次执行查询时都能获得一致的结果。 - **合理利用索引**:为排序字段创建索引可以极大地提升查询速度。 - **避免对变长字段排序**:尽量减少对`VARCHAR`、`TEXT`等字段的排序操作,以降低资源消耗。 - **谨慎处理随机选择**:采用更高效的随机选取策略,如基于偏移量的方法。 遵循这些最佳实践可以帮助编写出更加高效且可靠的SQL查询。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值