SQL中的连接(二)——SQL读书笔记

发布时间:2019-05-03  栏目:sqlite  评论:0 Comments

 

《SQL学习指南》中的第八章

  

 1.4
外连接

   
 

在多表连接中,存在连接条件或然不能够表中持有的行匹配的标题,譬喻当account表与customer表实行连接时,会存在account表中cust_id列值不可能相称customer表中的cust_id列值,内接连在不能合营成功时,是不会将那条相称失利的结果放入再次回到的结果聚集,如果大家须要重申某些表,也正是某些表的具有行必须回到,那么些表的行数决定了回到结果集的行数。

 
  

   
一)左外连接

          关键词:left outer join & left join
,left提议了连年了左手的表决定结果集的行数,而左侧只担当提供与之相称的列值。

     例子1.

     
  壹)查询全体的生意客户账户 ——那是内一而再

   
 

   
  SELECT a.account_id ,b.cust_id,b.`name`

 FROM 
account a INNER JOIN business b

 ON
a.cust_id = b.cust_id;

 

   
 结果如图所示:

     
  图片 1

        
2)查询全体的客户,但与此同时要是是商业贸易客户,再次回到其客户名称。

     
   

     
   SELECT a.account_id ,a.cust_id,b.`name`

FROM 
account a LEFT OUTER JOIN business b

ON
a.cust_id = b.cust_id;

     
   

    
     结果如图所示:

       
  图片 2

           
3)查询全数的客户,但与此同时倘诺是自身人客户,重返其客户名称。

     
       

 SELECT a.account_id
,a.cust_id,

 CONCAT(i.fname,’ ‘,i.lname) AS
gustname

 FROM 
account a INNER JOIN individual i

 ON
a.cust_id = i.cust_id;

 
  

     结果如图所示:

           
 图片 3

   
 二)右外接连

          关键词:right outer join & rigth join
,同理right提出了再三再四了右的表决定结果集的行数,而右边只担当提供与之相称的列值。

     
    1)

     
    SELECT c.cust_id , b.`name`

 FROM
customer c

 RIGHT
JOIN business b

    
     ON c.cust_id = b.cust_id;

     
    结果如下图所示

       
  图片 4

    
 三)多表外连接

      

     
   
一)获取具备的账户列表,在那之中富含个人客户的真名以及商业客户的公司名称

     
  

     
   SELECT a.account_id, 

CONCAT(i.fname,’ ‘,i.lname) AS
person_name,

b.`name` as business_name

FROM
account a

LEFT
JOIN individual i

ON
a.cust_id = i.cust_id

LEFT
JOIN business b

ON
a.cust_id = b.cust_id ;

     
   

     
   结果如下图所示

       
  图片 5

           
   SELECT COUNT(*) FROM account a;

     
    结果如下

       
  图片 6

           
  下面多表进行外接连,以account为主表,去相配individual表中用户,若匹配不成事,展现为null;再去相配business表中用户,同理匹配不成功,展现为null.同时表明了外接连中,存在以哪个表为主表,所以主表的逐1是不可变,消除上二遍笔记中的遗留问题:内接连与表的次第非亲非故,但是外接连要留心主表所在的岗位。

       
  

   
 

 通过子查询的点子贯彻地点的八个表同时开始展览的自连接:

     
   

SELECT
indi.id, person_name,bussiness_name

FROM
(

   
SELECT a.account_id AS id, CONCAT(i.fname,’ ‘,i.lname) as
person_name

   
FROM account a

   
LEFT JOIN individual i

  ON
a.cust_id = i.cust_id

)  AS
indi

INNER
JOIN (

   
SELECT a.account_id AS id, b.`name` AS bussiness_name

   
FROM  account a

   
LEFT JOIN business b

    ON
a.cust_id = b.cust_id

) AS
busi

ON
indi.id =  busi.id;

结果如下图所示

     
  图片 7 

   
  4)自外连接

      

     
    1)后边通过内再而三实现的1个主题素材:获取雇员及其首席营业官的新闻

     
   SELECT e.emp_id,CONCAT(e.fname,’ ‘,e.lname) AS
emp_name,

em.emp_id AS
su_emp_id,CONCAT(em.fname,’ ‘, em.lname) AS
superior_name

FROM
employee e

INNER
JOIN employee em

ON
e.superior_emp_id = em.emp_id;

 

结果如下图所示:

图片 8

 

地方的结果由于是内接连的来由,雇员消息会缺点和失误一条,因为总主管是最高档别职员,未有上边,所以相配不成功,未有在结果聚焦显示。上边通过左连接的情势,能够解决那么些难题。

 
  

   
 SELECT e.emp_id,CONCAT(e.fname,’ ‘,e.lname) AS
emp_name,

em.emp_id AS
su_emp_id,CONCAT(em.fname,’ ‘, em.lname) AS
superior_name

FROM
employee e

LEFT
JOIN employee em

ON
e.superior_emp_id = em.emp_id;

 

结果如下图所示:

图片 9

 

       将上面包车型地铁左连接改换成右连接,那时候就是收获各样首席实践官的部属职员

 
  

   
SELECT e.emp_id,CONCAT(e.fname,’ ‘,e.lname) AS emp_name,

em.emp_id AS
su_emp_id,CONCAT(em.fname,’ ‘, em.lname) AS
superior_name

FROM
employee e

RIGHT
JOIN employee em

ON
e.superior_emp_id = em.emp_id;

结果如下图所示:

图片 10

当某些老板上边存在n个人员时,那样就能够在该首席试行官对应的多寡扩充n-1条数据,那也便是23个雇员,为啥查出的结果集中有2八条数据的。

     
    

 
  

 

   
 

 
  

 
  

 

 

 

 

 

 

 

 

 

 

 

留下评论

网站地图xml地图