今天我们介绍Oracle数据库中剩余的查询方法,今天的查询方法会比昨天的更为复杂一些(PS:我也是个初学者,请见谅。。)。

一、分组函数

  分组函数是为了区分同一个表中的不同数据而建立,其关键字为GROUP BY,其中可以包含任意数目的列。

  举例:

  SELECT DEPTNO.MAX(SAL)FROM EMP GROUP BY DEPTNO;

  特别注意一旦用GROUP 分组后,前后的数值要保持一致,也就是说GROUP BY 是以DEPTNO为依据进行分组的话,SELECT 后面也必须有DEPTNO。

  同时,组函数例外。也就是说SELECT后面可以跟任意的组函数。

  还记得我们的组函数有哪些吗?

  •avg()à返回某列的平均值
  •min()à返回某列的最小值
  •max()à返回某列的最大值
  •sum()à返回某列值的和
  •count()à返回某列的行数
  
  下面是一些具体实例。
  SELECT DEPTNO.SAL FROM EMP GROUP BY DEPTNO,SAL;(错误,这样进行分组将毫无意义,DEPTNO和SAL之间没有任何练习)

  SELECT DEPTNO,MIN(SAL) FROM EMP GROUP BY DEPTNO;

  SELECT COMM,COUNT(*) FROM EMP GROUP BY COMM ORDER BY COMM;

  SELECT DEPTNO,AVG(SAL)FROM EMP GROUP BY DEPTNO ORDER BY AVG(SAL);

  

  

  

  特别注意:GROUP BY  子句必须出现在where子句之后,order by 子句之前,如果GROUP BY 之后还需要进行筛选,则采用关键字 HAVING。

   也就是说,SELECT 语句可以写成  SELECT* FROM * WHERE* GROUP BY * HAVING* ORDER BY;

    程序的具体执行顺序为  FROM WHERE GROUP BY HAVING SELECT ORDER BY

     同时考虑到程序的优化,能用WHERE过滤的数据坚决不用HAVING。

---分别统计30部门中每个JOB的最高薪资,并按照JOB排列。

SELECT JOB,MAX(SAL) FROM EMP WHERE DEPTNO=30 GROUP BY JOB ORDER BY JOB;

---查询每个部门,每种工作的平均薪资

SELECT DEPTNO,JOB,AVG(SAL) FROM EMP GROUP BY DEPTNO,JOB ORDER BY DEPTNO;

--先执行WHERE 再执行GROUP

---查询名字中有A的员工,每个部门 每种工作的平均薪资,并且平均薪资大于1500

SELECT DEPTNO,JOB,AVG(SAL) FROM EMP WHERE ENAME LIKE '%A%'GROUP BY DEPTNO,JOB HAVING AVG(SAL)>1500;

二、多表关联查询

  目前主流的SQL语句中分为SQL92和SQL99,我们先介绍SQL 92的相关内容。

  

  /*
  SQL92多表关联查询
  等值关联
  非等值关联
  外连接
  自连接

  */

  -------等值关联

  

  SELECT * FROM EMP;
  SELECT * FROM DEPT;
  SELECT * FROM EMP,DEPT;
  SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
  SELECT EMP.ENAME,EMP.DEPTNO,DEPT.DNAME FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
  SELECT E.ENAME,E.DEPTNO,D.DNAME,D.LOC FROM EMP E,DEPT D WHERE E.DEPTNO = D.DEPTNO;

  SELECT E.ENAME,D.LOC FROM EMP E,DEPT D
  WHERE E.DEPTNO = D.DEPTNO
  AND E.ENAME LIKE '%A%'
  AND D.DEPTNO IN(10,30);

  ------非等值关联

  

  SELECT E.ENAME,E.SAL,S.GRADE FROM EMP E,SALGRADE S
  WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

  

  为了连接N张表,至少需要N-1个条件。

  

  在做等值关联的时候可能会因为两表没有共同的条件导致部分数据丢失,这是就要用到外连接
  ---外连接就是为了解决一张表中有数据,另一张表中没有数据

  在SQL 92中,外连接分为左外连接和右外连接。

  SELECT * FROM EMP E,DEPT D
  WHERE E.DEPTNO=D.DEPTNO(+);

  此为左外连接,可显示EMP中有,但DEPT表中无的数据

  SELECT * FROM EMP E,DEPT D
  WHERE E.DEPTNO(+)=D.DEPTNO;

  此为右外连接,可显示EMP中无,DEPT中有的数据

  如果还不好记忆的话,可以记下面的一句话。

  要显示谁,就在对方后面加一个加号。

  看看下图中有啥不同?

  

 

----自连接就是为了解决两个要匹配的列都在一张表上面

SELECT E.ENAME,M.ENAME FROM EMP E,EMP M
WHERE E.MGR=M.EMPNO;

  99语法
    笛卡尔积
    等值连接
    自然:会将名字,类型相同的类自动做等值连接
        简便
        有可能存在隐患(表的结构有可能被修改)
    字段
      USING
    非等值连接
      ON
    外连接
      左外
      右外
      全外

  

SELECET * FROM EMP E,DEPT D;(92式)

SELECT * FROM EMP E CROSS JOIN DEPT D;(99式)

用CROSS JOIN 代替 ,

SELECT* FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO;(92式)

SELECT* FROM EMP E NATURAL JOIN DEPT D;(99式)

NATURAL JOIN 又成为自然连接,会将名字,类型相同的类自动做等值连接,缺点是有可能存在隐患(表的结构有可能被修改)

所以,我们经常可以采用下面一种方式

SELECT DEPTNO E.ENAME,D.DNAME FROM EMP E JOIN DEPT D USING(DEPTNO);(99式)(自动用DEPTNO做关联,并且不能加限定词,就是不能加E.或者D)

SLEECT* FROM EMP E, DEPT D WHERE E.DEPTNO=D.D.DEPTNO;(92式)

SELECT * FROM EMP E,SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

SELECT * FROM EMP E JOIN SALGRADE S ON ( E.SAL BETWEEN S.LOSAL AND S.HISAL);
(关键字JOIN ON代替了BETWEEN)

------外连接

---左外
SELECT * FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO(+);

SELECT * FROM EMP E LEFT OUTER JOIN DEPT D USING(DEPTNO);
(关键字 OUTJOIN USING)

---右外
SELECT * FROM EMP E,DEPT D
WHERE E.DEPTNO(+)=D.DEPTNO;

SELECT * FROM EMP E RIGHT OUTER JOIN DEPT D USING(DEPTNO);
(关键字 OUTER JOIN USING)

---全外 99特点,92没有

SELECT * FROM EMP E FULL OUTER JOIN DEPT D USING(DEPTNO);

---自连接

SELECT E.ENAME,M.ENAME FROM EMP E JOIN EMP M ON(E.MGR = M.EMPNO);(99式)
(关键字 JOIN ON)代替了,where

SELECT E.ENAME,M.ENAME FROM EMP E,EMP M
WHERE E.MGR=M.EMPNO;(92式)

/*

子查询
单行子查询 返回一行
多行子查询

只能运用三个运算符 IN SOME ALL

将查询的结果抽象成一张表
*/

SELECT MAX(SAL) FROM EMP;
SELECT ENAME FROM EMP WHERE SAL=(SELECT MAX(SAL) FROM EMP);
理解子查询的关键在于把子查询当作一张表来看待。外层的语句可以把内嵌的子查询返回的结果当成一张表使用。
子查询要用括号括起来
将子查询放在比较运算符的右边(增强可读性)

SELECT ENAME FROM EMP WHERE SAL>=(SELECT AVG(SAL) FROM EMP);

SELECT * FROM EMP WHERE DEPTNO = 30;

SELECT * FROM EMP WHERE DEPTNO <> 30 AND SAL IN(SELECT SAL FROM EMP WHERE DEPTNO = 30);

SELECT * FROM EMP WHERE DEPTNO <> 30 AND >=SAL SOME(SELECT SAL FROM EMP WHERE DEPTNO = 30);

SELECT * FROM EMP WHERE DEPTNO <> 30 AND SAL>= ALL(SELECT SAL FROM EMP WHERE DEPTNO=30);

some 只要大于最小的选项
ALL 则要大于最大的

SELECT * FROM EMP WHERE SAL>= ALL(SELECT SAL FROM EMP WHERE DEPTNO=20)AND DEPTNO=20;(最大)

SELECT * FROM EMP WHERE SAL>= some(SELECT SAL FROM EMP WHERE DEPTNO=20)AND DEPTNO=20;(最小)

SELECT DEPTNO,AVG(SAL) FROM EMP WHERE DEPTNO IS NOT NULL GROUP BY DEPTNO;

SELECT DA.DEPTNO,S.GRADE FROM SALGRADE S(
SELECT DEPTNO,AVG(SAL) FROM EMP WHERE DEPTNO IS NOT NULL GROUP BY DEPTNO) DA
WHERE DA.AVGSAL BETWEEN S. LOSAL AND S. HISAL;

 

Oracle数据库初级学习 2的更多相关文章

  1. Oracle数据库初级学习

    第一天 SQL查询语句 CMD——SQLPLUS----账号 soctt 密码 tiger,输入完成后进入SQL数据库,如图显示即连接成功. 连接成功后 ,我们首先设置一下基本界面, --设置 每列显 ...

  2. Oracle 数据库 基础学习 (一) SQL基本知识

    Oracle 从零开始,不知所措.要掌握一种技能,最好的方式是先学会怎么使用它,然后再深入学习,先有样子,再有技术.   一,什么是数据库? 为什么需要数据库? 数据库实质上是一个信息的列表,或者是一 ...

  3. 【Oracle教程资源大合集】Oracle数据库免费学习资源汇总

    Oracle的产品非常丰富,各类学习资源也五花八门,本文将介绍Oracle官方的免费教程与风哥整理的Oracle视频教程: 1.Oracle帮助中心 Oracle帮助中心也称为Oracle文档中心,这 ...

  4. oracle 数据库的学习1

    1.oracle 数据库常用的基本类型 char(10)  -->存储固定长度的字符串 varchar2(10)-->存储可变长的字符串 Date INTEGER -->存储整数 N ...

  5. Oracle 数据库基础学习 (三) Oracle 四个表结构

    Oracle 四个表的 emp dept  salgrade  bunus 的结构,记住有利于后期SQL语句的学习 雇员表(emp) No. 字段 类型 描述 1 empno NUMBER(4) 表示 ...

  6. oracle数据库逐步学习总结【基础一】

    原创作品,转载请在文章开头显眼位置注明出处:https://www.cnblogs.com/sunshine5683/p/10059955.html 一.oracle的基本命令 1.连接命令 用法:c ...

  7. Oracle 数据库基础学习 (七) SQL语句综合练习

    一.多表查询综合练习 1.  列出高于在30部门工作的所有人员的薪金的员工的姓名.部门名称.部门编号.部门人数 分析: 需要的员工信息: |-emp表:姓名.部门编号 |-dept表:部门名称.部门编 ...

  8. Oracle 数据库基础学习 (二) 学习小例子:创建一个表,记录商品买卖的情况

      运行环境:Oracle database 11g + PL/SQL Developer ex: --创建一个表 create table plspl_test_product( --加入not n ...

  9. Oracle数据库的学习

    复制数据库结构到另外一数据库的的语句,首先在数据库创建链接,比如我在131数据库,dblink_018 的018为链接名称,随便取 ,可在此表查看数据库链接 select * from dba_db_ ...

随机推荐

  1. 网页设计中常用的19个Web安全字体

    来自http://www.jb51.net 在Web编码中,CSS默认应用的Web字体是有限的,虽然在新版本的CSS3,我们可以通过新增的@font-face属性来引入特殊的浏览器加载字体.但多数情况 ...

  2. 【前端】Web前端学习笔记【1】

    ... [2015.12.02-2016.02.22]期间的学习笔记. 相关博客: Web前端学习笔记[2] 1. JS中的: (1)continue 语句 (带有或不带标签引用)只能用在循环中. ( ...

  3. Hibernate不能自动建数据表解决办法

    首先自己要注意自己的MYSQL版本,然后设置对应的方言 兼容性模式 <property name="hibernate.dialect">org.hibernate.d ...

  4. vs2010 vc++ 统一修改所有工程的目录配置

    vs2005和vs2008中都是通过 工具-选项-项目和解决方案-VC++目录,设置 头文件include .库文件lib.可执行文件dll的路径,以便在引用dll动态链接库文件时,可以查找到该文件的 ...

  5. 插件框架(Plugin Framework)

    HOW TO MAKE PLUGIN FRAMEWORK 插件系统构建 Dissect Eclipse Plugin Framework

  6. 0040 Linux 系统管理命令

    1. 主机名称 hostname hostnamectl 2.开机启动 chkconfig systemctl 3.服务管理 service 服务名  start service 服务名  stop ...

  7. VRP介绍以及AC初始化配置-06

    VRP介绍 VRP:多功能路由平台(Versatile Routing Platform) 角色:网络操作系统 支撑多种设备的软件平台 提供TCP/IP 路由服务 通用路由平台VRP(Versatil ...

  8. ThreadLocal工作原理

    原文出处: imzoer 在这篇文章中,总结了一下面试过程中遇到的关于ThreadLocal的内容.总体上说,这样回答,面试算是过得去了.但是,这样的回答,明显仅仅是背会了答案,而没有去研究Threa ...

  9. C语言文法的理解

    <程序> ->  <外部声明> |  <程序>  <外部声明> <外部声明>  ->   <函数定义>  |  &l ...

  10. Linux 学会这些基本可以啦

    1,Linux 内壳文件:cat /etc/issue OR /etc/redhat-release ubuntu[apt-get install -y vim] centos[yum install ...