• 6.交叉连接,自连接和联合查询


    一.交叉连接
    格式:
    select * from table1 cross join table2
    笛卡尔集

    交叉连接是没条件的.
    针对案例student库中的表student和class表进行交叉连接,然后和score表进行左外连接,得出没参加考试的学生.

    交叉连接有两种方式:效果一样.
    A.select * from student,class
    B.select * from student cross join class

    统计出一张学生成绩统计表,并按顺序排列.
    select t1.sname,t1.total --可以加上平均分
    from student,    
        (
        select sid ,sum(score) as 'total'
        from score
        group by sid
        ) as t1
    where student.sid=t1.sid
    order by t1.total desc

    --学号,姓名,sql server ,电子技术,移动开发,总分,均分

    select t1.sid as '学号',t1.sname as '姓名',t2.[SQL server],t2.移动开发,t2.电子技术,t2.总分,t2.均分
    from student as t1,
        (select sid as '学号',
            SUM(case when cid=1001 then score else 0 end) as 'SQL server',
            SUM(case when cid=1002 then score else 0 end) as '移动开发',
            SUM(case when cid=1003 then score else 0 end) as '电子技术',
            SUM(score) as '总分',
            SUM(score)/3 as '均分'
        from score
        group by sid
        ) as t2
    where t1.sid = t2.学号
    order by t2.总分 desc

    二.自连接(boss表)
    1.统计员工的下属有多少.
        select t1.staff_id,t1.staff_name,count(*) as '下属人数'
        from boss t1
        inner join
        boss t2
        on t1.staff_id =t2.report_id
        group by t1.staff_id ,t1.staff_name
    2.统计出哪些员工没有下属.
    利用 左连接先把全部包括NULL的显示出来就容易了.
        select t1.staff_id,t1.staff_name,t2.staff_name
        from boss t1 left outer join boss t2
        on t1.staff_id=t2.report_id
    然后对此结果集再分组 就可以得到全部有无下属的
        select t3.staff_id,t3.nameA,COUNT(t3.nameB) as '全部下属'
        from
        (
            select t1.staff_id,t1.staff_name as nameA,t2.staff_name as nameB
            from boss t1 left outer join boss t2
            on t1.staff_id=t2.report_id
        ) t3
        group by t3.staff_id,t3.nameA

    然后加having 将0的查询出来,如下:
        select t3.staff_id as '工号',t3.nameA as '姓名',COUNT(t3.nameB) as '无下属者'
        from
        (
            select t1.staff_id,t1.staff_name as nameA,t2.staff_name as nameB
            from boss t1 left outer join boss t2
            on t1.staff_id=t2.report_id
        ) t3
        group by t3.staff_id,t3.nameA
        having COUNT(t3.nameB)=0
    三.联合查询
    select * from A union select * from B      --并集
    select * from A intersect select * from B  --交集
    select * from A except select * from B     --相减

  • 相关阅读:
    盛京剑客系列21:再强调一遍:机会在MSCI成份,别走偏了
    盛京剑客系列20:平仓中兴通讯,获利45.51%,继续加仓优质个股
    盛京剑客系列19:推书《战胜华尔街》
    盛京剑客系列18:很多人因为恐惧脚下的小土坑,却丢掉了一米远处的大金矿
    盛京剑客系列17:市场暴跌下投资组合的调整
    盛京剑客系列16:推书《股市稳赚》
    盛京剑客系列15:割韭秘籍
    盛京剑客系列14:对高估值医药股要谨慎
    盛京剑客系列13:披露指数的密码,曙光就在前方
    leetcode -- Longest Valid Parentheses
  • 原文地址:https://www.cnblogs.com/yangwenlong/p/7905764.html
Copyright © 2020-2023  润新知