您的位置:首页 > 数据库

SQL 联合查询

2014-12-25 20:56 323 查看
a表

aaa    bbb    ccc

 1a      1b      1c

 2a      2b      2c

 3a      3b      3c

b表

aaa   bbb    ddd

 1a     1b       1d

 4a     4b       4d

1、union

union [all]

all:表示将查询的所有结果都合并到结果集中,若不加all会将重复的行只保留一行

[sql] view
plaincopyprint?

select * from a union select * from b  

结果:(查询的字段数相同)



[sql] view
plaincopyprint?

select aaa,bbb from a union select aaa,bbb from b  

结果:(重复的记录被覆盖)



[sql] view
plaincopyprint?

select aaa,bbb from a union all select aaa,bbb from b  

结果:(加上all,允许重复的行)



2、join

连接分为内连接、外连接、交叉连接

2.1、内连接 inner join (默认的连接方式)

只有至少有(指定的字段)一行的记录在两个查询表中都有记录,此时才有结果集。即返回两个表之间的交集(相同字段的记录)

[sql] view
plaincopyprint?

SELECT * FROM  `a` INNER JOIN b ON a.aaa = b.aaa  

结果:(两表有相同的字段的值的记录,会将字段连接起来,而不是union,将结果追加到记录的结果集后)



2.2、外连接

a、left join 左连接

返回查询表的记录,包含左边表的所有记录,如果左边表中的记录在右边表中没有对应的记录,则所返回右边表的字段结果为空(差集)

[sql] view
plaincopyprint?

SELECT * FROM  `a` LEFT JOIN `b` ON a.aaa = b.aaa  

结果:(b表没有的字段的值为空NULL)



b、right join 右连接

与left join相反,查询的记录包含右边表的所有记录,如果右边表中的记录在左边表中没有对应的记录,则返回左边表的字段值为空(差集)

[sql] view
plaincopyprint?

SELECT * FROM `b` LEFT JOIN `a` ON a.aaa = b.aaa  

结果:(a表没有的字段值为空NULL)



c、full join 全连接

返回左表和右表中的所有记录,即两表的数据全部显示

[sql] view
plaincopyprint?

select * from a full join b  

结果:(返回所有的记录)



3、cross in 交叉连接

不带where子句,返回两个表中所有笛卡尔积,记录数为a表和b表记录数的积

[sql] view
plaincopyprint?

SELECT * FROM  `b` CROSS JOIN `a`  

结果:



[sql] view
plaincopyprint?

SELECT * FROM  `a` CROSS JOIN `b`  

结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: