Oracle --- 多表查询和子查询
Posted 劳埃德·福杰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle --- 多表查询和子查询相关的知识,希望对你有一定的参考价值。
1.多表查询
用 连接 来完成多表查询
①相等连接 Equal join
SELECT emp.empno,emp.ename,emp.deptno, dept.deptno, dept.loc
FROM emp, dept
WHERE emp.deptno=dept.deptno AND emp.deptno=10;
// 使用表的别名
SELECT e.empno, e.ename, e.deptno, d.deptno, d.loc
FROM emp e, dept d
WHERE e.deptno= d.deptno;
②不等连接
SELECT e.ename, e.sal, s.grade
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
③外连接
可以用外连接来查出在一个表中,不匹配连接条件,外连接的符号是: (+)
SELECT e.ename, d.deptno, d.dname
FROM emp e, dept d
WHERE e.deptno(+) = d.deptno
ORDER BY e.deptno;
④自连接
SELECT worker.ename||' works for '||manager.ename
FROM emp worker, emp manager
WHERE worker.mgr = manager.empno;
⑤自然连接 NATURAL JOIN
基于具有相同列名的两个表中的所有列,自然连接在所有的匹配列中选取两个表中所有具有相同值 的数据行
SELECT empno, ename, sal, loc
FROM emp
NATURAL JOIN dept;
自然连接 Natural join 是一种特殊的等值连接,自然连接在结果中把重复的属性列去掉,而等值连接并不去掉重复的属性列。
等值连接中不要求相等属性值的属性名相同,而自然连接要求相等属性值的属性名必须相同,即两关系只有在 同名属性 才能进行自然连接。
⑥利用USING 子句创建连接
NATURAL JOIN 子句和 USING 子句是互斥的, 即两个子句只能使用一个
如果有几列 同名 但是 数据类型不匹配 , 则使用 USING子句为相等连接指定列
当有 多列匹配 时 , 使用 USING 子句 只匹配其中的一列
在 USING 子句引用的列中 不要使用 表名 或 别名
SELECT emp.empno, emp.ename, emp.sal, dept.loc
FROM emp JOIN dept USING(deptno);
⑦利用ON子句创建连接
NATURAL JOIN 子句和 ON 子句是互斥的 , 即两个子句只能使用一个
在所引用的 列 中要使用 表名 或 别名
连接条件 放在 ON 子句 中
SELECT e.empno, e.ename, e.deptno, d.deptno,d.loc
FROM emp e JOIN
dept d ON(e.deptno=d.deptno);
⑧内连接、左外连接、右外连接、全外连接
两个表的连接只返回 匹配数据行 的连接叫 内连接 。
两个表之间的连接不但 返回内连接的结果 而且也返回左边(或 右边 )不匹配的数据行叫左外连接(或 右外连接 ) 。
两个表之间的连接不但 返回内连接的结果 而且也返回左边和右边不匹配的数据行叫全外连接 。
SELECT e.ename, e.deptno, d.dname
FROM emp e LEFT OUTER JOIN
dept d ON(e.deptno=d.deptno);
SELECT e.ename, e.deptno, d.dname
FROM emp e RIGHT OUTER JOIN
dept d ON(e.deptno=d.deptno);
SELECT e.ename, e.deptno, d.dname
FROM emp e FULL OUTER JOIN
dept d ON(e.deptno=d.deptno);
2.子查询
子查询要包括在 括号 里面
子查询要放在 比较操作符的右边
子查询中 不要包含ORDER BY子句
单行子查询
SELECT ename
FROM emp
WHERE sal >
(SELECT sal
FROM emp
WHERE empno=7566);
// 在⼦查询中使⽤用分组函数
SELECT ename, job, sal
FROM emp
WHERE sal= (SELECT MIN(sal)
FROM emp);
// 在⼦查询中使⽤用HAVING⼦句
SELECT deptno, MIN(sal)
FROM emp
GROUP BY deptno
HAVING MIN(sal) > (SELECT MIN(sal)
FROM emp
WHERE deptno = 20);
多行子查询
// 使用Any操作符
SELECT empno, ename, job, sal
FROM emp
WHERE sal < ANY(SELECT sal
FROM emp
WHERE job = 'CLERK') AND job <> 'CLERK';
// 使用ALL操作符
SELECT empno, ename, job
FROM emp
WHERE sal > ALL(SELECT avg(sal)
FROM emp
GROUP BY deptno);
// 使用EXISTS运算符
SELECT * FROM dept
WHERE NOT EXISTS
(SELECT * FROM emp
WHERE emp.deptno=dept.deptno);
多列⼦查询
// 找出与第38号订单的产品号(prodid)、产品数量(qty)相匹配的订单的ordid、prodid和qty
SELECT ordid, prodid, qty
FROM item
WHERE (prodid, qty) IN (SELECT prodid, qty
FROM item
WHERE ordid=38) AND ordid <> 38;
在 FROM⼦句中使⽤子查询
SELECT a.ename, a.sal, a.deptno, b.salavg
FROM emp a, (SELECT deptno,avg(sal) salavg
FROM emp
GROUP BY deptno) b
WHERE a.deptno = b.deptno AND a.sal > b.salavg;
以上是关于Oracle --- 多表查询和子查询的主要内容,如果未能解决你的问题,请参考以下文章