多表查询之左外连接查询
## 多表: 一对多和多对多
## “一对一”建表原则
可以写在一个表中;
当表中字段很少的时候;
拆成多张表;
但是当表中字段过多,可以把表拆成好几个;
这样每个表中字段就少了;那么这个时候就得使用“外键”了,把表与表连接起来;
## 一对多建表原则
必须两个表 一个“主表”
一个“从表”
在“从表”中必须有个字段,
这个字段引用“主表”的主键;
“从表”中这个字段就是“从表”的外键;
举例:省和市这两个表:一个省对应多个市;显然是一对多的关系;
## 多对多建表原则
必须有三张表
其中必须有一张“中间表”
举例:
假设有表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 左边的作为主表;右边的作为从表;
查询的主体是主表,然后从从表中取出指定的字段数据(满足条件的一条记录中的指定字段数据)添加补充到主表中;
从表查询的过程是, 先找到满足条件的一条记录, 然后再从这条记录中取出指定的字段, 添加到主表中对应的记录中, 作为最终查询的结果;