3

我目前得到这个查询:

SELECT 
    location.street, 
    location.zip, 
    location.city, 
    surface, 
    price_buy, 
    price_rental 
FROM buildings 
JOIN location 
    ON building.location_id = location.location_id 
WHERE surface > 1000

期望的行为(在性能方面)将是:

  1. buildings从with 中过滤掉所有结果surface > 1000
  2. 检索与剩余条目location对应的数据。buildings

我的查询目前正在这样做吗?从语法上讲,我希望 theWHERE需要在 之前JOIN,但这甚至可能吗?MySQL 本身是否进行了任何优化,如果是,那么相同的优化是否适用于所有 SQL 语言?

4

2 回答 2

6

首先,您的查询与您想要的相反 - 它过滤掉(即删除)表面<= 1000的建筑物。

从语法上讲,我希望 WHERE 需要在 JOIN 之前,但这甚至可能吗?

不,你的语法很好。连接首先出现的原因是因为它们确定要查询的表和关系;只有在你完成之后,你才指定你想要和不想要的行。

SQL 语法的形式允许查询优化器理解你的意思(只要你

MySQL 本身是否进行了任何优化,如果是,那么相同的优化是否适用于所有 SQL 语言?

是的,MySQL(以及几乎所有 SQL 数据库引擎)都包含一个查询优化器,它将您的 SQL 转换为特定的指令。从概念上讲,SQL 是一种声明性语言——你告诉计算机你想要实现什么,它应该找出最有效的方式来实现它——这与命令式编程(PHP、C、Ruby 等)形成对比,其中你明确地告诉计算机要做什么,以及按照什么顺序。

您可以通过EXPLAIN了解它的工作方式。

从性能的角度来看,连接的顺序和 where 子句不应该产生影响(尽管我见过一些数据库并不总是如此);但是,表的索引策略会产生巨大的影响。坏消息是,这在数据库引擎之间确实会有所不同。

于 2013-09-12T13:19:55.983 回答
0

如果您想要剩余的建筑物,请将 WHERE 子句设置为相反:surface <= 1000。这将返回不合适的记录。

于 2013-09-12T13:19:11.010 回答