• 数据库的多表查询及左右连接


    1、关于多表查询的解决思路

    --思考题:要求查询出每个雇员的编号,姓名,工资,部门名称,工资所在公司的工资等级
    --第一步确定所需要的表,以及表中字段
      --emp,dept,salgrade
      --emp:雇员编号,姓名,工资
      --dept: 部门名称
      --salgrade: 工资等级
    
    --第二步确定表的关联字段
      --emp.deptno=dept.deptno
      --emp.sal between salgrade.losal and salgrade.hisal
    
    --第三步:查询每个雇员的信息
    select e.empno,e.ename,e.sal from emp e
    
    --第四步:为查询引入部门信息,并添加消除笛卡尔积的条件
    
    select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno
    
    --第五步:为查询引入工资等级信息,并添加消除笛卡尔积德条件
    
    select e.empno,e.ename,e.sal,d.dname,s.grade from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.losal and s.hisal

    2、左右连接

    关于左右连接指的是查询判断条件的参考方向,例如:下面有如下查询:

     select * from emp e,dept d where e.deptno = d.deptno; 

    部门一共有四个,但是现在只返回了三个部门的信息,缺少40部门,因为在雇员表之中没有一条记录是属于40部门的,所以现在不会显示40部门的信息,即:现在的查询以emp表为参考,那么如果说现在非要显示40部门呢?就必须改变这种参考的方向,就要使用左右连接。

    因为SQL1999语法适用于多种数据库所以这里直接学习该语法,一下是属于多个语法的联合

    select table1.column,table2.column
    
    from table1 [cross join table2]|
    
    [natural join table2]|
    
    [join table2 using(column_name)]|
    
    [join table2 on(table1.column_name = table2.column_name)]|
    
    [left|right|full outer join table2 on(table1.column_name = table2.column_name];

    接下来分块说明语法的使用

    a、交叉连接(cross join):用于产生笛卡尔积(笛卡尔积本身并不是属于无用的内容,在某些情况下还是需要使用的)

       select * from emp cross join dept; 

    b、自然连接(natural join):自动找到匹配的关联字段,消除掉笛卡尔积

       select * from emp natural join detp 

    但是并不是所有的字段都是关联字段,设置关联字段需要通过约束指定;

    c、join using子句:用户自己指定一个消除笛卡尔积的关联字段

       select * from emp join dept using(deptno); 

    d、join ... on子句:用户自己指定一个可以消除笛卡尔积德关联条件

      select * from emp join dept on(emp.deptno=dept.deptno);  

    e、连接方向的改变:

      左(外)连接: left outer join ...on;

      右(外)连接: right outer join ...on;

      全(外)连接: full outer join ...on;

       select * from emp right outer join dept on(emp.deptno=dept.deptno); 

    注:在Oracle之外的数据库都是使用的以上的sql:1999语法操作,所以这个语法一定要会。

    工作中使用的语句

    场景1: 两个表查询A and B  其中从 B表中查询出的值做为A表的查询条件进行查询

     SELECT t.name,t.* FROM A t WHERE t.id=(SELECT c.area_id FROM B c  WHERE c.id=193084);
    
     SELECT c.* FROM A c JOIN B t ON c.id=t.area_id WHERE t.`id`=193084
    
    
    SELECT * FROM A si LEFT JOIN B st ON si.id = st.f_si 
    WHERE si.id IN(85656,85689,85701,85704,85644,85692,85632,85620);
    支付宝打赏!

    您的资助是我最大的动力!
    金额随意,欢迎来赏!


    微信打赏!

    您的资助是我最大的动力!
    金额随意,欢迎来赏!

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

    如果,想给予我更多的鼓励,求打

    因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Blue●Sky】!


    Selenium-Python】技术交流群期待你的加入【 193056556

  • 相关阅读:
    自动安装rpm依赖
    goroutine上下文contxt语法
    goroutine 上下文用法
    Template Method 模式
    设计模式2--设计原则
    centos7关机自动进行远程服务器备份
    实用工具使用
    剑指offer python版 滑动窗口的最大值
    剑指offer python版 左旋转字符串
    剑指offer python版 翻转单词顺序
  • 原文地址:https://www.cnblogs.com/Skyyj/p/4756302.html
Copyright © 2020-2023  润新知