深圳罗湖住房和建设局网站官网,门业东莞网站建设技术支持,整站优化的公司,wordpress qux1、内联接#xff08;典型的联接运算#xff0c;使用像 或 之类的比较运算符#xff09;#xff1b;包括相等联接和自然联接#xff1b; 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行#xff1b; 2、外联接。外联接可以是左向外联接、右向… 1、内联接典型的联接运算使用像 或 之类的比较运算符包括相等联接和自然联接 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行 2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。 在 FROM子句中指定外联接时可以由下列几组关键字中的一组指定 1LEFT JOIN或LEFT OUTER JOIN 左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行则在相关联的结果集行中右表的所有选择列表列均为空值。 2RIGHT JOIN 或 RIGHT OUTER JOIN 右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行则将为左表返回空值。 3FULL JOIN 或 FULL OUTER JOIN完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时则另一个表的选择列表列包含空值。如果表之间有匹配行则整个结果集行包含基表的数据值。 3、交叉联接 交叉联接返回左表中的所有行左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。 例子 ------------------------------------------------- a表 id name b表 id job parent_id 1 张3 1 23 1 2 李四 2 34 2 3 王武 3 34 4 a.id同parent_id 存在关系 -------------------------------------------------- 1 内连接 select a.*,b.* from a inner join b on a.idb.parent_id 结果是 1 张3 1 23 1 2 李四 2 34 2 2左连接 select a.*,b.* from a left join b on a.idb.parent_id 结果是 1 张3 1 23 1 2 李四 2 34 2 3 王武 null 3 右连接 select a.*,b.* from a right join b on a.idb.parent_id 结果是 1 张3 1 23 1 2 李四 2 34 2 null 3 34 4 4 完全连接 select a.*,b.* from a full join b on a.idb.parent_id 结果是 1 张3 1 23 1 2 李四 2 34 2 null 3 34 4 3 王武 null 详解 一、交叉连接CROSS JOIN交叉连接CROSS JOIN有两种显式的和隐式的不带ON子句返回的是两表的乘积也叫笛卡尔积。例如下面的语句1和语句2的结果是相同的。 语句1隐式的交叉连接没有CROSS JOIN。SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAMEFROM ORDERS O , CUSTOMERS CWHERE O.ID1; 语句2显式的交叉连接使用CROSS JOIN。SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM ORDERS O CROSS JOIN CUSTOMERS CWHERE O.ID1;语句1和语句2的结果是相同的查询结果如下 二、内连接INNER JOIN内连接INNER JOIN有两种显式的和隐式的返回连接表中符合连接条件和查询条件的数据行。所谓的链接表就是数据库在做查询形成的中间表。例如下面的语句3和语句4的结果是相同的。 语句3隐式的内连接没有INNER JOIN形成的中间表为两个表的笛卡尔积。SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM CUSTOMERS C,ORDERS OWHERE C.IDO.CUSTOMER_ID; 语句4显示的内连接一般称为内连接有INNER JOIN形成的中间表为两个表经过ON条件过滤后的笛卡尔积。SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM CUSTOMERS C INNER JOIN ORDERS O ON C.IDO.CUSTOMER_ID;语句3和语句4的查询结果 三、外连接OUTER JOIN外连不但返回符合连接和查询条件的数据行还返回不符合条件的一些行。外连接分三类左外连接LEFT OUTER JOIN、右外连接RIGHT OUTER JOIN和全外连接FULL OUTER JOIN。三者的共同点是都返回符合连接条件和查询条件即内连接的数据行。不同点如下左外连接还返回左表中不符合连接条件单符合查询条件的数据行。右外连接还返回右表中不符合连接条件单符合查询条件的数据行。全外连接还返回左表中不符合连接条件单符合查询条件的数据行并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集去掉重复即“全外左外 UNION 右外”。说明左表就是在“LEFT OUTER JOIN”关键字左边的表。右表当然就是右边的了。在三种类型的外连接中OUTER 关键字是可省略的。 下面举例说明语句5左外连接LEFT OUTER JOINSELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.IDO.CUSTOMER_ID; 语句6右外连接RIGHT OUTER JOINSELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.IDO.CUSTOMER_ID;注意WHERE条件放在ON后面查询的结果是不一样的。例如 语句7WHERE条件独立。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.IDO.CUSTOMER_IDWHERE O.ORDER_NUMBERMIKE_ORDER001; 语句8将语句7中的WHERE条件放到ON后面。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.IDO.CUSTOMER_ID AND O.ORDER_NUMBERMIKE_ORDER001; 从语句7和语句8查询的结果来看显然是不相同的语句8显示的结果是难以理解的。因此推荐在写连接查询的时候ON后面只跟连接条件而对中间表限制的条件都写到WHERE子句中。语句9全外连接FULL OUTER JOIN。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.IDO.CUSTOMER_ID;注意MySQL是不支持全外的连接的这里给出的写法适合Oracle和DB2。但是可以通过左外和右外求合集来获取全外连接的查询结果。下图是上面SQL在Oracle下执行的结果语句10左外和右外的合集实际上查询结果和语句9是相同的。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.IDO.CUSTOMER_IDUNIONSELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.IDO.CUSTOMER_ID;语句9和语句10的查询结果是相同的如下 四、联合连接UNION JOIN这是一种很少见的连接方式。Oracle、MySQL均不支持其作用是找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能。语句11联合查询UNION JOIN例句还没有找到能执行的SQL环境。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O UNION JOIN CUSTOMERS C ON C.IDO.CUSTOMER_ID语句12语句11在DB2下的等价实现。还不知道DB2是否支持语句11呢SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.IDO.CUSTOMER_IDEXCEPTSELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O INNER JOIN CUSTOMERS C ON C.IDO.CUSTOMER_ID;语句13语句11在Oracle下的等价实现。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.IDO.CUSTOMER_IDMINUSSELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O INNER JOIN CUSTOMERS C ON C.IDO.CUSTOMER_ID;查询结果如下 五、自然连接NATURAL INNER JOIN说真的这种连接查询没有存在的价值既然是SQL2标准中定义的就给出个例子看看吧。自然连接无需指定连接列SQL会检查两个表中是否相同名称的列且假设他们在连接条件中使用并且在连接条件中仅包含一个连接列。不允许使用ON语句不允许指定显示列显示列只能用*表示ORACLE环境下测试的。对于每种连接类型除了交叉连接外均可指定NATURAL。下面给出几个例子。语句14SELECT *FROM ORDERS O NATURAL INNER JOIN CUSTOMERS C; 语句15SELECT *FROM ORDERS O NATURAL LEFT OUTER JOIN CUSTOMERS C; 语句16SELECT *FROM ORDERS O NATURAL RIGHT OUTER JOIN CUSTOMERS C; 语句17SELECT *FROM ORDERS O NATURAL FULL OUTER JOIN CUSTOMERS C; 六、SQL查询的基本原理两种情况介绍。第一、单表查询根据WHERE条件过滤表中的记录形成中间表这个中间表对用户是不可见的然后根据SELECT的选择列选择相应的列进行返回最终结果。第二、两表连接查询对两表求积笛卡尔积并用ON条件和连接连接类型进行过滤形成中间表然后根据WHERE条件过滤中间表的记录并根据SELECT指定的列返回查询结果。第三、多表连接查询先对第一个和第二个表按照两表连接做查询然后用查询结果和第三个表做连接查询以此类推直到所有的表都连接上为止最终形成一个中间的结果表然后根据WHERE条件过滤中间表的记录并根据SELECT指定的列返回查询结果。理解SQL查询的过程是进行SQL优化的理论依据。 七、ON后面的条件ON条件和WHERE条件的区别ON条件是过滤两个链接表笛卡尔积形成中间表的约束条件。WHERE条件在有ON条件的SELECT语句中是过滤中间表的约束条件。在没有ON的单表查询中是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。从这里可以看出将WHERE条件移入ON后面是不恰当的。推荐的做法是ON只进行连接操作WHERE只过滤中间表的记录。 八、总结连接查询是SQL查询的核心连接查询的连接类型选择依据实际需求。如果选择不当非但不能提高查询效率反而会带来一些逻辑错误或者性能低下。下面总结一下两表连接查询选择方式的依据1、 查两表关联列相等的数据用内连接。2、 Col_L是Col_R的子集时用右外连接。3、 Col_R是Col_L的子集时用左外连接。4、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。5、 求差操作的时候用联合查询。多个表查询的时候这些不同的连接类型可以写到一块。例如SELECT T1.C1,T2.CX,T3.CYFROM TAB1 T1 INNER JOIN TAB2 T2 ON (T1.C1T2.C2) INNER JOIN TAB3 T3 ON (T1.C1T2.C3) LEFT OUTER JOIN TAB4 ON(T2.C2T3.C3);WHERE T1.X T3.Y;上面这个SQL查询是多表连接的一个示范 转自http://www.jb51.net/article/39432.htm 转载于:https://www.cnblogs.com/mzzcy/p/7109685.html