多表查询

多表查询:在一条查询语句中,从多张表里取出锁需要的数据,如果要想进行多表查询,直接在FROM子句之后跟上多个表即可。
多表查询的语法:
SELECT [DISTINCT] * | 列名称 [AS][列别名],列名称 [AS][列别名],… FROM
表名称1[表别名1],表名称2[表别名2],…[WHERE 条件 (s)] [ORDER BY 排序的字段|列索引序号 ASC|DESC,排序字段2 ASC|DESC…]…

emp表的数据量:
SELECT * FROM emp ; 显示14条数据
dept表的数据量:
SELECT * FROM dept ; 显示4条数据
emp与dept合并数据量:
SELECT * FROM emp,dept ; 显示56条数据
出现笛卡尔积问题
笛卡尔积:由于数据库内部的处理机制会产生一些“无用”的数据,而这些数据就称为笛卡尔积。
消除笛卡尔积需要加入限定条件。
SELECT *FROM emp,dept WHERE emp.deptno=dept.deptno; 此时显示14条数据,为正确的数据合并

内连接
解决“表名.字段名”过长的问题
(1)利用变量
SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno ;
注:若重命名了表名(e,d) 在所有的表明中都必须用e,d
(2)利用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 ;
注:可以结合DECODE等命令
SELECT e.ename,e.job,e.sal,d.dname,s.grade ,DECODE(s.grade,1,‘E等工资’,2,‘D等工资’,3,‘C等工资’,4,‘B等工资’,5,‘A等工资’) grade FROM emp e,dept d,salgrade s WHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal ;
结论:
如果有2张表关联,那么可以通过1个条件消除笛卡尔积;
如果有3张表关联,可以通过2个条件消除笛卡尔积。
消除笛卡尔积的条件个数=表的个数-1

外连接
FROM表1,表2:其中表1就是左表,表2就是右表。
左表连接 以左表为主
SELECT *FROM emp e,dept d WHERE e.deptno=d.deptno(+) ;
右表连接 以右表为主
SELECT *FROM emp e,dept d WHERE e.deptno(+)=d.deptno ;

自身连接
同一个表有两列有关联
SELECT e.empno eno ,e.ename ename,m.empno mno,m.ename mname FROM emp e,emp m WHERE e.mgr=m.empno(+) ;

查询出在1981年雇佣的全部雇员的编号、姓名、雇佣日期(按照年-月-日显示)、工作、领导姓名、雇员月工资、雇员年工资(基本工资+奖金),雇员工资等级、部门编号、部门名称、部门位置,并且要求这些雇员的月基本工资在1500~3500之间,将最后的结果按照年工资的降序排列,如果年工资相等,则按照工作进行排序
SELECT e.empno,e.ename,e.hiredate,e.sal,(e.sal+NVL(e.comm,0))*12 income ,
m.ename mname ,d.deptno,d.dname,d.loc ,s.grade,
DECODE(s.grade,1,‘E等工资’,2,‘D等工资’,3,‘C等工资’,4,‘B等工资’,5,‘A等工资’) 工资等级
FROM emp e , emp m , dept d , salgrade s
WHERE TO_CHAR(e.hiredate,‘yyyy’)=‘1981’ AND e.sal BETWEEN 1500 AND 3500
AND e.mgr=m.empno(+)
AND e.deptno=d.deptno
AND e.sal BETWEEN s.losal AND s.hisal
ORDER BY income DESC , e.job ;

SELECT * FROM dept
UNION
SELECT * FROM dept WHERE deptno=10 ;
在这里插入图片描述

SELECT * FROM dept
UNION ALL
SELECT * FROM dept WHERE deptno=10 ;
在这里插入图片描述

SELECT * FROM dept
MINUS
SELECT * FROM dept WHERE deptno=10 ;
在这里插入图片描述

SELECT * FROM dept
INTERSECT
SELECT * FROM dept WHERE deptno=10 ;
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值