上周在面试的时候 考到SQL语句的查询时有点懵,回来后就开始复习oracle的相关知识。本来在笔记本上记笔记,可奈何字写得不是很好看,考虑到以后方便查阅的问题,就来了博客,一起复习复习。虽然在SQL语言的规范中关键字都是大写,但是为了方便书写和查阅,这里全用小写。
一、简单查询
1. select 语句
根据select的语法,必须的字句为 select 字句和from字句,其他的字句都是可选的。from、where、group by、having子句被称为表表达式。当处理select语句时,select语句这一部分总是首先被评估。表达式中的每个子句按照语法中列出的次序被依次评估。评估结果是一个虚拟表,它将用于以后得评估。也就是说,前一个子句的评估结果将用于下一个子句,知道表表达式中的每个子句都被评估完为止。
最基本的select语句的用法如下:
select EMPNO,ENAME,JOB, MGR HIREDATE,SAL,COMM ,DEPTNO from EMP;
运行结果如下:
EMPNO ENAME JOB HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ----------
7369 SMITH CLERK 7902 800 20
7499 ALLEN SALESMAN 7698 1600 300 30
7521 WARD SALESMAN 7698 1250 500 30
7566 JONES MANAGER 7839 2975 20
7654 MARTIN SALESMAN 7698 1250 1400 30
7698 BLAKE MANAGER 7839 2850 30
7782 CLARK MANAGER 7839 2450 10
7788 SCOTT ANALYST 7566 3000 20
7839 KING PRESIDENT 5000 10
7844 TURNER SALESMAN 7698 1500 0 30
7876 ADAMS CLERK 7788 1100 20
7900 JAMES CLERK 7698 950 30
7902 FORD ANALYST 7566 3000 20
7934 MILLER CLERK 7782 1300 10
选定了 14 行
2.where 子句
where 子句获取 from子句返回值(在虚拟表中),并且应用where 子句中定义的搜索条件。where子句相当于 from子句返回结果 的筛选器,每一行都要根据搜索条件进行评估,评估为true 的那些行为作为查询结果的一部分返回,那些评估未知或者为false的行为将不包括子啊结果中。
例如:找出 emp表中 job为 clerk的人
select EMPNO,ENAME,JOB, MGR HIREDATE,SAL,COMM ,DEPTNO from EMP where JOB='CLERK';
结果为:
EMPNO ENAME JOB HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ----------
7369 SMITH CLERK 7902 800 20
7876 ADAMS CLERK 7788 1100 20
7900 JAMES CLERK 7698 950 30
7934 MILLER CLERK 7782 1300 10
注意:where 后面的比较语句,若clerk加单引号,则为比较 字符串;若不加单引号,则认为clerk为一个变量。
3.关键字的使用
select 子句包括可选关键字 distinct 和 all 。在需要删除查询结果中相同的行时使用关键字 distinct ;在需要返回查询结果中的所有行时 使用关键字 all 。
例如:(1)使用distinct 关键字
select distinct JOB from EMP;
结果为:
JOB
---------
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST
(2)使用all关键字(若没有指定任何关键字,默认为all)
select all JOB from EMP;
结果为:
JOB
---------
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
选定了 14 行
4. 使用 值表达式
在select语句的搜索条件中可以使用值表达式,它由一个或者多个谓语组成,这些 谓语用于测试from 子句返回的内容
如:(1)
select EMPNO,ENAME,JOB,MGR HIREDATE,SAL,COMM,DEPTNO from EMP where SAL>1300 AND SAL<2000 ;
结果为:
EMPNO ENAME JOB HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 1600 300 30
7844 TURNER SALESMAN 7698 1500 0 30
(2)
select EMPNO,ENAME,JOB,MGR HIREDATE,SAL,COMM,DEPTNO from EMP where SAL>1000 AND SAL<2000 AND (DEPTNO =10 OR DEPTNO=20);
结果为
EMPNO ENAME JOB HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ----------
7876 ADAMS CLERK 7788 1100 20
7934 MILLER CLERK 7782 1300 10
5. 排序查询结果
order by 子句接受select 子句的输出,并且按照order by 子句中的规范排列查询结果的次序。这个子句不对行进行归纳,也不像where那样进行筛选。但是,可以使用order by 子句来指定按照升序(使用关键字ASC)还是降序(使用关键字DESC)对其进行组织。
例如:(1)
select EMPNO,ENAME,JOB,MGR HIREDATE,SAL,COMM,DEPTNO from EMP where SAL>1000 AND SAL<2000 order by SAL DESC;
结果:
EMPNO ENAME JOB HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 1600 300 30
7844 TURNER SALESMAN 7698 1500 0 30
7934 MILLER CLERK 7782 1300 10
7521 WARD SALESMAN 7698 1250 500 30
7654 MARTIN SALESMAN 7698 1250 1400 30
7876 ADAMS CLERK 7788 1100 20
选定了 6 行