之前的查詢,結果是表中所有的記錄。如果想要只是顯示滿足一定條件的記錄,就要使用條件查詢或者稱為限定查詢。
條件查詢的基本文法:
SELECT * |(具體的列名,如 ename ,empno)
FROM table(表名)
WHERE 限定條件
小記:where字句要緊跟在from字句之後。
例:查詢emp表中,工資大於2000的員工的所有資訊
SQL> select * from emp where sal > 2000 ; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 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 6 rows selected
在上例中,使用了 > ,在操作條件中,還可以使用 >= ,= ,<= ,<,等操作符號。關於不等號,特別說明一下,使用 != 和<>都是可以的。
例:查詢員工號不是7566的僱員資訊。
SQL> select * from emp where empno != 7566 ;
SQL> select * from emp where empno <> 7566 ; 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 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 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 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 13 rows selected
上面兩種方式的查詢結果都是一樣的。
邏輯運算:
1)AND ,邏輯並;
2)OR , 邏輯或;
3)NOT,邏輯否;
例:查詢員工部門號為10且工資大於2000的僱員資訊。
SQL> select * from emp where deptno = 10 and sal > 2000 ; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7839 KING PRESIDENT 1981/11/17 5000.00 10
如果要同時滿足兩個甚至是多個條件,使用and 串連條件字句。
例:查詢員工部門號為10 或者員工工資大於2000 的僱員資訊。
SQL> select * from emp where deptno = 10 or sal > 2000 ; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 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 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 7 rows selected
兩個條件之間是一種或者的關係,我們使用邏輯或 OR ,來串連兩個條件。
例:查詢員工工資大於2000,同時可以領取獎金的員工資訊。上面的查詢結果中,comm是空的,表示查詢結果是null。
SQL> select * from emp where sal > 1000 and 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
上面查詢的是獎金不為空白,所以使用了not ,如果要查詢comm為空白的僱員資訊,則條件改為 comm is null 。
其他比較子:
BETWEEN ... ON ...在兩個值之間,包括邊界
IN(set)值為列表set中的一個
LIKE模糊查詢
IS NULL查詢空值
between on 文法格式:
欄位 between 小值 on 大值
例:查詢工資在1500 到 2500 的僱員資訊
SQL> select * from emp where sal between 1500 and 2500 ; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
上面的查詢結果和語句 select * from emp where sal>1500 and sal < 2500; 的查詢結果是一樣的。
IN的文法格式:
in(值1, 值2 , 值3 )
例:查詢僱員編號為 7499 , 7782 , 7844 的僱員資訊
SQL> select * from emp where empno in (7499 , 7782 , 7844) ; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
LIKE的使用要注意萬用字元的問題,有兩種萬用字元:
% --任意多個字元的匹配
_--只匹配一個字元
例;查詢名字中第二個字元是M的僱員資訊。
SQL> select * from emp where ename like '_M%'; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH CLERK 7902 1980/12/17 800.00 20
轉譯字元:上面中使用了 % , _ 作為了匹配字元,如果名字中含有底線,要如何查詢呢?
此時我們就要進行轉譯;
文法格式:
SELECT ename
FROM emp
WHERE ename LIKE ‘IT\_%‘ escape ‘\‘;
判空操作:
例:查詢表中沒有獎金的員工資訊
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 10 rows selected
如果在where條件陳述式中含有,字元或者是日期,要用單引號將其引起來。
格式如下:
SELECT ename, hiredate, sal
FROM emp
WHERE hiredate = '7-6月-1994'
SELECT ename, deptno
FROM emp
WHERE ename ='Whalen';
字元大小寫敏感,日期的格式敏感,日期格式為 dd-m月-yy 。
排序:
使用 ORDER BY 字句對查詢的結果進行排序。
文法格式:
select distinct * | (具體的列名)
from 表名
where 查詢的條件
ORDER BY 排序的欄位 1 , 欄位2 , 欄位3 (asc | desc ) ;
asc-> 表示的升序 ,desc –> 表示的是降序 ,預設的是升序排列。排序除了可以按照 表中的欄位進行排序,還可以使用別名來排序。
例:查詢emp表中所有的資訊,對結果進行排序,首先對部門號進行排序,部門號一樣則按工資降序進行排列,如果工資一樣,則按員工號進行降序排列。
SQL> select * from emp order by deptno ,sal desc ,empno desc; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7839 KING PRESIDENT 1981/11/17 5000.00 10 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 7369 SMITH CLERK 7902 1980/12/17 800.00 20 7698 BLAKE MANAGER 7839 1981/5/1 2850.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 7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30 7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 7900 JAMES CLERK 7698 1981/12/3 950.00 30 14 rows selected