-->

多表查询(重点)

2020-02-19 08:17发布

在之前查询之中  from  子句之后只有一个数据表,所谓的多表查询是同时从多张数据表中取出数据实现查询

COUNT(*)统计一个表格的数据量

SELECT COUNT(*) FROM EMP ;

将emp和dept表多表查询

如果使用这样的语句查询:

SELECT * FROM EMP ,DEPT ;

这样查出的是 emp*dept的表格

所以要这样:

SELECT * FROM EMP ,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO ;

虽然消除了笛卡尔积,但是笛卡尔积依然存在

如果表格名称过长,往往会为其定义一个别名,

SELECT * FROM EMP E ,DEPT D WHERE E.DEPTNO = D.DEPTNO ;

范例,

1.要求查出每个雇员的编号,名字,职位,工资,部门,部门名称

  -选择数据表

    emp表,dept表。

  -确定已知的关联条件

    雇员和部门关联  emp.deptno = dept.deptno ;

第一步,查询每个雇员的编号。。。。

SELECT e.empno, e.ename ,e.job ,e.deptno  FROM emp e ;

第二步,加入部门表,要增加消除笛卡尔积的条件:

SELECT e.empno, e.ename ,e.job ,e.deptno  ,d.dname,d.loc FROM emp e ,dept d
WHERE e.deptno = d.deptno;

 

 

2.查询每个雇员的编号,姓名,工资,雇佣日期,工资等级

  -两个表

    emp和salgrade

  -关联字段

    emp.sal BETWEEN salgrade.losal AND salgrade.hisal ;

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

3.查询雇员的编号,姓名,职位,雇佣日期,工资,工资等级,所在部门及位置

  -emp

  -dept

  -salgrade

  关联条件

  emp.sal BETWEEN salgrade.losal AND salgrade.hisal ;

  AND  emp.deptno = dept.deptno ;

 

说明:1.如果使用NOT IN有了null则表示不为空,有些字段是永恒不能为空的,如果表很庞大,则直接造成死机。

   2.笛卡尔积只是显示消除,但是它还是在的。尽量回避多表查询尤其是数据量大的时候。

 

 

 

 

连接方式:

内连接:等值连接,在之前的所有查询都是内连接

外链接:左外连接,右外连接,全外连接

  

SELECT e.empno,e.job,e.mgr,m.empno
FROM emp e, emp m
WHERE e.mgr = m.empno(+) ;

//(+)只适用于Oracle

 

其他的使用

 

SQL1999

1.交叉连接

  产生笛卡尔积  

SELECT *
FROM emp CROSS JOIN dept ;

 2.自然连接

  

 

标签: