1 笛卡尔积
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
下面一张图很好解释了笛卡尔积:
笛卡尔积
2 数据准备
- 创建两张表:
t1
和t2
CREATE TABLE t1 ( id INT PRIMARY KEY, person VARCHAR(50) NOT NULL ); CREATE TABLE t2 ( id VARCHAR(50) PRIMARY KEY, person VARCHAR(50) NOT NULL );
- 插入数据
INSERT INTO t1(id, person) VALUES(1,'小明'), (2,'小红'), (3,'小强'); INSERT INTO t2(id, person) VALUES('A','小明'), ('B','小红'), ('C','小刚');
表t1
和t2
中的数据如下:
数据
3 CROSS JOIN
笛卡尔积就是将表1的每条记录与表2中的每一条记录拼成数据对,CROSS JOIN
的SQL执行语句如下:
SELECT t1.id, t2.id FROM t1 CROSS JOIN t2;
执行结果如下:
执行结果
下图解释了表t1
和t2
之间的笛卡尔积操作:
笛卡尔积
4 INNER JOIN
内连接就是求两个表的交集,从笛卡尔积的角度讲就是从笛卡尔积中选出满足某条件的记录,下面是一个内连接的例子:
SELECT t1.id, t2.id FROM t1 INNER JOIN t2 ON t1.person = t2.person;
执行结果如下:
下图解释了表t1
和t2
之间的内连接操作:
内连接
5 LEFT JOIN
左连接(LEFT JOIN
)的含义就是求两个表的交集外加左表剩下的数据。从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录:
SELECT t1.id, t2.id FROM t1 LEFT JOIN t2 ON t1.person = t2.person
执行结果
下图解释了表t1
和t2
之间的左连接操作:
左连接
6 RIGHT JOIN
右连接RIGHT JOIN
就是求两个表的交集外加右表剩下的数据。再次从笛卡尔积的角度描述,右连接就是从笛卡尔积中挑出ON
子句条件成立的记录,然后加上右表中剩余的记录:
SELECT t1.id, t2.id FROM t1 RIGHT JOIN t2 on t1.person = t2.person
执行结果
下图解释了表t1
和t2
之间的右连接操作:
右连接