多表查询

概念

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

语法

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

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

里面有三项信息:ID  NAME REGION_ID3d

select * from s_dept;

 

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

里面有两项信息:ID  NAMEio

select * from s_region;

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

select id, name, region_id from s_dept, s_region;

  

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

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

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

 

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

 

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

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;

起了别名后就只能用别名,否则会报错!d3

 

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;

  。。。。。。

  

这样输出了全部的,是不正确的,因此它的对立面不是这样简单的做法。因此要引入外链接。

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息