SQL语句中不同的连接JOIN及join的用法

 更新时间:2018年10月25日 14:35:54   作者:乘风踏西行  
为了从两个表中获取数据,我们有时会用JOIN将两个表连接起来。本文给大家较详细的介绍了SQL语句中不同的连接JOIN及join的用法,感兴趣的朋友跟随小编一起看看吧

为了从两个表中获取数据,我们有时会用JOIN将两个表连接起来。通常有以下几种连接方式:

JOIN  or  INNER JOIN(内连接) : 这两个是相同的,要求两边表同时有对应的数据,返回行,任何一边缺失数据就不显示。

LEFT JOIN(左外连接):即使右边的表中没有匹配,也从左表返回所有的行。

RIGHT JOIN(右外连接):即使左边的表中没有匹配,也从右表返回所有的行。

FULL JOIN(全外连接):只要其中一个表中存在匹配就返回行。

如例,有grade表(课程号sn,分数scroe,学号id),student表(学号id,学生姓名name),要查询学生的姓名和成绩

 

当JOIN或是INNER JOIN时,

SELECT s.name,g.sn,g.score from student as s join grade as g on s.id = g.id

或者

SELECT s.name,g.sn,g.score from student as s inner join grade as g on s.id = g.id

结果集如下

当LEFT JOIN时,

SELECT s.name,g.sn,g.score from student as s left join grade as g on s.id = g.id

结果集如下

当RIGHT JOIN时,

SELECT s.name,g.sn,g.score from student as s right join grade as g on s.id = g.id

结果集如下

当FULL JOIN时,

SELECT s.name,g.sn,g.score from student as s full join grade as g on s.id = g.id

结果集如下

注意,两个表连接时用on,在使用left join(right join或full join)时,on与where的区别是:

on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录

where条件是在临时表生成好后再对临时表进行过滤的条件,这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。如下图,

on条件为黄色部分

SELECT s.name,g.sn,g.score from student as s left join grade as g on s.id = g.id and score =90


SELECT s.name,g.sn,g.score from student as s left join grade as g on s.id = g.id where score =90

下面看下SQL中join的各种用法

1.自然连接(natural join)

自然连接将表中具有相同名称的列自动进行匹配,自然连接不必指定任何同等连接条件也不能认为指定哪些列需要被匹配,自然连接得到的结果表中,两表中名称相同的列只出现一次。

select * from employee natural join department;

2.内连接(inner join):产生的结果是A和B的交集(相同列里面的相同值)

内连接查询能将左表和右表中能关联起来的数据连接后返回,返回的结果就是两个表中所有相匹配的数据。

select * from TableA as A inner join TableB B on A.PK = B.PK;
select * from TableA as A inner join TableB B on A.PK > B.PK;



3.外连接(outer join)

内连接是要显示两张表的内存,而外连接不要求如此,外连接可以依据连接表保留左表,右表或全部表的行为而分为左外连接右外连接和全连接。

select * from TableA as A left(right/full) join TableB as B on A.PA = B.PK;

Full Join:产生的结果是A和B的并集(如果没有相同的值会用null作为值)


Left Join:产生表A的完全集,而B表中匹配的则有值(没有匹配的则以null值取代)



Right Join:产生表B的完全集,而A表中匹配的则有值(没有匹配的则以null值取代)


4.交叉连接(cross join)

又称笛卡尔连接,交叉连接返回两个集合的笛卡尔积。

select * from TableA cross join TableB;

参考链接:http://mazhuang.org/2017/09/11/joins-in-sql/

总结

以上所述是小编给大家介绍的SQL语句中不同的连接join及join的用法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 不同数据库之间导入导出功能介绍

    不同数据库之间导入导出功能介绍

    在SQL Server中使用最广泛的就是通过SELECT INTO语句导出数据,SELECT INTO语句同时具备两个功能
    2010-12-12
  • SQL为什么不建议执行超过3表以上的多表关联查询

    SQL为什么不建议执行超过3表以上的多表关联查询

    mysql是往简单化方向去设计的,如果多个表关联查询(超过3张表)效率上是比不上PG的,本文就详细的介绍一下原因,感兴趣的可以了解一下
    2022-03-03
  • sql server创建复合主键的2种方法

    sql server创建复合主键的2种方法

    sql server创建复合主键的2种方法,需要的朋友可以参考一下
    2013-02-02
  • SQL(MSSQLSERVER)服务启动错误代码3414的解决方法

    SQL(MSSQLSERVER)服务启动错误代码3414的解决方法

    这篇文章主要介绍了SQL(MSSQLSERVER)服务启动错误代码3414的解决方法,需要的朋友可以参考下
    2016-03-03
  • sqlserver中几种典型的等待

    sqlserver中几种典型的等待

    在最近的几次sqlserver问题的排查中,总结了sqlserver几种典型的等待类型,类似于oracle中的等待事件,如果看到这样的等待类型时候能够迅速定位问题的根源,下面通过一则案例来把这些典型的等待处理方法整理出来
    2016-05-05
  • SQL 窗口函示例数详解

    SQL 窗口函示例数详解

    窗口函数(Window Function),也叫OLAP函数(Online Anallytical Processing,联机分析处理)或者分析函数(Analytic Function),可以对数据库数据进行实时分析处理,这篇文章主要介绍了SQL 窗口函数详解,需要的朋友可以参考下
    2024-06-06
  • 将表里的数据批量生成INSERT语句的存储过程 增强版

    将表里的数据批量生成INSERT语句的存储过程 增强版

    这篇文章主要介绍了将表里的数据批量生成INSERT语句的存储过程 增强版的相关资料,需要的朋友可以参考下
    2015-12-12
  • SQL Server日期加减函数DATEDIFF与DATEADD用法分析

    SQL Server日期加减函数DATEDIFF与DATEADD用法分析

    这篇文章主要介绍了SQL Server日期加减函数DATEDIFF与DATEADD用法,结合分析SQL Server使用DATEDIFF与DATEADD函数获取常见的周、月、天等日期相关运算技巧,需要的朋友可以参考下
    2017-03-03
  • win7系统安装SQLServer2000的详细步骤(图文)

    win7系统安装SQLServer2000的详细步骤(图文)

    这篇文章主要介绍了win7系统安装SQLServer2000的详细步骤,里面有一些需要注意的事项,大家可以参考下
    2014-07-07
  • MyBatis实践之动态SQL及关联查询

    MyBatis实践之动态SQL及关联查询

    MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了。本文给大家介绍MyBatis实践之动态SQL及关联查询,对mybatis动态sql相关知识感兴趣的朋友一起学习吧
    2016-03-03

最新评论