`
bupter520
  • 浏览: 54239 次
  • 性别: Icon_minigender_2
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

表连接查询INNER JOIN/OUTER JOIN/CROSS JOIN

阅读更多


多表查询常涉及到到表连接的问题,主要涉及到内连接:
INNER JOIN,外连接:LEFT JOIN(or LEFT OUTER JOIN),RIGHT JOIN(or RIGHT OUTER JOIN),FULL JOIN和交叉连接:CROSS JOININNER JOIN也叫等值链接。内连接具有排他性,而OUTER JOIN却是包容性的。

表连接进行查询都是会产生一张中间的临时表,然后再将这张临时表返回给用户。通用的SQL语句:SELECT (待查询字段名) FROM 表一 (JOIN TYPE) 表二ON (JOIN CONDITION) [其他对临时表记录进行过滤的条件]

几种连接方式查询结果区别大致如下:

INNER JOIN:只返回两个表中连接字段相同的行(即符合条件的行);

LEFT JOIN: 返回包括左表中的所有记录和右表中联结字段相等的记录;

RIGHT JOIN: 返回包括右表中的所有记录和左表中联结字段相等的记录;

FULL JOIN:两个连接表的所有记录;

CROSS JOIN:不带WHERE子句,返回所有数据行的笛卡尔乘积.

           

表一:TAB_EMP

ID

EMP_NAME

DEPT

1

Eric Huang

1

2

Alice

3

3

Peter

1

4

Green

 

 

表二:TAB_DEPT

ID

DEPT_NAME

1

研发部

2

财务部

3

国际事业部

4

综合管理部

5

销售部

 

INNER JOIN 方式:

SQL>SELECT t1.emp_name, t2.dept_name FROM tab_emp t1 INNER JOIN tab_dept t2 ON t1.dept=t2.id;

执行结果:



 

分析:可以看出采用INNER JOIN方式时,只会列出满足连接条件的记录;

 

LEFT JOIN 方式:

SQL>SELECT t1.emp_name, t2.dept_name FROM tab_emp t1 LEFT JOIN tab_dept t2 ON t1.dept=t2.id;

执行结果:



 

 

分析:可以看出采用LEFT JOIN方式时,左表中的记录和右表中联结字段相等的记录会全部列出,而右表中连接字段不相等的字段全部为null

 

RIGHT JOIN 方式:

SQL>SELECT t1.emp_name, t2.dept_name FROM tab_emp t1 RIGHT JOIN tab_dept t2 ON t1.dept=t2.id;

执行结果:



 

 

分析:可以看出采用RIGHT JOIN方式时,返回包括右表中的所有记录和左表中联结字段相等的记录;,若左表中连接字段不相等的字段全部为null

 

FULL JOIN 方式:

SQL>SELECT t1.emp_name, t2.dept_name FROM tab_emp t1 FULL JOIN tab_dept t2 ON t1.dept=t2.id;

执行结果:



 

 

分析:可以看出采用FULL JOIN方式时,左表的所有记录会全部返回,右表的所有记录也会全部返回,匹配的就直接列出,不匹配的某一边的记录值为null就行;

 

CROSS JOIN方式:

值得注意的是该方式语法上和其他几种有点差别,不能用on子句。

SELECT * FROM [表一] CROSS JOIN [表二] 或者

SELECT * FROM [表一], [表二]

SQL> SELECT t1.emp_name, t2.dept_name FROM tab_emp t1 CROSS JOIN tab_dept t2;



 

分析:最后返回的记录数实际上就是两张表记录数的乘积。该类型的JOIN句法不需要连接条件,一个表中的所有行分别都会连接另一个表的所有行,得到的结果被称为一个笛卡尔积。

 

            最后总结一下,实际项目开发中CROSS JOIN用得比较少,它是不能使用ON关键字的,其它都要用。一般先进行连接获取到需要的新表数据,然后使用其他子句如where子句进行过滤,group by子句进行聚合,order by子句进行排序等等操作。

采用JOIN方式多表连接查询时,如果如果用到了GROUP BYGROUP BY 的排序顺序必须和SELECT中列出的字段顺序的一致. 这可能是由于GROUP BY 决定了表的排序方式, 如果是左外连接, 如果右边没有对应的话,还要填补空值. 如果排序方式对应不起来, 就会错乱。

  • 大小: 2.2 KB
  • 大小: 2.3 KB
  • 大小: 2.9 KB
  • 大小: 3.2 KB
  • 大小: 7.7 KB
1
0
分享到:
评论
2 楼 javaeyetodj 2010-11-08  
学习了理解了 
1 楼 zl-2577 2010-08-17  
不错,说的很详细。

相关推荐

    SQL联合查询inner join、outer join和cross join的区别详解

    对于开发使用到数据库的应用,免不了就要使用联合查询,SQL中常用的联合查询有inner join、outer join和cross join;这三者的区别很多人都应该不是很清楚,包括我自己,下面我们一起来看看,如果你使用join连表,...

    inner join-outer join-cross join查询方式总结

    表连接 内连接 外连接 交叉连接表连接 内连接 外连接 交叉连接表连接 内连接 外连接 交叉连接

    SQL中inner join、outer join和cross join的区别

    对于SQL中inner join、outer join和cross join的区别很多人不知道,我也是别人问起,才查找资料看了下,跟自己之前的认识差不多,如果你使用join连表,缺陷的情况下是inner join,另外,开发中使用的left join和right...

    join on 语句及扩展

    Join on/inner join on/full join on/full outer join on/left join on/right join on/cross join on; 在使用jion时,on和where条件的区别;

    SQL多表连接查询、多表关联

    sql多表连接查询inner join, left join , right join ,full join ,cross join Posted on 2008-05-07 21:55 我开始懂了 阅读(21431) 评论(9) 编辑 收藏 inner join,full outer join,left join,right jion 内部连接 ...

    sql中join总结

    SQL中大概有这么几种JOIN:cross joininner joinleft outer joinright outer joinfull outer join他们都是基于cross join(笛卡尔乘积),举例说明

    MySQL中基本的多表连接查询教程

    一、多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用’,’ 如:  由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用...

    数据库连接表查询

    数据库连接表查询 一、交叉连接(CROSS JOIN) 二、内连接(INNER JOIN) 三、外连接(OUTER JOIN)

    MySQL多表查询(四).pdf

    内连接(INNER JOIN):使用内连接合并两个或多个表的行。 外连接(OUTER JOIN):包括左外连接、右外连接和全外连接的使用。 交叉连接(CROSS JOIN):理解交叉连接的概念和使用场景。 自连接(SELF JOIN):在一个...

    Oracle 数据库连接查询SQL语句

    左连接 (left [outer] join) 左外连接就是将左表的所有数据分别于右表的每条数据进行连接组合,返回的结果除内连接的数据外,还有左表中不符合条件的数据,并在右表的相应列中填上null值。 SQL语句如下: select * ...

    SQL语句多表查询

    一、外连接 1、左连接 left join 或 left outer join 2、右连接 right join 或 right outer join ...二、内连接 join 或 inner join 三、交叉连接 cross join 四、两表关系为一对多,多对一或多对多时的连接语句

    LINQ to SQL语句之Join和Order By

    SELECT [t0].[FirstName], [t0].[LastName], [t2].[TerritoryDescription] FROM [dbo].[Employees] AS [t0] CROSS JOIN [dbo].[EmployeeTerritories] AS [t1] INNER JOIN [dbo].[Territories] AS [t2] ON [t2]....

    SQL Server数据库技术大全 电子书

    2.3.4 交叉联接(CROSS JOIN)/40 2.3.5 联接的替代写法/40 2.3.6 联合(UNION)/41 2.4 SQL数据类型/42 2.4.1 精确数字类型/43 2.4.2 近似数字类型/43 2.4.3 字符串类型/43 2.4.4 Unicode字符串类型/44 2.4.5 二...

    sql 外联、内联简单的例子

    INNER JOIN 仅对满足连接条件的CROSS中的列 LEFT OUTER JOIN 一个表满足条件的行,和另一个表的所有行 RIGHT OUTER JOIN 与LEFT相同,但两个表的角色互换 FULL OUTER JOIN LEFT OUTER 和 RIGHT OUTER中所有行的超集

    精通SQL数据库连接.doc

    FULL OUTER JOIN ( Product CROSS JOIN Color ) ON Catalog.item = Product.item AND Catalog.item_color = Color.color_name;   成为数据库专家 JOIN声明可以有效地找到你所需要的信息并避免带来麻烦。通过使用...

    你真的会玩SQL吗?内连接、外连接

     交叉联接 得到所连接表的所有组合 (笛卡儿集)cross join  内联接得到连接表的满足条件的记录组合inner join on  外联接(左、右)得到一个表的所有行,及其余表满 足连接条件的行 full | left | right ...

    精通SQL 结构化查询语言详解

    9.5 表连接的其他应用及注意问题  9.5.1 连接表进行聚合运算  9.5.2 多表连接的综合运用  9.5.3 多表连接注意事项  第10章 子查询  10.1 创建和使用返回单值的子查询  10.1.1 在多表查询中使用子查询...

    精通SQL--结构化查询语言详解

    9.5 表连接的其他应用及注意问题 183 9.5.1 连接表进行聚合运算 183 9.5.2 多表连接的综合运用 185 9.5.3 多表连接注意事项 186 第10章 子查询 187 10.1 创建和使用返回单值的子查询 187 10.1.1 在多表查询中...

    MySQL多表查询详解下

    JOIN 表2 别名 ON 链接条件 【WHERE 筛选条件】 【GROUP BY 分组】 【HAVING 筛选条件】 【ORDER BY 排序列表ASC|DESC】 分类(连接类型): 内连接(★): INNER 外联结 左外(★):LEFT 【OUTER】 右外(★):...

Global site tag (gtag.js) - Google Analytics