SQL

多表查询

多表连接基本查询
  • 使用一张以上的表做查询就是多表查询。
  • 语法:
SELECT {DISTINCT} * | 列名 ..
FROM 表名 别名,表名1 别名 {WHERE 限制条件
ORDER BY 排序字段 ASC | DESC .. .}

范例:查询员工表和部门表

  • 员工表
    oracle(14)_SQL_多表联合查询_基本查询_字段
  • 部门表
    oracle(14)_SQL_多表联合查询_基本查询_字段_02
  • 查询员工表和部门表
    oracle(14)_SQL_多表联合查询_基本查询_多表查询_03
  • 我们发现产生的记录数是 48 条,我们还会发现 emp 表是12条,dept 表是 4 条,48 正是 emp 表和dept 表的记录数的乘积,我们称其为笛卡尔积。
  • 如果多张表进行一起查询而且每张表的数据很大的话笛卡尔积就会变得非常大,对性能造成影响,想要去掉笛卡尔积我们需要关联查询。
  • 在两张表中我们发现有一个共同的字段是 depno,depno 就是两张表的关联的字段,我们可以使用这个字段来做限制条件,两张表的关联查询字段一般是其中一张表的主键,另一张表的外键。
  • 示例图:
    oracle(14)_SQL_多表联合查询_基本查询_多表查询_04
    关联之后我们发现数据条数是12 条,不再是 48 条。
  • 多表查询我们可以为每一张表起一个别名。
  • 示例图:
    oracle(14)_SQL_多表联合查询_基本查询_字段_05

范例:查询出雇员的编号,姓名,部门的编号和名称,地址

  • 示例图:
    oracle(14)_SQL_多表联合查询_基本查询_关联查询_06

范例:查询出每个员工的上级领导

  • 分析:emp 表中的 mgr 字段是当前雇员的上级领导的编号,所以该字段对 emp 表产生了自身关联,可以使用 mgr 字段和 empno 来关联。
  • 示例图:
    oracle(14)_SQL_多表联合查询_基本查询_关联查询_07

范例:在上一个例子的基础上查询该员工的部门名称

  • 分析:只要在上一个例子基础上再加一张表的关联,使用 deptno 来做关联字段即可
  • 示例图:
    oracle(14)_SQL_多表联合查询_基本查询_oracle_08

范例:查询出每个员工编号,姓名,部门名称,工资等级和他的上级领导的姓名,工资等级

  • 示例图:
    oracle(14)_SQL_多表联合查询_基本查询_字段_09

以上操作完整源码:

--查询员工表和部门表
select * from emp, dept;

--关联查询员工表和部门表
select * from emp, dept where emp.deptno = dept.deptno;

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

--查询出雇员的编号,姓名,部门的编号和名称,地址
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e, dept d
where e.deptno = d.deptno;

---查询出每一个员工的上级领导
select e.empno, e.ename, e1.empno, e1.ename
from emp e, emp e1
where e.mgr = e1.empno;

--查询每一个员工的上级领导和部门名称
select e.empno, e.ename, e1.empno, e1.ename, d.dname
from emp e, emp e1, dept d
where e.mgr = e1.empno
and e.deptno = d.deptno;

--查询出每个员工编号,姓名,部门名称,工资等级和他的上级领导的姓名,工资等级
select e.empno,
e.ename,
d.dname,
decode(s.grade,
1,
'一级',
2,
'二级',
3,
'三级',
4,
'四级',
5,
'五级',
'无级') egrade,
e1.ename,
decode(s1.grade,
1,
'一级',
2,
'二级',
3,
'三级',
4,
'四级',
5,
'五级',
'无级') e1grade
from emp e, dept d, salgrade s, emp e1, salgrade s1
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal
and e.mgr = e1.empno
and e1.sal between s1.losal and s1.hisal

如有错误,欢迎指正!