程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 第二章 約束和排序數據(SQL基礎),第二章sql

第二章 約束和排序數據(SQL基礎),第二章sql

編輯:Oracle教程

第二章 約束和排序數據(SQL基礎),第二章sql


                第二章 約束和排序數據

                1. 在 emp 表中選擇工資介於 1500 到 2500 的員工的信息;
                注意:使用 between 下邊界 and 上邊界時,條件包括邊界值;

                SCOTT@ORCL>select * from emp where sal between 1500 and 2500

                2. 在emp表中選擇位於20,30 部門的員工的信息;

                SCOTT@ORCL>select *from emp where deptno in (20,30);
                
                3. 在emp表中選擇位於員工的名字中包含大寫字符 ‘A’ 的員工的信息;

                SCOTT@ORCL>select * from emp where ename like '%A%';
                
                注意:如果查詢的名字中包含%或者_ ,而且查詢的時候又要查詢這樣的信息,需要用到換位碼。
                注意:通配符%,表示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 一致表結構沒有數據 */

                SCOTT@ORCL>select * from emp_n;

                        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 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 where ename like '%\%%';

                例:檢索以%開頭的記錄信息;
                SCOTT@ORCL>select * from emp_n where ename like '\%%' escape '\';

                         EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
                ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
                            1002 %whwh                                           2000

                例:檢索包含_的記錄信息;
                SCOTT@ORCL>select * from emp_n 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 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 where sal>=2000 and sal<=3000;
 
                SCOTT@ORCL>select * from emp where sal between 2000 and 3000;

                        4.2 對於or條件復合(可以將in()進行轉換)
                例:在emp表中選擇10號和20號部門的員工信息;
                SCOTT@ORCL>select * from emp where deptno=10 or deptno=20;
                
                SCOTT@ORCL>select * from emp where deptno in (10,20);

                        5 對於表中數據的排序
                        5.1 asc  表示按照所給字段進行升序排列(默認升序)
                                desc 表示按照所給字段進行降序排列
                例:將emp表中10號部門的員工信息按照sal列升序排列
                SCOTT@ORCL>select * from emp where deptno=10;

                SCOTT@ORCL>select * from emp where deptno=10 order by sal asc;

                SCOTT@ORCL>select * from emp where deptno=10 order by sal;

                例:將emp表中20號部門的員工信息按照sal列降序排列
                SCOTT@ORCL>select * from emp where deptno=20 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 where deptno=10 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 where deptno=20 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;

                 例:將emp表中10號部門的員工信息按sal降序排列,empno升序排列;
                 SCOTT@ORCL>select * from emp where deptno=10 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 where deptno=20  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  order by job asc,ename desc;

                例:將emp表中員工按照 HIREDATE 升序,sal降序排列(如果HIREDATE相同,按照sal降序)
                先將HIREDATE顯示格式設定
                SCOTT@ORCL>alter session set nls_date_format='yyyy-mm-dd';

                Session altered.

                SCOTT@ORCL>select * from emp order by hiredate asc,sal desc;
                    
                        6. 使用結果集中的別名進行排序;
                例:按照emp表中員工對於的年薪(sal*12)進行排序;
                SCOTT@ORCL>select empno,ename,hiredate,sal*12 year_sal from emp order by year_sal desc;

                注意:當然也可以按照字符串、日期對應的別名進行排序;

                        7. 如果排序的字段中包含null值,結果會怎麼樣?
                        注意:在字段進行比較大小的時候,null 值比任何值都大;
                例:emp表中員工的信息按照comm降序排列;
                SCOTT@ORCL>select * from emp order by comm desc;
                    
                注意:null 值之間的排序不考慮(因為Null 和 null 之間無法比較大小)

                如果我想將comm有值的部分換到上面,該怎麼辦?
                SCOTT@ORCL>select * from emp order by comm desc nulls last;

                同理:自己驗證 升序 排列
                SCOTT@ORCL>select * from emp
                    2  order by comm asc nulls first;


SQL數據排序問題

最簡單的方法是增加一個置頂字段,每個公司只有唯一一個。然後先按置頂字段排序,再按時間排序。
select * from company,product
where company.id = product.company_id
order by product.zhiding ,datetime

如果非要在一個query裡解決。
select count(*),* from company,product
where company.id = product.company_id
group by company.id
union
select 1,* from company,product
where company.id = product.company_id
and product.id not in (
select product.id from (select count(*),* from company,product
where company.id = product.company_id
group by company.id))
order by datetime
但是這樣的效率非常差。
 

數據庫排序問題(寫出SQL語句)

想不規則排序,可以使用隨機排序
select ID from table order by newID()

有疑問可以HI聊:)
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved