详解SQL Server连接(内连接、外连接、交叉连接)

    在查询多个表时,我们经常会用“连接查询”。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

  

什么是连接查询呢?

  

    概念:根据两个表或多个表的列之间的关系,从这些表中查询数据。

    目的:实现多个表查询操作。

 

知道了连接查询的概念之后,什么时候用连接查询呢?

     

    一般是用作关联两张或两张以上的数据表时用的。看起来有点抽象,我们举个例子,做两张表:学生表(T_student)和班级表(T_class)。

 

                     T_student                                   T_class

               

 

连接标准语法格式:

    

    SQL-92标准所定义的FROM子句的连接语法格式为:

    FROM  join_table join_type join_table[ON (join_condition)]

    其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。join_type 指出连接类型。join_condition指连接条件。

 

连接类型:

   

    连接分为三种:内连接、外连接、交叉连接。

 

内连接(INNER JOIN)

   

    使用比较运算符(包括=、>、<、<>、>=、<=、!>和!<)进行表间的比较操作,查询与连接条件相匹配的数据。根据比较运算符不同,内连接分为等值连接和不等连接两种。

1、等值连接

     概念:在连接条件中使用等于号(=)运算符,其查询结果中列出被连接表中的所有列,包括其中的重复列。

<span style="font-size:18px;"><span style="font-family:System;">     
    select * from T_student s,T_class c where s.classId = c.classId 
     等于
     select * from T_student s inner join T_class c on s.classId = c.classId</span></span>
       结果是:

                 

                 

2、不等连接

 

   概念:在连接条件中使用除等于号之外运算符(>、<、<>、>=、<=、!>和!<

<span style="font-size:18px;"><span style="font-family:System;">     
    select * from T_student s inner join T_class c on s.classId <> c.classId</span></span>
       结果是:

                


外连接

   

    外连接分为左连接(LEFT JOIN)或左外连接(LEFT OUTER JOIN)、右连接(RIGHT JOIN)或右外连接(RIGHT OUTER JOIN)、全连接(FULL JOIN)或全外连接(FULL OUTER JOIN)。我们就简单的叫:左连接、右连接和全连接。

 

1、左连接:

 

    概念:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。

<span style="font-size:18px;"><span style="font-family:System;">    
    select * from  T_student s left join T_class c on s.classId = c.classId</span></span>
  结果是:
                

  总结:左连接显示左表全部行,和右表与左表相同行。

 

2、右连接:

 

   概念:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

<span style="font-size:18px;"><span style="font-family:System;">   
   select * from  T_student s right join T_class c on s.classId = c.classId</span></span>
   结果是:

              

  总结:右连接恰与左连接相反,显示右表全部行,和左表与右表相同行。

 

3、全连接:

 

  概念:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值

<span style="font-size:18px;"><span style="font-family:System;">    
   select * from  T_student s full join T_class c on s.classId = c.classId</span></span>
   结果是:

            

   总结:返回左表和右表中的所有行。

 

交叉连接(CROSS JOIN):也称迪卡尔积

    概念:不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积(例如:T_student和T_class,返回4*4=16条记录),如果带where,返回或显示的是匹配的行数

 

1、不带where:

<span style="font-size:18px;"><span style="font-family:System;">   
   select *from T_student cross join T_class
  ‘等于
   select *from T_student, T_class</span></span>

    

结果是:

                           

       总结:相当与笛卡尔积,左表和右表组合。


2、有where子句,往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择。


select * from T_student s cross join T_class c where s.classId = c.classId 
   (注:cross join后加条件只能用where,不能用on)


      查询结果跟等值连接的查询结果是一样。


      连接查询非常简单,只需要在项目中多多实践,不断总结。
 
 
 
 
 
 
 
 
 
 
 

                
  • 61
    点赞
  • 181
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 52
    评论
MySQL连接是将两个或多个表中的数据关联起来的一种方法。连接在数据检索中扮演着非常重要的角色,因为它允许我们从多个相关的表中检索数据。MySQL支持多种类型的连接,包括内连接外连接等。下面分别对内连接外连接进行详细的讲解。 1. 内连接 内连接也称为等值连接,它是通过比较两个或多个表中的列值来匹配行的连接内连接只返回两个表中都存在匹配行的数据,其他行将被忽略。 内连接的语法如下: ``` SELECT 列名 FROM 表名1 INNER JOIN 表名2 ON 表名1.列名 = 表名2.列名; ``` 其中,INNER JOIN表示内连接操作。 例如,有两个表students和scores,students表中包含学生的信息,scores表中包含学生成绩信息。现在需要查询所有学生的姓名和成绩,可以使用内连接进行查询,语句如下: ``` SELECT students.name, scores.score FROM students INNER JOIN scores ON students.id = scores.id; ``` 其中,students.id与scores.id为连接条件,只有两个表中都存在该条件的数据才会进行连接。 2. 外连接 外连接可以分为左外连接、右外连接和全外连接。它们的区别在于返回的结果集中是否包含没有匹配的行数据。 (1)左外连接外连接返回左表中的所有行,以及右表中符合条件的行。如果右表中没有符合条件的行,将返回NULL值。 左外连接的语法如下: ``` SELECT 列名 FROM 表名1 LEFT JOIN 表名2 ON 表名1.列名 = 表名2.列名; ``` 其中,LEFT JOIN表示左外连接操作。 例如,有两个表students和scores,现在需要查询所有学生的姓名和成绩,包括没有成绩的学生,可以使用左外连接进行查询,语句如下: ``` SELECT students.name, scores.score FROM students LEFT JOIN scores ON students.id = scores.id; ``` 其中,students.id与scores.id为连接条件,如果scores表中没有与students表中相同id的数据,则返回NULL值。 (2)右外连接外连接与左外连接相反,它返回右表中的所有行,以及左表中符合条件的行。如果左表中没有符合条件的行,将返回NULL值。 右外连接的语法如下: ``` SELECT 列名 FROM 表名1 RIGHT JOIN 表名2 ON 表名1.列名 = 表名2.列名; ``` 其中,RIGHT JOIN表示右外连接操作。 例如,有两个表students和scores,现在需要查询所有学生的姓名和成绩,包括没有姓名的成绩,可以使用右外连接进行查询,语句如下: ``` SELECT students.name, scores.score FROM students RIGHT JOIN scores ON students.id = scores.id; ``` 其中,students.id与scores.id为连接条件,如果students表中没有与scores表中相同id的数据,则返回NULL值。 (3)全外连接外连接可以返回左右两个表中的所有行,如果某个表中没有符合条件的行,则返回NULL值。 全外连接的语法如下: ``` SELECT 列名 FROM 表名1 FULL JOIN 表名2 ON 表名1.列名 = 表名2.列名; ``` 其中,FULL JOIN表示全外连接操作。 例如,有两个表students和scores,现在需要查询所有学生的姓名和成绩,包括没有姓名或成绩的数据,可以使用全外连接进行查询,语句如下: ``` SELECT students.name, scores.score FROM students FULL JOIN scores ON students.id = scores.id; ``` 其中,students.id与scores.id为连接条件,如果students表中没有与scores表中相同id的数据,则返回NULL值;如果scores表中没有与students表中相同id的数据,则返回NULL值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿小亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值