更好的看↑代碼點擊VIEW PLAN
第二章 約束和排序數據
1. 在 emp 表中選擇工資介於 1500 到 2500 的員工的信息;
注意:使用 between 下邊界 and 上邊界時,條件包括邊界值;
SCOTT@ORCL>l
1 select * from emp
2* where sal between 1500 and 2500
SCOTT@ORCL>/
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
2. 在emp表中選擇位於20,30 部門的員工的信息;
SCOTT@ORCL>select *from emp
2 where deptno in (20,30);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
11 rows selected.
3. 在emp表中選擇位於員工的名字中包含大寫字符 ‘A’ 的員工的信息;
SCOTT@ORCL>select * from emp
2 where ename like '%A%';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7 rows selected.
注意:如果查詢的名字中包含%或者_ ,而且查詢的時候又要查詢這樣的信息,需要用到換位碼。
注意:通配符%,表示0或者多個字符一樣;通配符_,表示1個字符一樣;
3.1 創建與 emp 表結構相同的表;
SCOTT@ORCL>create table emp_n /* 參照emp表創建新表emp_n */
2 as select * from emp where 1=2; /* 加where 1=2 一致表結構沒有數據 */
Table created.
SCOTT@ORCL>select * from emp_n;
no rows selected
3.2 添加包含通配符的測試用數據;
SCOTT@ORCL>insert into emp_n(empno,ename,sal) values(&empno,&ename,&sal);
Enter value for empno: 1001
Enter value for ename: 'whwh%gogo'
Enter value for sal: 1000
old 1: insert into emp_n(empno,ename,sal) values(&empno,&ename,&sal)
new 1: insert into emp_n(empno,ename,sal) values(1001,'whwh%gogo',1000)
1 row created.
SCOTT@ORCL>/
Enter value for empno: 1002
Enter value for ename: '%whwh'
Enter value for sal: 2000
old 1: insert into emp_n(empno,ename,sal) values(&empno,&ename,&sal)
new 1: insert into emp_n(empno,ename,sal) values(1002,'%whwh',2000)
1 row created.
SCOTT@ORCL>/
Enter value for empno: 1003
Enter value for ename: 'whwh_gogo'
Enter value for sal: 3000
old 1: insert into emp_n(empno,ename,sal) values(&empno,&ename,&sal)
new 1: insert into emp_n(empno,ename,sal) values(1003,'whwh_gogo',3000)
1 row created.
SCOTT@ORCL>/
Enter value for empno: 1004
Enter value for ename: '_gogo'
Enter value for sal: 4000
old 1: insert into emp_n(empno,ename,sal) values(&empno,&ename,&sal)
new 1: insert into emp_n(empno,ename,sal) values(1004,'_gogo',4000)
1 row created.
SCOTT@ORCL>commit;
Commit complete.
SCOTT@ORCL>select * from emp_n;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
1001 whwh%gogo 1000
1002 %whwh 2000
1003 whwh_gogo 3000
1004 _gogo 4000
3.3 換位碼的使用方法;(此處以\作爲換位碼,換位碼還可以指定其他字符)
例:檢索包含%的記錄信息;
SCOTT@ORCL>select * from emp_n
2 where ename like '%\%%' escape '\';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
1001 whwh%gogo 1000
1002 %whwh 2000
SCOTT@ORCL>select * from emp_n
2 where ename like '%\%%';
no rows selected
例:檢索以%開頭的記錄信息;
SCOTT@ORCL>select * from emp_n
2 where ename like '\%%' escape '\';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
1002 %whwh 2000
例:檢索包含_的記錄信息;
SCOTT@ORCL>select * from emp_n
2 where ename like '%\_%' escape '\';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
1003 whwh_gogo 3000
1004 _gogo 4000
例:檢索以_開頭的記錄信息;
SCOTT@ORCL>select * from emp_n
2 where ename like '\_%' escape '\';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
1004 _gogo 4000
4 複合條件的使用
4.1 對於and條件的複合(可以將between...and...進行轉換)
例:在emp表中選擇工資介於2000到3000的員工的信息;
SCOTT@ORCL>select * from emp
2 where sal>=2000 and sal<=3000;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7566 JONES MANAGER 7839 02-APR-81 2975 20
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
SCOTT@ORCL>select * from emp
2 where sal between 2000 and 3000;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7566 JONES MANAGER 7839 02-APR-81 2975 20
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
4.2 對於or條件複合(可以將in()進行轉換)
例:在emp表中選擇10號和20號部門的員工信息;
SCOTT@ORCL>select * from emp
2 where deptno=10 or deptno=20;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
8 rows selected.
SCOTT@ORCL>select * from emp
2 where deptno in (10,20);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
8 rows selected.
5 對於表中數據的排序
5.1 asc 表示按照所給字段進行升序排列(默認升序)
desc 表示按照所給字段進行降序排列
例:將emp表中10號部門的員工信息按照sal列升序排列
SCOTT@ORCL>select * from emp
2 where deptno=10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
SCOTT@ORCL>select * from emp
2 where deptno=10
3 order by sal asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7839 KING PRESIDENT 17-NOV-81 5000 10
SCOTT@ORCL>select * from emp
2 where deptno=10
3 order by sal;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7839 KING PRESIDENT 17-NOV-81 5000 10
例:將emp表中20號部門的員工信息按照sal列降序排列
SCOTT@ORCL>select * from emp
2 where deptno=20
3 order by sal desc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7369 SMITH CLERK 7902 17-DEC-80 800 20
5.2 如果order by 後面跟多個字段,則將結果集先按照第1個字段進行排序【條件1】,
再按第2個字段進行排序【條件2】;
注意:【條件1】如果按照第1個字段分不開先後順序的時候,纔會按照第2個字段排序;
asc 或者desc 影響的字段,僅僅是它緊挨着的那個字段;
例:將emp表中10號部門的員工信息按sal降序排列,empno升序排列;
SCOTT@ORCL>select * from emp
2 where deptno=10
3 order by sal desc,empno asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7839 KING PRESIDENT 17-NOV-81 5000 10
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
例:將emp表中20號部門的員工信息按照empno 降序排列,sal升序排列;
SCOTT@ORCL>select * from emp
2 where deptno=20
3 order by empno desc,sal asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7369 SMITH CLERK 7902 17-DEC-80 800 20
5.3 除了可以使用字段排序,還可以使用字段所在的先後位置排序;
確定字段在表中的先後順序;
SCOTT@ORCL>set lines 100
SCOTT@ORCL>desc emp;
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
例:將emp表中10號部門的員工信息按sal降序排列,empno升序排列;
SCOTT@ORCL>select * from emp
2 where deptno=10
3 order by 6 desc,1 asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7839 KING PRESIDENT 17-NOV-81 5000 10
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
例:將emp表中20號部門的員工信息按照empno 降序排列,sal升序排列;
SCOTT@ORCL>select * from emp
2 where deptno=20
3 order by 1 desc,6 asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7369 SMITH CLERK 7902 17-DEC-80 800 20
5.4 除了可以使用number 類型的字段進行排序外,還可以使用字符串或者時間類型的字段進行排序;
注意:字符串排序:按照字符對應的ASCII碼的先後進行排序;
日期排序:按照日期的先後進行排序,時間越往後越大;
例:將emp表中員工按照job升序、ename降序進行排列;(先按Job排序,同樣的job按ename降序)
SCOTT@ORCL>select * from emp
2 order by job asc,ename desc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7369 SMITH CLERK 7902 17-DEC-80 800 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7900 JAMES CLERK 7698 03-DEC-81 950 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7839 KING PRESIDENT 17-NOV-81 5000 10
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
14 rows selected.
例:將emp表中員工按照 HIREDATE 升序,sal降序排列(如果HIREDATE相同,按照sal降序)
先將HIREDATE顯示格式設定
SCOTT@ORCL>alter session set nls_date_format='yyyy-mm-dd';
Session altered.
SCOTT@ORCL>select * from emp
2 order by hiredate asc,sal desc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
7566 JONES MANAGER 7839 1981-04-02 2975 20
7698 BLAKE MANAGER 7839 1981-05-01 2850 30
7782 CLARK MANAGER 7839 1981-06-09 2450 10
7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
7839 KING PRESIDENT 1981-11-17 5000 10
7902 FORD ANALYST 7566 1981-12-03 3000 20
7900 JAMES CLERK 7698 1981-12-03 950 30
7934 MILLER CLERK 7782 1982-01-23 1300 10
7788 SCOTT ANALYST 7566 1987-04-19 3000 20
7876 ADAMS CLERK 7788 1987-05-23 1100 20
14 rows selected.
6. 使用結果集中的別名進行排序;
例:按照emp表中員工對於的年薪(sal*12)進行排序;
SCOTT@ORCL>select empno,ename,hiredate,sal*12 year_sal
2 from emp
3 order by year_sal desc;
EMPNO ENAME HIREDATE YEAR_SAL
---------- ---------- ---------- ----------
7839 KING 1981-11-17 60000
7902 FORD 1981-12-03 36000
7788 SCOTT 1987-04-19 36000
7566 JONES 1981-04-02 35700
7698 BLAKE 1981-05-01 34200
7782 CLARK 1981-06-09 29400
7499 ALLEN 1981-02-20 19200
7844 TURNER 1981-09-08 18000
7934 MILLER 1982-01-23 15600
7521 WARD 1981-02-22 15000
7654 MARTIN 1981-09-28 15000
7876 ADAMS 1987-05-23 13200
7900 JAMES 1981-12-03 11400
7369 SMITH 1980-12-17 9600
14 rows selected.
注意:當然也可以按照字符串、日期對應的別名進行排序;
7. 如果排序的字段中包含null值,結果會怎麼樣?
注意:在字段進行比較大小的時候,null 值比任何值都大;
例:emp表中員工的信息按照comm降序排列;
SCOTT@ORCL>select * from emp
2 order by comm desc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 800 20
7782 CLARK MANAGER 7839 1981-06-09 2450 10
7902 FORD ANALYST 7566 1981-12-03 3000 20
7900 JAMES CLERK 7698 1981-12-03 950 30
7876 ADAMS CLERK 7788 1987-05-23 1100 20
7566 JONES MANAGER 7839 1981-04-02 2975 20
7698 BLAKE MANAGER 7839 1981-05-01 2850 30
7934 MILLER CLERK 7782 1982-01-23 1300 10
7788 SCOTT ANALYST 7566 1987-04-19 3000 20
7839 KING PRESIDENT 1981-11-17 5000 10
7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
14 rows selected.
注意:null 值之間的排序不考慮(因爲Null 和 null 之間無法比較大小)
如果我想將comm有值的部分換到上面,該怎麼辦?
SCOTT@ORCL>select * from emp
2 order by comm desc nulls last;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
7788 SCOTT ANALYST 7566 1987-04-19 3000 20
7839 KING PRESIDENT 1981-11-17 5000 10
7876 ADAMS CLERK 7788 1987-05-23 1100 20
7900 JAMES CLERK 7698 1981-12-03 950 30
7902 FORD ANALYST 7566 1981-12-03 3000 20
7934 MILLER CLERK 7782 1982-01-23 1300 10
7698 BLAKE MANAGER 7839 1981-05-01 2850 30
7566 JONES MANAGER 7839 1981-04-02 2975 20
7369 SMITH CLERK 7902 1980-12-17 800 20
7782 CLARK MANAGER 7839 1981-06-09 2450 10
14 rows selected.
同理:自己驗證 升序 排列
SCOTT@ORCL>select * from emp
2 order by comm asc nulls first;
</span>