在用sql语句查询数据库时,何时用左外连接

在用sql语句查询数据库时,何时用左外连接,第1张

简单说就是以谁为准就用谁!

以左数据为准去找满足条件的右数据,就用左外连;

以右数据为准去找满足条件的左数据,就用右外连;

INNER JOIN 就不用说了吧

比如A表有某些学生数据,B表部分A表内容中的一部分学生数据+A表没有的学生数据,

那么用左外连接 就是以A表学生数据为准,去找B表内容/或合并出另一个内容。

一般所说的左连接,外连接是指左外连接,右外连接。做个简单的测试你看吧。

先说左外连接和右外连接:

[TEST1@orcl#16-12月-11] SQL>select from t1;

ID NAME

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

1 aaa

2 bbb

[TEST1@orcl#16-12月-11] SQL>select from t2;

ID AGE

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

1 20

3 30

左外连接:

[TEST1@orcl#16-12月-11] SQL>select from t1 left join t2 on t1id=t2id;

ID NAME ID AGE

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

1 aaa 1 20

2 bbb

右外连接:

[TEST1@orcl#16-12月-11] SQL>select from t1 right join t2 on t1id=t2id;

ID NAME ID AGE

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

1 aaa 1 20

3 30

从上面的显示你可以看出:左外连接是以左边的表为基准。通俗的讲,先将左边的表全部显示出来,然后右边的表id与左边表id相同的记录就“拼接”上去,比如说id为1的记录。如果没有匹配的id,比如说t1中id为2的t2中就没有。那边就以null显示。

右外连接过程正好相反。

再看内连接:

[TEST1@orcl#16-12月-11] SQL>select from t1 inner join t2 on t1id=t2id;

ID NAME ID AGE

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

1 aaa 1 20

看到没有? 只有一条记录。内连接就是只取出符合过滤条件的记录 也就是t1id=t2id 那么符合t1id=t2id的记录只有id=1这一条,所以只显示一条。 不像外连接,是将你作为基准的表(左外连接就是左边表为基准,右外连接就是右边表为基准)的所有行都显示出来。

综上所述,你应该能明白了吧?如果不明白请留言。

select 字段列表 from 表1 join 表2 on 两个表之间的关联条件

select 字段列表 from 表1,表2 where 两个表之间的关联条件

上面这两句是一个意思,都属于连接查询中的内连接,返回完全满足关联条件的记录;第一句其实完整写法应该这样:select 字段列表 from 表1 inner join 表2 on 两个表之间的关联条件

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

inner join内部连接 两表都满足的组合

full outer 全连 两表相同的组合在一起,A表有但B表没有的数据(显示null), 同样B表有,A表没有的显示为(null)

A表 left join B表 左连,以A表为基础,A表的全部数据,B表有的组合。没有的为null

A表 right join B表 右连,以B表为基础,B表的全部数据,A表的有的组合。没有的为null

查询分析器中执行:

--建表table1,table2:

create table table1(id int,name varchar(10))

create table table2(id int,score int)

insert into table1 select 1,'lee'

insert into table1 select 2,'zhang'

insert into table1 select 4,'wang'

insert into table2 select 1,90

insert into table2 select 2,100

insert into table2 select 3,70

如表

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

table1| table2|

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

|id name| |id score|

|1 lee| |1 90|

|2 zhang| |2 100|

|4 wang| |3 70|

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

以下均在查询分析器中执行

一、外连接

1概念:包括左向外联接、右向外联接或完整外部联接

2左连接:left join 或 left outer join

(1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行

,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。

(2)sql语句

select from table1 left join table2 on table1id=table2id

-------------结果-------------

| id | name | id | score |

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

| 1 | lee | 1 | 90 |

| 2 | zhang | 2 | 100 |

| 4 | wang |NULL| NULL |

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

注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示

3右连接:right join 或 right outer join

(1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

(2)sql语句

select from table1 right join table2 on table1id=table2id

-------------结果-------------

|id | name | id | score |

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

| 1 | lee | 1 | 90 |

| 2 |zhang | 2 | 100 |

|NULL| NULL | 3 | 70 |

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

注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示

4完整外部联接:full join 或 full outer join

(1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行

,则整个结果集行包含基表的数据值。

(2)sql语句

select from table1 full join table2 on table1id=table2id

-------------结果-------------

| id | name | id | score |

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

| 1 | lee | 1 | 90 |

| 2 | zhang| 2 | 100 |

| 4 | wang|NULL| NULL|

|NULL| NULL| 3 | 70 |

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

注释:返回左右连接的和(见上左、右连接)

二、内连接

1概念:内联接是用比较运算符比较要联接列的值的联接

2内连接:join 或 inner join

3sql语句

select from table1 join table2 on table1id=table2id

-------------结果-------------

| id | name | id | score |

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

| 1 | lee | 1 | 90 |

| 2 | zhang| 2 | 100 |

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

注释:只返回符合条件的table1和table2的列

4等价(与下列执行效果相同)

A:select a,b from table1 a,table2 b where aid=bid

B:select from table1 cross join table2 where table1id=table2id (注:cross join后加条件只能用where,不能用on)

三、交叉连接(完全)

1概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。

(table1和table2交叉连接产生33=9条记录)

2交叉连接:cross join (不带条件where)

3sql语句

select from table1 cross join table2

-------------结果-------------

| id | name | id | score |

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

| 1 | lee | 1 | 90 |

| 2 | zhang| 1 | 90 |

| 4 | wang| 1 | 90 |

| 1 | lee| 2 | 100 |

| 2 | zhang| 2 | 100 |

| 4 | wang| 2 | 100 |

| 1 | lee | 3 | 70 |

| 2 | zhang| 3 | 70 |

| 4 | wang| 3 | 70 |

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

注释:返回33=9条记录,即笛卡尔积

4等价(与下列执行效果相同)

A:select from table1,table2

假设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表为标准的。

举个简单的例子吧,从结果来理解比较具体些。

a表

name sex

张三 男

李四 女

b表

name age

李四 30

王五 23

1\全外连接

select aname,asex,bname,bage

from a full outer join b on aname=bname

结果如下,

name sex name age

张三 男 NULL NULL

李四 女 李四 30

NULL NULL 王五 23

关联字段name,左表有而右表没有的,如张三,bname,bage都为NULL,加上左右两边都有的就是左连接的结果;而右表有而左表表没有的,如王五,aname,asex都为NULL,加上左右两边都有的就是右连接的结果;左右两边都有的如,李四,这就是内连接。相见如下

2\左

select aname,asex,bname,bage

from a left outer join b on aname=bname

结果如下

name sex name age

张三 男 NULL NULL

李四 女 李四 30

2\右

select aname,asex,bname,bage

from a right outer join b on aname=bname

结果如下

name sex name age

李四 女 李四 30

NULL NULL 王五 23

3\内联

select aname,asex,bname,bage

from a inner join b on aname=bname

结果如下

name sex name age

李四 女 李四 30

4\交叉

select aname,asex,bname,bage

from a cross join b on aname=bname

结果如下

name sex name age

张三 男 李四 30

李四 女 王五 23

张三 男 王五 23

李四 女 李四 30 望采纳

INNER JOIN 产生的结果是AB的交集

SELECT FROM TableA INNER JOIN TableB ON TableAname = TableBname

2LEFT [OUTER] JOIN 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

SELECT FROM TableA LEFT OUTER JOIN TableB ON TableAname = TableBname

3RIGHT [OUTER] JOIN 产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。

SELECT FROM TableA RIGHT OUTER JOIN TableB ON TableAname = TableBname

图标如left join类似。

4FULL [OUTER] JOIN 产生A和B的并集。对于没有匹配的记录,则会以null做为值。

SELECT FROM TableA FULL OUTER JOIN TableB ON TableAname = TableBname

你可以通过is NULL将没有匹配的值找出来:

SELECT FROM TableA FULL OUTER JOIN TableB ON TableAname = TableBname

WHERE TableAid IS null OR TableBid IS null

5 CROSS JOIN 把表A和表B的数据进行一个NM的组合,即笛卡尔积。如本例会产生44=16条记录,在开发过程中我们肯定是要过滤数据,所以这种很少用。

SELECT FROM TableA CROSS JOIN TableB

相信大家对inner join、outer join和cross join的区别一目了然了。

SQL使用(一)——联合查询

1联合查询分类

内连接(inner Join 或 Join)

外连接(outer Join)

左外连接(left outer Join 或 left Join)

右外连接(right outer Join 或 right Join)

全外连接(full outer Join 或 full Join)

交叉连接 (cross Join)

结果集链接 (union 和 union all)

2联合查询介绍

相关数据表如下:

A表

B表

C表

21内连接(Inner Join)

内连接:仅显示两个表中匹配行,即两表中都有才显示。

SQL如下:

SELECT  Aid  AS  AID,    Acontent  AS  AContent,    Bid  AS  BID,    Bcontent  AS  BContent  FROM  A  INNERJOIN  B  ON  (Aid = Bid);

1

2

3

4

5

6

7

8

查询结果

由查询结果可以看出,内连接根据连接条件(Aid=Bid)查询出了A、B两表中都存在的数据信息。2个表的联合查询结果如此,那么3个表甚至更多表联合查询的结果呢?

A、B、C三表联合内查询SQL

SELECTAidASAID,    AcontentASAContent,    BidASBID,    BcontentASBContent,    CidASCID,    CcontentASCContentFROMAINNERJOINBON(Aid = Bid)INNERJOINCON(Aid = Cid)

1

2

3

4

5

6

7

8

9

10

11

查询结果:

啊?怎么多了一行数据?不用惊讶,其实C表中有2个id为1的记录,然而我们怎么理解得到的查询结果呢?

可以把A、B两表的查询结果作为T表(中间结果表),然后T表内连接C表,连接条件为TAid=Cid。

简单来说n(n>=2)都可以看做两张表的联合查询,后面的小节将只介绍两个表的联合查询。

22外连接(Outer Join)

221左外连接(Left outer Join)

左外连接:左表有就显示,不论右表。

SQL:

SELECTAidASAID,    AcontentASAContent,    BidASBID,    BcontentASBContentFROMALEFTJOINBON(Aid = Bid);

1

2

3

4

5

6

7

8

查询结果:

左连接并不是把B表左连接到A表上,而是把A表作为基准表。由查询结果可以看出,A、B两表左连接,只要A中有结果,无论B表中有无结果,都会被查询出来。

222右外连接(Right outer Join)

右外连接:右表有就显示,不论左表。

SQL:

SELECTAidASAID,    AcontentASAContent,    BidASBID,    BcontentASBContentFROMARIGHTJOINBON(Aid = Bid);

1

2

3

4

5

6

7

8

9

查询结果:

右连接和左连接类似,只是把B表(连接的表)作为基准表。由查询结果可以看出,无论A表是否存在其他数据,只要B表数据存在就会被查询出来。

223全外连接(Full outer Join)

全外连接:左表/右表,有一个有就显示。

SQL:

SELECTAidASAID,    AcontentASAContent,    BidASBID,    BcontentASBContentFROMAFULLOUTERJOINBON(Aid = Bid);

1

2

3

4

5

6

7

8

9

查询结果:

全外连接查询就字面意思也不难看出是查询出两表(A、B)中的所有记录信息。

注:MySQL中不支持全外连接(但是可以union来实现,后面会介绍)。

22交叉连接(Cross Join)

SQL:

SELECTAidASAID,    AcontentASAContent,    BidASBID,    BcontentASBContentFROMACROSSJOINB;

1

2

3

4

5

6

7

8

9

查询结果:

由结果可以看出,交叉连接是对A、B量表进行笛卡尔积的结果查询出来。即A的每条记录都有和B中所有记录相对应的信息。

23 SQL Union

SQL Union用于将多个select结果集进行合并。值得注意的是,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL:

SELECTFROMAUNIONSELECTfromB;

1

查询结果:

Union是把2个Select结果集进行合并,由查询结果也不难看出,A、B两表的结果数据进行了合并,并且都被查询出来了。

如果2个Select结果集中存在相同的结果,用Union则会把相同的记录进行合并,查询结果中仅仅会显示一条。那么如果想都显示出来,把Union换成Union All 即可。

Union实现Full outer Join:

1首先获取A、B表中id的不同组合。

SQL:

CREATEVIEWvasSELECTAidfromAUNIONSELECTBidfromB;

1

视图内存如下:

2以视图V为基本表,Left Join A、B表即可。

SQL:

SELECTAid,    Acontent,    Bid,    BcontentFROMvLEFTJOINAON(Aid = vid)LEFTJOINBON(Bid = vid);

1

2

3

4

5

6

7

8

9

查询结果如下:

以上就是关于在用sql语句查询数据库时,何时用左外连接全部的内容,包括:在用sql语句查询数据库时,何时用左外连接、mysql数据库的左连接,右连接,内链接。有何区别、数据库连接查询等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/sjk/9495639.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存