数据库 *** 作中,左连接,右连接是什么意思,举例说明

数据库 *** 作中,左连接,右连接是什么意思,举例说明,第1张

假设a表有两个字段,Aid、name, b 表也有两字段 Bid,nameid

其中 nameid是Aid在b 表中的外键。

a表有数据如下:

Aid name

1 a

2 b

3 c

b表有数据如下:

Bid nameid

1 1

2 1

3 1

4 2

5 2

用左连接,说白一点就是以左边那个表为标准,左边那表(表a)的所有记录必须得全部出现,例如:

select from a left join b on aAid=bnameid

结果应应该为:

Aid name Bid nameid

1 a 1 1

1 a 2 1

1 a 3 1

2 b 4 2

2 b 5 2

3 c NULL NULL

表a 的 Aid为1的出现了三次,Aid为2的出现了两次,Aid为3的出现了一次,全部都出现了。但因为在表b中没有以Aid为3对应的记录,所以用null来填充。

同样道理,用右连接,说白一点就是以右边那个表为标准,

例如:select from a right join b on aAid=bnameid

结果应该为:

Aid name Bid nameid

1 a 1 1

1 a 2 1

1 a 3 1

2 b 4 2

2 b 5 2

表b的记录必须全部出现,但没有出现 a表中Aid为3的记录,是因为b表中没有以之对应的记录,而且此时是以b表为标准的。这样的比喻不知你看不看得明。

以保险公司为基表进行左联接查询:

select icompany,pid ,i from insurance i

left join insure pi on icompany = picompany

left join patient p on piid = pid

主要还是执行计划和代价上的差别。因为Oracle对sql的解析是从后向前的,所以在RBO 下,大表在前,小表在后。这样就会先遇到小表,后遇到大表。你这2个都是数据库自带的小表,如果换成生产环境下,遇到大数据量级的表,差别就会显现了。个人看法,仅供参考。

1意思不一样。

左连接:只要左边表中有记录,数据就能检索出来,而右边有的记录必要在左边表中有的记录才能被检索出来。

右连接:右连接是只要右边表中有记录,数据就能检索出来。

2用法不一样。

右连接与左连接相反,左连接A LEFT JOIN B,连接查询的数据,在A中必须有,在B中可以有可以没有。

3空值不一样。

左连接是已左边表中的数据为基准,若左表有数据右表没有数据,则显示左表中的数据右表中的数据显示为空。

数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

定义:

数据库是存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数据进行存放,是有一定的规则的,否则查询的效率会很低。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。

即这个互联网世界就是数据世界。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。

SQL中的左外连接和+号的用法

Oracle 左连接、右连接、全外连接、(+)号作用

Oracle  外连接

(1)左外连接 (左边的表不加限制)

       (2)右外连接(右边的表不加限制)

       (3)全外连接(左右两表都不加限制)

外连接(Outer Join)

outer join则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。外连接分为三种: 左外连接,右外连接,全外连接。 对应SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我们省略outer 这个关键字。 写成:LEFT/RIGHT/FULL JOIN。

在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。

对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:

       1(+) *** 作符只能出现在where子句中,并且不能与outer join语法同时使用。

       2 当使用(+) *** 作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+) *** 作符

       3(+) *** 作符只适用于列,而不能用在表达式上。

       4(+) *** 作符不能与or和in *** 作符一起使用。

       5(+) *** 作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。

在做实验之前,我们先将dave表和bl里加一些不同的数据。 以方便测试。

SQL> select from bl;

ID NAME

---------- ----------

1 dave

2 bl

3 big bird

4 exc

9 怀宁

SQL> select from dave;

ID NAME

---------- ----------

8 安庆

1 dave

2 bl

1 bl

2 dave

3 dba

4 sf-express

5 dmm

21 左外连接(Left outer join/ left join)

left join是以左表的记录为基础的,示例中Dave可以看成左表,BL可以看成右表,它的结果集是Dave表中的数据,在加上Dave表和BL表匹配的数据。换句话说,左表(Dave)的记录将会全部表示出来,而右表(BL)只会显示符合搜索条件的记录。BL表记录不足的地方均为NULL

示例:

SQL> select from dave a left join bl b on aid = bid;

ID NAME               ID NAME

--------- ---------- ---------- ----------

1 bl                  1 dave

1 dave                1 dave

2 dave                2 bl

2 bl                  2 bl

3 dba                 3 big bird

4 sf-express          4 exc

5 dmm                             -- 此处B表为null,因为没有匹配到

8 安庆                             -- 此处B表为null,因为没有匹配到

SQL> select from dave a left outer join bl b on aid = bid;

ID NAME               ID NAME

---------- ---------- ---------- ----------

1 bl                  1 dave

1 dave                1 dave

2 dave                2 bl

2 bl                  2 bl

3 dba                 3 big bird

4 sf-express          4 exc

5 dmm

8 安庆

用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在右表,左表就是全部显示,故是左连接。

SQL> Select from dave a,bl b where aid=bid(+);    -- 注意: 用(+) 就要用关键字where

ID NAME               ID NAME

---------- ---------- ---------- ----------

1 bl                  1 dave

1 dave                1 dave

2 dave                2 bl

2 bl                  2 bl

3 dba                 3 big bird

4 sf-express          4 exc

5 dmm

8 安庆

22 右外连接(right outer join/ right join)

和left join的结果刚好相反,是以右表(BL)为基础的, 显示BL表的所以记录,在加上Dave和BL 匹配的结果。 Dave表不足的地方用NULL填充

示例:

SQL> select from dave a right join bl b on aid = bid;

ID NAME               ID NAME

---------- ---------- ---------- ----------

1 dave                1 dave

2 bl                  2 bl

1 bl                  1 dave

2 dave                2 bl

3 dba                 3 big bird

4 sf-express          4 exc

9 怀宁    --此处左表不足用Null 填充

已选择7行。

SQL> select from dave a right outer join bl b on aid = bid;

ID NAME               ID NAME

---------- ---------- ---------- ----------

1 dave                1 dave

2 bl                  2 bl

1 bl                  1 dave

2 dave                2 bl

3 dba                 3 big bird

4 sf-express          4 exc

9 怀宁  --此处左表不足用Null 填充

已选择7行。

用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在左表,右表就是全部显示,故是右连接。

SQL> Select from dave a,bl b where aid(+)=bid;

ID NAME               ID NAME

---------- ---------- ---------- ----------

1 dave                1 dave

2 bl                  2 bl

1 bl                  1 dave

2 dave                2 bl

3 dba                 3 big bird

4 sf-express          4 exc

9 怀宁

23 全外连接(full outer join/ full join)

左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充。 全外连接不支持(+)这种写法。

示例:

SQL> select from dave a full join bl b on aid = bid;

ID NAME               ID NAME

---------- ---------- ---------- ----------

8 安庆

1 dave                1 dave

2 bl                  2 bl

1 bl                  1 dave

2 dave                2 bl

3 dba                 3 big bird

4 sf-express          4 exc

5 dmm

9 怀宁

已选择9行。

SQL> select from dave a full outer join bl b on aid = bid;

ID NAME               ID NAME

---------- ---------- ---------- ----------

8 安庆

1 dave                1 dave

2 bl                  2 bl

1 bl                  1 dave

2 dave                2 bl

3 dba                 3 big bird

4 sf-express          4 exc

5 dmm  

最初由 ghc_x 发布

[B]有两个表T1和T2,两个表除了主键索引外均无其他索引,这两个表由T1F1(主键),T2F2(主键)进行左连接,SQL语句有两种写法:

1 SELECT FROM T1,T2 WHERE T1F1=T2F2(+)

2 SELECT FROM T1 LEFT JOIN T2 ON T1F1=T2F2

当查看1的执行计划时发现T1为全表扫描,T2为索引扫描。

当查看2的执行计划时发现两个表均为全表扫描。

有人知道这是为什么吗? [/B]

我一直以来也是认为这两种写法是一样的,没想到楼主特意去看了它们的执行计划,而且发现了它们的不同,这使得我比较惊讶。

按照书上的讲法,这两种写法是没有什么区别的,后一种写法只不过是前一种写法的新版本。

为什么两者的执行计划会不一样呢?

我仔细看了一下两者的执行计划,发现了为什么后一种要两个表都全表 扫描,而前一个表有一个索引扫描。

原来前者选择的优化器是RULE,而后者选择的优化器是CBO的ALL ROWS。

不过,似乎要后者的效率高。

1 SELECT /+RULE/ FROM T1,T2 WHERE T1F1=T2F2(+)

2 SELECT /+RULE/ FROM T1 LEFT JOIN T2 ON T1F1=T2F2

这样再看下执行计划吧

以上就是关于数据库 *** 作中,左连接,右连接是什么意思,举例说明全部的内容,包括:数据库 *** 作中,左连接,右连接是什么意思,举例说明、数据库多对多关系的表如何采用左连接查询、数据库左右连接问题,怎么选择左右连接,是否左右连接的选择跟sql语句的查询性能有关。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9794291.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存