以users表和address表 2个表为例:
笛卡尔积:
在表的链接查询方面,有一种现象成为:笛卡尔积现象(笛卡尔乘积现象),如果两张表链接,没有任何条件约束,最后结果为:2张表的乘积。
连接查询分类:
说明:当查询涉及到多个字段多个表时,需要多表连接。
1、内连接查询
inner join on
语法:select * from a表 join b表 on a.id = b.id 可不写inner
select 查询列表
from 表名1,表名2,··· ···
join 表名2 别名 on 连接条件 (注意:这里的join可写多个。也就是可以连接多个表进行查询)
join 表3 别名 on 连接条件
where 筛选查询
group by 分组查询 having 分组后的筛选
order by 排序列表
limit 起始的条目数,显示的条目数;
执行顺序:
from子句 -> jion表 -> on筛选条件 -> where子句 -> group by -> having -> select -> order by -> limit
说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表交集的部分。
比如 - 查找users表中address_id与addrss表中关联的所有数据:
select * from users join address on users.address_id = address.ids
也可以使用SQL92的等值连接
select * from users u, address ad where u. address_id = ad.ids
结果:
2、左连接查询
left join on
语法:select * from a表 left join b表 on a.id = b.id
说明:组合两个表中的记录,返回左边表(表1)的全部字段记录,而右表(表2)只会显示符合筛选条件的数据,右表没有的数据则会用null来表示(这里只看解释,会很懵逼,结合例子,才能明白)。
select u.id, u.name, u.age, ad.address from users u left join address ad on u.address_id = ad.ids
结果:users表中address_id 为10,在address表中没有,但是还是会查询出来,因为用的左连接查询,但是在address表中没有的数据,会用null来表示。
3、右连接查询
right join on
语法:select * from a表 right join b表 on a.id = b.id
说明:与左连接查询相反,组合两个表中的记录,返回右边表(b表)的全部字段记录,而左表(a表)只会显示符合筛选条件的数据,左表没有的数据则会用null来表示。
select u.id,u.name,u.age,ad.address from users u right join address ad on u.address_id = ad.ids
结果:
4、全外连接查询
在mysql数据库中,不支持全外连接查询,但是可以通过union 来实现。
关键字: union
语法:select * from a表 left join b表 on a.id = b.id union select * from a表 right b表 on a.id = b.id
说明:把2个表的记录全部查询出来,不符合筛选条件的字段值为null
结果:
补充下:
5、子连接
关于自连接在开发中还是很常见的,比如,下边的表设计:
查询的结果:
每个分类下的子分类需要放到父分类后边,这种结果对于后端做层级结构非常好做,当然你也可以不自连接,查询全部的数据直接甩给前端,让前端来做这种树形结构数据(之前有篇文章记录了前端如何通过递归算法来实现这种树形结构)。
实现这种结果,需要把一个表看作2个表,一个父表,一个子表,让父表的id = 子表的 父id即可:
select
c1.categoryid c1id, c2.categoryid c2id,
c1.categoryname c1name, c2.categoryname c2name
from
category c1,
category c2
where
c1.categoryid = c2.pid;