SQL的几种连接:内连接、左连接、右连接、全连接、交叉连接

这篇文章专门为小女友写的,我们家罗妹子测试一枚,可能最近在现在的公司呆着不爽就想换工作,在面试的几家公司都有问数据库方面的知识或笔试题,可是我家妹子在他们公司都是用navicat管理工具查数据的,基本上也不会写SQL语句,所以在接下来的面试基本都没有拿到 offer,妹子面试了几天可郁闷坏了,最后让我教他基本的SQL语句,ε=(´ο`*)))唉….我只想说现在没有几把刷子连测试的工作都不好找了,作为一个高质量的男票外加一枚程序员的我只能败在她的石榴裙下了,哈哈….此处省略一万字……..


准备工作(数据库表)

这里先准备两张表 Agent:代理商标 Sales:销售人员表
SQL的几种连接:内连接、左连接、右连接、全连接、交叉连接


运算符

等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
不等值连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。


内连接( inner join )

内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。

第一种SQL语句:SELECT * FROM Agent AS a , Sales AS s WHERE a.A# = s.A#
第二种SQL语句:SELECT * FROM Agent AS a INNER JOIN Sales AS s ON a.A# = s.A#
第三种SQL语句:SELECT * FROM Agent AS a JOIN Sales AS s ON a.A# = s.A#
其连接结果如下图,是按照a.A#= s.A#进行连接。
SQL的几种连接:内连接、左连接、右连接、全连接、交叉连接


外连接

左连接( left join )

全称是 左外连接(left outer join),是外连接中的一种。left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的。换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID)。B表记录不足的地方均为null。

SQL语句:SELECT * FROM Agent AS a LEFT JOIN Sales AS s ON a.A# = s.A#
其连接结果如下图,是按照a.A#= s.A#进行连接。
SQL的几种连接:内连接、左连接、右连接、全连接、交叉连接

右连接( right join )

全称是 右外连接(right outer join) ,是以B表的记录为基础的,A可以看成左表,B可以看成右表,right join是以右表为准的。换句话说,右表(B)的记录将会全部表示出来,而左表(A)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID)。A表记录不足的地方均为null。

SQL语句:SELECT * FROM Agent AS a RIGHT JOIN Sales AS s ON a.A# = s.A#
其连接结果如下图,是按照a.A#= s.A#进行连接。
SQL的几种连接:内连接、左连接、右连接、全连接、交叉连接

全连接 ( full join )

存在匹配,匹配显示;同时,将各个表中不匹配的数据与空数据行匹配进行显示。可以看成是左外连接与右外连接的并集。full join 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 “Persons” 中的行在表 “Orders” 中没有匹配,或者如果 “Orders” 中的行在表 “Persons” 中没有匹配,这些行同样会列出。

SQL语句:SELECT * FROM Agent AS a FULL JOIN Sales AS s ON a.A# = s.A#
其连接结果如下图,是按照a.A#= s.A#进行连接。
SQL的几种连接:内连接、左连接、右连接、全连接、交叉连接


交叉联接( cross join )

交叉联接也称作笛卡尔集,返回的记录数为两个表的记录数乘积,将A表的所有行分别与B表的所有行进行连接。

SQL语句:SELECT * FROM Agent AS a CROSS JOIN Sales AS s
其连接结果如下图,是按照a.A#= s.A#进行连接。
SQL的几种连接:内连接、左连接、右连接、全连接、交叉连接