连接查询
对于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 顺序要对应,不然查出来的数据字段会对不上
- Prev: Cygwin 内存限制问题
- Next: elasticsearch 的安装