
SQL> --查询名叫SCOTT的员工
SQL> SELECT e.* FROM emp e WHERE e.ename = 'SCOTT';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
SQL> --查询工资在3k到5k的员工
SQL> SELECT e.* FROM emp e WHERE e.sal BETWEEN 3000 AND 5000;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
7839 KING PRESIDENT 1981/11/17 5000.00 10
7902 FORD ANALYST 7566 1981/12/3 3000.00 20
SQL> --查询工号是7839/7566/7788/7876的员工
SQL> SELECT e.* FROM emp e WHERE e.empno IN (7839, 7566, 7788, 7876);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7566 JONES MANAGER 7839 1981/4/2 2975.00 20
7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
7839 KING PRESIDENT 1981/11/17 5000.00 10
7876 ADAMS CLERK 7788 1983/1/12 1100.00 20
复制
观察上面的几个例子,我们不难发现,WHERE 用以设立筛选条件,这个筛选条件是作用在结果集纵向上的

=、>、>=、<、<= 这些比较运算符使用方法和它们在数学运算中一样,都是对符号两边的量值进行对应的比较验证
在 Oracle 中 <>、!=、^= 等运算符都可以表示“不等于”运算
关键字 BETWEEN <下限值> AND <上限值> 可以表示一个闭区间,也就是筛选“大于等于下限值并且小于等于上限值”的值
关键字 IN 用来罗列要筛选的特定元素,这些元素要放在括号中,元素之间使用逗号隔开,例如 empno IN (7839, 7566, 7788) 表示选择 empno 列的值为 7839 或者 7566 或者 7788 的行;相反地,NOT IN 则表示排除掉集合中罗列的元素,例如 empno NOT IN (7839, 7566, 7788) 则表示排除掉 empno 列的值为 7839 或者 7566 或者 7788 的行
LIKE 运算符是专门用来检验字符串是否符合指定特征的,这个所谓的“特征”也是一个字符串,字符串中可以使用两个通配符,除了通配符以外的其它字符就是表示其字符本身,通配符包括下划线(_)匹配一个任意字符,百分号(%)匹配任意个任意字符
如前面所说的 NULL 的特殊性,NULL 与其它量值或者 NULL 之间不能使用一般的运算符来比较,准确的说 NULL 是一种概念,所以筛选某列中的空值或者非空值,要使用专门的 IS NULL 或者 IS NOT NULL 来判断
SQL> --1、LIKE的使用方法
SQL> --例1.1:查找姓名以S开头的员工
SQL> SELECT e.* FROM emp e WHERE e.ename LIKE 'S%';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
SQL> --例1.2:查找姓名中包含字母A的员工
SQL> SELECT e.* FROM emp e WHERE e.ename LIKE '%A%';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
7876 ADAMS CLERK 7788 1983/1/12 1100.00 20
7900 JAMES CLERK 7698 1981/12/3 950.00 30
SQL> --例1.3:查找姓名中第二个字母是A的员工
SQL> SELECT e.* FROM emp e WHERE e.ename LIKE '_A%';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
7900 JAMES CLERK 7698 1981/12/3 950.00 30
SQL> --例1.4:查找姓名中第三个字母是A的员工
SQL> SELECT e.* FROM emp e WHERE e.ename LIKE '__A%';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
7876 ADAMS CLERK 7788 1983/1/12 1100.00 20
SQL> --2、IS NULL的使用方法
SQL> --例2.1:查找绩效为空的员工
SQL> SELECT e.* FROM emp e WHERE e.comm IS NULL;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
7566 JONES MANAGER 7839 1981/4/2 2975.00 20
7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
7839 KING PRESIDENT 1981/11/17 5000.00 10
7876 ADAMS CLERK 7788 1983/1/12 1100.00 20
7900 JAMES CLERK 7698 1981/12/3 950.00 30
7902 FORD ANALYST 7566 1981/12/3 3000.00 20
7934 MILLER CLERK 7782 1982/1/23 1300.00 10
SQL> --例2.2:查找绩效不为空的员工
SQL> SELECT e.* FROM emp e WHERE e.comm IS NOT NULL;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
复制


SQL> --查询30号部门当中从事CLERK职务之员工
SQL> SELECT e.* FROM emp e WHERE e.deptno = 30 AND e.job = 'CLERK';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7900 JAMES CLERK 7698 1981/12/3 950.00 30
复制
OR 则在两边任一个表达式为真时,运算结果就可以为真,表示“或者”的意思。数据库在实际执行语句时,如果 OR 左边的表达式结果已经是真了,就不会计算右边的表达式
SQL> --查询所有供职于30号部门或者从事CLERK职务之员工
SQL> SELECT e.* FROM emp e WHERE e.deptno = 30 OR e.job = 'CLERK';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1983/1/12 1100.00 20
7900 JAMES CLERK 7698 1981/12/3 950.00 30
7934 MILLER CLERK 7782 1982/1/23 1300.00 10
复制
NOT 是将表达式原本的结果反过来,如果表达式本来结果为真,则 NOT 可以返回假,反之亦然,就像 NOT IN、NOT LIKE 里的 NOT 分别对 IN 和 LIKE 的影响一样。注意 NOT 只作用于紧随其后的表达式
SQL> --查询所有不在30部门供职或者从事CLERK职务之员工
SQL> SELECT e.* FROM emp e WHERE NOT e.deptno = 30 OR e.job = 'CLERK';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
7566 JONES MANAGER 7839 1981/4/2 2975.00 20
7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
7839 KING PRESIDENT 1981/11/17 5000.00 10
7876 ADAMS CLERK 7788 1983/1/12 1100.00 20
7900 JAMES CLERK 7698 1981/12/3 950.00 30
7902 FORD ANALYST 7566 1981/12/3 3000.00 20
7934 MILLER CLERK 7782 1982/1/23 1300.00 10
SQL> --查询所有除供职于30部门或从事CLERK职务以外之员工
SQL> SELECT e.* FROM emp e WHERE NOT (e.deptno = 30 OR e.job = 'CLERK');
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7566 JONES MANAGER 7839 1981/4/2 2975.00 20
7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
7839 KING PRESIDENT 1981/11/17 5000.00 10
7902 FORD ANALYST 7566 1981/12/3 3000.00 20
复制
SQL 中的算术表达式计算完全遵循数学中的优先级规则
在逻辑运算符中,优先级顺序为 NOT > AND > OR
在逻辑运算表达式中,括号括起来的部分总是先计算

SQL> --验证AND比OR优先级高
SQL> SELECT 1 FROM dual WHERE 1 = 0 AND 1 = 0 OR 1 = 1;
1
----------
1
复制


ORDER BY 可以指定多个字段,这些字段可以不出现在 SELECT 列表当中,字段之间用逗号隔开
默认对每个字段做升序排序,排序的优先级以 ORDER BY 列表中最左侧最高,最右侧最低
可以使用 DESC(降序)或者 ASC(升序)关键字,干预数据库排序的行为,这两个关键字只作用于其紧跟的字段
DESC 默认将 NULL 值排在最前面,DESC NULLS LAST 规定 NULL 在最后面
ASC 默认将 NULL 排在最后面,ASC NULLS FIRST 规定 NULL 在最前面
ORDER BY 中可以使用 SELECT 里面规定的列别名而取代原来的表达式,但在 ORDER BY 中则不允许再规定别名
ORDER BY 中也可以使用表达式,如算术运算式、调用函数等
SQL> SELECT e.* FROM emp e WHERE e.deptno = 30 ORDER BY e.comm, e.sal;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
7900 JAMES CLERK 7698 1981/12/3 950.00 30
7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
SQL> SELECT e.* FROM emp e WHERE e.deptno = 30 ORDER BY e.comm DESC, e.sal;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7900 JAMES CLERK 7698 1981/12/3 950.00 30
7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
SQL> SELECT e.* FROM emp e WHERE e.deptno = 30 ORDER BY e.comm DESC, e.sal DESC;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
7900 JAMES CLERK 7698 1981/12/3 950.00 30
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
SQL> SELECT e.* FROM emp e WHERE e.deptno = 30 ORDER BY e.comm DESC NULLS LAST, e.sal;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
7900 JAMES CLERK 7698 1981/12/3 950.00 30
7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
复制
好家伙,今天我可真长
