Oracle数据库——多表查询,分组查询,子查询

目录

多表查询 

表的连接

1999语法

分组查询

Oracle执行语句及顺序

WHERE和HAVING的区别:

UNION和UNION ALL的区别:

子查询

SELECT子句

FROM子句

WHERE子句(用到最多)

HAVING子句


多表查询 

FROM

性能不好,海量的大数据不建议使用

多表查询:在FROM子句后面设置多张数据表

笛卡尔积:会将两张表相乘

使用别名,若表名很长

表的连接

SELECT *
FROM emp e,dept d
WHERE e.des=d.des;

表连接的的两种形式:

  • 内连接(等值连接):所有满足条件的数据都会被显示出来;
  • 外连接(左连接,右连接,全外连接)控制左表与右表的数据是否全部显示。(+)标记仅Oracle才有
  • SELECT *
    FROM emp e,dept d
    WHERE e.des=d.des(+);   

      //左外连接,显示所有emp表的内容

1999语法

左外连接

SELECT * FROM emp LEFT OUTER JOIN dept USING(deptno);

 全外连接

SELECT * FROM emp FULL OUTER JOIN dept USING(deptno);

分组查询

GROUB BY

select d.deptno,d.dname,d.loc,trunc(avg(months_between(sysdate,e.hiredate)/12)) years
from dept d,emp e
group by d.deptno,d.dname,d.loc;

Oracle执行语句及顺序

  • 5确定要使用的数据:SELECT
  • 1确定要查找的数据源:FROM
  • 2.针对于数据行的筛选:WHERE
  • 3针对于数据实现分组:GROUP BY
  • 4针对于分组后的数据进行筛选:HAVING
  • 6针对于返回数据进行排序:ORDER BY

WHERE和HAVING的区别:

  • WHERE出现在GROUP BY 操作之前,即分组前的数据筛选,不允许使用统计函数
  • HAVING出现在GROUP BY 之后,针对分组后的数据进行筛选,可以使用统计函数

UNION和UNION ALL的区别:

  • union: 对两个结果集进行并集操作, 不包括重复行,相当于distinct, 同时进行默认规则的排序;
  •  union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示, 不管是不是重复;

子查询

可同时嵌套多个子查询

未选定行可能是子查询返回为空

作用:解决多表查询带来的笛卡尔积影响的性能问题。

SELECT子句

返回单行单列,使用较少

FROM子句

返回多行多列(表结构)

SELECT d.dname,d.loc,count
FROM dept d,(SELECT deptno,COUNT(empno) count from emp GROUP BY deptno) temp
WHERE d.deptno=temp.deptno(+);

WHERE子句(用到最多)

返回单行单列,单行多列,多行单列

作用:数据行的筛选,过滤条件使用

单行单列:

SELECT *
FROM emp
WHERE sal>(SELECT AVG(sal) FROM emp);

单行多列:

SELECT *
FROM emp
WHERE (sal,job)=(SELECT sal,job FROM emp WHERE ename='SCOTT');

多行单列:

三种操作符IN,ANY,ALL

IN 操作

与子查询中的sal相同均满足此条件

SELECT *
FROM emp
WHERE sal IN (SELECT sal FROM emp WHERE ename='SCOTT');

ANY

>ANY ()—大于其中最小数值就满足

<ANY ()—小于其中最大数值就满足

=ANY ()—等于其中一个数值就满足

SELECT *
FROM emp
WHERE sal=ANY (SELECT sal FROM emp WHERE job='CLERK');

ALL

>ALL ()—比查询得到的最大值要大

<ALL ()—比查询得到的最小值要小

SELECT *
FROM emp
WHERE sal>ALL (SELECT sal FROM emp WHERE job='CLERK');

HAVING子句

返回单行单列,同时表示要使用统计函数

SELECT job,COUNT(ename),AVG(SAL)
FROM emp
GROUP BY job
HAVING AVG(sal)>(SELECT AVG(sal) FROM emp);

猜你喜欢

转载自blog.csdn.net/qq_36230524/article/details/82822122