gpt4 book ai didi

mysql - 以下哪个查询被优化/首选

转载 作者:搜寻专家 更新时间:2023-10-30 23:37:55 27 4
gpt4 key购买 nike

考虑两个表表A和表B

表A

|id|driver_id|vehicle_id|is_allowed|license_number|driver_name|

表B

|id|driver_id|vehicle_id|offence|payable_amount|driver_name|

目标:找到名称为 XYZ 的允许驾驶员的 driver_id 和 vehicle_id。

Query1:SELECT * FROM tableA,tableB {join-condition}{filter-condition}

SELECT tableA.driver_id,tableA.vehicle_id FROM tableA,tableB 
WHERE
tableA.driver_id=tableB.driver_id AND
tableA.vehicle_id=tableB.vehicle_id AND
tableA.driver_name='XYZ' AND
tableB.driver_name='XYZ' AND
tableA.is_allowed = 1

Query2:SELECT * FROM (SELECT * FROM tableA {filter-condition}) JOIN (SELECT * FROM tableB {filter-condition}) ON {join-condition}{filter-condition}

SELECT tableAA.driver_id,tableAA.vehicle_id FROM 
(SELECT tableA.driver_id,tableA.vehicle_id from tableA WHERE tableA.driver_name='XYZ' AND
tableA.is_allowed = 1) as tableAA,
JOIN
(SELECT tableB.driver_id,tableB.vehicle_id from tableB WHERE tableB.driver_name='XYZ') as tableBB
ON
tableAA.driver_id=tableBB.driver_id AND
tableAA.vehicle_id=tableBB.vehicle_id

哪种类型的查询是可读的、优化的并且符合标准。

最佳答案

正确的版本应该是这样的:

SELECT a.driver_id, a.vehicle_id
FROM tableA a JOIN
tableB b
ON a.driver_id = b.driver_id AND
a.vehicle_id = b.vehicle_id
WHERE a.driver_name = 'XYZ' AND
b.driver_name = 'XYZ' AND
a.is_allowed = 1;

注意事项:

  • JOIN 被认为是在 FROM 子句中组合表的正确方法。简单规则:永远不要FROM 子句中使用逗号。
  • ON 子句应包含所有包含来自多个表的列的谓词。
  • 首选使用表别名,使查询更易于编写和阅读。
  • 您可能希望使用 INEXISTS,因为您的查询未从 TableB 返回列。
  • 不要在FROM 子句中使用不必要的子查询。在某些数据库(尤其是 MySQL)中,这会阻碍索引的使用并增加中间表具体化的额外开销。

并且,您的问题的答案是第一个版本可能是优化版本(因为它不会不必要地实现子查询)。这两个版本都不是首选。

关于mysql - 以下哪个查询被优化/首选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39307159/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com