联接:通过连接运算符实现同时查询多张表。


1.内联接:

     join  on

     只显示有关联的数据(只返回符合条件的table1和table2的列)


2.外连接

A、left  join:
外连接:结果集既包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right  join:
右外连接:结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full  join:

       全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。


3.自联接

       连接的表都是同一个表,同样可以由内连接,外连接各种组合方式,按实际应用去组合。

       理解自联接的例子:

       create table t_agent(

          pk_agent_id int primary key auto_increment,

          f_agent_name varchar(100) not null,

          f_relation varchar(255),

          fk_parent_agent int

       )engine=innodb default charset=utf8;


       alter table t_agent

          add constraint fk_agent_self_ref foreign key(fk_parent_agent)

            references t_agent(pk_agent_id);


       insert into t_agent VALUES (null,'西南地区总代理','四川省',null);


       insert into t_agent VALUES (null,'四川省二级代理','四川省成都市',1);

       insert into t_agent VALUES (null,'云南省二级代理','云南省昆明市',1);

       insert into t_agent VALUES (null,'贵州省二级代理','贵州省贵阳市',1);


       insert into t_agent VALUES (null,'四川省成都市三级代理','四川省成都市锦江区',2);

       insert into t_agent VALUES (null,'四川省成都市三级代理','四川省成都市成华区',2);

       insert into t_agent VALUES (null,'四川省成都市三级代理','四川省成都市高新区',2);


       -- 所有的代理商及其父级代理的名称

       select a.f_agent_name 代理商名称, b.f_agent_name 父级代理商名称

        from t_agent a left join t_agent b

        on a.fk_parent_agent = b.pk_agent_id;


       -- 获取所有代理商及其直属的子代理商数量

       select b.pk_agent_id,b.f_agent_name 代理商, count(a.f_agent_name) 子代理商

         FROM t_agent a right join t_agent b

         on a.fk_parent_agent = b.pk_agent_id

         group by b.f_agent_name

         order by b.pk_agent_id;