在之前查询之中 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.笛卡尔积只是显示消除,但是它还是在的。尽量回避多表查询尤其是数据量大的时候。
连接方式:
内连接:等值连接,在之前的所有查询都是内连接
外链接:左外连接,右外连接,全外连接
在emp表格中增加一个没有部门的数据:
此时新增加的数据部门为空
:观察内连接,等值连接。