MySQL之连接

     在文章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

显示左表的全部记录以及右表符合连接条件的记录

      
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将在找到符合连接条件的记录后停止搜索更多的行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值