zoukankan      html  css  js  c++  java
  • 多表查询

    概念

    要查询的数据分布在多张表中(分布咋一张表,数据太多会造成冗余,而且分布在多张表有利于增删改查)。

    语法

    (1)如果这样:from  表1,表2;——这样会产生笛卡尔积

    ****s_dept——系统自带的部门表

    里面有三项信息:ID  NAME REGION_ID

    select * from s_dept;

     

    ****s_region——系统自带的地区表

    里面有两项信息:ID  NAME

    select * from s_region;

    演示:列出部门的id name  以及部门的地区信息(要名称不要id)

    select id, name, region_id from s_dept, s_region;

      

    两张表里有同名的字段,会出现混淆

    再加上表名代表信息来源于哪个表,这样就会出现笛卡尔积

    select s_dept, id, s_dept, name, region_id, s_region, name from s_dept, s_region

     

    输出了60条数据,本来不可能有这么多数据的,这说明产生了笛卡尔积。

     

    这时应该使用连接条件,避免笛卡尔积:

    select s_dept.id,s_dept.nam,region_id,s_region.name
    from s_dept,s_region
    where region_id=s_region.id/*连接条件*/ ;
    col  name for  a15;(调整格式)
    

    (2)所以用法应该是:

    • select  字段,表名.重名的字段,from  表1,表2
    • where  表的连接条件;(三张表至少需要两个连接条件)

    演示:列出每个员工的id  first_name  和这个员工的所在部门名

    • s_emp:dept_id   部门编号
    • s_dept:id       部门编号
    select s_emp.id, first_name, name from s_emp, s_dept where dept_id=s_dept.id;

    表的别名  简化查询的书写

    select s_emp.id, first_name.name from s_emp e, s_dept d where dept_id=d.id;

    起了别名后就只能用别名,不然会报错!

     

    select e.id, first_name.name from s_emp e, s_dept d where dept_id=d.id;

      

    演示:列出员工first_name  和员工所在的部门名以及部门对应的地区名

     

    select first_name, d.name, r.name from s_emp e, s_dept d, s_region where e.dept_id=d.id and d.region_id=r.id;

    ***salgrade  工资级别表

    GRADE 工资级别(1~5个级别)

    LOSAL  级别的低工资

    HISAL  级别的高工资

     

    select * from salgrade;

      

    演示:列出每个员工的id和salary,以及工资对应的级别  

    select e.id, e.salary, s.grade from s_emp e, salgrade s where e.salary between s.losal and hisal;

      

    或者:

    select e.id, e.salary, s.grade from s_emp e, salgrade s where salary>=losal and salary<=hisal;

    按id排个序:

    select e.id, e.salary, s.grade from s_emp e.salgrade s where salary>=losal and salary<=hisal order by id;

    自连接

    • 使用等号连接表叫等值连接
    • 不使用等号连接叫非等值连接
    • 特殊的连接:自连接

    一张表中有两层或两层以上业务含义的数据,要找出其中一层数据就逻辑上把一张表当成两张表使用。

    例如:

    s_emp员工表有两层业务含义的数据:

    领导是员工

    有些员工是领导,有些员工是普通员工,但都在一张表里

    演示:要求从s_emp表中找出所有的领导(有人的manager_id是其id)

     

    select m.id, m.first_name from s_emp e, s_emp m where e.manager_id=m.id;

    把一张表当成两张表用.

    但是这样会有重复的,因为一个领导可能管了几个人.

    所以要进行排重.

     

    select distinct m.id, m.first_name from s_emp e, s_emp m where e.manager_id=m.id;

    演示:要求从s_emp表中找出所有普通员工(应该有17个)

    select distinct m.id, m.first_name from s_emp e, s_emp m where e.manager_id!=m.id;

      。。。。。。

      

    这样输出了所有的,是不正确的,所以它的对立面不是这样简单的作法。所以要引入外连接。

  • 相关阅读:
    mssql like的效率
    【编辑器开发】基本js指令
    QQ菜单OUTLOOK风格
    oracle exp/imp命令详解
    javascript读取xml
    在c#中调用windows脚本的方法
    oracle常用命令(转)
    有效创建Oracle dblink的两种方式
    oracle 绑定变量(bind variable)
    Oracle备份与恢复
  • 原文地址:https://www.cnblogs.com/cjaaron/p/9210629.html
Copyright © 2011-2022 走看看