sql读书笔记,SQL读书笔记

   嵌套子查询是SQL语句中相比较常用的意气风发种查询艺术,开垦进度中相遇查询须求将自个儿的某列作为待查询的数额,在参谋别人的SQL语句的写法终于完毕了温馨须要的职能。

1. SQL读书笔记——SQL中的连接(1卡塔尔(قطر‎,sql读书笔记

 

《SQL学习指南》中的第5章    1.连接:      在某种机制下,须求将八个表中的数码开展整合到一齐,即同多个查询的结果集中包含来自五个也许七个以上的表,这种机制被叫做连接(join卡塔尔(قطر‎.    1.1 ANSI连接语法      本文选用的都是切合SQL92本子的ANSI SQL标准,全体的主流数据库都使用了SQL92的接连语法。由于那几个数据库都冒出SQL92正式通知从前,同一时间存在部分旧的三番若干遍语法,如下所示:      例子1:      SELECT e.fname, e.lname, d.`name`      FROM employee e , department d      WHERE e.dept_id = d.dept_id;          推荐使用SQL92标准 的连续几天形式,不引入应用方面包车型地铁连年情势,主因是:      1)连接条件和过滤条件被分隔到五个子句中(ON子句和WHERE子句卡塔尔(英语:State of Qatar),使得查询语句更方便人民群众明白;      2)每三个表的三番五次条件都在ON子句中列出,轻松寻找连接条件;      3)SQL92标准能够在各类数据库中通用,而旧的语法在差异的多寡中的表现也许略有差异; 
         1.2 笛Carl积      例子 1: 直接运用from连接employee 和 department表      格局黄金年代:      SELECT e.fname, e.lname, d.`name`      FROM employee e JOIN department             二个有二19个雇员和3个部门,会时有爆发54行数据,由于查询未有分明性的钦定八个表是什么样连接的以致的,当时会暗许两张表置换。那样的连接被叫作交叉连接(cross join卡塔尔(قطر‎.  1.3 内连接            1)两表连接      例子1: 查询各个雇员所属的单位音讯        SELECT e.fname, e.lname, d.`name`      FROM employee e JOIN department d           ON e.dept_id = d.dept_id            结果如图所示
     图片 1

 

           那个时候因此汇报方面三个表是通过何种方式关联的,是经过dept_id来涉及多个表的。      要是在三个表中的dept_id列中存在有个别值,但该值在另一张表的dept_id列中海市蜃楼,那么那时候连带的行的连接会失利,在结果集中的相关行的连接会战败,在结果集大校会去掉包括该值的行,那种类型的连接被称为内连接     若想要满含有个别表中的具有行,并没有必要思谋该表的每生龙活虎行都与另一张表相称,那么能够应用外连接       2)多表内连接      -- 例子2.询问Woburn支行中兼有熟悉柜员(在二零零七年早前入职的柜员)开设的账户   SELECT a.account_id, a.product_cd,a.open_date FROM account a INNER JOIN employee e ON a.open_emp_id = e.emp_id INNER JOIN branch b ON e.assigned_branch_id = b.branch_id WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller') AND b.`name` = 'Woburn Branch';   结果如图所示: 图片 2

 

     到现在FROM子句中蕴涵3个表,两种连接类型和多个ON子句,看上去连接的依次是account表,employee表,然后branch表,那么只要沟通employ表和account表的接二连三各种会并发哪些状态呢?       SELECT a.account_id, a.product_cd,a.open_date FROM employee e INNER JOIN account a ON a.open_emp_id = e.emp_id INNER JOIN branch b ON e.assigned_branch_id = b.branch_id WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller') AND b.`name` = 'Woburn Branch';   结果如图所示---无改造 图片 3 那么在退换employee和branch的次第吧?   SELECT a.account_id, a.product_cd,a.open_date FROM branch b INNER JOIN account a ON a.open_branch_id = b.branch_id INNER JOIN employee e ON a.open_emp_id = e.emp_id WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller') AND b.`name` = 'Woburn Branch';   结果如图所示---无修正 图片 4sql读书笔记,SQL读书笔记。  那么更改ON语句的任务呢   SELECT a.account_id, a.product_cd,a.open_date FROM branch b INNER JOIN account a INNER JOIN employee e ON a.open_branch_id = b.branch_id ON a.open_emp_id = e.emp_id WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller') AND b.`name` = 'Woburn Branch';   结果如图所示---报错!错误原因:ON语句连接关系要紧跟 JOIN语句 图片 5     例子二开外表明格局的案由:SQL是生龙活虎种非进程化的语言,相当于说只必要描述要博得的多寡对象, 而实行进度是数据库服务器担当(笔者只要结果集*_*)(然则左连接,右连接的主题材料,还不是很明确,稍后还要进行测验一下卡塔尔  3)子查询作为结果集的内再而三 例子二中的另叁个本子:使用“连接 ”连接子查询,也便是将子查询的结果集作为查询表进行三番五次   1)       SELECT e.emp_id FROM employee e WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller');   2)  SELECT b.branch_id FROM  branch b WHERE b.`name` = 'Woburn Branch';   3)  SELECT a.account_id, a.product_cd,a.open_date FROM account a INNER JOIN (SELECT e.emp_id FROM employee e WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller') ) em ON a.open_emp_id = em.emp_id INNER JOIN (SELECT b.branch_id FROM  branch b WHERE b.`name` = 'Woburn Branch') br ON a.open_branch_id = br.branch_id;   4)自连接 例子3.列出雇员的姓名同有的时候间列出董事长的全名:   SELECT emp.emp_id AS emp_id,CONCAT(emp.fname,' ',emp.lname) AS em, e.emp_id AS super_em_id,CONCAT(e.fname,' ',e.lname) AS super_em FROM employee e INNER JOIN employee emp ON e.emp_id = emp.superior_emp_id;   结果如图所示:     图片 6     上边查询达成了对表自个儿举办一连,自连接,employee表中满含了指向本人的外键(superior_emp_id)同一时候,employee表后生可畏共18行,但此询问再次回到了17行,那是由于银行的高管MIchael Smith并没 本人的掌管,它的superior_emp_id列为null,因而在改行上的内连接战败,在结果聚焦并不会来得。   5)不等连接 例子4.如果实行首席试行官决定设立二次面向银行柜员的象棋比赛,今后要开创全数博弈者的列表      SELECT CONCAT(e.fname,' ',e.lname卡塔尔(قطر‎ as TEAM_A, 'VS', CONCAT(emp.fname,' ',emp.lname) as TEAM_B FROM employee e INNER JOIN employee emp ON e.emp_id < emp.emp_id WHERE e.title = 'Teller' AN德姆p.title = 'Teller'; 结果如图所示:  图片 7

 

                         

. SQL读书笔记——SQL中的连接(1卡塔尔,sql读书笔记 《SQL学习指南》中的第5章 1.老是: 在某种机制下,必要将多个表中的数目举办整合到一齐,即...

SQL中的连接(2卡塔尔国——SQL读书笔记,sql读书笔记

 

《SQL学习指南》中的第10章     1.4 外连接       在多表连接中,存在连接条件或许不可能表中享有的行相称的标题,比如当account表与customer表举行一连时,会存在account表中cust_id列值不能相配customer表中的cust_id列值,内接连在不或许协作成功时,是不会将那条相称失利的结果归入再次回到的结果聚焦,假诺大家必要重申有些表,也正是某些表的具备行必需回到,那个表的行数决定了回到结果集的行数。          1卡塔尔国左外连接           关键词:left outer join & left join ,left提出了连续了左臂的表决定结果集的行数,而侧面只担负提供与之合作的列值。      例子1.         1)查询全部的生意客户账户 ——那是内连接             SELECT a.account_id ,b.cust_id,b.`name`  FROM  account a INNER JOIN business b  ON a.cust_id = b.cust_id;        结果如图所示:
        图片 8

         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;                     结果如图所示:           图片 9

            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;           结果如图所示:              图片 10

     2卡塔尔(英语:State of Qatar)右外接连

          关键词:right outer join & rigth join ,同理right提议了一而再了右的表决定结果集的行数,而左边只担任提供与之协作的列值。           1卡塔尔(英语:State of Qatar)           SELECT c.cust_id , b.`name`  FROM customer c  RIGHT JOIN business b           ON c.cust_id = b.cust_id;           结果如下图所示           图片 11

      3卡塔尔多表外连接

                 1卡塔尔(英语:State of Qatar)获取具备的账户列表,在那之中储存个人顾客的人名以致经济贸易顾客的集团名称                   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 ;                    结果如下图所示           图片 12

               SELECT COUNT(*) FROM account a;

          结果如下           图片 13

              上边多表进行外接连,以account为主表,去相称individual表中客户,若相配不成事,展现为null;再去相配business表中客户,同理相配不成事,展现为null.同不平时间表明了外接连中,存在以哪个表为主表,所以主表的次第是不可变,解决上一回笔记中的遗留难题:内连接与表的各样毫不相关,但是外接连要专一主表所在的职分。

                  通过子查询的措施落到实处地方的多个表同一时间扩充的自连接:           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 卡塔尔(英语:State of Qatar) AS busi ON indi.id =  busi.id; 结果如下图所示         图片 14        4卡塔尔自外连接                  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;   结果如下图所示: 图片 15

 

地点的结果由于是内连接的缘由,雇员信息会缺点和失误一条,因为总首席营业官是最高档别职员,没有上级,所以相配不成事,未有在结果集中显示。下边通过左连接的不二等秘书籍,能够减轻那么些主题素材。           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;   结果如下图所示: 图片 16

 

       将下边包车型地铁左连接更正成右连接,当时就是收获每一个高管的属下职员          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; 结果如下图所示: 图片 17

当有些首席营业官上面存在n个人士时,那样就能够在该COO对应的多少扩充n-1条数据,这也正是十多个雇员,为何查出的结果聚焦有28条数据的。

                                                       

《SQL学习指南》中的第10章 1.4 外连接 在多表连接中,存在连接条件恐怕不恐怕表中负有的行相配...

        查询语句如下:

        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

        查询结果如下:

        图片 18

        参考:

 

本文由星彩网app下载发布于星彩彩票app下载,转载请注明出处:sql读书笔记,SQL读书笔记

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。