数据库查询中什么是左连接,什么是右连接?

2021-11-08 16:16发布

10条回答
夏虫语冰
2楼 · 2021-11-09 10:25

A表 B表
a b a b
1 3 3 2
2 4 1 4

左连接:
select A.*,B.* from A LEFT JOIN B ON A.b=B.b;
结果
1 3
2 4 1 4

右连接:
select A.*,B.* from A RIGHT JOIN B ON A.b=B.b;
结果
2 4 1 4
3 2

一句话,左连接就是左边全部保留按条件查出右边,右连接就是右边全部保留按条件查出左边

我是大脸猫
3楼 · 2021-11-09 10:39

一、交叉连接(cross join)

交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积。

例如:下面的语句1和语句2的结果是相同的。
语句1:隐式的交叉连接,没有cross join。

select o.id, o.order_number, c.id, c.name from orders o , customers c where o.id=1;

 

语句2:显式的交叉连接,使用cross join。

select o.id,o.order_number,c.id,c.name from orders o cross join customers c whereo.id=1;

 


语句1和语句2的结果是相同的,查询结果如下:

 

二、内连接(inner join)

内连接(inner join):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

例如:下面的语句3和语句4的结果是相同的。
语句3:隐式的内连接,没有inner join,形成的中间表为两个表的笛卡尔积。

select o.id,o.order_number,c.id,c.name from customers c, orders o wherec.id=o.customer_id;

 

语句4:显示的内连接,一般称为内连接,有inner join,形成的中间表为两个表经过on条件过滤后的笛卡尔积。

select o.id,o.order_number,c.id,c.name from customers c inner join orders o onc.id=o.customer_id;

 


语句3和语句4的查询结果:

 

三、外连接(outer join):
     外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接(left outer join)、右外连接(right outer join)和全外连接(full outer join)。
三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:
左外连接还返回左表中不符合连接条件单符合查询条件的数据行。
右外连接还返回右表中不符合连接条件单符合查询条件的数据行。
全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 union 右外”。
说明:左表就是在“(left outer join)”关键字左边的表。右表当然就是右边的了。在三种类型的外连接中,outer 关键字是可省略的。
下面举例说明:

语句5:左外连接(left outer join)

select o.id,o.order_number,o.customer_id,c.id,c.name from orders o left outer joincustomers c on c.id=o.customer_id;

 

语句6:右外连接(right outer join)

select o.id,o.order_number,o.customer_id,c.id,c.name from orders o right outer joincustomers c on c.id=o.customer_id;

注意:where条件放在on后面查询的结果是不一样的。例如:


语句7:where条件独立。

select o.id,o.order_number,o.customer_id,c.id,c.name from orders o left outer joincustomers c on c.id=o.customer_id where o.order_number<>'mike_order001';

 


语句8:将语句7中的where条件放到on后面。

select o.id,o.order_number,o.customer_id,c.id,c.name from orders o left outer joincustomers c on c.id=o.customer_id and o.order_number<>'mike_order001';

 


从语句7和语句8查询的结果来看,显然是不相同的,语句8显示的结果是难以理解的。因此,推荐在写连接查询的时候,on后面只跟连接条件,而对中间表限制的条件都写到where子句中。

语句9:全外连接(full outer join)。

select o.id,o.order_number,o.customer_id,c.id,c.name from orders o full outer joincustomers c on c.id=o.customer_id;

 


注意:mysql是不支持全外的连接的,这里给出的写法适合oracle和db2。但是可以通过左外和右外求合集来获取全外连接的查询结果。下图是上面sql在oracle下执行的结果:


语句10:左外和右外的合集,实际上查询结果和语句9是相同的。

select o.id,o.order_number,o.customer_id,c.id,c.name from orders o left outer joincustomers c on c.id=o.customer_id union selecto.id,o.order_number,o.customer_id,c.id,c.name from orders o right outer join customers c on c.id=o.customer_id;

 

语句9和语句10的查询结果是相同的,如下:

 

四、联合连接(union join):
      这是一种很少见的连接方式。oracle、mysql均不支持,其作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能。
语句11:联合查询(union join)例句,还没有找到能执行的sql环境。

select o.id,o.order_number,o.customer_id,c.id,c.name from orders o union joincustomers c on c.id=o.customer_id

 

语句12:语句11在db2下的等价实现。还不知道db2是否支持语句11呢!

select o.id,o.order_number,o.customer_id,c.id,c.name from orders o full outer joincustomers c on c.id=o.customer_id except selecto.id,o.order_number,o.customer_id,c.id,c.name from orders o inner join customers c onc.id=o.customer_id;

 

语句13:语句11在oracle下的等价实现。

select o.id,o.order_number,o.customer_id,c.id,c.name from orders o full outer joincustomers c on c.id=o.customer_id minus selecto.id,o.order_number,o.customer_id,c.id,c.name from orders o inner join customers c onc.id=o.customer_id;

 


查询结果如下:

 

五、自然连接(natural inner join):
     说真的,这种连接查询没有存在的价值,既然是sql2标准中定义的,就给出个例子看看吧。自然连接无需指定连接列,sql会检查两个表中是否相同名称的列,且假设他们在连接条件中使用,并且在连接条件中仅包含一个连接列。不允许使用on语句,不允许指定显示列,显示列只能用*表示(oracle环境下测 试的)。对于每种连接类型(除了交叉连接外),均可指定natural。下面给出几个例子。
语句14:

select * from orders o natural inner join customers c;

 

语句15:

select * from orders o natural left outer join customers c;

 

语句16:

select * from orders o natural right outer join customers c;

 

语句17:

select * 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.cy from tab1 t1 inner join tab2 t2 on (t1.c1=t2.c2) inner jointab3 t3 on (t1.c1=t2.c3) left outer join tab4 on(t2.c2=t3.c3); where t1.x >t3.y;


1、左连接: 

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

2、右连接: 

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


羊羊0531
5楼 · 2021-11-09 10:59

数据库中的左连接和右连接的区别可以概括为一句话来表示即左连接where只影响右表,右连接where只影响到左表

image.png

summer
6楼 · 2021-11-09 16:00

外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。

回答: 2021-11-16 17:43

SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。

LEFT JOIN(左连接) 返回包括左表中的所有记录和右表中联结字段相等的记录。
即使右表中没有匹配,也从左表返回所有的行。

RIGHT JOIN(右连接)返回包括右表中的所有记录和左表中联结字段相等的记录。
即使左表中没有匹配,也从右表返回所有的行。


不吃鱼的猫
7楼 · 2021-11-14 09:25

左连接就是以左表为主,有链接是以查询右表为主

帅帅马
8楼 · 2021-11-14 18:27

SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。

LEFT JOIN(左连接) 返回包括左表中的所有记录和右表中联结字段相等的记录。
即使右表中没有匹配,也从左表返回所有的行。

RIGHT JOIN(右连接)返回包括右表中的所有记录和左表中联结字段相等的记录。
即使左表中没有匹配,也从右表返回所有的行。

示例表:表1和表2


1、LEFT JOIN 例:

注释:王五在表2中没有匹配的记录,所以表2的内容为NULL。

2、RIGHT JOIN例: 

注释:表2中所有记录被返回。


py大白
9楼 · 2021-11-16 08:49

       外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

相关问题推荐

  • 回答 157

    虽然从事开发行业的女生越来越多,但女生的比例还是远比不上男生。软件测试的男女生比例则基本相当,软件测试要求细心、耐心,大部分女生也是比较适合学的。而且软件测试课程分为手工测试和自动化测试,手工测试分为功能测试、性能测试、接口测试。自动化测试...

  • 回答 121

    需要。很多人当初抱着测试不需要懂代码,才选择了这个行业,这个就要看对自己的职业定位了,是止步于月薪过万就可以了,还是往20k、30k去突破,如果这样的话,是肯定要会接口、会自动化,就必然要涉及到代码。如果真的看不懂代码,实际的测试后期的工作会出现...

  • 回答 91

    在我看来游戏开发挺难的,尤其像手游一类的还有网游,里面有很多的程序代码而且伤神又费力,不过也有女生在这方面做的很好的,如果你感兴趣,非常想学,可以试试

  • 回答 80

    软件测试专业现在很火热,很缺少人才,25岁学软件测试能学会,就业薪资也高,工作也相对轻松

  • 回答 11
    已采纳

    测试类型有:功能测试,性能测试,界面测试。功能测试在测试工作中占的比例最大,功能测试也叫黑盒测试。是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。采用黑盒技术设计测试用...

  • 回答 15
    已采纳

    这个其实和接口测试的场景密不可分的,比如说:外部接口测试:    必须先接口测试通过了,才能执行功能测试子系统或者各个模块之间的联调测试:    必须各子系统后台代码完成,并提供接口才可以完成测试,一般来说都要求各子系统功能测试通过后再进行...

  • 回答 6
    已采纳

    这个是会因为公司的架构不同而不同的,并不是固定的,但是一般是会有专门的测试部门,或者叫质量保证部,也有可能是叫别的名字。

  • 回答 43
    已采纳

    移动端测试,包括App兼容性测dao试,7*24小时稳定性测试,功耗性能测试,UI测试,交互测试等,课程主要学习的内容有:1、功能测试主要包括计算机基础、软件测试核心理论、Linux、数据库,学习目标是掌握软件测试核心理论,结合Linux、数据库等可实现移动端、w...

  • 回答 1

    标题  1. 首先要做一个标题党(此标题党非彼标题党)。标题一定要清晰简洁易理解,不应该臃长  2. 尽量前缀要规范,例如模板: [Product][Version]_[Feature]_[Title],这样描述会很清晰,也方便查找  3. 缺陷的标题一定要描述在什么情况下发生了什么问...

  • 回答 1

    1、 缺陷报告可以记录缺陷2、可以对缺陷进行跟踪管理3、可以对缺陷报告进行分类 总结 统计

  • 回答 1

    1、缺陷编号(Defect ID),提交BUG的顺序。2、缺陷标题(summary),简明扼要的说明一下这个BUG。3、缺陷的发现者(DetectedBy) ,一般是自己。4、发现缺陷的日期(Detected on date),一般是当天。5、缺陷所属的模块(subject), 在测试哪个模块的时候发现的BUG...

  • 回答 1

    缺陷标题好的缺陷标题需要让相关人员一目了然,一般建议的格式是条件+失败。缺陷类型缺陷类型也是根据具体的项目而定的。但一般情况下分为功能、界面、建议。重现步骤重现步骤的编写规则可以参考测试用例中的操作步骤 ,一定要足够详细、说明清楚问题的操作顺...

  • 回答 1

    工具:NoSQLUnitJsTestDriverQTRunnerVenusFluintBuster.JSSQLUnitECUTQTestlibUnitilsgreatestDbUnitAbbotGoogleTest框架:JUnitMoqJSCaptureMockCUnitPyUnitCppUTestCppUnitzCUTcipra

  • 回答 1

    JunitTestNGGoogleTestpytestunittestJmockitJaCoCogcov、lcov、gcovrCoverage.pyEvoSuiteDiffblue Cover

  • 回答 1

      React Hooks测试库( Testing Library)是一个简单而完整的React Hooks测试工具。  React Hooks测试库让用户可以为React钩子创建简单的测试工具,自定义钩子的输入和检索输出,以处理在功能组件体内运行的情况。  使用React Hooks,用户不必为了测试而去担...

  • 回答 1

    1、单元测试注重代码逻辑,接口测试注重业务逻辑;2、单元测试的粒度最小,是测试最小独立的单元模块(不依赖其他模块);接口测试不是,会覆盖很多;3、单元测试是白盒测试,接口测试是黑盒测试;4、单元测试关注的是代码的实现和逻辑,测试范围较小,保证实...

没有解决我的问题,去提问