在文章MySQL之子查询 https://blog.csdn.net/rhx_qiuzhi/article/details/79875308 中定义了三张表,分别是goods表,goods_cates和table_goods_brand三张表具有如下的关联关系
MySQL在SELECT语句、多表更新、多表删除语句中支持JOIN操作,其语法结构为:
table_reference {[INNER|CROSS]JOIN | {LEFT|RIGHT}[OUTER]JOIN}table_reference ON conditional_expr
表在使用的时候可以给表起一个别名:
table_reference table_name[[AS] alias] | table_subquery [AS] alias
数据表可以使用table_name AS alias或者table_name alias_name赋予数据表别名,table_subquery可以作为子查询使用在FROM子句中,这样的子查询必须为其赋予别名。
MySQL中连接类型有有三种:
1、JOIN,CROSS JOIN 和 INNER JOIN是等价的,为内连接,使用较多
2、LEFT [OUTER] JOIN 左外连接
3、RIGHT [OUTER] JOIN 右外连接
1、内连接INNER JOIN
一般会使用ON关键字来设定连接条件,也可以是使用WHERE来代替,通常使用ON关键字来设定连接条件,使用WHERE关键字进行结果记录的过滤。那什么是内连接呢?
显示左表和右表中交集的部分
root@localhost test>SELECT goods_id ,goods_name,cate_name FROM goods INNER JOIN goods_cates
-> ON goods.cate_id = goods_cates.cate_id ;
注意这里只有8条记录,而原来在goods中共有9条记录,使用命令查看
root@localhost test>select * from goods\G;
由于cate_id和表goods_cates表中cate_id关联,但是goods_cates表中并没有id为12的索引,那在上图中为什么没有Laserjet Pro P16呢,因为它不符合连接条件,刚才在goods_cates中增加的route ,switch等记录,因为在goods没有使用,因此没有显示出来,所以也不会呈现出来。
2、左外连接LEFT [OUTER] JOIN
显示左表的全部记录以及右表符合连接条件的记录
![](https://i-blog.csdnimg.cn/blog_migrate/11d33b2eab636a411ca4d52cc77ad22a.png)
root@localhost test>SELECT goods_id ,goods_name,cate_name FROM goods LEFT JOIN goods_cates
-> ON goods.cate_id = goods_cates.cate_id ;
但是发现上表中第9条记录的cate_name显示为NULL,左外连接显示的是左表的全部,和右表符合连接条件的,如果右表没有符合连接条件的,显示为空NULL,因为goods中分类为12,但是12在goods_cates中不存在.
3、右外连接RIGHT [OUTER] JOIN
显示右表的全部记录以及左表符合连接条件的记录
root@localhost test>SELECT goods_id ,goods_name,cate_name FROM goods RIGHT JOIN goods_cates
-> ON goods.cate_id = goods_cates.cate_id ;
4、多表连接
root@localhost test>SELECT goods_id goods_name,cate_name,brand_name,goods_price FROM goods
-> AS g
-> INNER JOIN goods_cates AS c ON g.cate_id = c.cate_id
-> INNER JOIN table_goods_brands AS b ON g.brand_id = b.brand_id\G;
连接可以看成是外键的逆向操作,外键是将多张表分别存储显示,而连接是将多张表连接在一下显示。关于连接有以下几点:
1、A LEFT JOIN B join_condition 数据表B的结果依赖于数据表A
2、数据表A的结果集根据左连接条件依赖于所有数据表(B除外)
3、左外连接条件决定如何检索数据表B(在没有指定WHERE连接条件的情况下)
4、如果数据表A的某条记录符合WHERE条件,但是在数据表B中不存在符合连接条件的记录,将生成一个所有列为空的额外的B行
5、如果使用内连接查找的记录在连接数据表中不存在,并且在WHERE子句中尝试一下操作:col_name IS NULL 时,如果col_name被定义为NOT NULL,MySQL将在找到符合连接条件的记录后停止搜索更多的行