Sql多表关联

表a

id

name

1

张三

2

李四

3

赵六

表b

id

bname

1

红烧肉

2

火腿肠

4

大白菜

(一)外连接

外连接可分为:左连接、右连接、完全外连接。

1、左连接(left join 或 left outer join)

SQL语句:select * from a left join b on a.id=b.id

左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL)。

id

name

id

bname

1

张三

1

红烧肉

2

李四

2

火腿肠

3

赵六

NULL

NULL

  1. 右连接(right join 或 right outer join)

SQL语句:select * from a right join b on a.id=b.id

右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)。

id

name

id

bname

1

张三

1

红烧肉

2

李四

2

火腿肠

NULL

NULL

4

大白菜

  1. 完全外连接(full join 或 full outer join)

SQL语句:select * from a full join b on a.id=b.id

完全外连接包含full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL)。

id

name

id

bname

1

张三

1

红烧肉

2

李四

2

火腿肠

3

赵六

NULL

NULL

NULL

NULL

4

大白菜

(二)内连接(join 或 inner join)

SQL语句:select * from a inner join b on a.id=b.id

inner join 是比较运算符,只返回符合条件的行。

此时相当于:select * from a,b where a.id=b.id

id

name

id

bname

1

张三

1

红烧肉

2

李四

2

火腿肠

(三)交叉连接(course join)

SQL语句:select * from a cross join b

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

id

name

id

bname

1

张三

1

红烧肉

2

李四

1

红烧肉

3

赵六

1

红烧肉

1

张三

2

火腿肠

2

李四

2

火腿肠

3

赵六

2

火腿肠

1

张三

4

大白菜

2

李四

4

大白菜

3

赵六

4

大白菜

如果我们在此时给这条SQL加上WHERE子句的时候,

比如SQL:select * from a cross join b where a.id=b.id

此时将返回符合条件的结果集,结果和inner join所示执行结果一样。

id

name

id

bname

1

张三

1

红烧肉

2

李四

2

火腿肠

(四)两表关系为一对多,多对一或多对多时的连接语句

1、一对多,多对一

两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的结果不一样,当然两表也要略有改动。比如表a的列可以改为:aid name bid,表b的列可以改为:bid bname。

这样两表就可以写一对多和多对一的SQL语句了,写法和上面的一对一SQL语句一样。

2、多对多:

表a

aid

aname

A1

张三

A2

李四

A3

王五

表b

bid

bname

B1

红烧肉

B2

火腿肠

B3

大白菜

表c

id

aid

bid

1

A1

B1

2

A2

B2

3

A3

B2

4

A3

B3

5

A2

B1

当两表为多对多关系的时候,我们需要建立一个中间表c,中间表至少要有两表的主键,当然还可以有别的内容。

SQL语句:select a.aname,b.bname from c left join a on a.aid=c.aid left join b on b.bid=c.bid

aname

bname

张三

红烧肉

李四

火腿肠

王五

火腿肠

王五

大白菜

李四

红烧肉


版权声明:本文为qq_57399395原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。