
一、使用Where子句限定查询
1、where中限定所选择的数据行
例:查询部门号为10的员工编号、姓名、工作
SQL> select empno,ename,job from emp where deptno=10;
EMPNO ENAME JOB
----- ---------- ---------
7782 CLARK MANAGER
7839 KING PRESIDENT
7934 MILLER CLERK
思考?查询管理者(mgr)编号为7566的雇员姓名、管理者编号和部门编号。
2、where子句中使用比较运算符
Oracle提供6种比较符:=(等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、<>或!=(不等于)
例1:查询工资大于1500的员工信息
SQL> select * from emp where sal>1500;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
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 1987-4-19 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
例2:查询工资小于等于1600的员工信息
SQL> select * from emp where sal<=1600;
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
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
思考?查询工资小于等于奖金的员工信息。
3、where子句中使用字符串
字符串必须用单引号引起来,数值型常数不需要。关键字不区分大小写,字符串区分大小写。
例:检索员工“JAMES”的信息
正确的条件
SQL> select ename,job,deptno from emp where ename='JAMES';
ENAME JOB DEPTNO
---------- --------- ------
JAMES CLERK 30
错误的条件
SQL> select ename,job,deptno from emp where ename='james';
ENAME JOB DEPTNO
---------- --------- ------
4、Where子句中使用日期
Oracle以内部数值形式存储日期,默认日期形式是“DD-MON-YY”,如“81年1月1日”表示为 “01-1月-81”。日期必须用单引号引起来。
例1:查询1982年1月23日入职的员工姓名、工资等信息。(日期格式'23-1月-82')
SQL> select ename,sal,hiredate from emp where hiredate='23-1月-82';
ENAME SAL HIREDATE
---------- --------- -----------
MILLER 1300.00 1982-1-23
如要改变where子句日期格式为“yyyy-mm-dd”,需使用如下的命令:
SQL> alter session set nls_date_format='yyyy-mm-dd';
例2:查询1982年1月23日入职的员工姓名、工资等信息。(日期格式'1982-1-23')
SQL> select ename,sal,hiredate from emp where hiredate='1982-1-23';
ENAME SAL HIREDATE
---------- --------- -----------
MILLER 1300.00 1982-1-23
5、Where子句中使用Between…And…运算符
Between…and…运算符用来显示符合一定范围内的数据行,所指定的范围包含上限和下限。
例:显示工资在1100到3000之间的所有员工信息
SQL> select * from emp where sal between 1100 and 3000;
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
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
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
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
思考?查询1981年入职的雇员信息
6、Where子句中使用in运算符
例:显示管理员编号是7902、7566或7788的雇员编号、姓名、工资和管理员编号。
SQL> select empno,ename,sal,mgr from emp where mgr in (7902,7566,7788);
EMPNO ENAME SAL MGR
----- ---------- --------- -----
7369 SMITH 800.00 7902
7788 SCOTT 3000.00 7566
7876 ADAMS 1100.00 7788
7902 FORD 3000.00 7566
思考?显示雇员FORD,ALLEN的编号、姓名、工资和管理员编号。
7、Where子句中使用like运算符
Like运算符实现SQL语句的模糊查询,查询条件的字形匹配操作可以使用通配符“%”和“_”。
%:表示零或更多任意的字符
_:代表一个字符
例1:显示姓名由大写字母S开头的雇员信息
SQL> select empno,ename,sal from emp where ename like 'S%';
EMPNO ENAME SAL
----- ---------- ---------
7369 SMITH 800.00
7788 SCOTT 3000.00
思考?显示所有受雇于1981年1月之12月之间的雇员姓名和入职日期(使用通配符%)。
SQL> select ename,hiredate from emp where hiredate like '%81%'
ENAME HIREDATE
---------- -----------
ALLEN 1981-2-20
WARD 1981-2-22
JONES 1981-4-2
MARTIN 1981-9-28
BLAKE 1981-5-1
CLARK 1981-6-9
KING 1981-11-17
TURNER 1981-9-8
JAMES 1981-12-3
FORD 1981-12-3
例2:显示所有姓名第二个字母为A的雇员姓名。
SQL> select ename from emp where ename like '_A%';
ENAME
----------
WARD
MARTIN
JAMES
思考?显示所有姓名的第三个字母为A的雇员姓名和入职日期。
8、Where子句中使用空值运算
Is null运算符判定值是否为空。
例:查询没有上级管理员的雇员信息
SQL> select * from emp where mgr is null;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7839 KING PRESIDENT 1981-11-17 5000.00 10
思考?是否可以使用如下的SQL语句显示上述要求的雇员信息
SQL> select * from emp where mgr = '';
思考?显示没有资格获得奖金的雇员信息。
SQL> select * from emp where 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 1987-4-19 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7876 ADAMS CLERK 7788 1987-5-23 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
9、Where子句中使用逻辑运算符
SQL中有三个逻辑运算符:
AND:所有条件都为真,则返回真值;
OR:任何一个条件为真,则返回真值;
NOT:如果条件为假,则返回真值。
例1:查询工资大于1100(包含1100),并且工作为CLERK的雇员编号、姓名、工作和工资。
SQL> select empno,ename,job,sal from emp where sal>=1100 and job='CLERK';
EMPNO ENAME JOB SAL
----- ---------- --------- ---------
7876 ADAMS CLERK 1100.00
7934 MILLER CLERK 1300.00
例2:查询工资大于1100(包含1100),或工作为CLERK的雇员编号、姓名、工作和工资。
SQL> select empno,ename,job,sal from emp where sal>=1100 or job='CLERK';
EMPNO ENAME JOB SAL
----- ---------- --------- ---------
7369 SMITH CLERK 800.00
7499 ALLEN SALESMAN 1600.00
7521 WARD SALESMAN 1250.00
7566 JONES MANAGER 2975.00
7654 MARTIN SALESMAN 1250.00
7698 BLAKE MANAGER 2850.00
7782 CLARK MANAGER 2450.00
7788 SCOTT ANALYST 3000.00
7839 KING PRESIDENT 5000.00
7844 TURNER SALESMAN 1500.00
7876 ADAMS CLERK 1100.00
7900 JAMES CLERK 950.00
7902 FORD ANALYST 3000.00
7934 MILLER CLERK 1300.00
例3:查询雇员工作不是CLERK,MANAGER和ANALYST的雇员姓名和工作。
SQL> select ename,job from emp where job not in ('CLERK','MANAGER','ANALYST');
ENAME JOB
---------- ---------
ALLEN SALESMAN
WARD SALESMAN
MARTIN SALESMAN
KING PRESIDENT
TURNER SALESMAN
Not运算符还可以和between、like、null配合使用。
思考?
(1)查询工资不在1100之3000之内的员工姓名、工作和工资。(not between … and…)
(2)查询员工姓名第二字母不为A的员工编号和姓名。(not like)
(3)显示有资格获得奖金的雇员信息。(is not nul)
10、运算符的优先规则
优先级:所有比较运算符 > NOT > AND > OR
可以用圆括号强制改变优先级。
例1:如果一个雇员工作是CLERK并且他的工资大于1000,或这个雇员的工作是SALESMAN,则显示这个雇员的姓名、工作和工资。
SQL> select ename,job,sal from emp where job='CLERK' and sal>1000 or job='SALESMAN';
ENAME JOB SAL
---------- --------- ---------
ALLEN SALESMAN 1600.00
WARD SALESMAN 1250.00
MARTIN SALESMAN 1250.00
TURNER SALESMAN 1500.00
ADAMS CLERK 1100.00
MILLER CLERK 1300.00
例2:如果一个雇员工作是CLERK或是SALESMAN,并且他的工资大于1000,则显示这个雇员的姓名、工作和工资。
SQL> select ename,job,sal from emp where (job='CLERK' or job='SALESMAN') and sal>1000;
ENAME JOB SAL
---------- --------- ---------
ALLEN SALESMAN 1600.00
WARD SALESMAN 1250.00
MARTIN SALESMAN 1250.00
TURNER SALESMAN 1500.00
ADAMS CLERK 1100.00
MILLER CLERK 1300.00
思考?
(1)显示姓名中两次出现字母L,并且在编号为30的部门工作,或者其管理员编号是7788的雇员姓名、部门编号、管理员编号。
(2)显示工作为CLERK或ANALYST,并且工资不等于1000、3000、5000的雇员姓名、工作及工资。
二、使用Order by子句排序
Order by子句可以使用关键字ASC(升序)和DESC(降序)将查询的结果按指定的顺序进行排序,默认排序方式是升序。
对于不同类型数据的升序排列原则是:
数值型:按从小到大顺序排序,如1,2,…,999,…
日期型:按时间从早到晚顺序排序,如1-1月-81排在1-1月-82之前
字符型:按字母顺序排列,如A最前,Z最后
空值:升序时排在最后,降序时排在最前
例1:按进入公司的先后顺序显示雇员信息
SQL> select * from emp order by hiredate;
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
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
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7839 KING PRESIDENT 1981-11-17 5000.00 10
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
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
例2:显示雇员的姓名和入职日期,要求先入公司的员工排在后入公司的员工后面。
SQL> select ename,hiredate from emp order by hiredate desc;
ENAME HIREDATE
---------- -----------
ADAMS 1987-5-23
SCOTT 1987-4-19
MILLER 1982-1-23
FORD 1981-12-3
JAMES 1981-12-3
KING 1981-11-17
MARTIN 1981-9-28
TURNER 1981-9-8
CLARK 1981-6-9
BLAKE 1981-5-1
JONES 1981-4-2
WARD 1981-2-22
ALLEN 1981-2-20
SMITH 1980-12-17
例3:显示工资大于1500的雇员编号、姓名、工作、工资和部门编号,先按部门编号,在按工资水平排序。
SQL> select empno,ename,job,sal,deptno from emp where sal>1500 order by deptno,sal;
EMPNO ENAME JOB SAL DEPTNO
----- ---------- --------- --------- ------
7782 CLARK MANAGER 2450.00 10
7839 KING PRESIDENT 5000.00 10
7566 JONES MANAGER 2975.00 20
7902 FORD ANALYST 3000.00 20
7788 SCOTT ANALYST 3000.00 20
7499 ALLEN SALESMAN 1600.00 30
7698 BLAKE MANAGER 2850.00 30
例4:显示雇员的编号、姓名、月工资和一年的工资总和,按工资总和降序排序
SQL> select empno,ename,sal,12*sal annsal from emp order by annsal desc;
EMPNO ENAME SAL ANNSAL
----- ---------- --------- ----------
7839 KING 5000.00 60000
7902 FORD 3000.00 36000
7788 SCOTT 3000.00 36000
7566 JONES 2975.00 35700
7698 BLAKE 2850.00 34200
7782 CLARK 2450.00 29400
7499 ALLEN 1600.00 19200
7844 TURNER 1500.00 18000
7934 MILLER 1300.00 15600
7521 WARD 1250.00 15000
7654 MARTIN 1250.00 15000
7876 ADAMS 1100.00 13200
7900 JAMES 950.00 11400
7369 SMITH 800.00 9600
思考?
(1)显示受雇时间在1981年2月20日之1981年5月1日之间的雇员姓名、工作及受雇时间,并以受雇时间升序排列。
(2)显示在10号和30号部门工作的雇员姓名及其部门编号,并安排雇员姓名字母顺序排列。
(3)显示能挣的奖金的雇员姓名、工资、奖金,并以工资和奖金降序排列。
