Knowledge

笛卡尔积

笛卡尔乘积–数学中, 两个集合 X 和 Y 的笛卡尔积(Certersian product), 表示为 X * Y, 所有的有序对集合.

例如, 对于A={a,b}, B={0,1,2}, 则笛卡尔积结果为:

1
2
A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

注意, 他们是有序的.

Cross Join

说明

“交叉连接”-无法用”文式图”进行表示, 其结果就是1.1所述的”笛卡尔积”的结果, 一般而言不会做该查询, 性能消耗过于巨大.

例如对于两个表 A(10000条数据), B(100条数据), 则查询时会产生10000 * 100条记录, 这对于仅仅想获取 B 中某一个记录的 SQL 来说过于巨大.

cross-join

命令

1
2
SELECT * FROM TableA CROSS JOIN TableB;
SELECT * FROM TableA, TableB;

Inner Join

说明

“内连接”, 即数学中的交集, 从另外一个角度考虑: 内连接 = 交叉连接 + 限制条件.

实际上在有些 DB Server中, 可以通过”交叉连接”语句 + where限制条件达到和”内连接”语句一样的效果, 反之同理, 但是在通用DB Server中不会顺利执行.

format

1
2
SELECT * FROM TableA INNER JOIN TableB ON <condition>;
SELECT * FROM TableA JOIN TableB on <condition>;

等值连接

命令: SELECT * FROM T1 INNER JOIN T2 ON T1.id = T2.id;

equal-join

不等值连接

命令: SELECT * FROM T1 INNER JOIN T2 ON T1.count > T2.count;

un-equal-join

自连接

使用场景: 操作对象只有一个表, 自己连接自己, 例如一张存放推荐人与被推荐人的, A是 B 的推荐人, 同时 A 也可能是C 的推荐人, 此时可能会涉及自连接查询.

Outer Join

Left Outer Join

说明: Left Join = Inner Join + 左侧表不符合连接条件的所有记录

format:

1
2
SELECT * FROM T1 LEFT OUTER JOIN T2 ON <condition>;
SELECT * FROM T1 LEFT JOIN T2 ON <condition>;

Left Join

Negation Right Join

通过限定条件, 获取Right Outer Join的非集.

命令: SELECT * FROM T1 LEFT JOIN T2 ON T1.id=T2.id where T2.id is null;

right join

Right Outer Join

同 Left Outer Join相反.

MY Left Join

见4.2节

Union

Union

说明: 将前后两项查询集累加在一起, 必须确保前后两项的查询项相等, 查询项个数相等, 自动合并相等的项.

Union: ELECT column_name(s) from T1 UNION SELECT column_name(s) from T2;

Union All

不自动合并相等的项, 其他等同于union查询.

Full Join

Intro

Mysql不支持全连接查询, 但是可以通过 left outer join + right outer join + union来实现全连接, 即数学意义上”去重复并集”.

Full Join

1
2
3
SELECT * FROM T1 LEFT JOIN T2 ON T1.id=T2.id
union
SELECT * FROM T1 RIGHT JOIN T2 ON T1.id=T2.id;

Negation Union Set

1
2
3
SELECT * FROM T1 LEFT JOIN T2 ON T1.id=T2.id where T2.id is null(获取T1独有的元素)
UNION
SELECT * FROM T1 RIGHT JOIN T2 ON T1.id=T2.id where T1.id is null(获取 T2独有的元素)