mysql数据库:内链接,外连接

多表查询之左外连接查询

## 多表: 一对多和多对多

## “一对一”建表原则

可以写在一个表中;

当表中字段很少的时候;
拆成多张表;


但是当表中字段过多,可以把表拆成好几个;
这样每个表中字段就少了;那么这个时候就得使用“外键”了,把表与表连接起来;




## 一对多建表原则

必须两个表 一个“主表”
            一个“从表”

    在“从表”中必须有个字段,
    这个字段引用“主表”的主键;
        “从表”中这个字段就是“从表”的外键;


举例:省和市这两个表:一个省对应多个市;显然是一对多的关系;




## 多对多建表原则

必须有三张表
    其中必须有一张“中间表”

举例:
    假设有表A,是明星表;有表B,是角色表;

    需要“中间表”C,分别是“表A一条记录”和“表B一条记录”的任意组合;


显然,一个演员可以对应多个角色;一个角色也可以对应多个演员;


举例
“权限和角色”,“学生和课程表”



/


 <!--


一对多

         用户角度:
                 一个用户可以有多个订单是一对多的角度;



        一对一(业务逻辑上的一对一; 因为一个订单只能对应一个用户。。):
    左外连接    selct * from A left outer join B on 条件;
     把订单表当成主表;

    select o.*,u.username,u.birthday,u.sex,u.address from mybatis.orders o left outer join mybatis.user u on o.user_id=u.id;


    一对多(业务逻辑上的一对多;是业务逻辑;;因为一个用户可以对用多个订单):
     左外连接   selct * from A left outer join B on 条件;

   如果没有订单的人也要显示出来的话,就用user;把用户当成主表;使用的左外连接;
     使用左外连接得到的是个并集;主表记录全部展示;

    select * from mybatis.user u left outer join mybatis.orders o on o.user_id=u.id;




      如果没有订单的人不要显示出来的话,就用user;把用户当成主表;使用的内连接;
     显示内连接: select * from A inner join B on 条件;
      内连接得到的结果是个交集;; 把主表中无关的记录都过滤掉了;

     select * from mybatis.user u inner join mybatis.orders o on o.user_id=u.id;

        除掉多余的类;;; 给o.id 取个别名 oid
  select u.*, o.id oid, o.number,o.createtime, o.note
  from mybatis.user u
  inner join mybatis.orders o
  on o.user_id=u.id;

    -->



    //



    /

    字典数据表;关联查询;

      crm.sql建表;


多表关联查询, 就是。记录 对 记录;

主表上的一条记录对应 另外一张表上的一条或者多条记录;

但是 最后查询出来的就是个组合排列; 

而不是 大杂烩, 主表的一条记录上包含了另外一张表的多条记录;这是错误的;


是平铺的; 
这是一对一的关系;
主表一条记录结合另外一张表的一条记录, 合并成一条记录;


如果是一对多的关系;也是一样的;
主表一条记录结合另外一张表的一条记录, 合并成一条记录;



    /
进阶版; 替换掉多余字段;

 关联查询

select

 cust_id,
        cust_name,
        cust_user_id,
        cust_create_id,



        b1.dict_item_name cust_source,



        b2.dict_item_name cust_industry,



        b3.dict_item_name cust_level,


        cust_linkman,
        cust_phone,
        cust_mobile,
        cust_zipcode,
        cust_address,
        cust_createtime

 from customer c
left  outer join base_dict b1 on c.cust_source=b1.dict_id

left  outer join base_dict b2 on c.cust_industry=b2.dict_id

left  outer join base_dict b3 on c.cust_level=b3.dict_id


where c.cust_name like "%黑马%"and cust_source='6' and cust_industry='1' and cust_level='22' limit 0,5 ;


左外连接 selct * from A left outer join B on 条件;

left 左边的作为主表;右边的作为从表;

查询的主体是主表,然后从从表中取出指定的字段数据(满足条件的一条记录中的指定字段数据)添加补充到主表中;

从表查询的过程是, 先找到满足条件的一条记录, 然后再从这条记录中取出指定的字段, 添加到主表中对应的记录中, 作为最终查询的结果;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值