Fork me on GitHub

多表查询(学习笔记)

语法:

SELECT [DISTINCT] * | 列名称 [AS]别名,........
FROM 表名称1 [别名1],表名称2 [别名2],...
[WHERE 条件(s)]
[ORDER BY 排序的字段 1,ASC| DESC,排序的字段2 ASC| DESC,....] 
  • 示例一 查询所有员工的信息和部门信息

   

SELECT * FROM EMP,DEPT;

查询结果可以看到有56条记录,而emp表只有14条,dept表只有4条,很多重复记录,这就是多表查询所产生的笛卡尔积

消除笛卡尔积,在where中加入条件来消除

  • 示例二 查询所有员工的信息和部门信息
SELECT * FROM emp e,dept d
WHERE e.deptno=d.deptno;

这样结果就正常了

  •    示例三 查询每个员工的编号、姓名、职位、基本工资、部门名称、部门位置
SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno;
  • 示例四 查询出每个员工的编号、姓名、入职日期、基本工资、工资等级

此时要想进行等级查询就要用要salgrade表,但是salgrade表中并没有字段与emp表中字段相对应,但是在salgrade表中有losal(最低工资)、hisal(最高工资)用于表示一个工资等级的范围,所以,可以通过BETWEEN...AND进行笛卡尔积的消除

 

SELECT e.empno,e.ename,e.hiredate,e.sal,s.grade
FROM emp e,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;

 

  • 示例五 示例四中的工资等级替换 1显示为E等级工资,2显示为D等级工资3显示为C等级工资,4显示为B等工资,5显示为A等工资
SELECT e.empno,e.ename,e.hiredate,e.sal,
DECODE(s.grade,1,'E等工资',
                2,'D等工资',
                3,'C等工资',
                4,'B等工资',
                5,'A等工资'
) 工资等级
FROM emp e,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
  • 示例六 查询每个员工的姓名、职位、基本工资、部门名称、工资等级

数据在3张表中emp,dept,salgrade

SELECT e.ename,e.sal,d.dname,
DECODE(s.grade,1,'E等工资',
                2,'D等工资',
                3,'C等工资',
                4,'B等工资',
                5,'A等工资'
) 工资等级
FROM emp e,dept d,salgrade s
WHERE e.deptno=d.deptno 
    AND e.sal BETWEEN s.losal AND s.hisal;

 

posted @ 2015-01-10 00:25  森林森  阅读(676)  评论(0编辑  收藏  举报