以users表和address表 2个表为例:

mysql基础 - 连接查询_连接查询mysql基础 - 连接查询_字段_02

笛卡尔积:

在表的链接查询方面,有一种现象成为:笛卡尔积现象(笛卡尔乘积现象),如果两张表链接,没有任何条件约束,最后结果为: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

说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表交集的部分。

mysql基础 - 连接查询_字段_03

比如 - 查找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

结果:

mysql基础 - 连接查询_连接查询_04

2、左连接查询

left  join  on

语法:select  *  from  a表  left  join b表 on  a.id = b.id

说明:组合两个表中的记录,返回左边表(表1)的全部字段记录,而右表(表2)只会显示符合筛选条件的数据,右表没有的数据则会用null来表示(这里只看解释,会很懵逼,结合例子,才能明白)。

mysql基础 - 连接查询_连接查询_05

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来表示。

mysql基础 - 连接查询_数据_06

3、右连接查询

right  join  on

语法:select  *  from  a表  right  join b表 on  a.id = b.id

说明:与左连接查询相反,组合两个表中的记录,返回右边表(b表)的全部字段记录,而左表(a表)只会显示符合筛选条件的数据,左表没有的数据则会用null来表示。

mysql基础 - 连接查询_数据_07

select u.id,u.name,u.age,ad.address from users u right join address ad on u.address_id = ad.ids

结果:

mysql基础 - 连接查询_数据_08

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

结果:

mysql基础 - 连接查询_数据_09

补充下:

5、子连接

关于自连接在开发中还是很常见的,比如,下边的表设计:

mysql基础 - 连接查询_字段_10

 查询的结果:

每个分类下的子分类需要放到父分类后边,这种结果对于后端做层级结构非常好做,当然你也可以不自连接,查询全部的数据直接甩给前端,让前端来做这种树形结构数据(之前有篇文章记录了前端如何通过递归算法来实现这种树形结构)。
mysql基础 - 连接查询_连接查询_11

 实现这种结果,需要把一个表看作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;