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 --- 多表查询和子查询的主要内容,如果未能解决你的问题,请参考以下文章

oracle多表查询和子查询练习

oracle中的多表查询和子查询以及一些注意事项

oracle之连接查询和子查询

Oracle各种Tips

多表查询和子查询

MySQL多表查询和子查询