sql系列(基礎篇)-第二章 約束和排序數據

   更好的看↑代碼點擊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>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章