关键字:基表, 匹配, 笛卡尔积
交叉连接
交叉连接(cross join):不带on子句,返回的是两表的乘积,也叫笛卡尔积
有两种,显式的和隐式的,(只是SQL书写方式不同而已)
两张原始表
person 表:人员表,包括主键ID, 姓名name
order表:人员喜欢的食物表,包括主键ID, 食物Food, person_id,
交叉连接后(行数是 3*4)
隐式SQL
SELECT o.* , p.* From order as o , person as p
显示SQL (使用CORSS JOIN)
SELECT o.* , p.* From order as o cross join person as p
内连接
a.内连接
内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
内连接的语法如下:
select fieldlist from table1 [inner] join table2 on table1.column = table2.column
例子
select p.* , o.* from person p inner join order o on p.id = o.person_id
结果如下(及从两表的笛卡尔积中选出 符合on后面条件 的行)
外连接
外连接分为三种:左外连接,右外连接,全外连接。对应SQL:LEFT/RIGHT/FULL OUTER JOIN。
在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。如果基表的数据在另一张表没有记录。那么在相关联的结果集行中列显示为空值(NULL)。
左连接
select p.* , o.* from person p left join order o on p.id = o.id
可以这样去考虑,第一步取出person的第一行,匹配oder表所有行,如果满足 on条件, 则匹配上,如下结果得到两条记录
第二步:用person表的第二行重复第一步的操作,结果也是有两条可以匹配。
第三步:用person表的第三行重复第一步的操作,但是没有一条匹配上。结果会是这样的,如下图
所以最后的结果是5条