Oracle学习笔记(二):基本SELECT语句

对于SQL 语言来讲,最强大的莫过于SELECT 语言

1,FROM字句(这是最简单的)

SQL> SELECT e.empno "雇员编号", e.ename "雇员名称" , e.hiredate "受雇日期", e.de
ptno "部门编号"
  2  FROM emp e ;

  雇员编号 雇员名称   受雇日期         部门编号
---------- ---------- -------------- ----------
      7369 SMITH      17-12月-80             20
      7499 ALLEN      20-2月 -81             30
      7521 WARD       22-2月 -81             30
      7566 JONES      02-4月 -81             20
      7654 MARTIN     28-9月 -81             30
      7698 BLAKE      01-5月 -81             30
      7782 CLARK      09-6月 -81             10
      7788 SCOTT      19-4月 -87             20
      7839 KING       17-11月-81             10
      7844 TURNER     08-9月 -81             30
      7876 ADAMS      23-5月 -87             20
      7900 JAMES      03-12月-81             30
      7902 FORD       03-12月-81             20
      7934 MILLER     23-1月 -82             10

已选择14行。
2, WHERE语句
SQL> SELECT e.empno "雇员编号", e.ename "雇员名称", e.hiredate "受雇日期", e.dep
tno "部门编号"
  2  FROM emp e WHERE e.empno>=1900 ;

  雇员编号 雇员名称   受雇日期         部门编号
---------- ---------- -------------- ----------
      7369 SMITH      17-12月-80             20
      7499 ALLEN      20-2月 -81             30
      7521 WARD       22-2月 -81             30
      7566 JONES      02-4月 -81             20
      7654 MARTIN     28-9月 -81             30
      7698 BLAKE      01-5月 -81             30
      7782 CLARK      09-6月 -81             10
      7788 SCOTT      19-4月 -87             20
      7839 KING       17-11月-81             10
      7844 TURNER     08-9月 -81             30
      7876 ADAMS      23-5月 -87             20
      7900 JAMES      03-12月-81             30
      7902 FORD       03-12月-81             20
      7934 MILLER     23-1月 -82             10

已选择14行。

3,WHERE语句的作用主要是指定检索条件

WHERE条件中可以使用的操作符

=等于
<>,!=不等于
>=大于等于
<=小于等于
>大于
<小于
ANY与列表中的任何值进行比较
ALL与列表中的所有值进行比较
BETWEEN指定的两个值之间,包括边界值
LIKE匹配的字符样式,一般用于模糊查询
IN匹配的一个列表值
IS NULL匹配空值

ALL ANY 操作符

~注:ALL与ANY的区别:
ANY是指列表中每一个值进行比较,只需要满足列表中的其中一个条件就可以输出
ALL是值列表中的所有的值进比较,必须满足所有条件才可以

SQL> SELECT empno FROM emp
  2  WHERE empno > ANY (7788 , 7800 , 7900) ;

     EMPNO
----------
      7839
      7844
      7876
      7900
      7902
      7934

已选择6行。

SQL> SELECT empno FROM emp
  2  WHERE empno > ALL (7788 , 7800 , 7900) ;

     EMPNO
----------
      7902
      7934

IN 操作符
检索列表中的数据,进行匹配。

SQL> SELECT empno FROM emp
  2  WHERE empno  IN (7788 , 7800 , 7900) ;

     EMPNO
----------
      7788
      7900

In与ANY 与ALL的不同是,IN只是匹配,没有进行比较

BETWEEN操作符:

a BETWEEN b and c 的作用相当于a<=b and a>=c

SQL> SELECT empno FROM emp WHERE empno BETWEEN 7000 AND 7500 ;

     EMPNO
----------
      7369
      7499

SQL> SELECT empno FROM emp WHERE empno >= 7000 AND empno <= 7500 ;

     EMPNO
----------
      7369
      7499

LIKE 操作符
下划线(_):匹配指定位置的一个字符
百分号(%):匹配从指定位置开始的任意个字符      

下面我们尝试在scott.emp查询ename第三个字母为O的人的名字:

     

SQL> SELECT ename FROM emp WHERE ename LIKE '__O%' ;

ENAME
----------
SCOTT


主要用于模糊查询

4,ORDER BY字句

SQL> SELECT ename FROM emp ORDER BY ename DESC ;

ENAME
----------
WARD
TURNER
SMITH
SCOTT
MILLER
MARTIN
KING
JONES
JAMES
FORD
CLARK

ENAME
----------
BLAKE
ALLEN
ADAMS

已选择14行。

#DESC为降序,由大到小;ASC为升序,由小到大;

5,GROUP BY子句

使用GROUP BY语句,可以根据表中的某一列或某激烈对表中的数据进行分组,多个列之间用逗号隔开。若进行多列分组,Oracle会对第一列进行分组,然后在分出来的组按第二列再进行分组。
 GROUP BY clause must contain only aggregates or grouping columns.    (Oracle文档)
 
 必须含有聚合函数和Group by右面的是前面所选的列,聚合函数根据Group所返回的结果进行计算

这里是只分一组的情况

SQL>  SELECT deptno AS "部门编号" ,COUNT(*) AS "员工人数"  --查询scott用户表中每一个部门的员工号
  2  FROM emp GROUP BY deptno ;

  部门编号   员工人数
---------- ----------
        30          6
        20          5
        10          3

分两组的情况:

SQL> select deptno ,job from emp group by job , deptno ;

    DEPTNO JOB
---------- ---------
        20 MANAGER
        10 PRESIDENT
        10 CLERK
        30 SALESMAN
        20 ANALYST
        30 MANAGER
        10 MANAGER
        30 CLERK
        20 CLERK

已选择9行。


~注:我们可以尝试这样理解GROUP BY字句:当被分组的列只有一列时,被分组的列把相同的数据合并,就像Java里面的List与Set,把List转化为Set的时候,相同的数据去掉。返回的结果就是这个Set的值。

这也可以解释为什么“没有使用聚合函数的列,必须出现在 group by 后面“,否则分组之后,未分组的数据与分组的数据将形成一对多的关系,如上面的关系,deptno=10的数据有很多行,而同时对应的其他列的数据

却有很多行。当被分组的列有多列时,我们把之前分好组的数据当成是一个表,再进行类似的分组方法,最后输出全部的分组结果:

deptno=10是分好的一组,我们把它看成是一个表,再对job分组,就如上面所示,

SQL> SELECT deptno ,job FROM emp WHERE DEPTNO = 10 ;

    DEPTNO JOB
---------- ---------
        10 MANAGER
        10 PRESIDENT
        10 CLERK

6,HAVING字句

HAVING语句:
HAVING字句经常与GROUP BY 字句一起用,完成统计后,再对分组的结果进行筛选结果

SQL> SELECT deptno AS "部门编号" ,COUNT(*) AS "员工人数"
  2  FROM emp GROUP BY deptno
  3  HAVING COUNT(*)>3 ;

  部门编号   员工人数
---------- ----------
        30          6
        20          5


#综:如果再SELECT语句中同时包含GROUP BY , HAVING , ORDER BY三个字句,那么这些字句在SELECT语句中出现的顺序应为:GROUP BY , HAVING , ORDER BY;


7,DISTINCT关键字

DISTINCT关键字
用来限定在检索结果中显示不重复的数据
对于重复值,只显示一个。如果不指定将默认使用ALL

SQL> select distinct deptno from emp ;

    DEPTNO
----------
        30
        20
        10

SQL> select all deptno from emp ;

    DEPTNO
----------
        20
        30
        30
        20
        30
        30
        10
        20
        10
        30
        20
        30
        20
        10

已选择14行。

~注:Distinct的用法过程:select查询结果,再把相同的合并,有点类似于集合的唯一性特点。


对Oracle SQL查询的基本知识就总结到这里,可能会有很多问题,希望有读者可以指出。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值