语法树专题
第 1 题:基础双表连接
【题目描述】
- 表结构:学生表 $Student(Sno, Sname, Sage)$,选课表 $SC(Sno, Cno, Grade)$
- SQL 语句:
1 | SELECT Grade |
【1. 未优化语法树】
- 逻辑:先笛卡尔积,再统一筛选。
1 | [π] Grade |
【2. 优化后语法树】
- 逻辑:Sname 条件下沉,$\times$ 变 $\bowtie$。
1 | [π] Grade |
第 2 题:经典三表连接
【题目描述】
- 表结构:职工 $Emp(Eno, DeptNo)$,部门 $Dept(DeptNo, Dname)$,项目 $Project(Pno, Eno)$
- SQL 语句:
1 | SELECT Pno |
【1. 未优化语法树】
- 逻辑:三表强行笛卡尔积,顶层做大筛选。
1 | [π] Pno |
【2. 优化后语法树】
- 逻辑:先筛 Dept,再向上逐层连接。
1 | [π] Pno |
第 3 题:涉及多表的多重筛选
【题目描述】
- 表结构:订单 $Order(Ono, Cno, Date)$,客户 $Customer(Cno, City)$
- SQL 语句:
1 | SELECT Ono, Date |
【1. 未优化语法树】
1 | [π] Ono, Date |
【2. 优化后语法树】
- 逻辑:两边各筛各的(Order筛日期,Customer筛城市),最后再连接。
1 | [π] Ono, Date |
第 4 题:投影与选择的结合
【题目描述】
- 表结构:教师 $T(Tno, Tname)$,课程 $C(Cno, Cname, Tno)$
- SQL 语句:
1 | SELECT Tname |
【1. 未优化语法树】
1 | [π] Tname |
【2. 优化后语法树】
- 逻辑:Cname 条件下沉。
1 | [π] Tname |
第 5 题:逻辑推导(传递性)
【题目描述】
- 表结构:表 $A(a1, a2)$,表 $B(b1, b2)$
- SQL 语句:
1 | SELECT a1 |
【1. 未优化语法树】
- 注意:这里只写 SQL 原话。
1 | [π] a1 |
【2. 优化后语法树】
- 逻辑:既然 A.a2=B.b2 且 A.a2>100,那么 B.b2 一定也大于 100。利用这个隐含条件,把 B 表也先筛一遍。
1 | [π] a1 |
总结
1. 怎么画“未优化树”?
考试时,未优化的树是送分题,一定要画成**“倒挂的T型结构”**:
- 底部:把所有表列出来。
- 连接:用 $\times$ 把它们全部连起来。
- 中间:在最上面的 $\times$ 头上画一个 $\sigma$,把
WHERE后面所有的条件抄进去。 - 顶部:画一个 $\pi$,写上
SELECT后面的列名。
2. 怎么画“优化树”?
- 分家:把 $\sigma$ 里的条件拆开。
- 下沉:
- 如果是
Table.Col = 'Value'这种条件,直接沉到对应的表头顶。 - 如果是
A.id = B.id这种连接条件,变成 $\bowtie$,放在 A 和 B 汇合的地方。
- 如果是
- 推导:如果看到
A=B且A>10,记得给 B 也加上B>10的筛选。