mysql 连接查询 distinct去重 union查询

连接查询

对于mysql连接查询这块,之前一直是似懂非懂,大多数都是用inner join和left join进行查询,直到后来出了事,心里就如有了块石头,没地方放,一直惦记着这事,想搞懂到底是怎么回事。

INNER JOIN
select * from a inner join b on a.id = b.a_id
A,B表只要是满足ON条件的数据才会查出来
如果B表有2条数据都满足A表的查询,那么就会出现2条类似的数据(A表字段一样,B表字段不一样)

LEFT JOIN
select * from a left JOIN b on a.id = b.a_id
A,B表只要是满足ON条件的数据就会查出来,并且A表未被匹配的数据也会展示出来
如果B表有2条数据都满足A表的查询,那么就会出现2条类似的数据(A表字段一样,B表字段不一样)

RIGHT JOIN
select * from a right JOIN b on a.id = b.a_id
A,B表只要是满足ON条件的数据就会查出来,并且A表未被匹配的数据也会展示出来
如果B表有2条数据都满足A表的查询,那么就会出现2条类似的数据(A表字段一样,B表字段不一样)

总结

内连接(inner join)
只要是a,b表满足查询条件的数据就会查出来(b表可能有多条数据关联到a表,那么就会有多条数据查出来 也就是 a表字段数据一样,b表的字段数据是b表的 这样的数据)

左连接
除了查出 内连接 的数据,还会查询出左边中没有满足on条件的数据,只不过select b表的字段是null

右链接
除了查出 内连接 的数据,还会查出右边没有满足on条件的数据,只不过select a表的字段是null

distinct去重

对于有时候查询得数据有重复,可以使用distinct去重,如

# 无论写一个字段,还是多个字段 都是组合去重的
select distinct username from a
select distinct a.id,b.* from a inner JOIN b on a.id = b.a_id
select distinct a.*,b.* from a inner JOIN b on a.id = b.a_id
# 查询多个字段,但要通过某一个字段去重
SELECT min(id),title FROM `articles` GROUP BY title limit 20

union查询

union语句查询得时候a sql select的字段要和b sql select 顺序要对应,不然查出来的数据字段会对不上