嵌套子查询是SQL语句中相比常用的1种查询办法,开辟进度中遭逢查询须要将团结的某列作为待查询的数额,在参谋旁人的SQL语句的写法终于达成了团结索要的功力。

  嵌套子查询是SQL语句中比较常用的1种查询办法,开采进度中境遇查询须要将团结的某列作为待查询的多寡,在参照他事他说加以考查旁人的SQL语句的写法终于达成了投机要求的功用。

SQL中的连接(2)——SQL读书笔记,sql读书笔记

 

《SQL学习指南》中的第拾章     1.4 外连接      
在多表连接中,存在连接条件恐怕无法表中装有的行相称的标题,例如当account表与customer表进行延续时,会设有account表中cust_id列值不恐怕相称customer表中的cust_id列值,内接连在不能合作成功时,是不会将那条相称退步的结果放入再次回到的结果集中,如果我们供给强调有个别表,约等于某些表的有着行必须重临,那个表的行数决定了回去结果集的行数。
         一)左外连接           关键词:left outer join & left join
,left建议了连接了左边手的表决定结果集的行数,而右边手只承担提供与之相配的列值。
     例子一.         壹)查询全部的商业贸易客户账户 ——那是内连接          
  SELECT a.account_id ,b.cust_id,b.`name`  FROM  account a INNER
JOIN business b  ON a.cust_id = b.cust_id;        结果如图所示:
     
  图片 1

         二)查询全部的客户,但与此同时假设是商业客户,重临其客户名称。

                   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

            三)查询全体的客户,但同时假如是本人人客户,重返其客户名称。

               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建议了一连了右的表决定结果集的行数,而右侧只肩负提供与之协作的列值。
          壹)           SELECT c.cust_id , b.`name`  FROM customer c
 RIGHT JOIN business b           ON c.cust_id = b.cust_id;          
结果如下图所示        
  图片 4

      三)多表外连接

                
1)获取具有的账户列表,个中包括个人客户的真名以及商业贸易客户的集团名称      
            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.同时表明了外接连中,存在以哪个表为主表,所以主表的种种是不可变,消除上2遍笔记中的遗留难题:内连接与表的相继毫无干系,不过外接连要留意主表所在的职位。

                
 通过子查询的方式贯彻地点的多个表同时实行的自连接:           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条数据,那也正是十八个雇员,为什么查出的结果集中有28条数据的。

                                                       

《SQL学习指南》中的第八章 一.四 外连接
在多表连接中,存在连接条件恐怕不可能表中保有的行相称…

        查询语句如下:

        不太协考察询语句如下:

        SELECT DISTINCT dbo.a.ProxyID, dbo.a.account AS adminAccount,
dbo.b.LevelName, dbo.a.ProfitProportion, dbo.a.totalUpScore,
dbo.a.score, dbo.a.members, dbo.a.authority, dbo.a.registerDate,
dbo.a.freezeState, temp.belongName

        SELECT DISTINCT dbo.a.ProxyID, dbo.a.account AS adminAccount,
dbo.b.LevelName, dbo.a.ProfitProportion, dbo.a.totalUpScore,
dbo.a.score, dbo.a.members, dbo.a.authority, dbo.a.registerDate,
dbo.a.freezeState, temp.belongName

FROM dbo.a INNER JOIN dbo.b ON dbo.a.ProxyLevel = dbo.b.LevelId INNER
JOIN (SELECT   dbo.c.BelongsAgent, a.ProxyID, a.account AS belongName
FROM dbo.a AS a INNER JOIN dbo.c ON a.ProxyID = BelongsAgent AND
a.ProxyID = dbo.c.BelongsAgent) AS temp ON dbo.a.belongsAgent =
temp.BelongsAgent

FROM dbo.a INNER JOIN dbo.b ON dbo.a.ProxyLevel = dbo.b.LevelId INNER
JOIN (SELECT   dbo.c.BelongsAgent, a.ProxyID, a.account AS belongName
FROM dbo.a AS a INNER JOIN dbo.c ON a.ProxyID = BelongsAgent AND
a.ProxyID = dbo.c.BelongsAgent) AS temp ON dbo.a.belongsAgent =
temp.BelongsAgent

        查询结果如下:

 

        图片 11

  精简版的查询语句如下:(省略了a表的一些不根本字段)

        参考:

  SELECT DISTINCT dbo.a.BelongAgentId, dbo.a.Account, dbo.b.LevelName,
temp.BelongName  FROM dbo.a INNER JOIN (SELECT a.Account AS BelongName,
a.ProxyId FROM dbo.a AS a INNER JOIN (SELECT BelongAgentId AS id FROM
dbo.a AS a) AS t ON a.ProxyId = t.id) AS temp ON dbo.a.BelongAgentId =
temp.ProxyId INNER JOIN dbo.b ON dbo.a.ProxyLevel = dbo.b.LevelId

 

  新人报导,希望大家多多支持,感激大家!

相关文章