参数作用:对 SQL 中的表进行编号
参数特点有 3 个:
- 根据执行顺序的不同,表的编号会变化
- 出现编号相同的情况,执行顺序会由上到下
- 出现编号不同的情况,执行顺序会由大到小
因此,总的执行顺序是,由大到小,由上到下。
规则依据
参数特点的制定依据是笛卡尔积。笛卡尔积会把表格中的每行数据都相乘,组成一张超大的表格。
因此,在得到这张超大表格的过程中,以最小的代价得到相同的结果是优化的主要方向。
从图中可以看到,由行数少的表向行数多的表乘积为笛卡尔积产生的中间数据更少。
因此,最少的中间数据量,能带来最高的运算效率。
代码实例
- 实例 1
目的:查看相同编号的表格执行顺序
执行内容:查询课程编号为 2 或教师证编号为 3 的老师信息
select t.* from teacher t, course c, teacherCard tc where t.tid = c.tid and t.tcid = tc.tcid and (c.cid=2 or tc.tcid=3)
执行结果:
explain 结果:
explain select t.* from teacher t, course c, teacherCard tc where t.tid = c.tid and t.tcid = tc.tcid and (c.cid=2 or tc.tcid=3)
- 实例 2
目的:查看不同编号的表格执行顺序
执行内容:查询教授 SQL 课程的老师的描述
select tc.tcdesc from teacherCard tc, course c, teacher t where c.tid = t.tid and ta.tcid = tc.tcid and c.cname = 'sql'
将多表连接变成子查询,使得编号产生不同的顺序。
select tc.tcdesc from teacherCard tc where tc.tcid = (
select t.tcid from teacher t where t.tid = (
select c.tid from course c where c.cname = 'sql'
)
)
执行结果:
explain 结果:
explain select tc.tcdesc from teacherCard tc where tc.tcid = (
select t.tcid from teacher t where t.tid = (
select c.tid from course c where c.cname = 'sql'))
执行顺序和子查询的嵌套顺序一致,先查内层,再查外层。
如果将多表连接和子查询组合使用,会让 id 值出现相同和不同的,
查询顺序依然是:不同的由大到小,相同的由上到下。