JOIN对于接触过数据库的人,这个词都不陌生,而且很多人很清楚各种JOIN,还有很多人对这个理解也不是很透彻。
假设我们有两个表,Table_A和Table_B。这两个表中的数据如下所示:

TABLE_A  PK Value---- ----------   1 FOX   2 COP   3 TAXI   6 WASHINGTON   7 DELL   5 ARIZONA   4 LINCOLN  10 LUCENTTABLE_B  PK Value---- ----------   1 TROT   2 CAR   3 CAB   6 MONUMENT   7 PC   8 MICROSOFT   9 APPLE  11 SCOTCH

Join 语法:

join_table:    table_reference JOIN table_factor [join_condition]                                          //内连接  | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition               //外连接  | table_reference LEFT SEMI JOIN table_reference join_condition                               //左半连接  | table_reference CROSS JOIN table_reference [join_condition] (as of Hive 0.10)table_reference:    table_factor                    //表  | join_table                      //join语句table_factor:    tbl_name [alias]                //表名[别名]  | table_subquery alias            //子查寻[别名]  | ( table_references )            //带空号的table_referencejoin_condition:    ON expression                   //on开头的条件语句
1、Inner JOIN: (内连接)

在这里插入图片描述
这是最简单、最容易理解的连接,也是最常见的连接。此查询将返回左表(表A)中具有右表(表B)中匹配记录的所有记录。此连接写成如下:

SELECT <select_list> FROM Table_A AINNER JOIN Table_B BON A.Key = B.Key
-- Inner JOINSELECT A.PK AS A_PK, A.Value AS A_Value,       B.Value AS B_Value, B.PK AS B_PKFROM Table_A AINNER JOIN Table_B BON A.PK = B.PKA_PK A_Value    B_Value    B_PK---- ---------- ---------- ----   1 FOX        TROT          1   2 COP        CAR           2   3 TAXI       CAB           3   6 WASHINGTON MONUMENT      6   7 DELL       PC            7(5 row(s) affected)
2、Left JOIN: (左连接)

在这里插入图片描述
此查询将返回左表(表A)中的所有记录,而不管这些记录是否与右表(表B)中的任何记录匹配。它还将从正确的表中返回任何匹配的记录。此连接写成如下:

SELECT <select_list>FROM Table_A ALEFT JOIN Table_B BON A.Key = B.Key
-- Left JOINSELECT A.PK AS A_PK, A.Value AS A_Value,B.Value AS B_Value, B.PK AS B_PKFROM Table_A ALEFT JOIN Table_B BON A.PK = B.PKA_PK A_Value    B_Value    B_PK---- ---------- ---------- ----   1 FOX        TROT          1   2 COP        CAR           2   3 TAXI       CAB           3   4 LINCOLN    NULL       NULL   5 ARIZONA    NULL       NULL   6 WASHINGTON MONUMENT      6   7 DELL       PC            7  10 LUCENT     NULL       NULL(8 row(s) affected)
3、Left Excluding JOIN: (左连接排除内连接结果)

此查询将返回左表(表A)中与右表(表B)中的任何记录都不匹配的所有记录。此连接写成如下:
在这里插入图片描述

SELECT <select_list> FROM Table_A ALEFT JOIN Table_B BON A.Key = B.KeyWHERE B.Key IS NULL
-- Left Excluding JOINSELECT A.PK AS A_PK, A.Value AS A_Value,B.Value AS B_Value, B.PK AS B_PKFROM Table_A ALEFT JOIN Table_B BON A.PK = B.PKWHERE B.PK IS NULLA_PK A_Value    B_Value    B_PK---- ---------- ---------- ----   4 LINCOLN    NULL       NULL   5 ARIZONA    NULL       NULL  10 LUCENT     NULL       NULL(3 row(s) affected)
4、Right JOIN: (右连接)

在这里插入图片描述
此查询将返回右表(表B)中的所有记录,而不管这些记录中是否有任何记录与左表(表A)中的记录相匹配。它还将返回左表中的任何匹配记录。此连接写成如下:

SELECT <select_list>FROM Table_A ARIGHT JOIN Table_B BON A.Key = B.Key
-- Right JOINSELECT A.PK AS A_PK, A.Value AS A_Value,B.Value AS B_Value, B.PK AS B_PKFROM Table_A ARIGHT JOIN Table_B BON A.PK = B.PKA_PK A_Value    B_Value    B_PK---- ---------- ---------- ----   1 FOX        TROT          1   2 COP        CAR           2   3 TAXI       CAB           3   6 WASHINGTON MONUMENT      6   7 DELL       PC            7NULL NULL       MICROSOFT     8NULL NULL       APPLE         9NULL NULL       SCOTCH       11(8 row(s) affected)
5、Right Excluding JOIN: (右连接排除内连接结果)

在这里插入图片描述
此查询将返回右表(表B)中与左表(表A)中的任何记录都不匹配的所有记录。此连接写成如下:

SELECT <select_list>FROM Table_A ARIGHT JOIN Table_B BON A.Key = B.KeyWHERE A.Key IS NULL
-- Right Excluding JOINSELECT A.PK AS A_PK, A.Value AS A_Value,B.Value AS B_Value, B.PK AS B_PKFROM Table_A ARIGHT JOIN Table_B BON A.PK = B.PKWHERE A.PK IS NULLA_PK A_Value    B_Value    B_PK---- ---------- ---------- ----NULL NULL       MICROSOFT     8NULL NULL       APPLE         9NULL NULL       SCOTCH       11(3 row(s) affected)
6、Outer JOIN: (外连接)

在这里插入图片描述
此联接也可以称为完全外联接或完全联接。此查询将返回两个表中的所有记录,连接左表(表A)中与右表(表B)中的记录相匹配的记录。此连接写成如下:

SELECT <select_list>FROM Table_A AFULL OUTER JOIN Table_B BON A.Key = B.Key
-- Outer JOINSELECT A.PK AS A_PK, A.Value AS A_Value,B.Value AS B_Value, B.PK AS B_PKFROM Table_A AFULL OUTER JOIN Table_B BON A.PK = B.PKA_PK A_Value    B_Value    B_PK---- ---------- ---------- ----   1 FOX        TROT          1   2 COP        CAR           2   3 TAXI       CAB           3   6 WASHINGTON MONUMENT      6   7 DELL       PC            7NULL NULL       MICROSOFT     8NULL NULL       APPLE         9NULL NULL       SCOTCH       11   5 ARIZONA    NULL       NULL   4 LINCOLN    NULL       NULL  10 LUCENT     NULL       NULL(11 row(s) affected)
7、Outer Excluding JOIN: (外连接排除内连接结果)

在这里插入图片描述
此查询将返回左表(表A)中的所有记录和右表(表B)中不匹配的所有记录。我还不需要使用这种类型的联接,但所有其他类型的联接我都相当频繁地使用。此连接写成如下:

SELECT <select_list>FROM Table_A AFULL OUTER JOIN Table_B BON A.Key = B.KeyWHERE A.Key IS NULL OR B.Key IS NULL
-- Outer Excluding JOINSELECT A.PK AS A_PK, A.Value AS A_Value,B.Value AS B_Value, B.PK AS B_PKFROM Table_A AFULL OUTER JOIN Table_B BON A.PK = B.PKWHERE A.PK IS NULLOR B.PK IS NULLA_PK A_Value    B_Value    B_PK---- ---------- ---------- ----NULL NULL       MICROSOFT     8NULL NULL       APPLE         9NULL NULL       SCOTCH       11   5 ARIZONA    NULL       NULL   4 LINCOLN    NULL       NULL  10 LUCENT     NULL       NULL(6 row(s) affected)

注意,在外部联接上,首先返回内部连接记录,然后返回右连接记录,最后返回左连接记录(至少,我的Microsoft SQL Server就是这样做的;当然,这不需要使用任何ORDERBY语句)。您可以访问维基百科文章以获得更多信息(但是,条目不是图形化的)。我还创建了一个备忘单,您可以在需要时打印出来。如果您右键单击下面的图像并选择“将目标保存为.”,您将下载完整大小的图像。
SQL-JOINS用法说明

更多相关文章

  1. SQL语句类别
  2. mysqli不执行Select语句
  3. 什么是客户端准备语句?
  4. mysqli类使用预处理语句不返回任何数据
  5. PHP实现字符串转换成查询语句
  6. Mysql数据库四大特性、事物的四个隔离、基本MySQL语句、独立表空
  7. 为什么准备好的语句由每个会话管理?
  8. MYSQL必知必会-SQL语句查询
  9. MySQL-数据库安装及基本SQL语句

随机推荐

  1. Android输入系统(三):加载按键映射
  2. Android:(10)如何安装卸载的应用程序解析
  3. [置顶] Android android:gravity和androi
  4. Android(Lollipop/5.0) Material Design(
  5. android指纹识别、拼图游戏、仿MIUI长截
  6. Android(安卓)studio 通过以servlet搭建
  7. Android多语言布局layout
  8. Google Android手机操作系统发展历程[信
  9. Android相对布局属性
  10. flutter 与 android 混合开发 以及 Andro