这两个过程和上面分析的INNER JOIN一样,但是这时候能否利用上面说的 filter push down的优化呢?根据LEFT OUTER JOIN的语义来讲,答案是否定的。我们手工操作看一下:
- mysql> SELECT * FROM score s WHERE s.score is NULL;
- Empty set (0.00 sec)
第二步: 进行左外链接
- mysql> SELECT
- -> no, name , s.c_no, s.score
- -> FROM student stu LEFT JOIN (SELECT * FROM score s WHERE s.score is NULL) AS s ON sstu.no = s.s_no;
- +------+-------+------+-------+
- | no | name | c_no | score |
- +------+-------+------+-------+
- | S001 | Sunny | NULL | NULL |
- | S002 | Tom | NULL | NULL |
- | S003 | Kevin | NULL | NULL |
- +------+-------+------+-------+
- 3 rows in set (0.00 sec)
我们发现两种写法的结果不一致,第一种写法只返回Tom没有参加考试,是我们预期的。第二种写法返回了Sunny,Tom和Kevin三名同学都没有参加考试,这明显是非预期的查询结果。所有LEFT OUTER JOIN不能利用INNER JOIN的 filter push down优化。
4. RIGHT OUTER JOIN
右外链接语义是返回右表所有行,左边不存在补NULL,如下:
- mysql> SELECT
- -> s.c_no, s.score, no, name
- -> FROM score s RIGHT JOIN student stu ON sstu.no = s.s_no;
- +------+-------+------+-------+
- | c_no | score | no | name |
- +------+-------+------+-------+
- | C01 | 80 | S001 | Sunny |
- | C02 | 98 | S001 | Sunny |
- | C03 | 76 | S001 | Sunny |
- | NULL | NULL | S002 | Tom | -- 左边没有的进行补 NULL
- | C01 | 78 | S003 | Kevin |
- | C02 | 88 | S003 | Kevin |
- | C03 | 68 | S003 | Kevin |
- +------+-------+------+-------+
- 7 rows in set (0.00 sec)
上面右外链接我只是将上面左外链接查询的左右表交换了一下:)。
5. FULL OUTER JOIN
全外链接语义返回左表和右表的并集,不存在一边补NULL,用于演示的MySQL数据库不支持FULL OUTER JOIN。这里不做演示了。
6. SELF JOIN (编辑:云计算网_泰州站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|