目录
前言
参考链接
SQL水平提升
(1)select语句内部的执行顺序
一条完整的 SELECT 语句内部的执行顺序是这样的:
FROM 子句组装数据(包括通过 ON 进行连接);
WHERE 子句进行条件筛选;
GROUP BY 分组;
使用聚集函数进行计算;
HAVING 筛选分组;
计算所有的表达式;
SELECT 的字段;
ORDER BY 排序;
LIMIT 筛选
(2)内连接&笛卡尔积
select * from a,b where a.id = b.id .然后同事说让我写内连接,我说这就是内连接啊。结果同事说这怎么会是内连接,这是笛卡尔乘积。我当时有点惊呆了,在原来公司都是这样写啊,难道这不是内连接,后来百度一下,发现:
(1)select * from a,b 不加条件的话是笛卡尔乘积。
(2)select * from a,b where a.id = b.id 加条件相当于内连接,等价于select * from a inner join b on a.id = b.id,等价于select * from a join b on a.id = b.id
所以据说(1)这种写法并不符合规范,可能只对某些数据库管用,如sqlserver。最好写成inner join的写法。
from a join b 与 from a, b 产生的临时表结果集,都是执行笛卡尔积 即【select * from a cross join b 】两表的行乘积数。
区别:
on : 与取得结果集同步进行数据刷选及过滤。
where : 获得结果集之后,才进行数据刷选及过滤。
详情看本文章(1)select语句内部的执行顺序
(3)Join Ordering
参考文章
德国慕尼黑工业大学网址 | Query Optimization - Chair for Database Systems (tum.de) |
查询优化即将在数据库系统中讨论,本讲座着眼于优化技术的更广泛主题。它侧重于连接排序和访问路径选择等核心问题,但概述了整个查询处理机制。讲座的主要目标是双重的:首先,学习不同的优化技术,这些技术在其他领域也相关。其次,了解查询的处理方式以及为什么查询快或慢。
Query optimization is addressed shortly in Database Systems, this lecture looks at a broader topic of optimization techniques. It concentrates on the central issues like join ordering and access path selections, but gives an overview of the whole query processing machinery. The main goals of the lecture are twofold: First, to learn different optimization techniques, which are also relevant in other areas. And second, to get an understanding how queries are processed and why queries are fast or slow.