数据库各种连接方式的on、and、where条件使用
内连接:只保留满足on条件的数据,剔除不匹配的数据
左外连接:无论on中的条件满不满足,都保留左表所有数据
右外连接:无论on中条件满不满足,都保留右表的所有数据
全外连接:无论on中条件满不满足,都保留所有表的所有数据
表A
表B
select a.*,b.* from a left join b on a.id=b.id;
注:关联多条,从表有重复数据,一般不去重,显示出A表全部数据,005关联两次
结果如下:
select a.*,b.* from b left join a on a.id=b.id;
select a.*,b.* from a left join b on a.id=b.id and a.type=1;
注:以左表全匹配进行连接,之后用and筛选,不符合and条件的数据左表保留,右表为null,B表只显示001、002的数据
结果如下:
select a.*,b.* from a left join b on a.id=b.id where a.type=1;
注:先走on条件,在过滤出type=1的数据,on关联时用,where结果集过滤时用
结果如下:
select a.*,b.* from a left join b on a.id=b.id and a.type<>1;
注:a.type<>1,type字段不等于1,空值不参与运算,查询出A表全部,B表005存在两条,关联的A表type不等于1的数据
结果如下:
select a.*,b.* from a left join b on a.id=b.id where a.type<>1;
注:a.type<>1,type字段不等于1,空值不参与运算,type不为1,A表有003、005、005,因为005从表B有两条,所以005显示两条,共四条数据
结果如下:
select a.*,b.* from a left join b on a.id=b.id and b.card=1111;
注:从表B,005不关联,因为005的card不为1111,所以从表B只显示一条card等于1111的数据
结果如下:
select a.*,b.* from a left join b on a.id=b.id where b.card=1111;
select a.*,b.* from a left join b on a.id=b.id and b.card<>1111;
注:从表B005有两条,但因为005有一条card的值为空,不参与计算,所以005只有一条数据在右侧显示
结果如下:
select a.*,b.* from a left join b on a.id=b.id where b.card<>1111;
select a.*,b.* from a inner join b on a.id=b.id and a.type=1;
注:inner返回共有的,join和inner join中的where和and的查询结果相同,都是取**链接后的结果**再进行筛选,链接后为7条数据,在筛选type=1的数据
结果如下:
select a.*,b.* from a inner join b on a.id=b.id where a.type=1;
右外连接和左外连接原理相同