文章目錄
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語句。
數據庫只在數據字典中存儲視圖的定義信息。
視圖分爲簡單視圖和複雜視圖:
-
簡單視圖只從單表裏獲取數據,複雜視圖從多表;
-
簡單視圖不包含函數和數據組,複雜視圖包含;
-
簡單視圖可以實現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行記錄
後續有記起來的再加吧~