您的位置:首页 > 数据库

SQL基础 之 表连接

2015-07-11 10:07 253 查看
关键字:基表, 匹配, 笛卡尔积

交叉连接

交叉连接(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条
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: