筆試--關於Oracle數據庫--試題回顧

1. 行列轉換

SQL> /

       ID1 NAME1                COURSE1                  SCORE1
---------- -------------------- -------------------- ----------
         1 張三                 語文                         67
         1 張三                 數學                         76
         1 張三                 英語                         43
         1 張三                 歷史                         56
         1 張三                 化學                         11
         2 李四                 語文                         54
         2 李四                 數學                         81
         2 李四                 英語                         64
         2 李四                 歷史                         93
         2 李四                 化學                         27
         3 王五                 語文                         24

       ID1 NAME1                COURSE1                  SCORE1
---------- -------------------- -------------------- ----------
         3 王五                 數學                         25
         3 王五                 英語                          8
         3 王五                 歷史                         45
         3 王五                 化學                          1

已選擇15行。

SQL> l
  1    select id,name ,
  2    sum(decode(course,'語文',score,0)) 語文,
  3    sum(decode(course,'數學',score,0)) 數學,
  4    sum(decode(course,'英語',score,0)) 英語,
  5    sum(decode(course,'歷史',score,0)) 歷史,
  6    sum(decode(course,'化學',score,0)) 化學
  7    from kecheng
  8*   group by id,name
SQL> /

        ID NAME              語文       數學       英語       歷史       化學
---------- ----------- ---------- ---------- ---------- ---------- ----------
         2 李四                54         81         64         93         27
         3 王五                24         25          8         45          1
         1 張三                67         76         43         56         11

decode(字段,比較1,值1,比較2,值2,… ,比較n,值n,缺省值)
decode(條件,值1,翻譯值1,值2,翻譯值2,… ,值n,翻譯值n,缺省值)
decode(course,'化學',score,0)
表示course的值如果等於“化學”,就將course值替換爲score的值,沒有匹配值設置默認替換值爲0;
在這裏插入圖片描述
sum(decode(course,'化學',score,0)) 化學 from kecheng group by id,name
根據主體即每個學生的id,name進行分組,由於之前只有符合course=”化學“這一條件才能得到分數,用sum函數或者max、min函數再次提取出非零的值就能得到每個學生的化學分數

SQL> select id,name, sum(decode(course,'化學',score) )
2    from kecheng
3    group by id,name;

      ID NAME        SUM(DECODE(COURSE,'化學',SCORE))
---------- ----------- --------------------------------
       2 李四                                      27
       3 王五                                       1
       1 張三                                      11

再依次匹配每一科目與分數,得到所有科目分數值
在這裏插入圖片描述

2. 獲取每組最大值

ROW_NUMBER()與rownum的區別在於:使用rownum進行排序的時,是先對結果集加入僞列rownum然後再進行排序,而ROW_NUMBER函數在包含排序從句後是先排序再計算行號碼

  • row_number()和rownum差不多,功能更強一點(可以在各個分組內從1開時排序).

  • rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內).

  • dense_rank()是連續排序,有兩個第二名時仍然跟着第三名。相比之下row_number是沒有重複值的 .

SQL> SELECT * FROM (
2         SELECT T.*,ROW_NUMBER() OVER( PARTITION BY MGR ORDER BY SAL DESC) RN
3                FROM EMP T)
4  WHERE RN =1;

   EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO         RN                                                                                                      
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ----------                                                                                                      
    7902 FORD                 ANALYST                  7566 03-12-81           3000                    20          1                                                                                                      
    7499 ALLEN                SALESMAN                 7698 20-2-81           1600        300         30          1                                                                                                      
    7934 MILLER               CLERK                    7782 23-1-82           1300                    10          1                                                                                                      
    7566 JONES                MANAGER                  7839 02-4-81           2975                    20          1                                                                                                      
    7369 SMITH                CLERK                    7902 17-12-80            800                    20          1                                                                                                      
    7839 KING                 PRESIDENT                     17-11-81           5000                    10          1                                                                                                      

已選擇 6 行。

SQL> select * from (
  2  select t.*,rank() over(partition by mgr order by sal desc)  rank
  3  from emp t  )
  4  where rank =1
  5  ;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO       RANK                                                                                                      
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ----------                                                                                                      
      7902 FORD                 ANALYST                  7566 03-12-81           3000                    20          1                                                                                                      
      7499 ALLEN                SALESMAN                 7698 20-2-81           1600        300         30          1                                                                                                      
      7934 MILLER               CLERK                    7782 23-1-82           1300                    10          1                                                                                                      
      7566 JONES                MANAGER                  7839 02-4-81           2975                    20          1                                                                                                      
      7369 SMITH                CLERK                    7902 17-12-80            800                    20          1                                                                                                      
      7839 KING                 PRESIDENT                     17-11-81           5000                    10          1                                                                                                      

已選擇 6 行。

SQL> select * from (
  2  select t.*,dense_rank() over(partition by mgr order by sal desc)  dense_rank
  3  from emp t  )
  4  where dense_rank =1
  5  ;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO DENSE_RANK                                                                                                      
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ----------                                                                                                      
      7902 FORD                 ANALYST                  7566 03-12-81           3000                    20          1                                                                                                      
      7499 ALLEN                SALESMAN                 7698 20-2-81           1600        300         30          1                                                                                                      
      7934 MILLER               CLERK                    7782 23-1-82           1300                    10          1                                                                                                      
      7566 JONES                MANAGER                  7839 02-4-81           2975                    20          1                                                                                                      
      7369 SMITH                CLERK                    7902 17-12-80            800                    20          1                                                                                                      
      7839 KING                 PRESIDENT                     17-11-81           5000                    10          1                                                                                                      

已選擇 6 行。

3. 獲取每組前三的值

SQL> select * from (
  2  select t.*,ROW_NUMBER() OVER( PARTITION BY MGR ORDER BY SAL DESC) RN
  3  from emp t )
  4  where RN <=3
  5  ;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO         RN                                                                                                      
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ----------                                                                                                      
      7902 FORD                 ANALYST                  7566 03-12-81           3000                    20          1                                                                                                      
      7499 ALLEN                SALESMAN                 7698 20-2-81           1600        300         30          1                                                                                                      
      7844 TURNER               SALESMAN                 7698 08-9-81           1500          0         30          2                                                                                                      
      7521 WARD                 SALESMAN                 7698 22-2-81           1250        500         30          3                                                                                                      
      7934 MILLER               CLERK                    7782 23-1-82           1300                    10          1                                                                                                      
      7566 JONES                MANAGER                  7839 02-4-81           2975                    20          1                                                                                                      
      7698 BLAKE                MANAGER                  7839 01-5-81           2850                    30          2                                                                                                      
      7782 CLARK                MANAGER                  7839 09-6-81           2450                    10          3                                                                                                      
      7369 SMITH                CLERK                    7902 17-12-80            800                    20          1                                                                                                      
      7839 KING                 PRESIDENT                     17-11-81           5000                    10          1                                                                                                      

已選擇 10 行。

SQL> select * from (
  2  select t.*,rank() over(partition by mgr order by sal desc)  rank
  3  from emp t  )
  4  where rank <=3
  5  ;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO       RANK                                                                                                      
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ----------                                                                                                      
      7902 FORD                 ANALYST                  7566 03-12-81           3000                    20          1                                                                                                      
      7499 ALLEN                SALESMAN                 7698 20-2-81           1600        300         30          1                                                                                                      
      7844 TURNER               SALESMAN                 7698 08-9-81           1500          0         30          2                                                                                                      
      7521 WARD                 SALESMAN                 7698 22-2-81           1250        500         30          3                                                                                                      
      7654 MARTIN               SALESMAN                 7698 28-9-81           1250       1400         30          3                                                                                                      
      7934 MILLER               CLERK                    7782 23-1-82           1300                    10          1                                                                                                      
      7566 JONES                MANAGER                  7839 02-4-81           2975                    20          1                                                                                                      
      7698 BLAKE                MANAGER                  7839 01-5-81           2850                    30          2                                                                                                      
      7782 CLARK                MANAGER                  7839 09-6-81           2450                    10          3                                                                                                      
      7369 SMITH                CLERK                    7902 17-12-80            800                    20          1                                                                                                      
      7839 KING                 PRESIDENT                     17-11-81           5000                    10          1                                                                                                      

已選擇 11 行。

SQL> select * from (
  2  select t.*,dense_rank() over(partition by mgr order by sal desc)  dense_rank
  3  from emp t  )
  4  where dense_rank <=3
  5  ;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO DENSE_RANK                                                                                                      
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ----------                                                                                                      
      7902 FORD                 ANALYST                  7566 03-12-81           3000                    20          1                                                                                                      
      7499 ALLEN                SALESMAN                 7698 20-2-81           1600        300         30          1                                                                                                      
      7844 TURNER               SALESMAN                 7698 08-9-81           1500          0         30          2                                                                                                      
      7521 WARD                 SALESMAN                 7698 22-2-81           1250        500         30          3                                                                                                      
      7654 MARTIN               SALESMAN                 7698 28-9-81           1250       1400         30          3                                                                                                      
      7934 MILLER               CLERK                    7782 23-1-82           1300                    10          1                                                                                                      
      7566 JONES                MANAGER                  7839 02-4-81           2975                    20          1                                                                                                      
      7698 BLAKE                MANAGER                  7839 01-5-81           2850                    30          2                                                                                                      
      7782 CLARK                MANAGER                  7839 09-6-81           2450                    10          3                                                                                                      
      7369 SMITH                CLERK                    7902 17-12-80            800                    20          1                                                                                                      
      7839 KING                 PRESIDENT                     17-11-81           5000                    10          1                                                                                                      

已選擇 11 行。

4. 獲取前三的值

SQL> l
  1*   select * from (select * from emp  order by sal) where rownum<=3
SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12-80           1000                    20
      7900 JAMES      CLERK           7698 03-12-81         1092.5                    30
      7521 WARD       SALESMAN        7698 22-2-81         1187.5        500         30

rownum是在排序前就生成了,所以不能直接根據rownum的值按順序取值

5. 索引

5.1 索引有哪些優缺點?

索引的優點

  • 可以大大加快數據的檢索速度,這也是創建索引的最主要的原因。

  • 通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

索引的缺點

  • 時間方面:創建索引和維護索引要耗費時間,具體地,當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,會降低增/改/刪的執行效率;
  • 空間方面:索引需要佔物理空間。

5.2 索引的分類

按照索引數據的存儲方式分爲:B樹索引、位圖索引、反向索引和基於函數的索引
按照索引的唯一性分爲:唯一索引和非唯一索引;
按照索引的個數分爲:單列索引和符合索引。

6. 建立數據庫三範式

第一範式:每個列都不可以再拆分。
第二範式:在第一範式的基礎上,非主鍵列完全依賴於主鍵,而不能是依賴於主鍵的一部分。
第三範式:在第二範式的基礎上,非主鍵列只依賴於主鍵,不依賴於其他非主鍵。
在設計數據庫結構的時候,要儘量遵守三範式,如果不遵守,必須有足夠的理由。比如性能。事實上我們經常會爲了性能而妥協數據庫的設計。

7. 視圖

視圖是存儲在數據字典裏的一條select語句。
數據庫只在數據字典中存儲視圖的定義信息。

視圖分爲簡單視圖和複雜視圖:

  1. 簡單視圖只從單表裏獲取數據,複雜視圖從多表;

  2. 簡單視圖不包含函數和數據組,複雜視圖包含;

  3. 簡單視圖可以實現DML操作,複雜視圖不可以。

視圖中的查詢語句不能包含order by,可在查詢視圖時加入

8. DDL、DML、DCL

  • DML(data manipulation language)數據操縱語言:
        就是我們最經常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用來對數據庫的數據進行一些操作

  • DDL(data definition language)數據庫定義語言:
        其實就是我們在創建表的時候用到的一些sql,比如說:CREATE、ALTER、DROP等。DDL主要是用在定義或改變表的結構,數據類型,表之間的鏈接和約束等初始化工作上。

  • DCL(Data Control Language)數據庫控制語言:
        是用來設置或更改數據庫用戶或角色權限的語句,包括(grant、deny、revoke、commit、savepoint、rollback)語句。這個比較少用到。
    (DCL一般只有sysadmin、dbcreator、db_owner、db_securityadmin等人員有權限操作)
    delete和drop區別:
    drop:刪除結構
    delete:刪除數據

9. select a.* from T1 a,T2 b;

返回()
A 2
B 3
C 5
D 6
應該是6,非質數。
多表查詢沒有指定連接條件,會導致笛卡爾積的出現,返回行數等於2張表的行數乘積,返回6行記錄

後續有記起來的再加吧~

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