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;
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查询的基本知识就总结到这里,可能会有很多问题,希望有读者可以指出。